使用Go语言Gorm框架操作MySQL数据库时,如何精确控制特定表的Binlog记录?本文将解决一个常见问题:即使设置了会话级别的sql_log_bin
变量,特定表的操作仍然写入Binlog日志。
问题描述:用户尝试在操作表A之前设置sql_log_bin=0
,操作之后再将其设置为1
,代码如下:
db.Exec(fmt.Sprintf("set sql_log_bin=%d", 0)).Error db.Exec("insert into a.......").Error db.Exec(fmt.Sprintf("sql_log_bin=%d", 1)).Error
然而,表A的操作仍然记录在Binlog中。这是因为Gorm框架在执行查询时才获取数据库连接,三次Exec
可能使用了不同的连接,导致sql_log_bin
设置无效。
解决方案:确保sql_log_bin
设置和表A操作在同一个数据库会话中完成。使用数据库事务:
tx := db.Begin() tx.Exec("set session sql_log_bin=0") tx.Exec("insert into A.......") tx.Commit()
将sql_log_bin=0
和表A操作放入事务中,保证它们在同一连接上执行,从而使sql_log_bin
设置生效。事务提交后,连接释放,后续操作不受影响。 注意:set session
设置的是当前会话变量,而非全局变量。全局控制需要修改MySQL配置文件。