114. MySQL 备份与恢复实战

1、运维人员在备份恢复方面的职责

1.1 设计备份策略 
(1) 备份内容: 数据,二进制日志  
(2) 数据容量: 大小
(3) 备份周期: 
	1. 每天全备
	2. 周期全备+增量备份
	3. 周期全备+日志备份
(4) 备份时间: 晚上备份
(5) 备份目标位置

1.2 日常备份检查
日志 , 备份的内容,备份大小

1.3 定期恢复演练
在测试环境中我建议,每半年做一次.

1.4 故障时的恢复
快速准确恢复数据.

1.5 平台数据迁移
同构平台
异构平台

2、备份工具介绍

2.1 介绍 
mysqldump (MDP)
Percona Xtrabackup(xbk,pbk,pxb)

2.2 区别 
MDP : 逻辑备份,SQL文件,文本形式,可读性高,便于处理,压缩比高,备份相对较慢 ,比较适合于100G以内的备份 
100G   30-40 Min        
xbk : 物理备份,数据文件,可读性较低,压缩比低,备份相对较快,比较适合于100G以上的备份 .
100G   10min
600G  50min 

100 PB   ---拆分数据库--->  MDP   ---压缩->

3、mysqldump

3.1 备份逻辑
将磁盘数据,加载到临时表,转换为SQL(建库,建表,插入语句)
3.2 核心参数 
(1) 连接参数
本地: -u  -p  -S 
远程: -u  -p  -H  -P 

(2) 备份参数
[root@db01 ~]# mkdir -p /data/backup 
[root@db01 ~]# chown -R mysql.mysql /data

-- 基础参数
-- 1. 全备参数 
[root@db01 ~]# mysqldump -uroot -p123 -A >/data/backup/full.sql

-- 2. 单库或多库备份 
[root@db01 ~]# mysqldump -uroot -p123 -B bgx oldboy test world mysql > /data/backup/db.sql

-- 3. 单表或多表备份 
[root@db01 ~]# mysqldump -uroot -p123 world city country >/data/backup/tab.sql

-- 4. 只导出建表语句
[root@db01 ~]# mysqldump -uroot -p123 world city country   --no-data >/data/backup/tab1.sql

-- 高级参数
-- 5. --master-data=2    ******5.5版本以后才有这个参数
(1) 自动记录备份时的binlog filename 及pos;记录二进制位置;可以作为日志截取的起点,也可以作为主从复制的起点
(2) 自动加锁和解锁;针对系统表
(3) 加了--single-transaction , 会有不一样的效果( global read lock is only taken a short time )

mysqldump -uroot -p123 -A --master-data=2 >/data/backup/full.sql

备份的结果:
30 -- CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000003', MASTER_LOG_POS=1162;

-- 6. --single-transaction 开启独立事务,备份InnoDB表的一致性快照.实现InnoDB表的热备功能.
mysqldump -uroot -p123 -A --master-data=2  --single-transaction  >/data/backup/full.sql 

补充:
对于非InnoDB(FTWRL,Flush tables with read lock),对于mysql库下的系统表备份的时候,会加global read lock 

-- 7.  特殊的数据库对象
-R         存储过程和函数
--triggers 触发器
-E         事件 
mysqldump -uroot -p -A --master-data=2  --single-transaction -R  --triggers -E   >/data/backup/full.sql 


-- 8. --max_allowed_packet=128M
1153 - Got a packet bigger than 'max_allowed_packet' bytes 
出现场景: 在数据库有超大比表时,需要加此的参数.



-- 9. 终极备份语句
mysqldump -uroot -p -A --master-data=2  --single-transaction -R  --triggers -E  --max_allowed_packet=128M  |gzip >/data/backup/full_`date +%F`.sql.gz 

4、测试环境模拟故障和恢复(mysqldump 全备+ binlog)

(1) 模拟原始数据 
create database mdp charset utf8mb4;
use mdp
create table t1 (id int);
create table t2 (id int);
create table t3 (id int);
insert into t1 values(1);
commit;
insert into t2 values(1);
commit;
insert into t3 values(1);
commit;
(2) 模拟全备 
mysqldump -uroot -p -A --master-data=2  --single-transaction -R  --triggers -E  --max_allowed_packet=128M  |gzip >/data/backup/full_`date +%F`.sql.gz 

(3) 模拟新的数据
use mdp
insert into t1 values(2);
commit;
insert into t2 values(2);
commit;
insert into t3 values(2);
commit;


(4) 搞破坏 
drop database mdp;

