插件窝 干货文章 Go GORM中如何精确控制MySQL特定表的Binlog日志记录?

Go GORM中如何精确控制MySQL特定表的Binlog日志记录?

Binlog 记录 MySQL GORM 827    来源:    2025-03-15

在Go中使用GORM操作MySQL时,默认情况下,所有的数据库操作(如插入、更新、删除等)都会被记录到MySQL的二进制日志(Binlog)中。如果你想要精确控制某个特定表的Binlog日志记录,可以通过以下几种方式实现:

1. 使用MySQL的SET SESSION sql_log_bin语句

你可以在执行特定表的操作之前,通过执行SET SESSION sql_log_bin语句来控制当前会话的Binlog记录行为。

import (
    "gorm.io/driver/mysql"
    "gorm.io/gorm"
)

func main() {
    dsn := "user:password@tcp(127.0.0.1:3306)/dbname?charset=utf8mb4&parseTime=True&loc=Local"
    db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
    if err != nil {
        panic("failed to connect database")
    }

    // 禁用Binlog记录
    db.Exec("SET SESSION sql_log_bin = 0")

    // 执行不需要记录Binlog的操作
    db.Table("specific_table").Create(&YourModel{...})

    // 启用Binlog记录
    db.Exec("SET SESSION sql_log_bin = 1")

    // 执行需要记录Binlog的操作
    db.Table("other_table").Create(&YourModel{...})
}

2. 使用MySQL的binlog_ignore_dbbinlog_do_db参数

你可以在MySQL配置文件中设置binlog_ignore_dbbinlog_do_db参数来控制特定数据库或表的Binlog记录。

  • binlog_ignore_db:忽略指定数据库的Binlog记录。
  • binlog_do_db:只记录指定数据库的Binlog。

例如,在my.cnfmy.ini中添加以下配置:

[mysqld]
binlog_ignore_db = specific_database

或者:

[mysqld]
binlog_do_db = other_database

然后重启MySQL服务使配置生效。

3. 使用MySQL的ROW格式Binlog

如果你使用的是ROW格式的Binlog,可以通过binlog_row_image参数来控制Binlog中记录的行数据。

  • binlog_row_image = FULL:记录完整的行数据。
  • binlog_row_image = MINIMAL:只记录必要的行数据。

你可以在MySQL配置文件中设置:

[mysqld]
binlog_format = ROW
binlog_row_image = MINIMAL

然后重启MySQL服务使配置生效。

4. 使用MySQL的TRIGGERSTORED PROCEDURE

你还可以通过创建触发器(TRIGGER)或存储过程(STORED PROCEDURE)来控制特定表的Binlog记录。在触发器或存储过程中,你可以使用SET SESSION sql_log_bin来控制Binlog记录。

例如,创建一个触发器:

CREATE TRIGGER before_insert_specific_table
BEFORE INSERT ON specific_table
FOR EACH ROW
BEGIN
    SET SESSION sql_log_bin = 0;
END;

然后在Go中执行插入操作时,触发器会自动禁用Binlog记录。

5. 使用GORM的BeforeCreateAfterCreate钩子

你可以在GORM的模型钩子中控制Binlog记录。例如,在BeforeCreate钩子中禁用Binlog,在AfterCreate钩子中启用Binlog。

type YourModel struct {
    gorm.Model
    // 其他字段
}

func (m *YourModel) BeforeCreate(tx *gorm.DB) (err error) {
    tx.Exec("SET SESSION sql_log_bin = 0")
    return
}

func (m *YourModel) AfterCreate(tx *gorm.DB) (err error) {
    tx.Exec("SET SESSION sql_log_bin = 1")
    return
}

总结

通过以上几种方式,你可以在Go GORM中精确控制MySQL特定表的Binlog日志记录。具体选择哪种方式取决于你的应用场景和需求。