慢查询阻塞了xtrabackup进而阻塞以后的sql导致的系统瘫痪问题

本文详细记录了一次因长时间运行的SQL导致MySQL备份过程出现阻塞的问题,并通过释放阻塞SQL使系统恢复正常运行。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

收到开发反应一库的sql频繁超时,系统几乎瘫痪,无法执行任何操作,我登上库先查看到当前的线程,发现有大量的线程状态是

 Waiting for table flush

 

查看当前的事务

从昨天开始执行,到今天早晨还没执行完,具体原因还没深究,先将此线程释放,然后备份才可以flush table成功继而备份完成后后面一系列被阻塞的sql都得以正常运行

mysql> select * from information_schema.innodb_trx\G
*************************** 1. row ***************************
                    trx_id: 192611452
                 trx_state: RUNNING
               trx_started: 2017-11-30 18:33:58
     trx_requested_lock_id: NULL
          trx_wait_started: NULL
                trx_weight: 3688
       trx_mysql_thread_id: 352932171
                 trx_query: DELETE FROM xx WHERE xx IN(SELECT xx
                                                FROM xx WHERE Remarks LIKE xx)
       trx_operation_state: unlock_row
         trx_tables_in_use: 2
         trx_tables_locked: 2
          trx_lock_structs: 3688
     trx_lock_memory_bytes: 368848
           trx_rows_locked: 4
         trx_rows_modified: 0
   trx_concurrency_tickets: 0
       trx_isolation_level: READ COMMITTED
         trx_unique_checks: 1
    trx_foreign_key_checks: 1
trx_last_foreign_key_error: NULL
 trx_adaptive_hash_latched: 0
 trx_adaptive_hash_timeout: 0
          trx_is_read_only: 0
trx_autocommit_non_locking: 0

后来想了一下每天的凌晨两点有物理备份,于是查看备份日志,发现果然是上面的事务阻塞了物理备份;

 

物理备份的整个流程

先记录当前redo log的序列号
171201 02:00:02 >> log scanned up to (54138135415)
xtrabackup: Generating a list of tablespaces
xtrabackup: using the full scan for incremental backup
xtrabackup: Starting 4 threads for parallel data files transfer
然后备份innodb库表
171201 02:00:12 [01] Copying .
备份完之后flush table;因为被阻塞,所以知道释放完事务后才成功
171201 02:00:17 Executing FLUSH NO_WRITE_TO_BINLOG TABLES...
接着开始备份非事务库表
171201 09:36:13 Executing FLUSH TABLES WITH READ LOCK... 171201 09:36:13 >> log scanned up to (54147795188) 171201 09:36:14 Starting to backup non-InnoDB tables and files 171201 09:36:14 [01] Copying .... xtrabackup: The latest check point (for incremental): '54138858140' xtrabackup: Stopping log copying thread. .171201 09:36:14 >> log scanned up to (54147795198) 171201 09:36:14 Executing FLUSH NO_WRITE_TO_BINLOG ENGINE LOGS...
备份完之后释放表锁
171201 09:36:14 Executing UNLOCK TABLES 171201 09:36:14 All tables unlocked 171201 09:36:14 [00] Copying ib_buffer_pool to xxx 171201 09:36:14 [00] ...done 171201 09:36:14 Backup created in directory xxxx MySQL binlog position: xxx 171201 09:36:14 [00] Writing backup-my.cnf 171201 09:36:14 [00] ...done 171201 09:36:14 [00] Writing xtrabackup_info 171201 09:36:14 [00] ...done xtrabackup: Transaction log of lsn (54138129801) to (54147795198) was copied. 171201 09:36:15 completed OK!

被阻塞的语句是FLUSH NO_WRITE_TO_BINLOG TABLES...

官方解释flush tables

Closes all open tables, forces all tables in use to be closed, and flushes the query cache and prepared statement cache.

没有涉及到锁相关的字眼;但是测试表明在执行查询或者变更还未完成时,如果另起一个会话执行flush tables 则会被阻塞,

如果此后如果有操作慢查询中的表的任何sql都会被阻塞;

 

 

          

 

转载于:https://www.cnblogs.com/Bccd/p/7940809.html

### MySQL 数据库底层数据保护机制实现原理 #### 1. InnoDB 存储引擎的数据保护机制 MySQL 的核心存储引擎之一是 InnoDB,它提供了事务支持和多种数据保护机制。InnoDB 的数据保护主要依赖以下几个关键技术: - **事务日志 (Redo Log)** Redo Log 是一种用于记录数据库变更的日志文件,主要用于崩溃恢复。每次修改数据时,InnoDB 都会先写入 Redo Log 文件,然后再异步更新磁盘上的实际数据页。这种技术被称为 Write-Ahead Logging (WAL)[^1]。 - **双写缓冲区 (Doublewrite Buffer)** 双写缓冲区是一种防止部分页面写失败的技术。在将脏页刷回磁盘之前,InnoDB 将这些页面的副本写入共享表空间的一个连续区域中。如果系统突然宕机,在恢复过程中可以通过 Doublewrite 缓冲区重建损坏的部分页面[^2]。 - **一致性读 (Consistent Read)** InnoDB 使用 MVCC(多版本并发控制)来实现一致性的只读视图。通过保存旧版本的数据,即使其他事务正在修改同一行数据,当前事务仍然可以看到该行的历史状态。 #### 2. 物理备份与逻辑备份 为了进一步增强数据保护能力,MySQL 提供了两种常见的备份方式——物理备份和逻辑备份。 - **物理备份** 物理备份是指直接复制数据库文件的内容到另一个位置。这种方式的优点是可以快速还原整个实例,并且占用的空间较小。但是,由于涉及到二进制级别的操作,因此兼容性和移植性较差。物理备份的核心工具 `innobackupex` 或者更现代的替代品 Percona XtraBackup 支持在线热备份[^2]。 - **逻辑备份** 逻辑备份则是导出 SQL 脚本的形式保存数据结构和内容。虽然这种方法执行速度较慢且生成较大的文件大小,但它具有更好的跨平台适应能力和可维护性。常用的命令有 mysqldump 和 SELECT INTO OUTFILE[^2]。 #### 3. 自动检测与修复机制 除了主动采取措施外,MySQL 还内置了一些被动防御手段来自我诊断潜在问题并尝试纠正它们。 - **校验和验证 (Checksum Verification)** 每个数据页都有一个计算得出的校验值附加在其末尾。每当加载某个页面进入内存缓存池时都会重新计算其校验码并与原始值比较。如果不匹配,则表明此页面可能已受损需启动相应的纠错程序。 - **死锁探测器 (Deadlock Detector)** 当多个事务相互等待资源形成循环依赖关系即所谓“死锁”情况发生时,如果没有及时处理可能会造成无限期阻塞现象影响正常业务运行效率低下甚至瘫痪整个系统工作流程所以有必要设置专门模块负责监控此类事件一旦发现立即挑选牺牲掉其中一个参与者从而解除僵局恢复正常秩序继续前进下去[^1]。 --- ### 示例代码:使用 Percona XtraBackup 执行全量备份 以下是利用 Percona XtraBackup 工具完成一次完整的 MySQL 数据库物理备份的例子: ```bash # 开始创建增量起点的基础快照 xtrabackup --backup --target-dir=/data/backups/full/ # 查看备份目录下的元信息确认无误后再进行下一步骤的操作 ls -l /data/backups/full/ ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值