基于binlog的MySQL增量恢复实验

简单说明:

本博文包含单库备份恢复实验和全库备份恢复实验俩实验
依据《CentOS6实验机模板搭建部署》和
《CentOS6u9 使用Mariadb官方yum源安装最新Stable版本命令简录》部署MySQL库
继续配置binlog:

HOSTNAME=mariadb
hostname $HOSTNAME
echo "$(grep -E '127|::1' /etc/hosts)">/etc/hosts
echo "$(ifconfig eth0|grep inet|awk -F'[ :]' '{print $13}') $(hostname)">>/etc/hosts
sed -i "s/^HOSTNAME.*$/HOSTNAME=$HOSTNAME/g" /etc/sysconfig/network
ping -c 3 $(hostname)

# 在配置文件[mysqld]标签下追加binlog配置
cat >>/etc/my.cnf<<EOF
log-bin=/var/lib/mysql/binlog
binlog_cache_size=32K
max_binlog_cache_size=60M
max_binlog_size=50M
binlog-format=ROW
expire_logs_days=7
EOF
/etc/init.d/mysql restart

# 查看是否生效
mysql -uroot -pvincent
show variables like 'log_bin%';
system du -sh /var/lib/mysql/binlog*
exit

建库,跑脚本模拟业务:

创建两个业务库和对应的业务表:

mysql -uroot -pvincent
create database vincent1;
create database vincent2;
create table vincent1.test1
(id int,dt timestamp NOT NULL DEFAULT NOW());
create table vincent2.test1
(id int,dt timestamp NOT NULL DEFAULT NOW());
GRANT ALL PRIVILEGES ON vincent1.* TO 'vincent1'@'%' IDENTIFIED BY 'vincent1';
GRANT ALL PRIVILEGES ON vincent2.* TO 'vincent2'@'%' IDENTIFIED BY 'vincent2';
flush privileges;
exit

后台执行脚本模拟生产:

cat >/tmp/test1.sh<<EOF
SQL1='insert into vincent1.test1(id) select count(id) from vincent1.test1;'
while true;do echo \${SQL1}|mysql -uroot -pvincent;sleep 1;done &
EOF
cat >/tmp/test2.sh<<EOF
SQL2='insert into vincent2.test1(id) select count(id) from vincent2.test1;'
while true;do echo \${SQL2}|mysql -uroot -pvincent;sleep 1;done &
EOF
bash /tmp/test1.sh &
bash /tmp/test2.sh &

源库备份方法:

全库备份:

mysqldump -uroot -pvincent --flush-privileges \
--single-transaction --master-data=2 --triggers \
--routines --events --hex-blob -A >/tmp/Full_Backup.sql

多业务库备份:

mysqldump -uroot -pvincent --flush-privileges \
--single-transaction --master-data=2 --triggers \
--routines --events --hex-blob -B vincent1 vincent2 >/tmp/Muti_Backup.sql

单库备份:

mysqldump -uroot -pvincent --flush-privileges \
--single-transaction --master-data=2 --triggers \
--routines --events --hex-blob vincent1 >/tmp/Vincent1_Backup.sql
# 注意,未使用-B参数,不包含建库语句,恢复时需要提前建库,然后指定该库

基于binlog的全库恢复实验:

依据简单说明中的实验机部署部分部署另外一台MySQL库
源库停掉脚本,传输备份到恢复库主机:

ps -ef|grep test|grep -v grep|awk '{print $2}'|xargs kill -9
mysql -uroot -pvincent
select max(id) from vincent1.test1;
select max(id) from vincent2.test1;
exit
# 3867
# 3757
scp /tmp/*.sql /var/lib/mysql/binlog.* 192.168.77.11:/tmp/

目标库全库恢复:

# 依据全备文件,定位起始binlog日志文件和pos
cd /tmp/
head -30 Full_Backup.sql|grep CHANGE
# -- CHANGE MASTER TO MASTER_LOG_FILE='binlog.000002', MASTER_LOG_POS=268403;

# 抽取全备点之后的binlog日志
mysqlbinlog binlog.000002 --start-position=268403 >Full_binlog.sql
# 如果有其他binlog日志,则追加即可:
# mysqlbinlog binlog.000003 >>Full_binlog.sql

# 全库恢复
mysql -uroot -pvincent < Full_Backup.sql

# 追加binlog,增量恢复
mysql -uroot -pvincent < Full_binlog.sql

# 测试:
mysql -uroot -pvincent
select max(id) from vincent1.test1;
select max(id) from vincent2.test1;
select User,Host from mysql.user where user!='root';
exit
# 3867
# 3757
# vincent1
# vincent2
# 因为是全库恢复,因此创建的账号和俩业务库全部恢复
# 业务库中的表数据和源端保持一致,增量恢复成功

基于binlog的单库恢复实验:

使用单库备份,选择vincent1库做恢复测试

# 依据单备文件,定位起始binlog日志文件和pos
cd /tmp/
head -30 Vincent1_Backup.sql|grep CHANGE
# -- CHANGE MASTER TO MASTER_LOG_FILE='binlog.000002', MASTER_LOG_POS=362938;

# 抽取全备点之后的binlog日志,使用参数-d只抽取vincent1库相关操作
mysqlbinlog binlog.000002 -d vincent1 --start-position=362938 >Vincent1_binlog.sql
# 如果有其他binlog日志,则追加即可:
# mysqlbinlog -d vincent1 binlog.000003 >>Vincent1_binlog.sql

# 删除已经恢复的数据,做单库恢复
mysql -uroot -pvincent -e "drop database vincent1;"
mysql -uroot -pvincent -e "drop database vincent2;"
mysql -uroot -pvincent -e "drop user vincent1;"
mysql -uroot -pvincent -e "drop user vincent2;"
mysql -uroot -pvincent -e "flush privileges;"
# 因为单库备份脚本没有使用-B参数,无建库语句,因此要手动建库
mysql -uroot -pvincent -e "create database vincent1;"
mysql -uroot -pvincent -o vincent1 < Vincent1_Backup.sql

# 追加binlog,增量恢复
mysql -uroot -pvincent < Vincent1_binlog.sql

# 测试:
mysql -uroot -pvincent
select max(id) from vincent1.test1;
select max(id) from vincent2.test1;
select User,Host from mysql.user where user!='root';
exit
# 3867
# 表不存在
# 无root账号之外的账号
# 因为是单库恢复,因此创建的业务账号和第二个业务库全部没有恢复
# 业务库1中的表数据和源端保持一致,增量恢复成功

[TOC]

猜你喜欢

转载自blog.csdn.net/zwjzqqb/article/details/80886107