Linux 第71天 mariadb backup and recovery
时间: 20181013
欢迎访问我的博客: www.winthcloud.top
目录
备份和恢复
冷备实验
lvm快照备份实验(温备)
逻辑备份工具:mysqldump, mydumper, phpMyAdmin
总结
备份和恢复
为什么要备份
灾难恢复:硬件故障、软件故障、自然灾害、黑客攻击、误操作测试等数据丢失场景
备份注意要点
能容忍最多丢失多少数据
恢复数据需要在多长时间内完成
需要恢复哪些数据
还原要点
做还原测试,用于测试备份的可用性
还原演练
备份类型:
完全备份:整个数据集
部分备份:只备份数据子集,如部分库或表
增量备份:仅备份最近一次完全备份或增量备份(如果存在增量)以来变化的数据,
备份较快,还原复杂
差异备份:仅备份最近一次完全备份以来变化的数据,备份较慢,还原简单
注意:二进制日志文件不应该与数据文件放在同一磁盘
冷、温、热备份
冷备:读写操作均不可进行
温备:读操作可执行;但写操作不可执行
热备:读写操作均可执行
MyISAM:温备,不支持热备
InnoDB:都支持
物理和逻辑备份(重点)
物理备份:直接复制数据文件进行备份,与存储引擎有关,占用较多的空间,速度快
逻辑备份:从数据库中“导出”数据另存而进行的备份,与存储引擎无关,占用空间少,
速度慢,可能丢失精度
备份时需要考虑的因素
温备的持锁多久
备份产生的负载
备份过程的时长
恢复过程的时长
备份什么
数据
二进制日志、InnoDB的事务日志
程序代码(存储过程、函数、触发器、事件调度器)
服务器的配置文件
备份工具
cp, tar等复制归档工具:物理备份工具,适用所有存储引擎;
只支持冷备;完全和部分备份
LVM的快照:先加锁,做快照后解锁,几乎热备;借助文件系统工具进行备份
mysqldump:逻辑备份工具,适用所有存储引擎,温备;支持完全或部分备份;
对InnoDB存储引擎支持热备,结合binlog的增量备份
xtrabackup:由Percona提供支持对InnoDB做热备(物理备份)
的工具,支持完全备份、增量备份
MariaDB Backup: 从MariaDB 10.1.26开始集成,
基于Percona XtraBackup 2.3.8实现
mysqlbackup:热备份, MySQL Enterprise Edition组件(收费)
mysqlhotcopy:PERL 语言实现,几乎冷备,仅适用于MyISAM存储引擎,
使用LOCK TABLES、FLUSH TABLES和cp或scp来快速备份数据库
冷备实验
即将mariadb服务停掉然后直接将其数据文件全部备份
datadir下的内容,二进制日志,事务日志等,全部备份,然后再另外一台机器还原
lvm快照备份实验(温备)
想要使用lvm快照实现备份还原,首先数据库文件必须是在lvm逻辑卷上存放,其次就是
卷组中有空余的空间用来创建快照卷,此种方法备份时有短暂的时间锁表用来创建快照
创建完成后即可将其释放(如果用脚本几乎就是热备) 以下为具体步骤:
1. 锁表,创建数据库分区快照 (锁表之前模拟有事务未提交完成)
mysql -uroot -pcentos -e 'FLUSH TABLES WITH READ LOCK;'
lvcreate -L 1G -s -p r -n snap_data /dev/skyVG/data
2. 记录当前binlog位置,解锁
mysql -uroot -pcentos -e 'FLUSH LOGS;'
mysql -uroot -pcentos -e 'SHOW MASTER STATUS' > /PATH/TO/SOMEFILE
mysql -uroot -pcentos -e 'UNLOCK TABLES;'
3. 备份数据库内容并模拟插入新数据(如果是还原至其它的服务器注意要备份配置文件)
mount -o nouuid,norecovery /dev/mapper/skyVG-snap_data /mnt
tar -Jcf /root/mysql.back.xz /mnt/mysql
模拟向插入新数据(此处不写具体命令了,自行插入)
4. 还原所备份的数据(还原时关闭记录二进制日志记录)
因为是全部还原所以需要将数据库的数据文件全部删除
(切记不要删除二进制日志,还原后需要用此日志还原至最新状态)
systemctl stop mariadb
rm -rf /data/mysql/*
cd /data/mysql
tar -xf /root/msyq.back.xz
mv mnt/mysql/* ./
rm -rf mnt
service mysqld start
5. 使用binlog还原至最新(建议此时关闭二进制日志记录)
查看之前所备份的那个位置记录,然后将此位置文件之后的所有binlog文件重定向至
一个文件里,我这里的位置记录是binlog.000004 379
cat mysql.posi
mysql -uroot -pcentos -e 'SET GLOBAL sql_log_gin=0'
mysqlbinlog --start-position=379 /data/mariadblog/binlog.000004>rect.sql
如在此之后还有其它binlog将其追加至同一个文件中(有几个加几个)
mysqlbinlog --start-position=379 /data/mariadblog/binlog.000005>>rect.sql
将此文件同步至数据库中
mysql -uroot -pcentos < rect.sql
mysql -uroot -pcentos -e 'SET GLOBAL sql_log_gin=1'
此时数据库中已同步至最新的状态(可以查看即使当时有事务未完成提交也不影响恢复
后丢失数据)
逻辑备份工具:mysqldump, mydumper, phpMyAdmin
此种备份与lvm不同之处在于这个备份是在逻辑上的备份,即不是基于底层硬盘块的备份,而是
基于sql语句进行的备份,原理是mysqldump命令可以将数据库里要备份的数据库做查询并将数
据库的所有配置和表格的数据转换为sql语句,还原时则是重新将一个空库中插入所备份的sql
语句,可能会出现丢失精度,这里使用mysqldump命令做讲解
mysqldump工具: 客户端命令,通过mysql协议连接至mysql服务器进行备份
mysqldump参考: https://dev.mysql.com/doc/refman/5.7/en/mysqldump.html
mysqldump常见选项:
-A, --all-databases 备份所有数据库,含create database
-B, --databases db_name… 指定备份的数据库,包括create database语句
-E, --events: 备份相关的所有event scheduler
-R, --routines: 备份所有存储过程和自定义函数
--triggers: 备份表相关触发器,默认启用,用--skip-triggers, 不备份触发器
--default-character-set=utf8 指定字符集
--master-data[=#]: 此选项须启用二进制日志
1:所备份的数据之前加一条记录为CHANGE MASTER TO语句,非注释,不指定#,
默认为1
2:记录为注释的CHANGE MASTER TO语句 此选项会自动关闭--lock-tables功能
自动打开-x|--lock-all-tables功能(除非开启--single-transaction)
-F, --flush-logs: 备份前滚动日志,锁定表完成后,执行flush logs命令,
生成新的二进制日志文件,配合-A 或 -B 选项时,会导致刷新多次数据库。
建议在同一时刻执行转储和日志刷新,可通过和--single-transaction或-x,
--master-data 一起使用实现,此时只刷新一次日志
--compact: 去掉注释,适合调试,生产不使用
-d, --no-data 只备份表结构
-t, --no-create-info 只备份数据,不备份create table
-n,--no-create-db 不备份create database,可被-A或-B覆盖
--flush-privileges 备份mysql或相关时需要使用
-f, --force 忽略SQL错误,继续执行
--hex-blob 使用十六进制符号转储二进制列(例如,“abc”变为0x616263)
受影响的数据类型包括BINARY, VARBINARY,BLOB,BIT
-q, --quick 不缓存查询,直接输出,加快备份速度
MyISAM备份选项:
支持温备;不支持热备,所以必须先锁定要备份的库,而后启动备份操作
锁定方法如下:
-x,--lock-all-tables:加全局读锁,锁定所有库的所有表,同时加
--single-transaction或--lock-tables选项会关闭此选项功能
注意:数据量大时,可能会导致长时间无法并发访问数据库
-l,--lock-tables:对于需要备份的每个数据库,在启动备份之前分别锁定其所有表,
默认为on,--skip-lock-tables选项可禁用,对备份MyISAM的多个库,可能会造成
数据不一致
注:以上选项对InnoDB表一样生效,实现温备,但不推荐使用
InnoDB备份选项: 支持热备,可用温备但不建议用
--single-transaction
此选项Innodb中推荐使用,不适用MyISAM,
此选项会开始备份前,先执行START TRANSACTION指令开启事务
此选项通过在单个事务中转储所有表来创建一致的快照。
仅适用于存储在支持多版本控制的存储引擎中的表(目前只有InnoDB可以);
转储不保证与其他存储引擎保持一致。 在进行单事务转储时,要确保有效的转
储文件(正确的表内容和二进制日志位置),没有其他连接应该使用以下语句:
ALTER TABLE,DROP TABLE,RENAME TABLE,TRUNCATE TABLE
此选项和--lock-tables(此选项隐含提交挂起的事务)选项是相互排斥
备份大型表时,建议将--single-transaction选项和--quick结合一起使用
InnoDB建议备份策略(下方为一条命令)
mysqldump –uroot –A –F –E –R --single-transaction --master-data=1
--flush-privileges --triggers --default-character-set=utf8 --hex-blob
> $BACKUP/fullbak_$BACKUP_TIME.sql
MyISAM建议备份策略(下方为一条命令)
mysqldump –uroot –A –F –E –R –x --master-data=1 --flush-privileges
--triggers --default-character-set=utf8 --hex-blob
>$BACKUP/fullbak_$BACKUP_TIME.sql
mysqldump备份示例(建议还原时关闭bin_log日志功能)
1. 先备份数据库(下方为一条命令)
mysqldump -A -E -R --master-data=2 --single-transaction -uroot
-pcentos > all.sql
2. 模拟备份数据库后新插入数据
这里不写具体命令了,自行创造,原理和上一个类似
3. 还原所备份的数据
还原第一步先要配置好一个mysql使变成运行状态
因为所备份的数据都是sql语句,直接执行命令导入即可
mysql -uroot -pcentos -e 'SET GLOBAL sql_log_gin=0'
mysql -uroot -pcentos < all.sql
4. 根据binlog日志还原数据库
因为all.sql里有写备份时所备份的位置即从那个位置之后的binlog都添加至一个文件
即可实现不愿
mysqlbinlog --start-position=245 mariadb.bin.log.000005 > rec.sql
mysqlbinlog --start-position=245 mariadb.bin.log.000006 >> rec.sql
mysql -uroot -pcentos < rec.sql
mysql -uroot -pcentos -e 'SET GLOBAL sql_log_gin=1'
总结
1.使用lvm快照备份恢复,即使有事务当时未提交,恢复时也不会丢失数据,原理是因为事务
在未提交时只是在事务日志里有记录,但并未写入binlog日志文件中,即未对表做修改。
当做备份时,其实事务里的内容由于未提交所以还原时其实是被丢弃了,但由于解锁后
事务又提交了,即产生了二进制日志,所以用二进制日志即可将之前被丢弃的事务再次
恢复至最新的状态
2.单台机器虽然有备份但是还原需要时间会影响线上业务
3.mysqldump备份在一定基础上可以接受跨版本还原数据库(测试)