调用 "FLUSH TABLES WITH READ LOCK" 时 mysqldump 挂起

mysqldump hangs when calling "FLUSH TABLES WITH READ LOCK"

我有一个 MySQL 服务器 (Serv-B) 作为主服务器 (Serv-A) 的从服务器。 这已经配置并且运行良好(已检查复制是否正常工作)。

现在,我希望这个“从”服务器也成为另一个从服务器 (Serv-C) 的主服务器。为此,我执行与设置初始配置相同的命令:

我连接到 MySQL 服务器 Serv-B,并调用以下命令:

FLUSH TABLES WITH READ LOCK; SHOW MASTER STATUS;

在另一个终端上,我 运行 mysqldump 命令:

mysqldump -u root mydb > /home/cx42/mydb.sql

但是挂起。它会一直挂起,直到我关闭 MySQL 终端,或使用 UNLOCK TABLES;

停止“刷新”命令

我一解锁表,mysqldump 命令就会在几秒钟内完成。

似乎 FLUSH 命令以 mysqldump 无法访问它们的方式锁定了我的表,但我不知道是什么原因造成的。

Serv-B 服务器(我称之为“FLUSH ..”的服务器)具有以下配置:

server-id              = 10
log_bin                = /var/log/mysql/mysql-bin.log
expire_logs_days       = 7
max_binlog_size        = 100M
binlog_do_db           = mydb
log_slave_updates      = 1
relay-log              = /var/log/mysql/mysql-relay-bin.log

怎么了?

是的,FLUSH TABLES WITH READ LOCK 获取锁是正确的。从语法上应该很明显,如果你要阅读 documentation:

  • FLUSH TABLES tbl_name [, tbl_name] ... WITH READ LOCK

    Flushes and acquires read locks for the named tables.

您可以使用 UNLOCK TABLES 释放锁定,但这意味着您可能无法从 SHOW MASTER STATUS 中获得正确的读数。一旦解锁表,就可以执行更多更新,从而提高日志位置。

更好的选择是让 mysqldump 完成工作。如果您使用 --source-data 选项(或 8.0.26 之前的 --master-data 选项调用 mysqldump,转储的输出将包括二进制日志位置,因此您不必在另一个 window.

https://dev.mysql.com/doc/refman/8.0/en/mysqldump.html#option_mysqldump_source-data