MySQL 通过binlog日志恢复数据

MySQL 通过binlog日志恢复数据

​ Binlog日志,即binary log,是二进制日志文件,有两个作用,一个是增量备份,另一个是主从复制,即主节点维护一个binlog日志文件,从节点从binlog中同步数据,也可以通过binlog日志来恢复数据。

一、查看

  1. 登录mysql查看binlog日志的状态
# 查看binlog,为off关闭状态
show variables like '%log_bin%';
  1. 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
  1. biglog 日志文件

Binlog日志包括两类文件;第一个是二进制索引文件(后缀名为.index),第二个为日志文件(后缀名为.00000*),记录数据库所有的DDL和DML(除了查询语句select)语句事件

  1. 查看所有binlog日志文件列表
show master logs;
# 只查看第一个binlog文件的内容
show binlog events;
# 查看指定binlog文件的内容
show binlog events in '二进制文件名';
# 查看当前正在写入的binlog文件
show master status\G
  1. 查看最后一个binlog日志的编号名称及其最后一个操作事件pos结束点的值
show master status; 
  1. 刷新日志Flush logs

刷新日志,此刻开始产生一个新编号的binlog文件,例如:
MySQL 通过binlog日志恢复数据_第1张图片

每当mysqld服务重启时,会自动执行刷新binlog日志命令,mysqldump备份数据时加-F选项也会刷新binlog日志

  1. 清空所有binlog日志命令
reset master;
  1. 查看binlog文件内容

使用查看工具mysqlbinlog来查看(cat/vi/more都是无法打开的)

注意:

  1. 不要查看当前正在写入的binlog文件

  2. 不要加–force参数强制访问

  3. 如果binlog格式是行模式的,请加 -vv参数

8.1 本地查看

  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 输出文件名
  1. 基于pos值
mysqlbinlog --start-postion=107 --stop-position=1000 -d 库名 二进制文件
  1. 远程查看
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
  1. 输出文件

binlog日志文件记录为ROW格式

# 将row格式的binlog日志文件base64解析后转入文件,-v代表换行展示
mysqlbinlog --base64-output=decode-rows -v 二进制文件 --result-file 输出文件名

日志文件格式

  1. 开始事物的时间:

​ SET TIMESTAMP=1350355892/!/;

​ BEGIN

  1. sqlevent起点

​ #at 1643330 :为事件的起点,是以1643330字节开始。

  1. sqlevent 发生的时间点

​ #121016 10:51:32:是事件发生的时间,

  1. serverId

​ server id 1 :为master 的serverId

  1. 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完成数据同步。

二、恢复数据

  1. 基于时间点恢复
 mysqlbinlog --start-datetime="2021-11-27 16:23:26" --stop-datetime="2021-11-27 16:23.27" 二进制文件 | mysql -uroot -p
  1. 基于pos恢复
mysqlbinlog 二进制文件  --start-position 208956514 --stop-position 208956970 | mysql -uroot -p

你可能感兴趣的:(mysql)