MySQL数据库-备份恢复

备份恢复

介绍

备份主要时用来恢复数据

工作职责
1 设计备份策略和恢复策略
备份策略: 
	1. 备份的时间
	   根据公司的实际业务情况,一般选择业务低谷。
	2. 备份的周期
	   每天 
	   每周
	3. 备份的方式
		全备、增量
		逻辑、物理
恢复策略: 
	1. 方案。
	2. 准确性。
    3. 需要多长时间。
2 检查备份
   1. 存在性。 
   2. 大小。
   3. 日志。
3 定期恢复演练

4 故障恢复。

5 迁移升级

备份工具介绍

逻辑备份工具

主流: mysqldump (MDP)

基于SQL(create database ,create table , insert into)语句的备份。
使用场景: 100G以内,比较常用的就是逻辑备份。
优点: 自带工具,不需要单独安装;文本形式存储,便于查看处理;压缩比较高,节省空间。
缺点: 备份时间较长。恢复时间更长(4-6倍)。

其他的.

mydumper
mysqlpump
into outfile/load data infile

物理备份工具

Percona - Xtrabackup(xbk,pbk,pxb)

备份数据文件。
优点:备份、恢复速度更快。
缺点:二进制方式,可读性差;压缩比较低,浪费空间。
使用场景: 100G-TB级别数据量,一般采用xbk。

mysqldump 应用

备份方式

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

参数应用

连接参数

-u
-p
-S
-h
-P

备份参数
-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
功能: 
1. 备份时自动生成,当前的binlog位置信息
2. 自动开启锁表备份功能,如果开了--single-transaction,可以减少global read lock.

--single-transaction
功能:InnoDB “热备”。 对于InnoDB表不锁表,开启一执行快照备份。


-R -E --triggers 特殊对象备份
mysqldump -uroot -p123 -A --master-data=2 --single-transaction -R -E --triggers >/opt/full.sql

--max-allowed-packet=128M
# 1153 - Got a packet bigger than 'max_allowed_packet' bytes 
mysqldump -uroot -p123 -A --master-data=2 --single-transaction -R -E --triggers --max-allowed-packet=128M >/opt/full.sql

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

[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

MDP+binlog生产故障恢复模拟

模式环境
mysql> create database mdp charset utf8mb4;
mysql> create table t1(id int);
mysql> insert into t1 values(1),(2),(3);
mysql> commit;
模拟全备
[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

模拟新的数据变化
mysql> create table t2 (id int);
mysql> insert into t2 values(1),(2),(3);
mysql> commit;
搞破坏
mysql> drop database mdp;
恢复
检查备份
SET @@GLOBAL.GTID_PURGED='09a8c1af-6e45-11ea-a381-000c29248f69:1-10';
-- CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000009', MASTER_LOG_POS=1387;

截取日志
起点: 
position ---》mysql-bin.000009', MASTER_LOG_POS=1387;
GTID     ---09a8c1af-6e45-11ea-a381-000c29248f69:11
终点: 
GTID:    09a8c1af-6e45-11ea-a381-000c29248f69:12
position  mysql-bin.000009 | 1874

[root@db01 opt]# mysqlbinlog  --skip-gtids --include-gtids='09a8c1af-6e45-11ea-a381-000c29248f69:11-12' /data/3306/binlog/mysql-bin.000009 >/opt/bin.sql


恢复数据
mysql> set sql_log_bin=0;
mysql> source /opt/full_2020-03-27.sql 
mysql> source /opt/bin.sql
mysql> set sql_log_bin=1;

percona-xtrabackup 应用

介绍

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

下载安装

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

配置

[client]
socket=/tmp/mysql.sock

xbk备份恢复原理

备份: 
InnoDB表:
  1、xbk备份执行的瞬间,立即触发ckpt,已提交的数据脏页,从内存刷写到磁盘,并记录此时的LSN号
  2、备份InnoDB表时,拷贝 ibd 、ibdata、undo、ibtmp1,将备份期间产生的redo截取拷贝,记录LSN
非InnoDB表: 
  1. 触发 FTWRL 全局锁,关闭binlog记录
  2. 拷贝非InnoDB表数据。
 
数据完成后
  记录binlog位置,停止redo拷贝,记录last lsn,记录所有备份日志到指定日志文件中,解锁
  
恢复:  
	1. prepare 备份:利用了InnoDB CSR的功能,使用redo进行前滚,undo进行回滚
    2. 恢复备份: cp 文件至源路径。

应用

全备
innobackupex --user=root --password=123 --no-timestamp  /opt/full/xbkfull_`date +%F`
全备恢复演示
[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

Xtrabackup 全备+增量应用

增量备份原理

xrabackup自动检查LSN号码的变化,将每天LSN发生变化的数据页备份走。
增量备份,必须要依赖全备。恢复时,必须合并到全备。

查看备份集

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

增量备份应用

模拟数据
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;
模拟周日全备
innobackupex --user=root --password=123 --no-timestamp /opt/full
模拟周一增量
innobackupex --user=root --password=123 --no-timestamp  --incremental-basedir=/opt/full  --incremental  /opt/inc1
模拟周二数据
 use incremental 
 create table t3 (id int);
 insert into t3 values(1),(2),(3);
 commit;

模拟周二增量
innobackupex --user=root --password=123 --no-timestamp  --incremental-basedir=/opt/inc1  --incremental  /opt/inc2
模拟周三数据
  use incremental 
 create table t4 (id int);
 insert into t4 values(1),(2),(3);
 commit;
搞破坏
[root@db01 ~]# pkill mysqld
[root@db01 ~]# rm -rf /data/3306/data/*

故障恢复 full+inc1+inc2+binlog

# Prepare Base Full 处理基础全备
[root@db01 ~]# innobackupex --apply-log --redo-only /opt/full/

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

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

# merging  inc2 to BASE FULL ,合并处理inc2增量到全备
innobackupex --apply-log  --incremental-dir=/opt/inc2  /opt/full 

# 最后一次全备整理
[root@db01 opt]# innobackupex --apply-log  /opt/full/

# 恢复数据
root@db01 full]# chown -R mysql.mysql /opt/*
vim /etc/my.cnf
#datadir=/data/3306/data
datadir=/opt/full

[root@db01 full]# /etc/init.d/mysqld start
Starting MySQL... SUCCESS!

# 截取恢复binlog 
[root@db01 inc2]# cat /opt/inc2/xtrabackup_binlog_info 
mysql-bin.000009	1712	81c442f5-7011-11ea-b4da-000c29248f69:1-7

[root@db01 inc2]# mysqlbinlog --skip-gtids --include-gtids='81c442f5-7011-11ea-b4da-000c29248f69:8-9' /data/3306/binlog/mysql-bin.000009 >/opt/bin.sql


# 清空binlog日志,再发起全备。
mysql> reset master;
Query OK, 0 rows affected (0.03 sec)

从mysqldump 全备中获取 库和表的备份

获得表结构

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

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

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

获取单库的备份

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

xtrabackup 单独恢复表

单独起实例,备份数据拉起来
截取日志恢复此实例
故障表,表空间迁移恢复到生产

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值