第1章 DBA备份的职责
1.1 设计备份策略
备份周期
备份工具
备份方式
1.2 日常备份检查可用性
#查看定时任务
crontab -l
#通过定时找任务找到备份的脚本和路劲信息
备份脚本
备份路径
#看备份日志
检查备份文件(大小,内容)
1.3 定期恢复演练(测试库)
一季度或者半年
1.4 故障恢复
只要备份和日志是完整的,恢复到故障之前的时间点(快速)
1.5 数据迁移
操作系统不同的迁移
mysql -> mysql
其他 -> mysql
mysql -> 其他
考虑两大方面:
1.停机时间
2.回退方案
第2章 备份的类型
1.1 热备
1.在数据库正常业务时,备份数据,并且能够一致性恢复(只能是innodb)
2.对业务影响非常小
1.2 温备
1.锁表备份,只能查询不能修改(myisam)
2.影响到写入操作
1.3 冷备
1.关闭数据库业务,数据库没有任何变更的情况下,进行备份数据.
2.业务停止
第3章 备份方式及工具的介绍
1.1 备份工具
第一种备份工具: mysqldump(逻辑备份)
基于SQL语句进行备份
mysqldump
mysqlbinlog
第二种备份工具: XBK(物理备份)
基于磁盘数据文件备份
xtrabackup(XBK) :percona 第三方
1.2 2种工具的比较
mysqldump
优点:
1.不需要下载安装
2.备份出来的是SQL,文本格式,可读性高,便于备份处理
3.压缩比较高,节省备份的磁盘空间
缺点:
1.依赖于数据库引擎,需要从磁盘把数据读出
2.然后转换成SQL进行转储,比较耗费资源,数据量大的话效率较低
建议:
100G以内的数据量级,可以使用mysqldump
超过TB以上,我们也可能选择的是mysqldump,配合分布式的系统
1EB =1024 PB =1000000 TB
XBK
优点:
1.类似于直接cp数据文件,不需要管逻辑结构,相对来说性能较高
缺点:
2.可读性差
3.压缩比低,需要更多磁盘空间
建议:
>100G<TB
第4章 mysqldump工具的使用
1.1 备份用到的参数
-A(全备参数)
mysqldump -uroot -p123 -A|gzip >/backup/$(date +%F).sql.gz
-B(备份多个单库)
列子1:备份指定的库schoo和world
mysqldump -uroot -p123 -B school world |gzip >backup/$(date +%F).sql.gz
#注意
-B 后面只能接上库的名字,不能接表的名字
例子2:备份world库下的city表
msyqldump -uroot -p123 world city |gzip >/backup/$(date +%F).sql.gz
#注意
备份单个表和多个表时,不用加上-B参数
-R(存储过程) --triggers(触发器) -E(事件)
例子
mysqldump -uroot -p123 -A -R -E --triggers |gzip >/backup/$(date +%F).sql.gz
--master-data=2
此参数的作用
(1)在备份时,会自动记录,二进制日志文件名和位置号
0 默认值
1 以change master to命令形式,可以用作主从复制
2 以注释的形式记录备份时刻的文件名+postion号
(2)自动锁表
如果不加--single-transaction会全局锁表进行温备份
如果加--single-transaction,对于innodb的表不锁表(快照备份),对于非innodb的表还是会锁表进行温备份
#因为innodb存储引擎支持事务
--single-transaction
对于InnoDB的表,进行一致性快照备份,不锁表.只有innodb的表支持这个功能
--set-gtid-purged
auto,on 默认是auto
off
使用场景:
1. --set-gtid-purged=OFF,可以使用在日常备份参数中.
mysqldump -uroot -p123 -A -R -E --triggers --master-data=2 --single-transaction --set-gtid-purged=OFF >/backup/$(date +%F).sql.gz
2. auto,on:在构建主从复制环境时需要的参数配置
mysqldump -uroot -p -A -R -E --triggers --master-data=2 --single-transaction --set-gtid-purged=ON >/backup/$(date +%F).sql.gz
--max_allowed_packet
#备份时服务端像客户端传输数据包的大小(针对很大的表)
例子:
mysqldump -uroot -p -A -R -E --triggers --master-data=2 --single-transaction --set-gtid-purged=OFF --max-allowed-packet=256M >/backup/$(date +%F).sql.gz
注意报错:
1153 - Got a packet bigger than 'max_allowed_packet' bytes
(1) 如果是mysql正常工作出现,调整[mysqld]的此参数
(2) 如果是mysqldump备份时出现,mysqldump 命令行添加此参数
第5章 模拟故障恢复
1.1 模拟环境
第一个里程: 模拟数据
mysql>create database kk;
mysql>use kk
mysql>create table t1 (id int);
mysql>insert into t1 values(1),(2),(3);
mysql>commit;
第二个里程: 周二23:00全备
mysqldump -uroot -p123 -A -R -E --triggers --master-data=2 --single-transaction |gzip >/backup/$(date +%F).sql.gz
第三个里程: 模拟周二23:00到周三10点之间数据变化
mysql>use kk
mysql>insert into t1 values(11),(22),(33);
mysql>commit;
mysql>create table t2 (id int);
mysql>insert into t2 values(11),(22),(33);
mysql>commit;
第四个里程: 模拟故障,删除表
drop database kk;
1.2 恢复流程
第一个里程: 停业务,挂维护页
第二个里程: 把备份数据拷贝到临时库
第三个里程: 截取二进制
1. 先在备份文件中找到备份时的起点,下一个GTID号码就是记录备份以后的操作了
[root@db01 ~]# sed -n '24p' /backup/2020-04-09.sql
SET @@GLOBAL.GTID_PURGED='53105cbc-725d-11ea-9859-000c29ceddde:1-14';
2. 在二进制文件中找到终点
show binlog events in 'mysql-bin.000005';
SET @@SESSION.GTID_NEXT= '53105cbc-725d-11ea-9859-000c29ceddde:18'
3. 截取二级制日志导入到sql文件
cd /data/binlog
mysqlbinlog --skip-gtids --include-gtids='53105cbc-725d-11ea-9859-000c29ceddde:15-17' /data/binlog/mysql-bin.000005 >/backup/binlog.sql
第四个里程: 恢复全备和截取的二进制到临时库
mysql>set sql_log_bin=0;
mysql>source /backup/2020-04-09.sql
mysql>source /backup/binlog.sql
mysql>set sql_log_bin=1;
第五个里程: 将删除的库,从临时库导出,并恢复到生产中
1. 先从临时库导出
mysqldump -uroot -p123 -R -E -B backup --triggers --master-data=2 --single-transaction |gzip >/backup/backup.sql
2. 在把数据拷贝到生产服务器上,导入到数据库中
mysql>set sql_log_bin=0;
mysql>source /backup/backup.sql
mysql>set sql_log_bin=1;
第六个里程: 检查数据时候恢复
mysql>show databases;
第6章 MySQL物理备份工具-xtrabackup(XBK)
1.1 XBK的备份方式
(1)对于非Innodb表(比如 myisa)是,锁表cp数据文件,属于一种温备份。
(2)对于Innodb的表(支持事务的),不锁表,拷贝数据页,最终以数据文件的方式保存下来,把一部分redo和undo 一并备走,属于热备方式
1.2 XBK的安装
第一个里程: 安装依赖
yum -y install perl perl-devel libaio libaio-devel perl-Time-HiRes perl-DBD-MySQL libev
第二个里程: 上传软件包
第三个里程: 安装软件包
yum localinstall percona-xtrabackup-24-2.4.4-1.el6.x86_64.rpm -y
第四个里程: 检查是否安装上了
是否有innobackupex这个命令
1.3 XBK在恢复innodb表的流程
1. xbk备份执行的瞬间,立即触发ckpt,已提交的数据脏页,从内存刷写到磁盘,并记录此时的LSN号
2. 备份时,拷贝磁盘数据页,并且记录备份过程中产生的redo和undo一起拷贝走,也就是checkpoint LSN之后的日志
3. 在恢复之前,模拟Innodb“自动故障恢复”的过程,将redo(前滚)与undo(回滚)进行应用
4. 恢复过程是cp 备份到原来数据目录下
第7章 innobackupex使用
1.1 全备
innobackupex --user=root --password=123 /backup
1.2 自定义备份路径名
innobackupex --user=root --password=123 --no-timestamp /backup/$(date +%F)
1.3 备份集中多出来的文件
xtrabackup_binlog_info
xtrabackup_checkpoints
xtrabackup_info
xtrabackup_logfile
1. xtrabackup_binlog_info:(备份时刻的binlog位置点信息)
[root@db01 2020-04-09]# cat xtrabackup_binlog_info
mysql-bin.000005 3615 53105cbc-725d-11ea-9859-000c29ceddde:1-18
记录的是备份时刻,binlog的文件名字和当时的结束的position,可以用来作为截取binlog时的起点
2. xtrabackup_checkpoints
[root@db01 2020-04-09]# cat xtrabackup_checkpoints
backup_type = full-backuped (表示属于全备类型)
from_lsn = 0 (上次所到达的LSN号对于全备就是从0开始,对于增量有别的显示方法)
to_lsn = 5881360 (备份开始时间(ckpt)点数据页的LSN)
last_lsn = 5881369 (备份结束后,redo日志最终的LSN)
compact = 0
recover_binlog_info = 0
3. xtrabackup_info
记录的是备份时的详细信息
4. xtrabackup_logfile
记录的是备份的redo,是二进制文件,看不了
1.4 全备的恢复
全备恢复的前提
1、被恢复的目录是空
2、被恢复的数据库的实例是关闭
第一个里程: 用XBK进行全备
nnobackupex --user=root --password=123 --no-timestamp /backup/full
第二个里程: 关闭数据库
systemctl stop mysqld
第三个里程: 创建新的数据目录
mkdir /data/mysql/data1
第四个里程: 整理备份
innobackupex --apply-log /backup/full
将redo进行重做,已提交的写到数据文件,未提交的使用undo回滚掉。模拟了CSR的过程
第五个个里程: 恢复备份
cp -a /backup/$(date +%F)/* /data/mysql/
第六个里程: 修改数据库配置文件中的数据路径
vim /etc/my.cnf
datadir=/data/mysql/data
改为
datadir=/data/mysql/data1
第七个里程: 数据路径授权
chown -R mysql:mysql /data/mysql/data1
第八个里程: 启动数据库
systemctl start mysqld
1.5 XBK增量恢复实践
增量恢复的前提
(1)增量备份的方式,是基于上一次备份进行增量。
(2)增量备份无法单独恢复。必须基于全备进行恢复。
(3)所有增量必须要按顺序合并到全备中。
第一个里程: 环境模拟
1. 模拟周日全备
innobackupex --user=root --password=123 --no-timestamp /backup/full &>/tmp/full.log
2. 模拟周一数据的变化
mysql>create database XBK charset utf8mb4;
mysql>use XBK
mysql>create table t1 (id int);
mysql>insert into t1 values(1),(2),(3);
mysql>commit;
3. 第一次增量备份(周一)
innobackupex --user=root --password=123 --no-timestamp --incremental --incremental-basedir=/backup/full /backup/inc1 &>/tmp/inc1.log
#说明
--incremental:开启增量备份的功能
--incremental-basedir=/backup/full :基于哪个备份进行增量
/backup/inc1 :备份到哪里去
4. 模拟周二的数据变化
mysql>use XBK
mysql>create table t2 (id int);
mysql>insert into t2 values(1),(2),(3);
mysql>commit;
5. 第二次增量备份(周二)
innobackupex --user=root --password=123 --no-timestamp --incremental --incremental-basedir=/backup/inc1 /backup/inc2 &>/tmp/inc2.log
6. 模拟周三的数据变化
mysql>use XBK
mysql>create table t3 (id int);
mysql>insert into t3 values(1),(2),(3);
mysql>commit;
mysql>drop database XBK;
第二个里程:恢复的思路
1. 停业务,挂维护页
2. 查找可用的备份:full+inc1+inc2
3. 截取binlog: inc2到误操作时间点的binlog
4. 恢复全备+增量+binlog
5. 验证数据
6. 开启业务,撤掉维护页
第三个里程: 恢复里程
第一里程: 整理全备
innobackupex --apply-log --redo-only /backup/full
#说明--redo-only
此参数,在整理全备和所有增量时都要应用,除了最后一次增量不用
第二个里程: 合并inc1到full中
innobackupex --apply-log --redo-only --incremental-dir=/backup/inc1 /backup/full
#哪一个增量合并到全备中
第三个里程: 合并inc2到full中
innobackupex --apply-log --incremental-dir=/backup/inc2 /backup/full
第四个里程: 最后一次整理全备
innobackupex --apply-log /backup/full
第五个里程: 截取binlog(inc2备份时刻的起点到drop之前的binlog)
1. 获取开始位置
cd /backup/inc2
[root@db01 inc2]# cat xtrabackup_info
...
binlog_pos = filename 'mysql-bin.000005', position '1470', GTID of the last change '53105cbc-725d-11ea-9859-000c29ceddde:1-7'
...
2. 获取结束位置
>show binlog events in 'mysql-bin.000005';
SET @@SESSION.GTID_NEXT= '53105cbc-725d-11ea-9859-000c29ceddde:9'
3. 截取二进制
cd /data/binlog
mysqlbinlog --skip-gtids --include-gtids='53105cbc-725d-11ea-9859-000c29ceddde:8-9' /data/binlog/mysql-bin.000005 >/backup/binlog.sql
第六个里程: 创建新的数据目录
mkdir /data/mysql/data3
第七个里程: 关闭数据库服务
systemctl stop mysqld
第八个里程: 拷贝整理好的备份库到新的数据目录下
cp -a /backup/full/* /data/mysql/data3
第九个里程: 修改数据库配置文件的数据目录
vim /etc/my.cnf
datadir=/data/mysql/data
改为
datadir=/data/mysql/data3
第十个里程: 给新的数据目录授权权限
chown -R mysql:mysql /data/mysql/data3
第十一个里程: 启动数据库
systemctl start mysqld
第十二个里程: 把截取出来的binlog导入到数据库中
mysql>set sql_log_bin=0;
mysql>source /backup/binlog.sql
mysql>set sql_log_bin=1;
第十二个里程: 验证数据
第八章 分库分表备份脚本
1.1 分库备份脚本
vim fenku.sh
#!/bin/bash
MYUSER=root
MYPASS=123
MYLOGIN="mysql -u$MYUSER -p$MYPASS"
MYDUMP="mysqldump -u$MYUSER -p$MYPASS -R -E --triggers --master-data=2 --single-transaction -B"
DBLIST=$($MYLOGIN -e "show databases;"|sed "1d"|egrep -v "_schema|mysql|sys")
for dbname in $DBLIST
do
MYDIR=/backup/$dbname
[ ! -d $MYDIR ] && mkdir -p $MYDIR
$MYDUMP $dbname 2>&1|gzip >/$MYDIR/${dbname}_$(date +%F).sql.gz
done
#脚本说明
DBLIST=$($MYLOGIN -e "show databases;"|sed 1d|egrep -v "_schema|mysql|sys")
sed 1d:删除第一行
egrep -v "_schema|mysql|sys":排除系统库
1.2 分库+分表备份脚本
脚本内容
vim fenbiao.sh
#!/bin/bash
MYUSER=root
MYPASS=123
MYLOGIN="mysql -u$MYUSER -p$MYPASS"
MYDUMP="mysqldump -u$MYUSER -p$MYPASS -R -E --triggers --master-data=2 --single-transaction"
DBLIST=$($MYLOGIN -e "show databases;"|sed 1d|egrep -v "_schema|mysql|sys")
for dbname in $DBLIST
do
TABLELIST=$($MYLOGIN -e "show tables from $dbname;"|sed "1d")
for tname in $TABLELIST
do
MYDIR=/backup/$dbname
[ ! -d $MYDIR ] && mkdir -p $MYDIR
$MYDUMP $dbname ${tname} 2>&1|gzip >$MYDIR/${dbname}_${tname}_$(date +%F).sql.gz
done
done