全局讀鎖通常是由flush table with read lock;這類語句添加,這類語句通常是在各種備份工具為了拿到一致性備份時使用,另外,在具有主從復制架構的環境中做主備切換時也常常使用,除了這兩種情況之外,還有一種情況也是最難排查的一種情況,那就是線上系統權限約束不規范的時候,各種人員使用的數據庫帳號都具有RELOAD權限時,都可以對數據庫加全局讀鎖。
root@localhost : performance_schema 05:18:09> select * from; ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 1 然后,我們查詢events_statements_history_long表中錯誤號為1064的記錄,開啟另一個會話(會話2) root@localhost : sbtest 05:32:55> use performance_schema Database changed root@localhost : performance_schema 05:33:03> select THREAD_ID,EVENT_NAME,SOURCE,sys.format_time(TIMER_WAIT) as exec_time,sys.format_time(LOCK_TIME) as lock_time,SQL_TEXT,CURRENT_SCHEMA,MESSAGE_TEXT,ROWS_AFFECTED,ROWS_SENT,ROWS_EXAMINED,MYSQL_ERRNO from events_statements_history where MYSQL_ERRNO=1064/G; *************************** 1. row *************************** THREAD_ID: 119 EVENT_NAME: statement/sql/error SOURCE: socket_connection.cc:101 exec_time: 71.72 us lock_time: 0 ps SQL_TEXT: select * from CURRENT_SCHEMA: sbtest MESSAGE_TEXT: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use ROWS_AFFECTED: 0 ROWS_SENT: 0 ROWS_EXAMINED: 0 MYSQL_ERRNO: 1064 1 row in set (0.01 sec) 可能你不知道錯誤號是多少,可以查詢發生錯誤次數不為0的語句記錄,在里邊找到MESSAGE_TEXT字段提示信息為語法錯誤的就是它了。 root@localhost : performance_schema 05:34:00> select THREAD_ID,EVENT_NAME,SOURCE,sys.format_time(TIMER_WAIT) as exec_time,sys.format_time(LOCK_TIME) as lock_time,SQL_TEXT,CURRENT_SCHEMA,MESSAGE_TEXT,ROWS_AFFECTED,ROWS_SENT,ROWS_EXAMINED,MYSQL_ERRNO,errors from events_statements_history where errors>0/G; *************************** 1. row *************************** THREAD_ID: 119 EVENT_NAME: statement/sql/error SOURCE: socket_connection.cc:101 exec_time: 71.72 us lock_time: 0 ps SQL_TEXT: select * from CURRENT_SCHEMA: sbtest MESSAGE_TEXT: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use ROWS_AFFECTED: 0 ROWS_SENT: 0 ROWS_EXAMINED: 0 MYSQL_ERRNO: 1064 errors: 1 1 row in set (0.00 sec) 使用events_statements_summary_by_digest表查詢發生語句執行錯誤的SQL語句記錄,首先,我們在會話1制造一兩個語句執行一定會發生錯誤的語句。 root@localhost : sbtest 05:32:34> select * ; ERROR 1096 (HY000): No tables used root@localhost : sbtest 05:40:57> select * from sbtest4 where id between 100 and 2000 and xx=1; ERROR 1054 (42S22): Unknown column 'xx' in 'where clause' 然后,我們在events_statements_summary_by_digest表中查詢發生錯誤次數大于0的記錄,在會話2執行。 root@localhost : performance_schema 05:34:03> select SCHEMA_NAME,DIGEST_TEXT,COUNT_STAR,sys.format_time(AVG_TIMER_WAIT) as avg_time,sys.format_time(MAX_TIMER_WAIT) as max_time,sys.format_time(SUM_LOCK_TIME) as sum_lock_time,SUM_ERRORS,FIRST_SEEN,LAST_SEEN from events_statements_summary_by_digest where SUM_ERRORS!=0/G; *************************** 1. row *************************** ...... *************************** 10. row *************************** SCHEMA_NAME: sbtest DIGEST_TEXT: SELECT * # 這里就是第一個執行錯誤的語句 COUNT_STAR: 1 avg_time: 55.14 us max_time: 55.14 us sum_lock_time: 0 ps SUM_ERRORS: 1 FIRST_SEEN: 2018-06-25 17:40:57 LAST_SEEN: 2018-06-25 17:40:57 *************************** 11. row *************************** SCHEMA_NAME: sbtest DIGEST_TEXT: SELECT * FROM `sbtest4` WHERE `id` BETWEEN ? AND ? AND `xx` = ? # 這里就是第二個執行錯誤的語句 COUNT_STAR: 1 avg_time: 101.68 us max_time: 101.68 us sum_lock_time: 0 ps SUM_ERRORS: 1 FIRST_SEEN: 2018-06-25 17:41:03 LAST_SEEN: 2018-06-25 17:41:03 11 rows in set (0.00 sec) PS:我們前面說過,events_statements_summary_by_digest表中不記錄具體的錯誤信息,只做錯誤語句統計,所以,如果需要查詢到具體的錯誤信息(如:具體的錯誤代碼,具體的錯誤提示信息以及具體的錯誤SQL文本等),還需要查詢events_statements_history或者events_statements_history_long表。
root@localhost : performance_schema 05:45:03> select THREAD_ID,EVENT_NAME,SOURCE,sys.format_time(TIMER_WAIT) as exec_time,sys.format_time(LOCK_TIME) as lock_time,SQL_TEXT,CURRENT_SCHEMA,MESSAGE_TEXT,ROWS_AFFECTED,ROWS_SENT,ROWS_EXAMINED,MYSQL_ERRNO from events_statements_history where MYSQL_ERRNO!=0/G; *************************** 1. row *************************** ...... *************************** 2. row *************************** THREAD_ID: 119 EVENT_NAME: statement/sql/select SOURCE: socket_connection.cc:101 exec_time: 55.14 us lock_time: 0 ps SQL_TEXT: select * CURRENT_SCHEMA: sbtest MESSAGE_TEXT: No tables used ROWS_AFFECTED: 0 ROWS_SENT: 0 ROWS_EXAMINED: 0 MYSQL_ERRNO: 1096 *************************** 3. row *************************** THREAD_ID: 119 EVENT_NAME: statement/sql/select SOURCE: socket_connection.cc:101 exec_time: 101.68 us lock_time: 0 ps SQL_TEXT: select * from sbtest4 where id between 100 and 2000 and xx=1 CURRENT_SCHEMA: sbtest MESSAGE_TEXT: Unknown column 'xx' in 'where clause' ROWS_AFFECTED: 0 ROWS_SENT: 0 ROWS_EXAMINED: 0 MYSQL_ERRNO: 1054 3 rows in set (0.00 sec) 4. 查看SQL執行進度信息
admin@localhost : (none) 12:45:19> show slave status/G; ............ Last_Errno: 1062 Last_Error: Coordinator stopped because there were error(s) in the worker(s). The most recent failure being: Worker 1 failed executing transaction '23fb5832-e4bc-11e7-8ea4-525400a4b2e1:2553990' at master log mysql-bin.000034, end_log_pos 98797. See error log and/or performance_schema.replication_applier_status_by_worker table for more details about this failure or others, if any. ............ Last_SQL_Errno: 1062 Last_SQL_Error: Coordinator stopped because there were error(s) in the worker(s). The most recent failure being: Worker 1 failed executing transaction '23fb5832-e4bc-11e7-8ea4-525400a4b2e1:2553990' at master log mysql-bin.000034, end_log_pos 98797. See error log and/or performance_schema.replication_applier_status_by_worker table for more details about this failure or others, if any. ............ 1 row in set (0.00 sec) 根據報錯提示查看performance_schema.replication_applier_status_by_worker表,該表中詳細記錄了每一個worker線程的詳細信息,從這里我們就可以找到發生報錯的worker線程具體的報錯原因。
admin@localhost : (none) 12:51:53> select * from performance_schema.replication_applier_status_by_worker where LAST_ERROR_MESSAGE!=''/G; *************************** 1. row *************************** CHANNEL_NAME: WORKER_ID: 2 THREAD_ID: NULL SERVICE_STATE: OFF LAST_SEEN_TRANSACTION: 23fb5832-e4bc-11e7-8ea4-525400a4b2e1:2553991 LAST_ERROR_NUMBER: 1062 LAST_ERROR_MESSAGE: Worker 2 failed executing transaction '23fb5832-e4bc-11e7-8ea4-525400a4b2e1:2553991' at master log mysql-bin.000034, end_log_pos 99514; Could not execute Write_rows event on table sbtest.sbtest4; Duplicate entry '833353' for key 'PRIMARY', Error_code: 1062; handler error HA_ERR_FOUND_DUPP_KEY; the event's master log FIRST, end_log_pos 99514 LAST_ERROR_TIMESTAMP: 2018-01-02 14:08:58 1 row in set (0.00 sec) 從查詢performance_schema.replication_applier_status_by_worker表可以發現,具體的復制報錯信息是因為主鍵沖突了