MySQL 备份卡在“Starting to lock all the tables”

问题

开始备份时,出现“正在开始锁定所有表”消息,然后备份停止,即使经过几个小时也不会继续。
使用 SHOW PROCESSLIST 可以观察到服务器上的 MySQL Enterprise Backup 连接处于以下状态:

State: Waiting to get readlock
Info: FLUSH TABLES WITH READ LOCK

状态:正在等待获取readlock
信息:使用读锁刷新表
www. On IT Road .com

解决方案

备份需要锁定服务器以获得任何非事务性数据的一致快照,例如 MyISAM 表、表定义以及二进制和从属日志位置。

造成这种情况的主要原因有两个

  • 导致 MySQL 在某些高负载服务器情况下错误地从不授予锁。这在 MySQL 5.5.8 及更高版本中已修复,但不会向后移植到包括 MySQL 5.0 或者 5.1 在内的早期版本,因为它以向后不兼容的方式改变了服务器行为。
  • 服务器上存在长时间运行的查询或者事务,但尚未完成,从而防止备份锁定。

我们应该查看 PROCESSLIST 并检查任何可能干扰的长时间运行的连接或者语句。
有时连接可能没有运行查询,但仍持有锁,因为事务已启动但尚未完成。
我们可以检查 InnoDB 事务状态来检查这一点(SHOW ENGINE INNODB STATUS)。

如果我们使用的是 MySQL 5.0 或者 5.1 并且无法升级,唯一的解决方法是禁用 MySQL Enterprise Backup 中的锁定。
我们可以通过将选项 -no-locking 选项传递给 mysqlbackup 来实现此目的(需要 MySQL Enterprise Backup 3.7.1 或者更高版本)

使用 -no-locking 选项有以下副作用:

  • 服务器无法观察到可靠的二进制日志位置。我们将无法通过使用二进制日志前滚备份来使用此备份执行时间点恢复。
  • 无论使用基于位置的复制还是基于 GTID 的复制,情况都是如此。在 MySQL 8.0 中,MySQL Server 具有特殊的备份和日志锁(分别为 LOCK INSTANCE FOR BACKUP 语句和 performance_schema.log_status 表),这将允许对 InnoDB 表进行无锁备份。
  • 我们将无法以一致的方式备份任何 MyISAM 表(如果有)。只有 InnoDB 表将彼此一致。
日期:2020-09-17 00:11:46 来源:oir作者:oir