(5) 恢复思路 
 -- 1. 挂维护页
 -- 2. 找测试库
 -- 3. 准备备份
	full
	截取binlog部分
 -- 4. 恢复全备+binlog到测试库 , 业务测试.
 -- 5. 导出故障库数据,恢复到生产 .
 -- 6. 撤维护页.

恢复过程: 

1. 准备备份 
   vim /data/backup/full_2019-12-26.sql30行: 
   -- CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000003', MASTER_LOG_POS=2570;

2. 截取二进制日志 
   -- CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000003', MASTER_LOG_POS=2570;
   起点 :  2570

mysql> show binlog events in 'mysql-bin.000003';
| mysql-bin.000003 | 3388 | Query          |         6 |        3477 | drop database mdp     
终点 : 3388


mysqlbinlog --skip-gtids --start-position=2570 --stop-position=3388 /data/mysql/binlog_3306/mysql-bin.000003 >/data/backup/bin.sql


3. 恢复备份
   set sql_log_bin=0;
   source /data/backup/full_2019-12-26.sql
   source /data/backup/bin.sql
   set sql_log_bin=1;

4. 检查数据
   mysql> show tables;
   mysql> select * from t1;
   mysql> select * from t2;
   mysql> select * from t3;


5. 扩展: 从全备中提取 单库 单表的数据进行恢复
   1、获得表结构

# sed -e'/./{H;$!d;}' -e 'x;/CREATE TABLE `city`/!d;q'  full.sql>createtable.sql

2、获得INSERT INTO 语句,用于数据的恢复

# grep -i 'INSERT INTO `city`'  full.sqll >data.sql &

3.获取单库的备份

# sed -n '/^-- Current Database: `world`/,/^-- Current Database: `/p' all.sql >world.sql

5.Percona Xtrabackup (物理)

基于磁盘的数据文件的备份,以数据页的形式进行拷贝

1.安装

1.1 安装依赖包:
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

1.2 下载软件并安装
wget https://www.percona.com/downloads/XtraBackup/Percona-XtraBackup-2.4.12/binary/redhat/7/x86_64/percona-xtrabackup-24-2.4.12-1.el7.x86_64.rpm

yum -y install percona-xtrabackup-*.rpm

2、备份命令介绍:

xtrabackup
innobackupex    ******

3.备份恢复方式——物理备份

3.1备份流程:
-- INNODB 引擎
(1) 进行 checkpoint,将内存已经提交事务的脏页,刷新到磁盘ibd文件,并且 记录LSN .
(2) 拷贝InnoDB数据(ibd,frm,ibdata1)文件到预定的备份路径.

-- NO-INNODB 非innodb引擎
(1) FLUSH TABLE WITH READ LOCK(FTWRL) Global READ LOCK 全局锁表
(2) 拷贝非InnoDB表各种数据 
(3) 解锁
-- REDO
自动将备份期间的redo变化保存下来.并记录全新的LSN号码.

官方解读:
Percona XtraBackup如何工作
Percona XtraBackup基于InnoDB的崩溃恢复功能。它会复制您的InnoDB数据文件,从而导致数据内部不一致。但随后它将对文件执行崩溃恢复,以使它们再次成为一致的可用数据库。

之所以有效,是因为InnoDB维护重做日志,也称为事务日志。这包含对InnoDB数据的每次更改的记录。当InnoDB 启动时,它将检查数据文件和事务日志,并执行两个步骤。它将已提交的事务日志条目应用于数据文件,并对已修改数据但未提交的所有事务执行撤消操作。

Percona XtraBackup的工作方式是在启动时记住日志序列号(LSN),然后复制掉数据文件。这需要一些时间,因此,如果文件正在更改,则它们会在不同的时间点反映数据库的状态。同时,Percona XtraBackup运行一个后台进程,该进程监视事务日志文件,并从中复制更改。Percona XtraBackup需要连续执行此操作,因为事务日志以循环方式编写,并且可以在一段时间后重新使用。自开始执行以来,Percona XtraBackup需要对数据文件的每次更改都具有事务日志记录。

Percona XtraBackup将 在可用的情况下使用备份锁作为轻量级替代。Percona Server 5.6+中提供了此功能。Percona XtraBackup使用此功能自动复制非InnoDB数据,以避免阻止修改InnoDB表的DML查询。当服务器支持备份锁时,xtrabackup将首先复制InnoDB数据,运行并复制MyISAM表和.frm文件。完成此操作后,将开始文件备份。它将备份.frm, .MRG,.MYD,.MYIFLUSH TABLES WITH READ LOCKLOCK TABLES FOR BACKUP.TRG,.TRN, .ARM,.ARZ,.CSM,.CSV,.par和 .opt的文件。
3.2恢复流程:
1. prepare  准备过程
  (1) redo将变化前滚 
  (2) Undo将未提交的事务进行回滚

