二进制日志(binlog)

作用

  • 数据恢复:用于基于时间点的恢复。通过 binlog 可以恢复在备份后到数据丢失之间的所有操作。

  • 复制:在主从复制(Master-Slave Replication)中,主服务器将数据修改记录写入 binlog,从服务器读取这些日志并重放,从而保持数据一致性。

特点

  • 记录所有对数据库进行修改的 SQL 语句。

  • 以事件的形式记录(每个事件对应一个 SQL 语句)。

  • 可以用于增量备份。

开启 binlog 功能及基本操作

找到 MySQL 的配置文件,在文件中添加一行 log_bin = mysql-bin 。

文件通常为:/etc/mysql/my.cnf

[mysqld]
# 设置3306端口
port=3306
# 设置mysql的安装目录# 切记此处一定要用双斜杠
basedir=D:\\DevPackTool\\mysql-8.0.22-winx64 
# 设置mysql数据库的数据的存放目录
datadir=D:\\DevPackTool\\mysql-8.0.22-winx64\\data
# 允许最大连接数
max_connections=200
# 允许连接失败的次数。这是为了防止有人从该主机试图攻击数据库系统
max_connect_errors=10
# 服务端使用的字符集默认为UTF8
character-set-server=UTF8MB4
# 创建新表时将使用的默认存储引擎
default-storage-engine=INNODB
# 默认使用“mysql_native_password”插件认证
default_authentication_plugin=mysql_native_password
#开启binlog
log_bin = /var/log/mysql/mysql-bin.log
binlog_format = ROW
expire_logs_days = 7
server-id=1  
[mysql]
# 设置mysql客户端默认字符集
default-character-set=UTF8MB4
 
[client]
# 设置mysql客户端连接服务端时默认使用的端口
port=3306
default-character-set=UTF8MB4
  • log_bin:指定 binlog 文件的路径。

  • binlog_format:binlog 的格式,可以是 ROWSTATEMENTMIXED

  • server_id:服务器 ID,必须是唯一的。

  • expire_logs_days:binlog 文件自动删除的天数。

重启MySQL

sudo systemctl restart mysql

使用 Binlog 恢复数据库

备份当前数据库(假设数据库名为 mydb):

mysqldump -u root -p --all-databases --single-transaction --flush-logs --master-data=2 > full_backup.sql

记录当前的 binlog 位置

在备份文件 full_backup.sql 的开头部分,可以找到类似如下的信息:

-- CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=154;

记下 MASTER_LOG_FILEMASTER_LOG_POS 的值。

进行恢复操作

  • 首先,恢复全量备份:

mysql -u root -p < full_backup.sql
  • 其次,从 binlog 文件中恢复后续的数据变化:

mysqlbinlog --start-position=154 --stop-position=END /var/log/mysql/mysql-bin.000001 | mysql -u root -p

其中,--start-position 是上面记录的 MASTER_LOG_POS 值,/var/log/mysql/mysql-bin.000001 是记录的 MASTER_LOG_FILE 路径。你也可以恢复多个 binlog 文件,直到恢复到你想要的时间点为止。

  • 恢复到 2023-07-23 10:00:00 之前的所有操作。

mysqlbinlog --stop-datetime="2023-07-23 10:00:00" /var/log/mysql/mysql-bin.000001 | mysql -u root -p
  • 继续恢复后续的 binlog 文件:

mysqlbinlog --start-datetime="2023-07-23 10:00:00" /var/log/mysql/mysql-bin.000002 | mysql -u root -p