MySQL备份恢复-mysqldump/xbk

MySQL备份恢复

1.介绍

最后一根救命稻草,备份主要是用来恢复数据

2.DBA在备份恢复工作职责

2.1设计备份策略和恢复策略

1.备份策略
1)备份的时间
凌晨,根据公司的实际业务情况,一般选择业务低谷时期。
2)备份的周期
每天
每周
3)备份的方式
全备、增量
逻辑、物理
2.恢复策略
1)方案。
2)准确性。
3)需要多长时间。

2.2 检查备份

1)存在性。
2)大小。
3)日志。

2.3 定期恢复演练

2.4 故障恢复

2.5 迁移升级

3.备份工具介绍

3.1 逻辑备份工具

3.1.1 主流: mysqldump (MDP)

基于SQL(create database ,create table , insert into)语句的备份。

使用场景:
100G以内,比较常用的就是逻辑备份。
优点:自带工具,不需要单独安装;文本形式存储,便于查看处理;压缩比较高,节省空间。
缺点:备份时间较长。恢复时间更长(4-6倍)。
3.1.2 其他的:自行扩展
mydumper 
mysqlpump 
into outfile/load data infile 

3.2 物理备份工具

Percona - Xtrabackup(xbk,pbk,pxb)
备份数据文件。
使用场景:
优点:备份、恢复速度更快。
缺点:二进制方式,可读性差;压缩比较低,浪费空间。

4.mysqldump 应用

4.1 备份方式:

基于SQL(create database ,create table , insert into)语句的备份。
针对InnoDB表可以实现非锁定备份。原理上是通过MVCC中的快照技术进行备份。
针对非InnoDB表,是启用了锁表备份,FTWRL(global read lock)。

4.2参数应用:

4.2.1 连接参数
-u 用户
-p 密码
-S 本地socket
-h ip
-P 端口
4.2.2 备份参数

-A 全备参数

[root@db01 ~]# mysqldump -uroot -p123 -A >/opt/full.sql

-B 单库或者多库备份

[root@db01 ~]# mysqldump -uroot -p123 -B world test >/opt/db.sql

备份库下的单表或多表

[root@db01 opt]# mysqldump -uroot -p123 world city country >/opt/tab.sql

注意: 单表或多表备份,在恢复时需要提前创建库,use到库中再恢复。
–master-data=2(默认0/1/2)
功能:
1)备份时自动生成,当前的binlog位置信息
2)自动开启锁表备份功能,如果开了–single-transaction,可以减少global read lock.
–single-transaction
功能:InnoDB “热备”。 对于InnoDB表不锁表,开启一执行快照备份。

[root@db01 ~]# mysqldump -uroot -p123 -A --master-data=2 --single-transaction >/opt/full.sql

-R、-E、–triggers 特殊对象备份

mysqldump -uroot -p123 -A --master-data=2 --single-transaction -R -E --triggers >/opt/full.sql

–max-allowed-packet=128M 上传下载数据控制大小

mysqldump -uroot -p123 -A --master-data=2 --single-transaction -R -E 
--triggers --max-allowed-packet=128M >/opt/full.sql
如果不添加在传输一些较大的数据报错
# 1153 - Got a packet bigger than 'max_allowed_packet' bytes

在这里插入图片描述
最终备份命令

#gzip压缩
mysqldump -uroot -p123 -A  -R  --triggers -E  --master-data=2  
--single-transaction --max-allowed-packet=128M |gzip > /opt/full_$(date +%F).sql.gz
#bzip2压缩
mysqldump -uroot -p123 -A  -R  --triggers -E  --master-data=2  
--single-transaction --max-allowed-packet=128M |bzip2 -9   > /opt/full_$(date +%F).sql.bz2

4.3 MDP+binlog生产故障恢复模拟

4.3.0 模式环境
mysql> create database mdp charset utf8mb4;
mysql> use mdp;
mysql> create table t1(id int);
mysql> insert into t1 values(1),(2),(3);
mysql> commit;
4.3.1 模拟全备
[root@db01 opt]# mysqldump -uroot -p123 -A -R --triggers -E --master-data=2  
--single-transaction --max-allowed-packet=128M |bzip2 -9 > /opt/full_$(date +%F).sql.bz2
4.3.2 模拟新的数据变化
mysql> create table t2 (id int);
mysql> insert into t2 values(1),(2),(3);
mysql> commit;
4.3.3 搞破坏
mysql> drop database mdp;
4.4.4恢复:

1) 检查备份

[root@db01 opt]# vim full_2020-03-28.sql
SET @@GLOBAL.GTID_PURGED='41476b26-7023-11ea-a155-000c290020fe:1-16';
-- CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000005', MASTER_LOG_POS=1047;

2)截取全备之后发生的操作日志

起点: 
position --->'mysql-bin.000005', MASTER_LOG_POS=1047;
GTID     --->41476b26-7023-11ea-a155-000c290020fe:17
终点: show binlog events in 'mysql-bin.000005';
GTID:    41476b26-7023-11ea-a155-000c290020fe:18
position:mysql-bin.000005 | 1534 

[root@db01 opt]# mysqlbinlog  --skip-gtids --include-gtids='41476b26-7023-11ea-a155-000c290020fe:17-18' /data/3306/binlog/mysql-bin.000005 >/opt/bin.sql

