binlog是二进制日志文件,用于记录mysql的数据变更,数据在恢复的时候binlog日志能起到很大的作用。mysql的主从复制就是利用的binlog原理
本文目录
一、开启binlog
二、测试数据恢复
一、开启binlog
1、登录mysql之后使用下面的命令查看是否开启binlog
show variables like 'log_%';
2、编辑配置文件
vi /etc/my.cnf
3、在mysqld
下面加入以下内容
`server_id=2`
`log_bin = mysql-bin`
`binlog_format = ROW`
`expire_logs_days = 30`
4、重启mysql服务
systemctl restart mysqld
5、再次使用命令show variables like 'log_%';
进行查看,为ON表明binlog开启
6、binlog日志文件存放路径为
/var/lib/mysql
7、再该路径下会生成mysql-bin.000001 mysql-bin.000002
这样的文件
二、测试数据恢复
1、准备测试数据
模拟数据库的备份
查看现在的binlog的日志
show master status;
数据库会在每天凌晨4点进行一次完全备份的定时计划任务。这里手动执行下,将数据库备份。备份到/home/wg/下
sudo mysqldump -uroot -p -B -F -R -x --master-data=2 my_test | gzip > ./bak_$(date +%F).sql.gz
注意 date后面的空格。
参数说明:
-B:指定数据库
-F:刷新日志
-R:备份存储过程等
-x:锁表
--master-data:在备份语句里添加CHANGE MASTER语句以及binlog文件及位置点信息
删除数据库表
drop table test1;
查看binlog日志,在/var/lib/mysql
目录下,如下命令查看:
show binlog events in 'mysql-bin.000001';
通过分析,造成数据库破坏的pos点区间是介于 387--1393 之间(这是按照日志区间的pos节点算的)。所以只要恢复到1328就可以了 后面的1393是操作drop的时间节点
恢复语法
恢复命令的语法格式:
mysqlbinlog mysql-bin.0000xx | mysql -u用户名 -p密码 数据库名
常用参数选项解释:
--start-position=387 起始pos点
--stop-position=1393 结束pos点
--start-datetime="2020-06-01 12:04:08" 起始时间点
--stop-datetime="2020-06-01 12:49:46" 结束时间点
--database=my_test 指定只恢复my_test数据库(一台主机上往往有多个数据库,只限本地log日志)
我们只需要从创建表节点387,恢复到drop之前就好了,完整的命令如下:
sudo mysqlbinlog mysql-bin.000001 --start-position 387 --stop-position 1393 | sudo mysql -uroot -p my_test
到此,恢复完成