如何在 MYSQL 中运行查询而不将其写入二进制日志
Posted
技术标签:
【中文标题】如何在 MYSQL 中运行查询而不将其写入二进制日志【英文标题】:How do i run a query in MYSQL without writing it to the binary log 【发布时间】:2011-02-26 20:37:31 【问题描述】:我想将一个大文件导入 mysql。但是,我不希望它写入二进制日志,因为导入会花费很长时间,并且会导致 slave 远远落后。事实上,我宁愿在奴隶上单独运行它,因为它在系统上会容易得多。有问题的表是一个新表,因此我不必担心它会不同步,因为主服务器和所有从服务器最终将拥有相同的数据,因为它们都会导入相同的文件最终。我也不想更改任何 replicate-ignore-* 或 binlog_ignore-* 选项,因为它们需要重新启动相关服务器。有没有办法运行单个查询而不将其写入二进制日志?
我已经知道答案了,但是我在网上找不到很容易,所以我让某人发布答案以获得一些代表点。如果没有答案,我会发布我找到的答案。
【问题讨论】:
【参考方案1】:如果您想从 cli 执行此操作,请尝试此操作,它对我有用:
$ mysqldump old_DB | mysql --init-command="SET SQL_LOG_BIN = 0;" new_DB
可能是在较新的 MySQL 版本中添加了“init-command”参数。
【讨论】:
【参考方案2】:您可以使用sql-log-bin 会话变量来关闭当前会话的日志记录。只需输入:
SET sql_log_bin = 0;
并且您当前会话的所有查询都不会发送到二进制日志。如果要重新打开二进制日志记录,请运行:
SET sql_log_bin = 1;
这仅适用于您所在的当前正在运行的会话。来自所有其他连接的所有其他查询仍将继续被记录。此外,您必须拥有 SUPER 权限才能使其正常工作。
【讨论】:
如果我在命令行中这样做会起作用吗?mysqldump mydb | mysql -h remote.host.com remote_db
是的,重点应该是在一个 mysql 会话中。如果你重新连接它是不同的会话。
您需要将命令添加到 mysqldump 的输出中。像echo "SET sql_log_bin = 0; " & mysqldump mydb | mysql -h remote.host.com remote_db
不确定添加刺痛的语法是否正确,但您可以从这里开始。
或者您可以转储到一个文件,启动一个新会话并在执行 Set SQL_LOG_BIN = 0 后使用“源”命令导入转储;
@Kibbee,如何在 Amazon RDS 服务上启用/禁用 sql_bin_log?因为这需要超级权限对吗?以上是关于如何在 MYSQL 中运行查询而不将其写入二进制日志的主要内容,如果未能解决你的问题,请参考以下文章