写入测试数据
创建脚本,脚本将创建一个single库,s1表,持续写入数据。
vim /root/bin/mysql_test.sh
#!/bin/bash
#混合测试数据库脚本
#将创建一个single数据库,其中创建一个s1表
#如果数据库存在,将会写入数据,可以在写入部分sleep 1 来让数据持续写入
#使用方法 ./xx.sh -uroot -p'123456'
#检查
mysql $*
-e "show databases;"
&>
/tmp/info_error.txt
if
[[ $?
-ne 0
]];then
echo "time:$(date +%F-%H-%M-%S) info:登陆命令错误"
cat /tmp/info_error.txt #如果错误则显示错误信息
echo
echo "./xx.sh -uroot -p'123456'"
exit 1
fi
#检查库是否存在
mysql $*
-e "use single;"
&>
/tmp/info_error.txt
if
[[ $?
-eq 0
]];then
mysql $*
-e "use single;select * from s1 where id=1;"
if
[[ $?
-ne 0
]];then
mysql $*
-e "use single;drop table s1;"
mysql $*
-e "use single;create table s1(id int AUTO_INCREMENT PRIMARY KEY,name char(20),age int);"
fi
else
mysql $*
-e "create database single;"
mysql $*
-e "use single;create table s1(id int AUTO_INCREMENT PRIMARY KEY,name char(20),age int);"
fi
#name随机数
random_name()
{
local 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
local a=`echo $[RANDOM%24]`
echo -n ${zu[a]}
done
}
#age随机数
random_age()
{
local a=`echo $[RANDOM%99]`
echo $a
}
#写入部分
for i in
`seq 1
1000`
do
b=`random_name`
c=`random_age`
sleep 2
mysql $*
-e "use single;insert into s1(name,age) values('${b}',${c});"
done
执行脚本,持续写入测试数据
bash /root/bin/mysql_test.sh -uroot -p'123456'
1.开启另一个终端,检查数据是否在写入
mysql -uroot -p'123456' -e "use single;select count(*) from s1;"
2.进行全备份,返回ok正确
cd /root/bin
bash mybak-all.sh
3.模拟第一天晚上,因为在持续写入数据,等一会再进行增量备份,并备份binlog
bash mybak-section.sh
bash mybak-binlog.sh -uback -p'123456'
4.等一会,模拟第二天晚上
bash mybak-section.sh
bash mybak-binlog.sh -uback -p'123456'
1.模拟出现问题了,停止写入 ctl + c
2.查看当前总数据,为129条
mysql -uroot -p'123456' -e "use single;select count(*) from s1;"
3.模拟误删除数据库
mysql -uroot -p'123456' -e "drop database single;"
4.对最新的状态备份binlog
bash mybak-binlog.sh -uback -p'123456'
5.关闭mysql
systemctl stop mysql
6.删除数据目录,否则无法恢复
rm -fr /usr/local/mysql/data/*
7.对全备份进行封装,返回ok正确
innobackupex --apply-log --redo-only /bak/mysql-xback/all-backup/
8.合并第一次模拟到全备份,最后一个参数是指定全备份
innobackupex --apply-log --redo-only --incremental-dir=/bak/mysql-xback/2018-12-12-14-51-26/ /bak/mysql-xback/all-backup/
9.合并第二次模拟到全备份
innobackupex --apply-log --redo-only --incremental-dir=/bak/mysql-xback/2018-12-12-14-52-47/ /bak/mysql-xback/all-backup/
10.开始恢复
innobackupex --copy-back /bak/mysql-xback/all-backup/
11.添加权限并启动
chown -R mysql.mysql /usr/local/mysql/data/
systemctl start mysql
12.查看数据恢复到125条,正常前是129条
mysql -uroot -p'123456' -e "use single;select count(*) from s1;"
13.查看备份时的pos点
cat /bak/mysql-xback/2018-12-12-14-52-47/xtrabackup_info | grep binlog_pos
显示如下 binlog_pos = filename ‘mysql-bin.000003’, position ‘1509’
14.解压最后2个binlog压缩包
cd /bak/mysql-binback/
tar -xf mybak-section-2018-12-12-15-07.tar.gz
tar -xf mybak-section-2018-12-12-15-15.tar.gz
15.进入第二个包,它是在最后一次增量备份后才执行的binlog
cd mybak-section-2018-12-12-15-07
将1509pos点之前的行删除,每个binlog文件前18行要保留
mysqlbinlog mysql-bin.000003 > 03.log
cat 03.log | grep -n 1509
恢复数据
cat 03.log | mysql -uroot -p'123456'
当前总是为128
mysql -uroot -p'123456' -e "use single;select count(*) from s1;"
16.进入倒数第一个包,它存放出问题之前的数据
cd mybak-section-2018-12-12-15-15
将drop这个有问题的指令之后的行删除
mysqlbinlog mysql-bin.000004 > 04.log
cat 04.log | grep -n drop
恢复数据
cat 04.log | mysql -uroot -p'123456'
当前总是为129
mysql -uroot -p'123456' -e "use single;select count(*) from s1;"
进入到脚本目录
cd /root/bin
执行重写脚本
bash mybak-rewrite.sh
可以看到原先目录只有一个全备份
ls /bak/mysql-xback/
原先的全备份和增量备份的打包
ls -lh /bak/xback/
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
扫码关注腾讯云开发者
领取腾讯云代金券
Copyright © 2013 - 2025 Tencent Cloud. All Rights Reserved. 腾讯云 版权所有
深圳市腾讯计算机系统有限公司 ICP备案/许可证号:粤B2-20090059 深公网安备号 44030502008569
腾讯云计算(北京)有限责任公司 京ICP证150476号 | 京ICP备11018762号 | 京公网安备号11010802020287
Copyright © 2013 - 2025 Tencent Cloud.
All Rights Reserved. 腾讯云 版权所有