首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >[MYSQL案例][023] 从库查询操作导致主从延迟增大

[MYSQL案例][023] 从库查询操作导致主从延迟增大

原创
作者头像
大大刺猬
发布2023-11-17 16:43:21
发布2023-11-17 16:43:21
4070
举报
文章被收录于专栏:大大刺猬大大刺猬

问题描述

1主n从, 有个从库延迟大

说明: 我这里是自己环境模拟的, 并非实际环境.

代码语言:javascript
复制
               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

代码语言:javascript
复制
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

代码语言:javascript
复制
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
我这是模拟环境, 没有再继续执行相关SQL了, (但事务未结束, 锁未释放).所以看不到当前执行的SQL
我这是模拟环境, 没有再继续执行相关SQL了, (但事务未结束, 锁未释放).所以看不到当前执行的SQL

找到了产生这个MDL的会话信息.

(当时环境是 一个select的语句, 跑了2小时, 一直是sending data状态, 应该是网络带宽不够.)

可以等它结束, 也可以直接kill, 建议是直接kill, 反正是从库的查询.

kill之后主从延迟就降下来了

总结

从库有时候会充当查询的角色(读写分离), 但查询的数据量太大也会导致主从延迟增大....

所以有DDL操作的时候, 建议关注下主从状态. 有大量查询在从库的时候, 也可以关注下主从状态.

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 问题描述
  • 分析和处理过程
  • 总结
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档