MYSQL中sql_log_bin变量在复制中的特殊用途

本文介绍如何通过设置SQL_LOG_BIN为OFF防止MySQL双MASTER结构中出现循环复制现象,并探讨了使用第三方工具实现多线程更新的方法。

SQL_LOG_BIN = {ON | OFF}

如果在一连接线种中将该值设置为OFF,则该连接上客户端的所有更新操作在MYSQL二进制日志中不会记录日志。


在双MASTER的复制结构中,原生的MYSQL复制中是不会出现循环复制的,因为可以判断server-id来决定

但是如用一种第三方的工具,模拟SLAVE连接MASTER获取binlog,然后这个工具再连接真正的SLAVE,将主库的binlog更新到SLAVE,那么SLAVE将无法区分这个更新是从主库来的,还是其它连接真正的更新SLAVE,在SLAVE的log_bin=ON时,这个更新将会又被传回MASTER,而MASTER也识别不出来,将出现循环复制


那么现在可以这样做,在这个第三方工具连接SLAVE后SET sql_log_bin = OFF,则该连接上对SLAVE的更新不会记入binlog,因为它是从MASTER上同步过来的,不记入SLAVE的binlog也没有太大问题


注:自己实现或用第三方的复制,可以实现多线程的update,而不是象原生slave update是单线程串行更新


<think> 我们正在讨论MySQL中的两个变量log_binsql_log_bin。根据提供的引用,我们可以总结如下: 1. **log_bin**: - 这是一个只读变量,用于报告当前二进制日志(binlog)系统的状态(即是否开启)。 - 它是在MySQL启动时通过命令行参数或配置文件(如my.cnf)设置的。例如,在配置文件中使用`log_bin=mysql-bin`来开启binlog并设置日志文件的前缀为`mysql-bin`。 - 要永久关闭binlog,需要在配置文件中注释掉或删除`log_bin`的配置,然后重启MySQL。因为它是只读的,所以不能在运行时动态修改。 2. **sql_log_bin**: - 这是一个动态变量,可以在运行时修改(全局或会话级别)。 - 它控制当前会话(session)或所有新会话(global)是否将语句记录到binlog中。 - 当在全局级别修改时(`SET GLOBAL sql_log_bin = OFF;`),它只对之后新建的会话有效。因此,如果要完全禁用所有连接的binlog记录,需要先设置全局变量,然后终止所有现有连接(因为现有会话不受影响)。 - 主要用途:在数据恢复(还原)过程中,为了避免恢复操作本身被记录到binlog(从而造成日志膨胀和可能的复制问题),可以在当前会话中临时关闭sql_log_bin,然后执行恢复操作。完成后,再重新开启。 **区别总结**: - `log_bin`是一个服务器启动时设定的选项,用于启用或禁用binlog功能,且是只读的,需要重启才能更改。 - `sql_log_bin`是一个动态开关,用于控制当前会话(或新会话)是否将操作记录到binlog。它不需要重启,但更改全局设置后,需要断开现有连接才能生效。 **使用场景举例**: - 如果你要永久关闭binlog,修改`log_bin`配置并重启。 - 如果你只是临时不想记录当前会话的操作(例如在恢复数据时),可以设置`sql_log_bin = OFF`(会话级别),这样当前会话的操作就不会被记录到binlog。 根据引用[^1][^2][^3][^4][^5]的内容,我们得到上述结论。 现在,我们按照用户要求生成相关问题: </think> ### MySQL中`sql_log_bin`与`log_bin`的区别解析 #### 1. **`log_bin`(二进制日志开关)** - **定义**:系统级配置参数,决定MySQL是否启用二进制日志功能[^1][^3] - **特性**: - 通过配置文件(如`my.cnf`)或启动命令行设置 - **只读变量**,运行时不能动态修改 - 需重启MySQL才能生效变更 - 可指定日志文件名前缀(如`log_bin=mysql.bin`) - **作用**: - 主从复制(Master-Slave)的数据同步基础[^3] - 数据恢复的核心依据(记录所有数据变更)[^3][^5] - **关闭方式**: ```ini # /etc/my.cnf # log_bin = mysql-bin ← 注释此行并重启 ``` #### 2. **`sql_log_bin`(会话级日志控制)** - **定义**:动态变量,控制当前会话是否记录到binlog[^2][^4] - **特性**: - **动态可调**:支持`SET GLOBAL`或`SET SESSION`修改 - 作用范围: - `GLOBAL`:仅影响**新建立**的会话[^2] - `SESSION`:立即影响当前会话 - 需配合`KILL`命令终止旧连接以完全生效全局变更[^2] - **核心用途**: - 数据恢复时避免冗余日志(如导入备份不记录binlog)[^3][^4] ```sql SET SESSION sql_log_bin = OFF; -- 当前会话停用binlog -- 执行数据恢复操作... SET SESSION sql_log_bin = ON; ``` --- ### 关键区别总结 | **特性** | `log_bin` | `sql_log_bin` | |------------------|------------------------------|------------------------------| | **配置层级** | 系统级(启动参数/配置文件) | 会话级(动态变量) | | **运行时修改** | ❌ 需重启生效 | ✅ 即时生效 | | **作用范围** | 全局性开关 | 支持会话级精细控制 | | **主要用途** | 主从复制/灾难恢复基础 | 临时禁用日志(如数据恢复) | | **关闭影响** | 完全禁用binlog功能 | 仅跳过指定操作的日志记录 | > **典型场景**:当需要还原数据库时,临时设置`SET SESSION sql_log_bin=OFF`可避免恢复过程写入binlog,既节省磁盘空间又防止污染主从同步[^3][^4]。 --- ### 注意事项 1. 全局修改`sql_log_bin`后,必须终止现有连接(`KILL PROCESSLIST`)才能使新设置对所有会话生效[^2] 2. 永久关闭binlog需通过`log_bin`配置重启,仅用`sql_log_bin`无法彻底禁用日志系统[^1][^3] 3. Binlog记录所有数据变更(包括无匹配的`UPDATE/DELETE`),需关注日志膨胀问题[^5] ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值