1主n从, 有个从库延迟大
说明: 我这里是自己环境模拟的, 并非实际环境.
Master_SSL_Key:
Seconds_Behind_Master: 2059
Master_SSL_Verify_Server_Cert: No
Last_IO_Errno: 0
Last_IO_Error:
Last_SQL_Errno: 0
Last_SQL_Error:
Replicate_Ignore_Server_Ids:
Master_Server_Id: 414003308
Master_UUID: 6d650f1f-ba4e-11ed-99ab-000c2980c11e
Master_Info_File: mysql.slave_master_info
SQL_Delay: 0
SQL_Remaining_Delay: NULL
Slave_SQL_Running_State: Waiting for dependent transaction to commit
Master_Retry_Count: 86400
Master_Bind:

先查看sql现场当前执行的SQL
select * from information_schema.processlist where user='system user';
发现是执行DDL操作, 状态是Waiting for table metadata lock 也就是有人拿着mdl不放.
使用如下SQL查看MDL (sql来源网络, 几经辗转, 忘了原出处. 先感谢该大佬)
如果对metadata_locks表不熟悉, 就建议看下官网: https://dev.mysql.com/doc/refman/8.0/en/performance-schema-metadata-locks-table.html
SELECT
locked_schema,
locked_table,
locked_type,
waiting_processlist_id,
waiting_age,
waiting_query,
waiting_state,
blocking_processlist_id,
blocking_age,
sql_kill_blocking_connection
FROM
(
SELECT
b.OWNER_THREAD_ID AS granted_thread_id,
a.OBJECT_SCHEMA AS locked_schema,
a.OBJECT_NAME AS locked_table,
"Metadata Lock" AS locked_type,
c.PROCESSLIST_ID AS waiting_processlist_id,
c.PROCESSLIST_TIME AS waiting_age,
c.PROCESSLIST_INFO AS waiting_query,
c.PROCESSLIST_STATE AS waiting_state,
d.PROCESSLIST_ID AS blocking_processlist_id,
d.PROCESSLIST_TIME AS blocking_age,
d.PROCESSLIST_INFO AS blocking_query,
concat('KILL ', d.PROCESSLIST_ID) AS sql_kill_blocking_connection
FROM
performance_schema.metadata_locks a
JOIN performance_schema.metadata_locks b ON a.OBJECT_SCHEMA = b.OBJECT_SCHEMA
AND a.OBJECT_NAME = b.OBJECT_NAME
AND a.lock_status = 'PENDING'
AND b.lock_status = 'GRANTED'
AND a.OWNER_THREAD_ID <> b.OWNER_THREAD_ID
AND a.lock_type = 'EXCLUSIVE'
JOIN performance_schema.threads c ON a.OWNER_THREAD_ID = c.THREAD_ID
JOIN performance_schema.threads d ON b.OWNER_THREAD_ID = d.THREAD_ID
) t1,
(
SELECT
thread_id,
group_concat( CASE WHEN EVENT_NAME = 'statement/sql/begin' THEN "transaction_begin" ELSE sql_text END ORDER BY event_id SEPARATOR ";" ) AS sql_text
FROM
performance_schema.events_statements_history
GROUP BY thread_id
) t2
WHERE
t1.granted_thread_id = t2.thread_id \G
找到了产生这个MDL的会话信息.
(当时环境是 一个select的语句, 跑了2小时, 一直是sending data状态, 应该是网络带宽不够.)
可以等它结束, 也可以直接kill, 建议是直接kill, 反正是从库的查询.
kill之后主从延迟就降下来了

从库有时候会充当查询的角色(读写分离), 但查询的数据量太大也会导致主从延迟增大....
所以有DDL操作的时候, 建议关注下主从状态. 有大量查询在从库的时候, 也可以关注下主从状态.
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。