MySQL 通过binlog日志恢复数据
Binlog日志,即binary log,是二进制日志文件,有两个作用,一个是增量备份,另一个是主从复制,即主节点维护一个binlog日志文件,从节点从binlog中同步数据,也可以通过binlog日志来恢复数据。
一、查看
- 登录mysql查看binlog日志的状态
# 查看binlog,为off关闭状态
show variables like '%log_bin%';
- binlog日志配置
# 开启二进制日志
log_bin = /mydata/mysql/log/mysql-bin.log
# mysql 清除过期日志的时间,默认值 0,不自动清理,而是使用滚动循环的方式。
expire_logs_days = 0
# 如果二进制日志写入的内容超出给定值,日志就会发生滚动。你不能将该变量设置为大于 1GB 或小于 4096 字节。 默认值是 1GB。
max_binlog_size = 1000M
# binlog 的格式也有三种:STATEMENT,ROW,MIXED。mysql 5.7.7 后,默认值从 MIXED 改为 ROW
# 关于 binlog 日志格式问题,请查阅网络资料
binlog_format = row
# 默认值 N=1,使 binlog 在每 N 次 binlog 写入后与硬盘同步,ps:1 最慢
# sync_binlog = 1
- biglog 日志文件
Binlog日志包括两类文件;第一个是二进制索引文件(后缀名为.index),第二个为日志文件(后缀名为.00000*),记录数据库所有的DDL和DML(除了查询语句select)语句事件
- 查看所有binlog日志文件列表
show master logs;
# 只查看第一个binlog文件的内容
show binlog events;
# 查看指定binlog文件的内容
show binlog events in '二进制文件名';
# 查看当前正在写入的binlog文件
show master status\G
- 查看最后一个binlog日志的编号名称及其最后一个操作事件pos结束点的值
show master status;
- 刷新日志Flush logs
刷新日志,此刻开始产生一个新编号的binlog文件,例如:
每当mysqld服务重启时,会自动执行刷新binlog日志命令,mysqldump备份数据时加-F选项也会刷新binlog日志
- 清空所有binlog日志命令
reset master;
- 查看binlog文件内容
使用查看工具mysqlbinlog来查看(cat/vi/more都是无法打开的)
注意:
-
不要查看当前正在写入的binlog文件
-
不要加–force参数强制访问
-
如果binlog格式是行模式的,请加 -vv参数
8.1 本地查看
- 基于开始/结束时间
mysqlbinlog --start-datetime='2021-01-01 00:00:00' --stop-datetime='2021-11-30 00:00:00' -d 库名 二进制文件
mysqlbinlog --base64-output=decode-rows -v --start-datetime='2021-01-01 00:00:00' --stop-datetime='2021-11-30 00:00:00' -d 库名 二进制文件 --result-file 输出文件名
- 基于pos值
mysqlbinlog --start-postion=107 --stop-position=1000 -d 库名 二进制文件
- 远程查看
mysqlbinlog -u 用户名 -p 密码 -h 地址 -P3306 \
--read-from-remote-server --start-datetime='2021-01-01 00:00:00' --stop-datetime='2021-11-30 00:00:00' 二进制文件名 > t.binlog
- 输出文件
binlog日志文件记录为ROW格式
# 将row格式的binlog日志文件base64解析后转入文件,-v代表换行展示
mysqlbinlog --base64-output=decode-rows -v 二进制文件 --result-file 输出文件名
日志文件格式
- 开始事物的时间:
SET TIMESTAMP=1350355892/!/;
BEGIN
- sqlevent起点
#at 1643330 :为事件的起点,是以1643330字节开始。
- sqlevent 发生的时间点
#121016 10:51:32:是事件发生的时间,
- serverId
server id 1 :为master 的serverId
- sqlevent终点及花费时间,错误码
end_log_pos 1643885:为事件的终点,是以1643885 字节结束。
execTime 0: 花费的时间
error_code=0:错误码
Xid:事件指示提交的XA事务
Mixed日志说明:
在slave日志同步过程中,对于使用now这样的时间函数,MIXED日志格式,会在日志中产生对应的unix_timestamp()*1000的时间字符串,slave在完成同步时,取用的是sqlEvent发生的时间来保证数据的准确性。另外对于一些功能性函数slave能完成相应的数据同步,而对于上面指定的一些类似于UDF函数,导致Slave无法知晓的情况,则会采用ROW格式存储这些Binlog,以保证产生的Binlog可以供Slave完成数据同步。
二、恢复数据
- 基于时间点恢复
mysqlbinlog --start-datetime="2021-11-27 16:23:26" --stop-datetime="2021-11-27 16:23.27" 二进制文件 | mysql -uroot -p
- 基于pos恢复
mysqlbinlog 二进制文件 --start-position 208956514 --stop-position 208956970 | mysql -uroot -p