mydumper 的“--use-savepoints”选项如何减少元数据锁定

lea*_*ord 8 mysql mysqldump

MyDumper 0.6.1 添加了一个新选项--use-savepoints。从手册中,它的意思是:

使用保存点减少元数据锁定问题,需要超级权限

我不明白。它如何“减少元数据锁定问题”以及为什么需要“超级特权”?我认为,元数据对于防止其他 DDL 修改表结构至关重要。

小智 3

我必须在 mydumper 的源代码中进行一些挖掘才能找到这个问题的答案。如果你看一下mydumper 的实际源代码:

您会发现以下内容从第 415 行开始作为进程队列的一部分:

if(use_savepoints && mysql_query(thrconn, "SET SQL_LOG_BIN = 0")){
    g_critical("Failed to disable binlog for the thread: %s",mysql_error(thrconn));
    exit(EXIT_FAILURE);
}
Run Code Online (Sandbox Code Playgroud)

这表明在 mydumper 中使用 --use-savepoints 需要能够关闭 MySQL bin 日志。我在自己的 MariaDB 服务器上尝试了此操作,该服务器仍然使用 MySQL 作为基本 DBMS,但在使用非管理员帐户时出现以下错误:

MariaDB [(无)]> SET SQL_LOG_BIN = 0; 错误 1227 (42000):访问被拒绝;您需要(至少一项)超级权限才能执行此操作

根据我阅读的实际代码并在我自己的 MySQL 服务器中测试此条件,我的理解是您需要“超级特权”,因为 mydumper 在运行时将禁用记录到 binlog。这是DOCS中提到的 SUPER 的“启用或禁用日志记录”功能的一部分。

有关 binlog 的更多具体信息如下:

http://dev.mysql.com/doc/refman/5.6/en/set-sql-log-bin.html

就保存点而言:

http://dev.mysql.com/doc/refman/5.6/en/savepoint.html

阅读完手册和这个错误报告后,看起来如果保存点被释放,它们将释放正在处理的表上的锁,这可以防止最近在 MySQL 5.5 中在 mysqldump 上看到的锁定问题。

我希望这能让您对 mydumper 工具有更多的了解。