Skip to content

MySQL通过Binlog恢复数据

TIP

Mysql Binlog是二进制格式的日志文件 Binlog是用来记录Mysql内部对数据库的改动(只记录对数据的修改操作),主要用于数据库的主从复制以及增量恢复

binlog使用场景

  • 数据恢复:通过mysqlbinlog工具来恢复数据。
  • mysql主从复制:mysql replication在master端开启binlog,master把它的二进制日志传递给slaves来达到master-slave数据一致的目的。

binlog日志常用命令

查看是否开启binlog

shell
show variables like 'log_bin';

查看MySQL的binlog模式

shell
show global variables like "binlog%";

查看日志开启状态

shell
show variables like 'log_%';

查看所有binlog日志列表

shell
show master logs;

查看最新一个binlog信息

  • 查看最新一个binlog日志的编号名称,及其最后一个操作事件结束点
shell
show master status;

刷新log日志

  • 刷新log日志,立刻产生一个新编号的binlog日志文件,跟重启一个效果
shell
flush logs;

清空所有binlog日志

shell
reset master;

开启binlog

修改配置文件

修改mysql的my.cnf配置文件,一般默认是在/etc/my.cnf路径下,简单开启binlog demo 在mysqld区块下添加

shell
#开启binlog日志
log_bin=ON
#binlog日志的基本文件名
log_bin_basename=/var/lib/mysql/mysql-bin
#binlog文件的索引文件,管理所有binlog文件
log_bin_index=/var/lib/mysql/mysql-bin.index
#配置serverid
server-id=1
#加入此参数才能记录到insert语句
binlog_format=MIXED
  • Mysql binlog日志有三种格式 【binlog-format参数】
  1. Statement:每一条会修改数据的sql都会记录在binlog中
  2. Row:不记录sql语句上下文相关信息,仅保存哪条记录被修改
  3. Mixedlevel:是以上两种level的混合使用,一般的语句修改使用statment格式保存binlog,如一些函数,statement无法完成主从复制的操作,则采用row格式保存binlog,MySQL会根据执行的每一条具体的sql语句来区分对待记录的日志形式,也就是在Statement和Row之间选择一种.新版本的MySQL中对row level模式也被做了优化,并不是所有的修改都会以row level来记录,像遇到表结构变更的时候就会以statement模式来记录。至于update或者delete等修改数据的语句,还是会记录所有行的变更。

修改完配置后,重启Mysql服务

使用Binlog恢复数据

  1. 在宝塔终端或者ssh中root权限下,使用命令
shell
/www/server/mysql/bin/mysqlbinlog --start-datetime="2022-04-23 12:00:00" --stop-datetime="2022-05-11 11:00:00" /www/server/data/mysql-bin.0000* > redata.sql

其中的/www/server/mysql/bin/mysqlbinlog是mysqlbinlog程序的位置,这样写的好处是不用增加配置系统环境变量,start和stop是划定时间段,注意结束时间不能是删除数据库之后的时间,也就是整个时间段必须在删除数据库之前,假如无法精确,那尽量提前到几天前,开始的时间要早于数据库建立的时间,假如记不清,那可以删掉开始时间,简写为

shell
/www/server/mysql/bin/mysqlbinlog --stop-datetime="2022-05-11 11:00:00" /www/server/data/mysql-bin.0000* > redata.sql

注意mysql-bin.0000*的写法是包含了全部所有的数据库信息,执行起来比较费时,假如你可以根据mysql-bin文件的大小和修改时间,确定某个具体的mysql-bin文件,那也可以写具体文件名,例如mysql-bin.000001,一般对应的文件都比较大。

  1. 进入 /www/server/data 目录下查看redata.sql或者全局搜索 redata.sql是否出现了,假如有了redate.sql文件,在数据库中新建数据库,数据库名最好和删掉的数据库同名,然后执行下面的命令
shell
mysql -uroot -p -f 新建数据库名 < redata.sql
  • 假如一切顺利,你的数据库会恢复到删除前的状态

上次更新于: