全局讀鎖通常是由flush table with read lock;這類(lèi)語(yǔ)句添加,這類(lèi)語(yǔ)句通常是在各種備份工具為了拿到一致性備份時(shí)使用,另外,在具有主從復(fù)制架構(gòu)的環(huán)境中做主備切換時(shí)也常常使用,除了這兩種情況之外,還有一種情況也是最難排查的一種情況,那就是線上系統(tǒng)權(quán)限約束不規(guī)范的時(shí)候,各種人員使用的數(shù)據(jù)庫(kù)帳號(hào)都具有RELOAD權(quán)限時(shí),都可以對(duì)數(shù)據(jù)庫(kù)加全局讀鎖。
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 然后,我們查詢(xún)events_statements_history_long表中錯(cuò)誤號(hào)為1064的記錄,開(kāi)啟另一個(gè)會(huì)話(huà)(會(huì)話(huà)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) 可能你不知道錯(cuò)誤號(hào)是多少,可以查詢(xún)發(fā)生錯(cuò)誤次數(shù)不為0的語(yǔ)句記錄,在里邊找到MESSAGE_TEXT字段提示信息為語(yǔ)法錯(cuò)誤的就是它了。 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表查詢(xún)發(fā)生語(yǔ)句執(zhí)行錯(cuò)誤的SQL語(yǔ)句記錄,首先,我們?cè)跁?huì)話(huà)1制造一兩個(gè)語(yǔ)句執(zhí)行一定會(huì)發(fā)生錯(cuò)誤的語(yǔ)句。 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' 然后,我們?cè)趀vents_statements_summary_by_digest表中查詢(xún)發(fā)生錯(cuò)誤次數(shù)大于0的記錄,在會(huì)話(huà)2執(zhí)行。 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 * # 這里就是第一個(gè)執(zhí)行錯(cuò)誤的語(yǔ)句 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` = ? # 這里就是第二個(gè)執(zhí)行錯(cuò)誤的語(yǔ)句 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:我們前面說(shuō)過(guò),events_statements_summary_by_digest表中不記錄具體的錯(cuò)誤信息,只做錯(cuò)誤語(yǔ)句統(tǒng)計(jì),所以,如果需要查詢(xún)到具體的錯(cuò)誤信息(如:具體的錯(cuò)誤代碼,具體的錯(cuò)誤提示信息以及具體的錯(cuò)誤SQL文本等),還需要查詢(xún)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執(zhí)行進(jìn)度信息
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) 根據(jù)報(bào)錯(cuò)提示查看performance_schema.replication_applier_status_by_worker表,該表中詳細(xì)記錄了每一個(gè)worker線程的詳細(xì)信息,從這里我們就可以找到發(fā)生報(bào)錯(cuò)的worker線程具體的報(bào)錯(cuò)原因。
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) 從查詢(xún)performance_schema.replication_applier_status_by_worker表可以發(fā)現(xiàn),具體的復(fù)制報(bào)錯(cuò)信息是因?yàn)橹麈I沖突了