3)恢复数据

mysql> set sql_log_bin=0;
mysql> source /opt/full_2020-03-28.sql #先恢复全备
mysql> source /opt/bin.sql #再恢复后面的日志
mysql> set sql_log_bin=1;

5.percona-xtrabackup

5.1 介绍

物理备份工具,备份数据文件。

5.2 下载安装

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
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-*

5.3 配置

datadir=/data/3306/data
[client]
socket=/tmp/mysql.sock

5.4 xbk备份恢复原理

1. 备份原理
InnoDB表:
1)xbk备份执行的瞬间,立即触发ckpt,已提交的数据脏页,从内存刷写到磁盘,并记录此时的LSN号
2)备份InnoDB表时,拷贝 ibd 、ibdata、undo、ibtmp1,将备份期间产生的redo截取拷贝,记录LSN

非InnoDB表:
1)触发 FTWRL 全局锁,关闭binlog记录
2)拷贝非InnoDB表数据。

数据完成后
记录binlog位置,停止redo拷贝,记录last lsn,记录所有备份日志到指定日志文件中,解锁

2. 恢复原理

1)prepare 备份:利用了InnoDB CSR(自动故障恢复)的功能,使用redo进行前滚,undo进行回滚
2)恢复备份:cp 文件至源路径。

5.5 xbk应用

5.5.1 全备
innobackupex --user=root --password=123 --no-timestamp  /opt/full/xbkfull_`date +%F`
5.5.2 全备恢复演示

环境准备:

[root@db01 ~]# pkill mysqld 
[root@db01 ~]# rm -rf /data/3306/data/*
第一步:prepare全备
[root@db01 ~]# innobackupex  --apply-log  /opt/full/xbkfull_2020-03-27/

第二步:恢复全备
[root@db01 ~]# innobackupex --copy-back /opt/full/xbkfull_2020-03-27/
或者: 
[root@db01 data]# cp -r /opt/full/xbkfull_2020-03-27/* /data/3306/data/
第三步:改权限并启动数据库
[root@db01 ~]# chown -R mysql.mysql /data/
[root@db01 data]# /etc/init.d/mysqld start
5.5.3 增量备份

1)原理
xrabackup自动检查LSN号码的变化,将每天LSN发生变化的数据页备份走。
增量备份,必须要依赖全备。恢复时,必须合并到全备。
在这里插入图片描述
2)查看备份集

xtrabackup_binlog_info  :binlog位置点 
xtrabackup_checkpoints  :LSN号码记录
xtrabackup_info         :备份总览
xtrabackup_logfile      :部分redo
5.5.4 增量备份应用

环境准备:

1)模拟数据

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

2)模拟周日全备

innobackupex --user=root --password=123 --no-timestamp /opt/full

3)模拟周一数据

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

4)模拟周一增量

innobackupex --user=root --password=123 --no-timestamp  
--incremental-basedir=/opt/full  --incremental  /opt/inc1

5)模拟周二数据

 use incremental 
 create table t3 (id int);
 insert into t3 values(1),(2),(3);
 commit;

6)模拟周二增量

innobackupex --user=root --password=123 --no-timestamp  
--incremental-basedir=/opt/inc1  --incremental  /opt/inc2

7)模拟周三数据

 use incremental 
 create table t4 (id int);
 insert into t4 values(1),(2),(3);
 commit;

8)搞破坏

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

恢复数据:full+inc1+inc2+binlog
1)Prepare Base Full 处理基础全备

[root@db01 ~]# innobackupex --apply-log --redo-only /opt/full/

2)merging inc1 to BASE FULL ,合并处理inc1增量到全备

innobackupex --apply-log --redo-only  --incremental-dir=/opt/inc1 /opt/full 

3)merging inc2 to BASE FULL,合并处理inc2增量到全备

innobackupex --apply-log  --incremental-dir=/opt/inc2 /opt/full 

4)最后一次全备整理

[root@db01 opt]# innobackupex --apply-log  /opt/full/

5)恢复数据

root@db01 full]# chown -R mysql.mysql /opt/*
[root@db01 ~]# vim /etc/my.cnf
#datadir=/data/3306/data
datadir=/opt/full
[root@db01 full]# /etc/init.d/mysqld start
Starting MySQL... SUCCESS!

6)截取恢复binlog

[root@db01 inc2]# cat /opt/inc2/xtrabackup_binlog_info 
mysql-bin.000002	1712	e308b7b1-7104-11ea-9021-000c290020fe:1-7
[root@db01 inc2]# mysqlbinlog --skip-gtids --include-gtids='e308b7b1-7104-11ea-9021-000c290020fe:8-9' /data/3306/binlog/mysql-bin.000002 >/opt/bin.sql
mysql> set sql_log_bin=0;
mysql> source /opt/bin.sql
mysql> set sql_log_bin=1;

7)清空binlog日志,再发起全备

mysql> reset master;
[root@db01 ~]# innobackupex --apply-log --redo-only /opt/full1/
5.5.5 从mysqldump 全备中获取库和表的备份
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.5.6 从xtrabackup单独恢复表
1)单独起实例,备份数据拉起来  
2)截取日志恢复此实例
3)故障表,表空间迁移恢复到生产
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值