插件窝 干货文章 Go语言GORM操作MySQL:如何避免特定表数据写入binlog日志?

Go语言GORM操作MySQL:如何避免特定表数据写入binlog日志?

binlog 记录 特定 操作 797    来源:    2025-03-14

在使用GORM操作MySQL时,如果你希望避免特定表的数据写入binlog日志,可以通过以下几种方式来实现:

1. 使用 SET sql_log_bin 语句

你可以在执行特定表的操作之前,临时关闭binlog日志记录,操作完成后再重新开启。这种方式适用于你希望在特定时间段内不记录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 sql_log_bin = 0")

    // 执行不记录binlog的操作
    db.Table("your_table").Create(&YourModel{...})

    // 重新开启binlog
    db.Exec("SET sql_log_bin = 1")
}

2. 使用 BLACKHOLE 存储引擎

MySQL的 BLACKHOLE 存储引擎会丢弃所有写入的数据,并且不会将这些操作记录到binlog中。你可以将特定表的存储引擎改为 BLACKHOLE,这样对该表的操作就不会记录到binlog中。

ALTER TABLE your_table ENGINE = BLACKHOLE;

3. 使用 REPLICATE_IGNORE_TABLE 配置

如果你使用的是MySQL的复制功能,可以通过在配置文件中设置 REPLICATE_IGNORE_TABLE 来忽略特定表的binlog记录。

[mysqld]
replicate-ignore-table=dbname.your_table

4. 使用 binlog_formatbinlog_row_image

在某些情况下,你可以通过调整 binlog_formatbinlog_row_image 来减少binlog的记录内容,但这并不能完全避免特定表的binlog记录。

SET GLOBAL binlog_format = 'ROW';
SET GLOBAL binlog_row_image = 'MINIMAL';

5. 使用 NO_LOG 权限

如果你有权限管理,可以为特定用户授予 NO_LOG 权限,这样该用户的操作不会记录到binlog中。

GRANT NO_LOG ON dbname.your_table TO 'username'@'host';

总结

  • 临时关闭binlog:适用于临时操作,使用 SET sql_log_bin = 0
  • BLACKHOLE 存储引擎:适用于永久不记录binlog的场景。
  • REPLICATE_IGNORE_TABLE:适用于复制场景。
  • 调整binlog_format和binlog_row_image:适用于减少binlog记录内容。
  • NO_LOG 权限:适用于特定用户的操作不记录binlog。

根据你的具体需求选择合适的方法来避免特定表的数据写入binlog日志。