2. copy-back 恢复过程 
   cp 命令
   --copy-back  拷贝
3. 对拷贝的文件进行授权操作

4.备份策略介绍 
full + inc + binlog  : 全备+增量+binlog
full + binlog        :全备+日志
diff  差异

5.xbk备份工具使用
[root@db01 ~]# vim /etc/my.cnf
[client]
socket=/tmp/mysql.sock

-- 5.0创建备份数据的路径
mkdir -p /data/backup
-- 5.1 全备
[root@db01 backup]# innobackupex  --user=root --password=123 /data/backup


-- 5.2 全备自定制目录名
[root@db01 backup]# innobackupex  --user=root --password=123 --no-timestamp /data/backup/full_`date +%F`

-- 5.3 备份信息介绍
1.xtrabackup_binlog_info :  备份时间点二进制日志的信息
mysql-bin.000003	4432	411148c1-26bf-11ea-a420-000c298780da:1-32	截取二进制日志的起始点-文件名和起始位置
作用: 二进制日志截取的起点位置.

2.xtrabackup_checkpoints :	备份的类型及lsn相关信息
backup_type = full-backuped  备份类型:全备 
from_lsn = 0	0代表包含了历史以来所有的lsn号码
to_lsn = 227111469	开始的lsn号码
last_lsn = 227111478	下一个增量的开始lsn号码;备份期间没有产生任何数据,数据是一致的
compact = 0
recover_binlog_info = 0

3.xtrabackup_info	详细显示备份信息
4.xtrabackup_logfile	redo日志文件(备份期间产生的数据变化)
[root@db01 full_2019-12-27]# file xtrabackup_logfile 
xtrabackup_logfile: data
存放的是redo日志文件,二进制数据类型,无法用cat查看
3.3增量备份
(0)全备操作:
[root@db01 backup]# innobackupex  --user=root --password=123 --no-timestamp /data/backup/full_`date +%F`

(1) 测试环境模拟周一白天数据变化:
create database xbk charset utf8mb4;
use xbk;
create table t1 (id int);
create table t2 (id int);
create table t3 (id int);
insert into t1 values(1);
commit;
insert into t2 values(1);
commit;
insert into t3 values(1);
commit;

(2) 测试环境模拟周一晚上的增量inc1 
innobackupex  --user=root --password=123 --no-timestamp  --incremental  --incremental-basedir=/data/backup/full_2019-12-27    /data/backup/inc1
参数详解:
	--incremental	打开增量备份的功能
	--incremental-basedir	基于哪个作为参照物[上一天的备份路径]
文件对比:
	[root@db01 inc1]# cat xtrabackup_checkpoints 
	backup_type = incremental
	from_lsn = 620153156
	to_lsn = 620153156
[root@db01 inc1]# cat ../full_2019-12-27/xtrabackup_checkpoints 
	backup_type = full-prepared
	from_lsn = 0
	to_lsn = 620153156	和to_lsn号码应该相同或者相差9位
	last_lsn = 620153165

(3) 测试环境模拟周二白天数据变化
use xbk;
insert into t1 values(2);
commit;
insert into t2 values(2);
commit;
insert into t3 values(2);
commit;

(4) 测试环境模拟周二晚上的增量inc2 
innobackupex  --user=root --password=123 --no-timestamp  --incremental  --incremental-basedir=/data/backup/inc1    /data/backup/inc2

(5) 模拟周三白天的数据变化
use xbk;
insert into t1 values(3);
commit;
insert into t2 values(3);
commit;
insert into t3 values(3);
commit;
3.4故障恢复
项目背景:因误操作导致数据库所有数据丢失
[root@db01 ~]# pkill mysqld
[root@db01 ~]# \rm -rf /data/mysql/data_3306/*

恢复思路: 
	1. 找最近的全备 
	2. 所有增量(inc1,inc2)合并全备(/data/backup/full_2019-12-27 )3. 备份的prepare(应用redo和undo;前滚+回滚)
	4. 恢复备份cp ,改权限
	5. 启动数据库【数据目录为空才能恢复,若部分数据丢失,需找测试库】
	6. 截取周二备份到周三故障点的binlog日志,进行恢复.
3.5. 增量合并并准备
This option should be used when preparing the base full
backup and when merging all incrementals except the last one. 
各个备份的,lsn能够连续.当准备基本满负荷时,应使用此选项
备份和合并除最后一个增量之外的所有增量时。

