MySQL中如何用全库备份恢复单张表

一、概述
模拟场景:下面模拟逻辑备份与物理备份两种方式恢复单表方法,利用完整备份+binlog恢复单表,某天某张表意外删除,如何从全备中恢复单表?


二、安装部署
2.1Mysql安装
(我的模拟环境数据版本为:5.7.36 ,此处省略相关操作)


2.2  xtrabackup-2.4.24 安装(物理备份)
官网地址:https://www.percona.com/downloads/Percona-XtraBackup-2.4/LATEST/

安装依赖包:
yum -y install wget
wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
yum -y install perl perl-devel libaio libaio-devel perl-Time-HiRes perl-DBD-MySQL libev

下载并安装 安装路径任意(rpm包)
wget https://www.percona.com/downloads/XtraBackup/Percona-XtraBackup-2.4.24/binary/redhat/7/x86_64/percona-xtrabackup-24-2.4.24-1.el7.x86_64.rpm
 
yum -y install percona-xtrabackup-24-2.4.24-1.el7.x86_64.rpm

安装后检查一下
which innobackupex
which xtrabackup

三、物理备份与还原(xtrabackup)
3.1全量备份
(说明:主节点上进行全量备份,自定义备份路径名称:/data/backup/xbk/full_`date +%F`)
innobackupex --user=root --password=123   --no-timestamp /data/backup/xbk/full_`date +%F`
innobackupex --apply-log  /data/backup/xbk/full_2022-05-14/

3.2恢复数据(全量备份+binlog备份)
(恢复思路:我们有全量备份+binlog备份,某天误删除主节点db01库中的t1表,如何恢复?保证主节点环境安全,我们先在测试节点操作,主节点的全备文件scp到测试节点进行全备恢复+binlog,然后单独备份在主节点删除的t1表,在将t1单表备份文件导入到主节点恢复)

3.2.1、删除db01库中的t1表
drop table db01.t1;

3.2.2、主节点的全备文件scp到测试库
scp -r /data/backup/xbk/full_2022-05-14 [email protected]:/data/backup/

3.2.3、测试库操作,清空data目录下数据
pkill mysqld
rm -rf /data/3306/mysql/*

3.2.4、恢复主节点scp过来的全备文件,并授权
innobackupex --copy-back /data/backup/full_2022-05-14/
授权
chown -R mysql.mysql /data/3306/mysql/*
启动
mysqld_safe --defaults-file=/etc/my.cnf  --user=mysql &

4、binlog日志恢复
截取binlog日志,在测试节点进行恢复
4.1、测试节点操作:在scp过来的全备文件中查找binlog文件名
more /data/backup/full_2022-05-14/xtrabackup_binlog_info 


4.2、去主节点上将mysql_bin.000009 日志scp到测试节点
scp /data/3306/log/mysqlbinlog/mysql_bin.000009 [email protected]:/data/3306/log/

4.3、测试节点操作:查找binlog最后位置点,用mysqlbinlog解析日志,找到drop之前最后操作的位置点
mysqlbinlog mysql_bin.000009

mysqlbinlog --skip-gtids --start-position=2435 --stop-position=3126 /data/3306/log/mysqlbinlog/mysql_bin.000009 >/data/backup/binlog.sql

4.4、恢复binlog
mysql> set sql_log_bin=0;
mysql> source /data/backup/binlog.sql
mysql> set sql_log_bin=1;
 

5、在测试节点上已把删除的t1表以及备份后的操作全部恢复完成,在测试节点上进行t1单表备份,在将t1单表备份文件导入到主节点恢复

5.1、用mysqldump对db01库下的t1表进行备份
mysqldump db01 -uroot -p --set-gtid-purged=off > /data/backup/db01_t1.sql

5.2、将上方单表备份db01_t1.sql文件,scp到主节点
scp /data/backup/db01_t1.sql [email protected]:/data/backup/

5.3、主节点上操作,恢复t1表数据,至此主节点被删的t1表恢复完成
mysql -uroot -p db01 < db01_t1.sql

四、逻辑备份与还原(mysqldump)


4.1全量备份
(场景:周一晚上进行全量备份,参数解释:-u(用户名)-p(密码)-A(全库备份 )-R(导出存储过程和函数)--single-transaction(设置事务的隔离级别)--triggers(触发器)--master-data=2(把change log那行注释掉,=1是没有注释)-set-gtid-purged=OFF (会记录binlog日志,如果不加,不记录binlog日志)>定向输出到文件,文件不存在,就创建文件)
mysqldump -uroot -p123  -A  -R  --single-transaction --triggers --master-data=2  --set-gtid-purged=OFF>/data/backup/all.sql


模拟周二上午数据变化,下午误删除t1表
mysql>use db01 ;
mysql>insert into t1 values(1),(2),(3);
mysql>commit;
mysql>drop table  t1;


4.2恢复数据(全量备份+binlog备份)
(恢复思路:我们用全量备份+binlog备份,恢复t1表,需要处理全备,在全备中截取create.sql+insert.sql+binlog.sql)

在全备中截取建表语句(路径根据自己的修改)
sed -n '/CREATE TABLE `t1` /,/\;/p' /data/backup/all.sql >/data/backup/create.sql


在全备中截取插入语句(路径根据自己的修改)
grep -i 'INSERT INTO `t1`'  /data/backup/all.sql >/data/backup/insert.sql


在全备中截取binlog(路径根据自己的修改)
在全备all.sql中查找binlog文件名和起点
vi /data/backup/all.sql
 
查找binlog最后位置点,用mysqlbinlog解析日志,找到drop之前最后操作的位置点
mysqlbinlog mysql_bin.000007

截取binlog的日志(路径根据自己的修改)
mysqlbinlog --skip-gtids --start-position=1775 --stop-position=2152 /data/3306/log/mysqlbinlog/mysql_bin.000007> /data/backup/binlog.sql


恢复数据(create.sql+insert.sql+binlog.sql)
use db01;
set sql_log_bin=0;
source /data/backup/create.sql
source /data/backup/insert.sql
commit;
source /data/backup/binlog.sql
set sql_log_bin=1;
 

 

你可能感兴趣的:(mysql,数据库,运维)