Mysql物理备份以及逻辑备份加恢复

mysqldump(MDP)应用 :

  1. 介绍,分类: 逻辑备份工具 备份的结果: SQL语句 , Create database , Create table ,
    Insert into 语句
  2. 备份逻辑:
    RR 级别
    获取一致性快照
A. 元数据备份 
	FTWRL ----> 
	Flush tables with read lock;    ---> MDL 
	
	Flush tables ---> close tables,阻止所有commit
	read lock    ---> all  read lock 
	
	show create database ..  --->  建库语句
	show create  table   ..  --->  建表语句
    unlock tables; 

B. 备份数据行 
	select  --->  
	InnoDB 可以进行快照备份
	拼接成insert 
	非InnoDB表,锁表备份的.

 适合的场景
单节点数据量,100G以内,单表2000w以内.可以使用MDP
恢复时间一般是备份时间的3-5倍.

基础备份参数:

-A : 全库备份
mysqldump -uroot -p'密码' -S(指定socket文件位置) -A >/(你要保存到的文件位置)

-B : 单库或者多库备份
mysqldump -uroot -p'密码' -S(指定socket文件位置) -B 选择备份的库1 选择备份的库2 >/(你要保存到的文件位置)

备份单表或者多表
mysqldump -uroot -p'密码' -S(指定socket文件位置) 库名称 选择库下的某张表1 选择库下的某张表2 >/(你要保存到的文件位置)

说明: 以上方法,在恢复时都需要先建立数据库,use到库中,然后再source导入

mysqldump特殊备份参数:

1. --master-data=2
解:
	自动记录binlog信息
	自动进行加GRL锁,配合--single-transaction会有不一样的效果

2. --single-transaction
解:
	对于innodb表进行一致性快照备份
	备份期间如果有DDL操作会备份失败

3. --max_allowed_packet=128M
解:
	允许备份最大数据页的内存大小

4. -R -E --triggers
解:
	备份时,同时将 存储过程\函数\事件\触发器 等高级对象备份走

标准化备份:
mysqldump -uroot -p -A --master-data=2  --single-transaction  --max_allowed_packet=128M -R -E  --triggers  >/tmp/full.sql

DIY案例:

案例:通过mysqldump全备+binlog实现PIT数据恢复
环境背景: 小型的业务数据库,50G,每天23:00全备,定期binlog异地备份。
故障场景: 周三下午2点,开发Navicat连接数据库实例错误,导致生产数据被误删除(DROP)

案例思路:

1.  挂维护页。
2.  检查备份、日志可用。
3.  如果只是部分损坏,建议找一个应急库进行恢复
			 a. 全备恢复 
			 b. 日志截取并恢复 
4.  恢复后数据校验	(业务测试部门验证)
5.  立即备份(停机冷备) 
6.  恢复架构系统
7.  撤维护页,恢复业务 

案例解答:

模拟故障: 
	1. 模拟测试数据
	mysql> create database pit;
	mysql> use pit 
	mysql> create table t1 (id int);
	mysql> insert into t1 values(1),(2),(3);
	mysql> commit;
	2. 全备 
[root@db01 tmp]# mysqldump -uroot -p -A --master-data=2 --single-transaction -R -E --triggers --max_allowed_packet=64M >/tmp/full_2300.sql 
	3. 模拟周三白天的操作 
	mysql> use pit
	mysql> insert into t1 values(11),(22),(33);
	mysql> commit;
	4. 模拟周三下午2:00,删库操作
mysql> drop database pit;
	

