mysqlbin恢复数据

Posted by 令德湖周杰伦 on 10-10,2020

一、开启binlog

1. 修改my.cnf文件:

server_id=1
log-bin=mysql-bin
binlog-format=ROW
重启服务

2. 登陆查看是否开启,以及binlog日志的位置

show variables like '%log_bin%';

mysqlbinlog1.jpg

3. 查看所有binlog日志列表:

show master logs;

4. 查看master状态

即最后(最新)一个binlog日志的编号名称,及其最后一个操作事件pos结束点(Position)值

show master status;

5. 刷新log日志

自此刻开始产生一个新编号的binlog日志文件

flush logs;

6. 重置(清空)所有binlog日志

reset master;

7. 查看binlog日志

方式一:用bin目录下面的mysqlbinlog命令

./mysqlbinlog  ../xx/mysql-bin.000011

方式二:登陆mysql,使用show binlog events命令,可以格式化数据,方便观察,还可以选择其他参数,如from,limit

show binlog events in '../xx/mysql-bin.000011';

二、备份数据

备份数据主要是在晚上通过定时任务去全局备份之前的数据。
使用mysqldump命令

./mysqldump -uroot -p -B -F -x  --master-data=2  test1 | gzip > ../xx/backup/test1.bak.sql.gz

解释:
-B:指定数据库;
-F:刷新日志,这样就会重新开始开始记录binlog;
-x:锁表
--master-data=2:在备份语句里添加CHANGE MASTER语句以及binlog文件及位置点信息
test1:为要备份的数据库名称
gzip > ../xx/backup/test1.bak.sql.gz:压缩到指定目录

三、测试误操并恢复

测试删除作流程

  1. test1库下对表进行操作
  2. 删除数据库test1, 即drop database test1;

恢复流程:

  1. 先将备份后产生数据的binlog拷贝
    拷贝最新的binlog日志mysql-bin.00001x到指定文件夹
cp /xx/mysql-bin.00001x   /xx/backup/
  1. 刷新binlog日志
    刷新binlog日志,重新开始新的binlog日志记录文件,不影响后续的操作。

  2. 开始恢复备份数据
    解压:

zip -d /xx/backup/test1.bak.sql.gz

导入数据:

./mysql -uroot -p  < /xx/backup/test1.bak.sql
  1. 查看增量数据的biglog,确定恢复点
    即查看步骤一copy的增量binlog,确定恢复点,即drop前一个的end-position
show binlog events in 'mysql-bin.00001x';
  1. 恢复
./mysqlbinlog --stop-position=1270 --database=test1 ../backup/mysql-bin.00001x | ./mysql -uroot -p

--stop-position=1270,指的是恢复到end-position=1270这个点
其他参数:
--start-position=875 起始pos点
--stop-position=954 结束pos点
--start-datetime="2018-9-25 22:01:08" 起始时间点
--stop-datetime="2020-9-25 22:09:46" 结束时间点
--database=test1 指定只恢复test1数据库(一台主机上往往有多个数据库,只限本地log日志)

另一种手动恢复办法

找到drop语句,手动编辑,删除drop语句,再全部导入增量binglog

  1. 将binlog日志转换为sql
./mysqlbinlog /xx/backup/mysql-bin.00001x > /xx/backup/00001x.sql
  1. 手动删除
vim /xx/backup/00001x.sql
  1. 导入
./mysql -uroot -p  < /xx/backup/00001x.sql