首页 > 文章列表 > Go语言Gorm框架下如何精准控制MySQL特定表的Binlog记录?

Go语言Gorm框架下如何精准控制MySQL特定表的Binlog记录?

108 2025-03-10

Go语言Gorm框架下如何精准控制MySQL特定表的Binlog记录?

使用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配置文件。

来源:1741207588