故事起源:
ZY問我,有沒有遇到過在mysql客戶端執(zhí)行了添加表字段的的命令典徘,顯示成功了,在客戶端也看的到益咬,為啥到服務端查就沒有了逮诲。我建議他在服務器上執(zhí)行一下,他說也不行幽告。
排障過程:
1.我去看了mysql正在執(zhí)行的進程:
show processlist;
發(fā)現他的任務處在 Lock wait timeout exceeded
狀態(tài)梅鹦。數據庫里面還有其他的任務是 Lock wait timeout exceeded 狀態(tài), 然后隊列里面狀態(tài)是sleep的任務也有很多冗锁。
- kill 掉他執(zhí)行的任務 再次執(zhí)行依舊不行齐唆。
3.想著sleep狀態(tài)的任務那么多,應該是等待時間太長冻河,然后我更改了wite_time 參數 原來是8小時箍邮,我改為了10分鐘。
MariaDB [(none)]> set global wait_timeout=600;
MariaDB [(none)]> show global variables like 'wait_timeout';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| wait_timeout | 600 |
+---------------+-------+
1 row in set (0.00 sec)
MariaDB [(none)]>
然后把所有的任務都kill掉了
for i in $(mysql -uroot -p123456 -Bse "show processlist" | awk '{print $1}');do mysql -uroot -p123456 -e "kill $i";done
4.開啟mysql自動提交
發(fā)現服務器不是自動提交叨叙,改為自動提交锭弊。
可以用以下命令查看:
show global variables like 'autocommit';
值為1就是自動提交 set global autocommit=1;
MariaDB [(none)]> select @@autocommit;
+--------------+
| @@autocommit |
+--------------+
| 1 |
+--------------+
1 row in set (0.00 sec)
MariaDB [(none)]>
5.再次執(zhí)行ZY的語句,成功擂错!
6.排查過程中發(fā)現里面還有報 mysql Copying to tmp table on disk
的任務廷蓉,用時較長,是其他項目的任務。
百度發(fā)現 tmp_table_size
這個參數可以緩存查詢數據桃犬,如果超過這個數字刹悴,就會寫到磁盤上,這樣就會很慢攒暇。所以要適當改大一點這個數據土匀,但是前提是內存允許。
我查了一下形用,原來 tmp_table_size 值為 16M就轧,我增加了一倍,沒敢加太多田度。
MariaDB [cs_epg_release]> set global tmp_table_size=33554432;
MariaDB [cs_epg_release]> show global variables like '%tmp_table_size%';
+----------------+----------+
| Variable_name | Value |
+----------------+----------+
| tmp_table_size | 33554432 |
+----------------+----------+
1 row in set (0.02 sec)
再去查看進程妒御,沒有狀態(tài)為 mysql Copying to tmp table on disk 的任務了。
7.后面對用時較長的查詢任務做了 sql 分析镇饺,全表掃描乎莉,給對應項目的人員了。
<完奸笤!>