如何在 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 中运行查询而不将其写入二进制日志的主要内容,如果未能解决你的问题,请参考以下文章

如何在现有 csv 文件中写入新行而不将其附加到最后一行?

如何将嵌入式资源作为字节数组读取而不将其写入磁盘?

如何在另一个目录中运行 python 脚本,而不将脚本写入磁盘?

使用 keytab 而不将其写入磁盘的 Bash 脚本

2 的十进制数的补码,而不将其转换为二进制形式?

将 nmap 输出发送到文件而不将其打印到标准输出