Mysql 数据库数据恢复 (利用mysqlbinlog)

323 阅读3分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第5天,点击查看活动详情
Binlog日志,即binary log,是二进制日志文件,有两个作用,一个是增量备份,另一个是主从复制,即主节点维护一个binlog日志文件,从节点从binlog中同步数据,也可以通过binlog日志来恢复数据

1、登录mysql之后使用下面的命令查看是否开启binlog

log_bin = OFF 即为关闭,查看binlog为off关闭状态

show variables like 'log_%';

image.png

2、如何开启binlog

编辑对应的配置文件:vi /etc/my.cnf 加入以下内容:

server_id=2
log_bin = mysql-bin
binlog_format = ROW
expire_logs_days = 30
  1. server-id = 1(单个节点id)
  2. log-bin= mysql-bin(/var/lib/mysql/mysql-bin,位置一般和mysql库文件所在位置一样)
  3. expire_logs_days = 30(表示此日志保存时间为30天)

image.png

3、重启mysql服务

systemctl restart mysqld

4、再次查看是否开启

使用命令:

show variables like 'log_%';

进行查看,为ON表明binlog开启

image.png

5、具体流程

1、查看所有binlog日志文件列表

show master logs;

image.png

2、查看最后一个binlog日志的编号名称及其最后一个操作事件pos结束点的值:

show master status;

image.png

3、Flush logs 刷新日志,此刻开始产生一个新编号的binlog文件,例如:

flush logs

image.png

每当mysqld服务重启时,会自动执行刷新binlog日志命令,mysqldump备份数据时加-F选项也会刷新binlog日志
4、清空所有binlog日志命令:reset master;
5、查看binlog文件内容,使用查看工具mysqlbinlog来查看(cat/vi/more都是无法打开的)
6、上面的方法读取内容较多不易观察,以下命令更为方便查看命令:

1、使用mysqlbinlog自带查看命令法

注意:

  • binlog是二进制文件,普通文件查看器cat、more、vim等都无法打开,必须使用自带的mysqlbinlog命令查看。
  • binlog日志与数据库文件在同目录中。
  • 在Mysql5.5以下版本使用mysqlbinlog命令时如果报错,就加上"--no-defaults"选项
  • 使用mysqlbinlog命令查看binlog日志内容,下面截取其中的一个片段分析分析:
show binlog events in 'mysql-bin.000001';

上面这种办法读取出binlog日志的全文内容比较多,不容易分辨查看到pos点信息,下面介绍一种更为方便的查询命令

show binlog events [IN 'log_name'] [FROM pos] [LIMIT [offset,] row_count];

参数解释:

  • IN 'log_name':指定要查询的binlog文件名(不指定就是第一个binlog文件)
  • FROM pos:指定从哪个pos起始点开始查起(不指定就是从整个文件首个pos点开始算)
  • LIMIT【offset】:偏移量(不指定就是0)
  • row_count :查询总条数(不指定就是所有行)

image.png 指定查询,从pos点406开始查询,如下:

image.png

7、找到日志存放地方:

如:/usr/local/mysql/data 或者 /var/lib/mysql

mysqlbinlog --no-defaults --start-position=236 --stop-position=163577350 mysql-bin.000010 | mysql -uroot -p;