log_bin是静态参数,不可在线修改;永久关闭需在my.cnf的[mysqld]段添加skip-log-bin并重启服务;临时禁用单会话binlog可执行SET SQL_LOG_BIN = 0(需高权限)。

log_bin 是静态参数,不能在线 SET 修改
直接执行 SET GLOBAL log_bin = OFF 会报错 ERROR 1238 (HY000): Variable 'log_bin' is a read only variable。MySQL 的 log_bin 是启动时加载的静态参数,运行中无法变更。想“关闭”它,本质是让 MySQL 下次启动时不加载 binlog 模块,不是运行时开关。
永久关闭:改配置 + 重启,用 skip-log-bin 最稳妥
编辑 MySQL 配置文件(如 /etc/mysql/my.cnf 或 /etc/my.cnf),在 [mysqld] 段下添加:
skip-log-bin
这个选项比注释掉 log_bin 行更可靠,原因如下:
-
skip-log-bin明确禁用 binlog,即使其他地方误配了log_bin也不会生效 - 注释
#log_bin = /path/to/binlog仅依赖该行存在与否,容易遗漏或被覆盖 - 某些 MySQL 版本(如 8.0.30+)默认启用 binlog,不显式
skip-log-bin可能仍开启
改完必须重启服务:sudo systemctl restart mysql(或 mysqld,依实际服务名而定)。
临时跳过单条语句记录:用 SQL_LOG_BIN=0
如果你只是不想某几条 DML/DDL 记入 binlog(比如清理测试数据、修复脏数据),可以临时关闭当前会话的写入:
SET SQL_LOG_BIN = 0;
之后执行的语句不会写入 binlog,但注意:
- 只对当前会话有效,断开重连后自动恢复为 1
- 必须有
SUPER或SYSTEM_VARIABLES_ADMIN权限,普通账号会报ERROR 1227 (42501) - 主从复制环境下慎用——从库若也执行了
SET SQL_LOG_BIN=0,可能导致主从数据不一致 - 事务内设为 0 后,rollback 不影响 binlog 状态,但 commit 也不会补录
验证是否真正关闭
重启后务必登录 MySQL 执行:
SHOW VARIABLES LIKE 'log_bin';
返回结果必须是 OFF 才算成功。如果仍是 ON,常见原因有:
- 改错了配置文件(比如改了
~/.my.cnf而非系统级/etc/mysql/my.cnf) - MySQL 启动时加载了多个配置文件,被后面文件里的
log_bin覆盖 - 使用了 systemd 启动,但
mysql.service的ExecStart中硬编码了--log-bin参数 - 宝塔等面板单独管理配置,需在面板里关,而非手动改文件
最易被忽略的是配置文件加载顺序和权限问题——MySQL 启动时实际读了哪几个文件,得查 mysqld --verbose --help | grep "Default options" 确认。


















