MySQL开启BIN日志
开启binlog
[mysqld]
log-bin=mysql-bin
server_id=1
# 配置定时清理
expire_logs_days = 5
# binlog每个日志文件大小
max_binlog_size = 200m
# binlog日志格式,MySQL默认采用的是STATEMENT,建议使用MIXED
binlog_format = MIXED
重新启动mysql
binlog日志格式
- STATEMENT模式(SBR)
基于SQL语句的复制(statement-based replication),每一条会修改数据的sql语句都会记录到binlog中。
优点:
不需要记录每一条sql语句和每一行的数据变化,减少了binlog日志量,节约IO,提高性能
缺点:
某些情况会导致master-slave中的数据不一致,例如sleep(),last_insert_id()等
- ROW模式(RBR)
基于行的复制(row-based replication),不记录每条sql语句的上下文信息,仅记录哪条数据被修改了,修改成什么样。
优点:
任何情况都可以复制,并且不会出现特定情况下存储过程、function等调用或者触发无法被正确复制的问题
缺点:
binlog日志文件会非常大
master上执行update语句时,所有变化都会写到binlog里面,SBR只会写一次,所以会导致频繁发生binlog的并发写问题
- MIXED模式
上面两种模式的混合使用,一般的复制使用STATEMENT模式保存binlog,对于STATEMENT模式无法复制的操作使用ROW模式保存binlog,MySQL会根据执行的SQL语句选择日志保存方式。
使用日志文件恢复数据
步骤一、找到要恢复数据的binlog文件
show variables like '%log_bin%';
步骤二:把日志文件导出为.sql文件
导出命令有两种,一种根据 事务区间导出,一种根据日期区间导出
事务区间导出命令:
mysqlbinlog --no-defaults --start-position=1 --stop-position=10 E:\phpstudy_pro\Extensions\MySQL5.7.26\log\mysql-bin.000001 -d 数据库名 > d:\test_pot.sql
日期区间导出命令:
mysqlbinlog --no-defaults --start-datetime="2022-08-10 9:16:59" --stop-datetime="2022-08-13 5:06:48" E:\phpstudy_pro\Extensions\MySQL5.7.26\log\mysql-bin.000001 -d 数据库名> d:\test.sql