恢复过程 : 
	1. 恢复全备 
	source /tmp/full_2300.sql 
	2. 截取二进制日志
	起点:  21105555
	[root@db01 tmp]# grep "\-- CHANGE MASTER TO" /tmp/full_2300.sql 
	-- CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000009', MASTER_LOG_POS=21105555;

	
	终点:21105836
	
	a. show master status ;
	b. show binlog  events in 'mysql-bin.000008';
	mysql> pager grep -i "drop database pit" -B 10
			                                                                                              |
	| mysql-bin.000009 | 21105805 | Xid            |        51 |    21105836 | COMMIT /* xid=6232 */                                                                                                                                                                                                                                                                        |
	| mysql-bin.000009 | 21105836 | Gtid           |        51 |    21105913 | SET @@SESSION.GTID_NEXT= '95972e36-43fe-11eb-a366-000c2905f029:70'                                                                                                                                                                                                                           |
	| mysql-bin.000009 | 21105913 | Query          |        51 |    21106014 | drop database pit /* xid=6234 */                                                                                                                                            
	
	[root@db01 tmp]# mysqlbinlog --skip-gtids --start-position=21105555 --stop-position=21105836 /data/3306/binlog/mysql-bin.000009 >/tmp/bin.sql


	3. 恢复日志
	mysql> set sql_log_bin=0;
	mysql> source /tmp/bin.sql
	mysql> set sql_log_bin=1;


Percona Xrabackup 应用 :


介绍
物理备份工具. 备份恢复更快.
支持全备和增量备份

全备备份逻辑
a. 8.0 之前
预备: 初始化进程和线程,分配专用内存.
备份:
0. 连接目标数据库,获取数据库信息.
a. 当前LSN号码记录 —> show engine InnoDB stutus ; 主要: Last checkpoint at NO.
b. non-InnoDB 数据 :frm , csv , MYI ,MYI ----> FTWRL
c. unlock tables;
d. Copy Innodb 数据: ibd ibdata1 undo tmp ,可以允许DML
e. 备份期间的redo截取和备份,并且记录LSN号.
结束:
记录binlog的当前位置点,将所有备份信息记录至专用日志文件中.

b. 8.0 之前
预备: 初始化进程和线程,分配专用内存.
备份:
0. 连接目标数据库,获取数据库信息.
a. 当前LSN号码记录 —> show engine InnoDB stutus ; 主要: Last checkpoint at NO.
b. LOCK INSTANCE FOR BACKUP; UNLOCK INSTANCE;
c. Copy Innodb 数据: ibd ibdata1 undo tmp ,可以允许DML
d. 备份期间的redo截取和备份,并且记录LSN号.
结束:
记录binlog的当前位置点,将所有备份信息记录至专用日志文件中.

增量备份逻辑
a. 第一次增量备份,使用全备作为"参照物",把变化的数据页和备份过程中产生的redo保存.
b. 往后所有的增量,都基于上一次备份作为参照物.把变化的数据页和备份过程中产生的redo保存.
c. 增量备份只针对InnoDB表有效,所以在8.0之前,针对非InnoDB表,都是全备.


恢复过程:

例如:备份策略为,FULL+inc1+inc2....
a. prepare 全备 (CR)
应用redo前滚
应用undo回滚(省略)
b. 合并所有增量到全备并且prepare
应用redo前滚
应用undo回滚(除了最后一次增量,这步省略)
c. 合并后的全备prepare 
d. 恢复备份


PXB的版本兼容性 
MySQL 5.6 ,5.7        : PXB 2.4版本
MySQL 8.0.11 ~ 8.0.19 : PXB 8.0 稳定版.
MySQL 8.0.20          : PXB 8.0.12+ 

全量备份\数据恢复:

安装
yum install -y percona-xtrabackup-80-8.0.13-1.el7.x86_64.rpm

 全量备份
mkdir -p /data/backup
xtrabackup --defaults-file=/etc/my.cnf --user=root --password=123   --backup --target-dir=/data/backup/full

 数据恢复:

a 搞破坏 

[root@db01 ~]# pkill mysqld
[root@db01 ~]# rm -rf /data/3306/data/*
[root@db01 ~]# rm -rf /data/3306/logs/*
[root@db01 ~]# rm -rf /data/3306/binlog/*


b 准备:(CR)
xtrabackup   --prepare --target-dir=/data/backup/full

说明: 模拟CR过程,将redo前滚,undo回滚,让备份数据是一致状态


c 拷回数据:
xtrabackup  --copy-back --target-dir=/data/backup/full

d 修改权限并启动数据库
[root@db01 data]# chown -R mysql.mysql /data/*
[root@db01 data]# /etc/init.d/mysqld start

迁移表空间.
需求: 将3306(源端)的test.t100w表迁移到3307(目标端)的test