(1) base_full 的 prepared --apply-log【前滚+回滚】基础库备份
[root@db01 ~]# innobackupex --apply-log --redo-only /data/backup/full_2019-12-27	准备备份
参数详解:
	--apply-log【恢复之前要做一个准备工作;前滚+回滚】
	--redo-only 只应用redo,不应用undo【准备工作、合并增量(最后一次不需要添加)】
	
(2) 将inc1 合并到full中
innobackupex --apply-log --redo-only   --incremental-dir=/data/backup/inc1 /data/backup/full_2019-12-27
PS:合并完之后last_lsn 号码是一样的

(3) 将inc2 合并到 full中 
innobackupex --apply-log  --incremental-dir=/data/backup/inc2 /data/backup/full_2019-12-27

(4) 整体备份的prepare.
innobackupex --apply-log  /data/backup/full_2019-12-27
3.6恢复备份
拷贝数据并修改权限
[root@db01 full_2019-12-27]# cp -a * /data/mysql/data_3306/
[root@db01 full_2019-12-27]# chown -R mysql.mysql /data
3.7启动数据库

/etc/init.d/mysqld start

3.8截取二进制日志
[root@db01 inc2]# cat /data/backup/inc2/xtrabackup_binlog_info 
mysql-bin.000003	6593	411148c1-26bf-11ea-a420-000c298780da:1-42

导出sql文件
[root@db01 inc2]# mysqlbinlog --skip-gtids --include-gtids='411148c1-26bf-11ea-a420-000c298780da:43-45' /data/mysql/binlog_3306/mysql-bin.000003 >/data/backup/bin.sql
3.9恢复binlog并验证数据是否恢复
mysql> set sql_log_bin=0;
mysql> source /data/backup/bin.sql
mysql> set sql_log_bin=1;
3.10 生产故障案例
项目背景:
	有全备有增量;总备份2T,误删除1G一张核心表(city)10分钟之内必须搞定
	
思路: 
	利用表空间迁移技术.

项目实施:略
1.全备数据库:
innobackupex  --user=root --password=123 /data/backup

2.创建核心数据库及表
create database cyw charset utf8mb4;
use cyw;
create table t1 (id int);
insert into t1 values(1);
commit;
flush logs;
create table t2 (id int);
insert into t2 values(1);
commit;
flush logs;
create table t3 (id int);
insert into t3 values(1);
commit;
flush logs;

3.误删除了核心表
drop database cyw;

4.全备+binlog恢复--》数据
[root@db01 ~]# mysqlbinlog --skip-gtids --include-gtids='3c041e5f-28a8-11ea-a229-000c292aecb1:1-3','3c041e5f-28a8-11ea-a229-000c292aecb1:4-5','3c041e5f-28a8-11ea-a229-000c292aecb1:6-7' /data/mysql/binlog_3306/mysql-bin.00000{2,3,4} >/data/backup/cc.sql
3.11 总结

备份时选项

xtrabackup --backup

--user:该选项表示备份账号

--password:该选项表示备份的密码

--host:该选项表示备份数据库的地址

--databases:该选项接受的参数为数据名,如果要指定多个数据库,彼此间需要以空格隔开;如:"xtra_test dba_test",同时,在指定某数据库时,也可以只指定其中的某张表。如:"mydatabase.mytable"。该选项对innodb引擎表无效,还是会备份所有innodb表

--defaults-file:该选项指定从哪个文件读取MySQL配置,必须放在命令行第一个选项位置

--incremental:该选项表示创建一个增量备份,需要指定--incremental-basedir

--incremental-basedir:该选项指定为前一次全备份或增量备份的目录,与--incremental同时使用

--incremental-dir:该选项表示还原时增量备份的目录

--include=name:指定表名,格式:databasename.tablename

Prepare于准备选项

prepare

--apply-log:此选项作用是通过回滚未提交的事务及同步已经提交的事务至数据文件使数据文件处于一致性状态

--use-memory:该选项表示和--apply-log选项一起使用,prepare 备份的时候,xtrabackup做crash recovery分配的内存大小,单位字节。也可(1MB,1M,1G,1GB),推荐1G

--export:表示开启可导出单独的表之后再导入其他Mysql中

--redo-only:此选项在prepare base full backup,往其中merge增量备份时候使用

还原时选项

--copy-back:复制

--move-back:移动
发布了148 篇原创文章 · 获赞 65 · 访问量 7628

猜你喜欢

转载自blog.csdn.net/chengyinwu/article/details/103738526