一、开启binlog
1. 修改my.cnf文件:
server_id=1
log-bin=mysql-bin
binlog-format=ROW
重启服务
2. 登陆查看是否开启,以及binlog日志的位置
show variables like '%log_bin%';
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:压缩到指定目录
三、测试误操并恢复
测试删除作流程
- test1库下对表进行操作
- 删除数据库test1, 即drop database test1;
恢复流程:
- 先将备份后产生数据的binlog拷贝
拷贝最新的binlog日志mysql-bin.00001x到指定文件夹
cp /xx/mysql-bin.00001x /xx/backup/
-
刷新binlog日志
刷新binlog日志,重新开始新的binlog日志记录文件,不影响后续的操作。 -
开始恢复备份数据
解压:
zip -d /xx/backup/test1.bak.sql.gz
导入数据:
./mysql -uroot -p < /xx/backup/test1.bak.sql
- 查看增量数据的biglog,确定恢复点
即查看步骤一copy的增量binlog,确定恢复点,即drop前一个的end-position
show binlog events in 'mysql-bin.00001x';
- 恢复
./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
- 将binlog日志转换为sql
./mysqlbinlog /xx/backup/mysql-bin.00001x > /xx/backup/00001x.sql
- 手动删除
vim /xx/backup/00001x.sql
- 导入
./mysql -uroot -p < /xx/backup/00001x.sql