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

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

binlog 操作 记录 特定 936    来源:    2025-03-13

在MySQL中,binlog(二进制日志)用于记录所有对数据库的更改操作,包括插入、更新和删除等操作。如果你希望避免特定表的数据写入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.Exec("INSERT INTO your_table (column1, column2) VALUES (?, ?)", value1, value2)

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

2. 使用 binlog_ignore_dbbinlog_do_db 配置

在MySQL配置文件中,你可以通过 binlog_ignore_dbbinlog_do_db 参数来控制哪些数据库或表的操作不记录到binlog中。

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

你可以在MySQL配置文件(如 my.cnfmy.ini)中添加以下配置:

[mysqld]
binlog_ignore_db = your_database_name

或者:

[mysqld]
binlog_do_db = other_database_name

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

3. 使用 blackhole 存储引擎

MySQL的 blackhole 存储引擎会接收数据但不实际存储数据,因此也不会将数据写入binlog。你可以将特定表的存储引擎改为 blackhole,这样对该表的操作不会记录到binlog中。

ALTER TABLE your_table ENGINE = BLACKHOLE;

4. 使用 ROW 格式的binlog

如果你使用的是 ROW 格式的binlog,可以通过 binlog_row_image 参数来控制binlog记录的内容。设置为 MINIMAL 时,binlog只会记录必要的列信息,从而减少binlog的大小。

SET GLOBAL binlog_row_image = 'MINIMAL';

5. 使用 NO_LOG 权限

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

GRANT NO_LOG ON your_database.your_table TO 'your_user'@'your_host';

总结

  • 如果你希望在特定操作期间禁用binlog,可以使用 SET sql_log_bin 语句。
  • 如果你希望永久性地忽略特定数据库或表的binlog记录,可以使用 binlog_ignore_dbbinlog_do_db 配置。
  • 如果你希望完全不记录特定表的操作,可以考虑使用 blackhole 存储引擎。

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