2020/06/05 mysql操作

mysql 查看當前正在執行的語句;

查看當前正在執行的語句 show processlist:

root@localhost [(none)]>show processlist;
+----+-------------+---------------------+------+-------------+-------+---------------------------------------------------------------+------------------+
| Id | User        | Host                | db   | Command     | Time  | State                                                         | Info             |
+----+-------------+---------------------+------+-------------+-------+---------------------------------------------------------------+------------------+
|  3 | system user |                     | NULL | Connect     | 53528 | Waiting for master to send event                              | NULL             |
|  4 | system user |                     | NULL | Connect     | 53528 | Slave has read all relay log; waiting for more updates        | NULL             |
|  5 | repluser    | 192.168.30.37:51622 | NULL | Binlog Dump | 53496 | Master has sent all binlog to slave; waiting for more updates | NULL             |
| 13 | root        | localhost           | NULL | Query       |     1 | starting                                                      | show processlist |
+----+-------------+---------------------+------+-------------+-------+---------------------------------------------------------------+------------------+
4 rows in set (0.22 sec)

結束正在執行的語句進程 kill 進程id

在這裏插入圖片描述

select @@global.query_cache_size;

set @@global.query_cache_size=16777216;

stream {
server {
listen 3336;
proxy_pass db;
}
upstream db {
server 10.211.7.11:3306;
server 10.211.7.12:3306 backup;
}
}

mysql找到所有索引
SELECT a.TABLE_SCHEMA,
a.TABLE_NAME,
a.index_name,
GROUP_CONCAT(column_name ORDER BY seq_in_index) AS Columns
FROM information_schema.statistics a
GROUP BY a.TABLE_SCHEMA,a.TABLE_NAME,a.index_name

mysql主從時不時進入Slave_SQL_Running_State:system lock,然後恢復到 Slave has read all relay log; waiting for more updates

五、system lock 延遲的原因

這裏先直接給出原因供大家直接參考,簡單的說從庫出現 system lock 應該視爲正在幹活,而不是名稱看到的“lock”,這是由於 slave 端不存在語句(row 格式)的執行,都是 Event 的直接 apply,狀態沒有切換的機會,也可以認爲是 slave 端狀態劃分不嚴謹,其實做一個 pstack 就能完全看出問題。下面是產生的必要條件:

由於大量的小事物,比如 UPDATE/DELETE table where 處理一行數據,這會出現只包含一行數據庫的 DML event 的語句,如果 table 是一張大表,則會加劇這種可能。
這個表上沒有主鍵或者唯一鍵,問題加劇。
由於類似 Innodb lock 堵塞,也就是 slave 從庫修改了數據同時和 sql_thread 也在修改同樣的數據,問題加劇。
確實 I/O 扛不住了,可以嘗試修改參數。
如果是大量的表沒有主鍵或者唯一鍵可以考慮修改參數 slave_rows_search_algorithms 試試。關於 slave_rows_search_algorithms 在我的系列中有一章詳細討論,這裏不做贅述。
這裏還特地請教了阿里的印風兄驗證了一下 mysql_lock_tables 是 myisam 實現表鎖的函數 Innodb 會設置爲共享鎖。

這裏我們先拋開 query event/map event 等。只考慮 DML event,下面就是 system lock 出現的流程:

如果一個小事物只有一條 DML event 的場景下邏輯如下:

->進入reading eventfrom the relay log狀態
 
 ->讀取一條event(參考next_event函數)
 
  ->進入system lock狀態
 
   ->Innodb層進行查找和修改數據

如果是一個大事物則包含了多條 DML event 的場景邏輯如下:

->進入reading eventfrom the relay log狀態
 
 ->讀取一條event(參考next_event函數)
 
  ->進入system lock狀態
 
   ->Innodb層進行查找和修改數據
 
->進入reading eventfrom the relay log狀態
 
 ->讀取一條event(參考next_event函數)
 
  ->Innodb層進行查找和修改數據
 
->進入reading eventfrom the relay log狀態
 
 ->讀取一條event(參考next_event函數)
 
  ->Innodb層進行查找和修改數據
 
....直到本事物event執行完成

因此我們看到對於一個小事物我們的 sql_thread 會在加 system lock 的情況下進行對數據進行查找和修改。

因此得出了我的結論,同時如果是 Innodb 層鎖造成的 sqlthread 堵塞也會在持有 system lock 的狀態下。但是對於一個大事物則不一樣,雖然出現同樣的問題,但是其狀態是 reading event from the relay log。

所以如果出現 system lock 一般就是考慮前文給出的結論。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章