1. 目标数据库3307中创建一个源端结构一致空表(t100w)
mysql> create database test;
mysql> use test
mysql> CREATE TABLE `t100w` (   `id` int DEFAULT NULL,   `num` int DEFAULT NULL,   `k1` char(2) DEFAULT NULL,   `k2` char(4) DEFAULT NULL,   `dt` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,   KEY `idx` (`k1`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
2. 目标端删除表空间,保留表结构,删除表空间文件
mysql> alter table t100w discard tablespace;

3. 源端锁定需要迁移的表
mysql> flush table t100w with read lock;

4. 拷贝ibd文件到目标端目录下
[root@db01 test]# cp -a /data/3306/data/test/t100w.ibd  /data/3307/data/test/
[root@db01 test]# pwd
/data/3307/data/test
[root@db01 test]# ll
total 94208
-rw-r----- 1 mysql mysql 96468992 Dec 28 17:38 t100w.ibd
5. 目标端导入表空间文件
mysql> alter table t100w import  tablespace;

6. 释放源端表锁
mysql> unlock tables;

PXB全备DIY案列:
(500G数据库,PXB 周日全备+周一-周五binlog,周三时候完全损坏,进行模拟和恢复)

mysql> use pxb;
mysql> create table t1(id int);
mysql> insert into t1 values(1),(2),(3);
mysql> commit;

[root@gzl full]#xtrabackup  --user=root --password=123   --backup --target-dir=/data/backup/full

mysql> use pxb;
mysql> insert into t1 values(11),(22);
mysql> commit;

[root@gzl full]# pkill mysqld 
[root@gzl full]# rm -rf /data/3306/data/*
[root@gzl full]# xtrabackup   --prepare --target-dir=/data/backup/full
[root@gzl full]# cat xtrabackup_binlog_info 
mysql-bin.000018	276	5fb7d9f5-3db7-11eb-b613-000c29d516ad:1-19,d81850da-45ed-11eb-a0a8-000c29d516ad:1-39,d8673e6e-48f8-11eb-84ad-000c29d516ad:1-4

[root@gzl full]#  mysqlbinlog --skip-gtids --start-position=276 /data/3306/binlog/mysql-bin.000018 >/tmp/bin.sql 
[root@gzl full]# mv /data/3306/binlog/* /tmp

[root@gzl full]# rm -rf /data/3306/data/*
[root@gzl full]#  xtrabackup  --copy-back --target-dir=/data/backup/full
[root@gzl full]# chown -R mysql. /data/
[root@gzl full]# /etc/init.d/mysqld start
mysql -uroot -p123
mysql> source /tmp/bin.sql

增量备份演练:

全量备份的目录为: mkdir  -p /data/backup/full
增量备份的目录为: mkdir  -p /data/backup/inc

# 1.备份操作:
# 1.1.全量备份:
xtrabackup --defaults-file=/etc/my.cnf  --user=root --password=123  --backup --parallel=4 --target-dir=/data/backup/full     (/data/backup/full下不能有文件)

mysql> create database pxb;
mysql> use pxb
mysql> create table t1 (id int);
mysql> insert into t1 values(1),(2),(3);
mysql> commit;

# 1.2.增量备份:
xtrabackup --defaults-file=/etc/my.cnf --user=root --password=123  --backup --parallel=4 --target-dir=/data/backup/inc  --incremental-basedir=/data/backup/full
 
# 模拟损坏  
[root@db01 ~]# pkill mysqld
[root@db01 ~]# rm -rf /data/3306/data/*

# 2.恢复操作:
# 2.1 准备全备份的日志:
xtrabackup --prepare --apply-log-only --target-dir=/data/backup/full

# 2.2 准备增量备份的日志:
xtrabackup --prepare --apply-log-only --target-dir=/data/backup/full  --incremental-dir=/data/backup/inc

# 2.3 全备份准备:
rm -rf /data/3306/binlog/*
rm -rf /data/3306/data/*
# xtrabackup --prepare --target-dir=/data/backup/full

# 2.4 拷回数据:
xtrabackup    --copy-back --target-dir=/data/backup/full
 
#2.5 修改数据目录的权限和属性:
chown -R mysql:mysql /data/*

猜你喜欢

转载自blog.csdn.net/weixin_49629796/article/details/115375410
今日推荐