按照第一步,环境需求中,将mysql开启binlog并重启,也可以设置全局变量,不用重启
vim /root/bin/mybak-all.sh
,将全量脚本复制到其中,并 chmod+ x /root/bin/mybak-all.sh
添加执行权限。
vim /root/bin/mybak-section.sh
,将增量脚本复制到其中,并 chmod +x /root/bin/mybak-section.sh
添加执行权限。
创建测试数据库
create database test;
切换数据库
use test;
创建测试表
create table s1(id int AUTO_INCREMENT PRIMARY KEY,name char(20),age int);
用 vim /root/bin/testsql.sh
命令创建一个数据插入脚本,随机插入一千条数据用于测试。
#!/bin/bash
ku=one
biao=s1
zi()
{
zu=(q w e r t y u i o p a s d f g h j k l z x c v b n m)
for i in
`seq 1
5`
do
a=`echo $[RANDOM%24]`
echo -n ${zu[a]}
done
}
for i in
`seq 1
1000`
do
b=`zi`
mysql -uroot -p'123456'
-e "use test;insert into s1(name,age) values('${b}',${i});"
done
执行脚本
bash /root/bin/testsql.sh
用如下命令检查表的条目数是否是1000条
mysql -uroot -p'123456' -e "use test;select count(*) from s1;"
第一次:
更改时间
date -s 2016-04-04
执行全量脚本
bash /root/bin/mybak-all.sh -uroot -p'123456'
再执行增量脚本
bash /root/bin/mybak-section.sh -uroot -p'123456'
查看是否有2个tar包。可以看到tar包
ls /ops/bak
mybak-all-2016-04-04-00-00.tar.gz
mybak-section-2016-04-04-00-00.tar.gz
执行脚本插入1000条数据
bash /root/bin/testsql.sh
用如下命令检查表的条目数是否是2000条
mysql -uroot -p'123456' -e "use test;select count(*) from s1;"
第二次:
更改时间
date -s 2016-04-05
执行全量脚本
bash /root/bin/mybak-all.sh -uroot -p'123456'
再执行增量脚本
bash /root/bin/mybak-section.sh -uroot -p'123456'
用查看是否有4个tar包。可以看到如下
ls /ops/bak
mybak-all-2016-04-04-00-00.tar.gz / mybak-section-2016-04-04-00-00.tar.gz
mybak-all-2016-04-05-00-00.tar.gz / mybak-section-2016-04-05-00-00.tar.gz
执行脚本插入1000条数据
bash /root/bin/testsql.sh
用如下命令检查表的条目数是否是3000条
mysql -uroot -p'123456' -e "use test;select count(*) from s1;"
第三次
更改时间
date -s 2016-04-06
执行全量脚本
bash /root/bin/mybak-all.sh -uroot -p'123456'
再执行增量脚本
bash /root/bin/mybak-section.sh -uroot -p'123456'
用查看是否有4个tar包。可以看到如下
ls /ops/bak
mybak-all-2016-04-04-00-00.tar.gz / mybak-section-2016-04-04-00-00.tar.gz
mybak-all-2016-04-05-00-00.tar.gz / mybak-section-2016-04-05-00-00.tar.gz
mybak-all-2016-04-06-00-00.tar.gz / mybak-section-2016-04-06-00-00.tar.gz
执行脚本插入1000条数据
bash /root/bin/testsql.sh
用如下命令检查表的条目数是否是4000条
mysql -uroot -p'123456' -e "use test;select count(*) from s1;"
删除: 登陆mysql服务器 mysql -uroot -p’123456’
删除test数据库,用来模拟误操作
drop database test;
恢复第一步:准备
移动到备份所在的目录
cd /ops/bak
解开最近时间点的全量备份包,最近时间是2016-04-06
tar -xf mybak-all-2016-04-06-00-00.tar.gz
解压后可以看到 mybak-all-2016-04-06-00-00.sql 和 2016-04-06-00-00-binlog.txt
其中mybak-all-2016-04-06-00-00.sql 是sql语句,用于恢复某个时间点的全部内容,如果只误操作某个库,可以单独恢复某个库。2016-04-06-00-00-binlog.txt中记录了全备过程中刷新的Binlog文件名。
解压增量备份的文件夹 ,因为这2个脚本是先后执行的,所以不需要解压6号前的,只解压6号及以后的。
tar -xf mybak-section-2016-04-06-00-00.tar.gz
解压后可以看到 mysql-bin.000008 和 mysql-bin.000009 2个binlog日志
恢复第二步:全备份恢复
导入数据进去
mysql -uroot -p'123456' < mybak-all-2016-04-06-00-00.sql
用如下命令检查表的条目数是否是3000条,6号备份完成后,才添加的最后1000条。
mysql -uroot -p'123456' -e "use test;select count(*) from s1;"
恢复第三步:增量恢复
查看应该从哪个binlog文件恢复。当前获得 ./mysql-bin.000014
cat 2016-04-06-00-00-binlog.txt
将 mybak-section-2016-04-06-00-00 文件夹中的 mysql-bin.000014 恢复,因为操作有问题的binlog日志在15中,14日志可以直接用于恢复
mysqlbinlog mybak-section-2016-04-06-00-00/ysql-bin.000014 | mysql -uroot -p'123456'
检查表的条目数是否是3000条,因为在写入3000条后,mysqldmp全备刷新了一下binlog,这个最新的是14,而还没有写入任何东西时便执行增量备份了,刷新了一下binlog,最新的是15,这时候才导入了最新的1000条。如果是持续的在写入,恢复14后会有数据变化。
mysql -uroot -p'123456' -e "use test;select count(*) from s1;"
在mysql数据目录/ops/server/mysql/data/下找到mysql-bin.000015
找出binlog日志中有删除数据库语句的行数,当前为728
mysql -uroot -p'123456' -e "show binlog events in 'mysql-bin.000015'\G" | grep -n "drop database "
找出728前后几行的内容,可以看到出现问题的pos点为5519,恢复到5519之前的数据即可。
mysql -uroot -p'123456' -e "show binlog events in 'mysql-bin.000015'\G" | sed -n '715,730p'
进行恢复,stop-position是指定恢复截止的pos点。
mysqlbinlog --stop-position=5519 mysql-bin.000015 | mysql -uroot -p'123456'
检查表的条目数是否是4000条
mysql -uroot -p'123456' -e "use test;select count(*) from s1;"
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。