如何在MYSQL中运行一个查询而不将其写入二进制日志

36
我希望将一个大文件导入MySQL,但我不想让它写入二进制日志,因为导入需要很长时间,会导致从服务器严重滞后。我宁愿在之后在从服务器上单独运行它,因为对系统的影响更小。涉及的表是新表,因此我不太担心它会失步,因为主服务器和所有从服务器最终都会有相同的数据,因为它们最终都会导入相同的文件。我也不想更改任何复制忽略(replicate-ignore-*)或二进制日志忽略(binlog_ignore-*)选项,因为这需要重新启动相关的服务器。是否有一种方法可以运行一个单个查询而不将其写入二进制日志?
我已经知道答案,但在网上找不到它,所以我让某人发帖回答并获得一些声望分。如果过了一段时间还没有答案,我会发布我找到的答案。
2个回答

60

您可以使用sql-log-bin会话变量关闭当前会话的日志记录。只需输入:

SET sql_log_bin = 0;

如果你想关闭当前会话的二进制日志记录,那么所有查询都不会被发送到二进制日志中。如果你想重新开启二进制日志记录,请运行以下命令:

SET sql_log_bin = 1;

这仅适用于您当前运行的会话。所有其他连接的所有其他查询仍将继续记录。此外,您必须拥有SUPER特权才能使其工作。


1
如果我在命令行中执行这个操作,这会起作用吗? mysqldump mydb | mysql -h remote.host.com remote_db - vinhboy
是的,主要的重点是应该在一个MySQL会话中。如果重新连接,则是不同的会话。 - Iaroslav Vorozhko
你需要在mysqldump的输出之前添加命令。 像这样:echo "SET sql_log_bin = 0; " & mysqldump mydb | mysql -h remote.host.com remote_db 不确定在字符串之前添加的语法是否正确,但你可以从这里开始。 - Iaroslav Vorozhko
或者你可以将其转储到文件中,启动新会话,并在执行Set SQL_LOG_BIN = 0;之后使用“source”命令导入转储。 - Kibbee
@Kibbee,我该如何在Amazon RDS服务上启用/禁用sql_bin_log?因为这需要SUPER权限,对吧? - Manish Sapkal
@ManishSapkal 尝试提出一个新问题。为了使该命令起作用,您需要 SUPER 权限。不确定如何在亚马逊上实现这一点。 - Kibbee

26

如果您想从命令行执行此操作,请尝试以下方法,这对我有效:

$ mysqldump old_DB | mysql --init-command="SET SQL_LOG_BIN = 0;" new_DB
可能在较新版本的MySQL中添加了"init-command"参数。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接