mysqldump(MDP)应用 :
- 介绍,分类: 逻辑备份工具 备份的结果: SQL语句 , Create database , Create table ,
Insert into 语句 - 备份逻辑:
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/*