MySQL刪除了記錄不生效的原因排查

2022-09-24 17:51:14 字數 3076 閱讀 1385

線上的一次mysql事務問題記錄

上周五進行了乙個大表刪除的操作,在刪除的過程中,出現了一點小問題,白白花費了兩個小時,我這裡記錄了一下大概的過程,廢話不多說了,直接看過程吧。

當時想進行刪除,先測試了一下刪除語句的語法,刪了一條試了一下,如下:

mysql ::>>select min(id) from ***x_user_login;

+---------+

| min(id) |

+---------+

| |

+---------+

row in set (0.00 sec)

mysql ::>>delete from ***x_user_login where id < ;

query ok, row affected (0.00 sec)

mysql ::>>select min(id) from ***x_user_login;

+---------+

| min(id) |

+---------+

| |

+--程式設計客棧-------+

row in set (0.00 sec)

然後重新使用mysql客戶端登入進去,發現了乙個奇怪的問題:

[dba_mysql ~]$ /usr/local/mysql/bin/mysql -udba_admin -p -h127.0.0.1 -p4306

enter password:

******fozxpt***************x

type 'help;' or '\h' for help. type '\c' to clear the current input statement.

mysql ::>>select min(id) from ***xx_user_login;

+---------+

| min(id) |

+---------+

| |

+---------+

row in set (0.00 sec)

也就是剛才刪除掉的那一條記錄又重新回來了。

想想覺得挺奇怪的,是不是我刪除錯了,或者說刪除之後,業務方又重新插入了資料,這不是出問題了麼。。。又重新試了幾次,都是一樣的效果。

這個現象很奇怪,之前沒有遇到過,我首先是檢查了一下指令碼,確認刪除的指令碼無誤後,又查了好半天,最後終於從事務的這個方向找到了乙個突破口,懷疑是事務沒有提交導致的,於是看了一眼當前事務的引數,如下:

mysql ::>>show variables like '%commit%';

+--------------------------------+-------+

| variable_name | value |

+--------------------------------+-------+

| autocommit | off |

| innodb_commit_concurrency | |

| innodb_flush_log_at_trx_commit | |

+--------------------------------+-------+

rows in set (0.00 sec)

[email protected]:(none) ::>>

mysql ::>>show global variables like '%commit%';

+--------------------------------+-------+

| variable_name | value |

+--------------------------------+-------+

| autocommit | on |

| innodb_commit_concurrency 程式設計客棧 | |

| innodb_flush_log_at_trx_commit | |

+--------------------------------+-------+

rows in set (0.00 sec)

看到這個,基本上問題就已經確定了,是因為當前會話中程式設計客棧的自動提交被設定成了off,所以刪除的時候,貌似已經成功了,重啟之後再看,這些事務被回滾了,所以就好像刪除操作"失效"一樣。

那既然已經定位到了問題,就開始找這個問題的根本原因,最終在配置檔案中找到了最根本的原因,如下:

[mysqldump]

quick

max_allowed_packet = m

[mysql]

no-auto-rehash

max_allowed_packet = m

prompt=mysql--\\u@\\h:\\d \\r:\\m:\\s>>

init-command="set interactive_timeout=28800;set wait_timeout=28800;set autocommit=0;"

配置檔案中的最後一行,mysql客戶端組的配置autocommit被設定成了0,當然就無法自動提交了,於是改了這個引數為1,再次重試指令碼,發現問題依舊。。。

看來還是改的不徹底。

我們知道,mysql載入配置檔案有乙個順序,我們可以使用mysql --help|grep my.cnf的命令來檢視,經過檢視,是因為/etc/my.cnf中的配置也是autocommit=0,所以就把當前這個配置檔案的引數給覆蓋了,最終,改完/etc/my.cnf檔案中的autocommit引數內容之後,重新連線mysql伺服器,發現問題解決。

總結,下面幾個小的知識點需要注意一下:

1、當發現資料無法刪除之後,可以先看看事務提交的引數是否設定成了off

2、使用show variables和show global variables可以分別檢視當前會話和全域性變數的事務引數;

3、my.cnf檔案中的mysql組中的引數是用來控制mysql客戶端的配置的。

4、my.cnf檔案有載入順序,改動的時候,需要全部都變更。或者程式設計客棧保證只存在乙個my.cnf檔案。

刪除了mysql的服務

重灌系統後煩人的事真多 裝乙個mysql都問題多多 我記得我先用乙個綠色的mysql安裝出了點點問題就沒有使用了 居然不能啟動服務 一看服務裡已經有乙個mysql了 弄了n就才找到辦法 連登錄檔都刪了還是不行 最後在這裡找到解決辦法 quote 1 首先停止舊版本的mysql服務。停止後仍無法啟動 ...

mysql刪除重複的記錄 MYSQL刪除重覆記錄

mysql刪除重覆記錄,儲存id最小的一條 方法1 1 建立乙個臨時表,選取需要的資料。2 清空原表。3 臨時表資料匯入到原表。4 刪除臨時表。mysql select from student id name 11 aa 12 aa 13 bb 14 bb 15 bb 16 cc 6 rows i...

仿ios便簽軟體 手機便簽記錄的東西刪除了怎樣恢復

手機便簽是很常用的工具軟體,無論是對工作,還是對生活,都很有幫助。手機便簽雖然好用,但是也有讓使用者很擔心的部分,萬一不小心把不該刪的內容刪除了怎麼辦?手機便簽怎麼恢復資料。其實手機便簽內容誤刪這種事,非常的常見。如果你手機便簽用的久了,記錄的內容也會很多,內容多了會有整理內容的時候,既然是整理,難...