概述
MySQL的多存储引擎架构针对不同的存储引擎有不同的备份方法,数据量的大小和备份目的不同都会影响如何选择备份策略。
备份类型
冷备份、热备份、暖备份。
冷备份是在完全停止数据库进程的情况下备份其数据目录,常在例行维护割接升级可停机的时候采用。
热备份是在数据库服务运行时通过备份工具执行数据备份,是在保证不中断和阻塞读写请求的同时完成数据备份,常用于大数据量的例行备份。
暖备份是MySQL数据库针对非事务型存储引擎表(例如:MyISAM)在不停机的情况下利用mysqlhotcopy工具进行的物理备份,其备份过程中为保证数据一致性会有短暂的读锁,与热备相比会阻塞写请求,故称为暖备。
注:mysqlhotcopy工具在未GA的MySQL 5.7版本将会移除,系统mysql库也会变成InnoDB引擎。
备份方式
逻辑备份和物理备份。
逻辑备份是对数据库对象(如用户、表、存储过程等)利用mysqldump和select outfile工具从数据库中导出最终以CSV或SQL文本形式保存。特点是备份速度较慢、可读性好,便于不同平台迁移。常用于表结构备份,在数据量规模不大时可作为例行备份。
物理备份是对数据库实例在物理磁盘上的数据文件、重做日志、表结构定义文件、配置文件等拷贝。特点是备份速度较快。常用于数据量规模较大的场景下可考虑在线热备。
存储引擎
主要讨论InnoDB和NDB(MySQL Cluster)事务型存储引擎。
对于逻辑备份两者都使用mysqldump或select .. outfile方式导出数据。
对于物理备份InnoDB推荐使用MySQL Enterprise Backup(MEB)进行在线热备;NDB使用 start backup
命令执行在线热备。
数据量规模
通常小于30G的数据可采用逻辑备份方式(mysqldump)在业务闲时备份,备份和恢复一般可以在30分钟内完成;大于30G的数据可考虑物理备份。备份速度还取决于物理磁盘的IO能力。
全量备份
全量备份是使用mysqldump或MEB工具对全部数据进行备份,数据量越大备份全量备份的间隔越长。
增量备份
增量备份是利用MySQL的BINLOG所记录数据库在线变更的功能,对其定时备份。任何存储引擎都可以使用此方式。MEB支持针对InnoDB数据页的增量备份,每次只备份变化的数据页,此方式只对InnoDB引擎有效。
备份方案
MySQL 单机版
场景1:数据量30G以内
备份方式:在线逻辑备份
备份周期:每天全备+每小时binlog备份
备份方法:
全量备份命令
mysqldump -uUSER -pPASSWORD --single-transaction DATABASE [TABLES] |gzip > DATABASE.sql.gz
Binlog备份脚本
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 | #!/bin/bash
MyUSER= # username
MyPASS= # password
DATADIR= # data directory
BACKDIR= # backup binlog directory
# Linux bin paths, change this if it can not be autodetected via which command
MYSQLADMIN="$(which mysqladmin)"
# read binlog index get binlog name
$MYSQLADMIN -u$MyUSER -p$MyPASS flush-logs
FILELIST=`cat $DATADIR/mysql-bin.index`
cd $DATADIR
COUNTER=0
for file in $FILELIST
do
COUNTER=`expr $COUNTER + 1 `
done
NextNum=0
for file in $FILELIST
do
BASE=`basename $file`
NextNum=`expr $NextNum + 1`
if [ $NextNum -eq $COUNTER ]
then
echo "skip lastest"
else
dest=$BACKDIR/$BASE
if [ -e $dest ]
then
echo "skip exist $BASE"
else
echo "copying $BASE"
cp $BASE $BACKDIR
fi
fi
done
echo "Backup MySQL BinLog OK !"
|
计划任务:
#crontab -l
0 3 * * * 全备
1 * * * * binlog备份
恢复步骤:
-
选取数据丢失前最近的全备文件
-
暂停业务访问数据库
- 导入最近的全备文件
gunzip < DATABASE.sql.gz | mysql -uUSER -pPASSWORD DATABASE
- 选取全备时间点的binlog备份,若因误操作删除造成数据丢失则stop-datetime为误操作前时间点
mysqlbinlog --start-datetime='最近全备时间' --stop-datetime='最终误操作前时间点' BINLOG_1 .. BINLOG_N | mysql -uUSER -pPASSWORD
- 验证数据
- 恢复业务访问
场景2:数据量大于30G
备份方式:在线热备
备份周期:每周全备+每天增备+每小时binlog备份
备份方法:使用MEB工具
全量备份命令
mysqlbackup -uUSER -pPASSWORD --backup-dir=FULL_BACKUP_DIR --with-timestamp backup-and-apply-log
增量备份命令
mysqlbackup -uUSER -pPASSWORD --incremental-base=history:last_backup --incremental-backup-dir=INCREMENT_BACKUP_DIR --with-timestamp --incremental backup
计划任务:
#crontab -l
0 3 * * 0 全备
0 3 * * * 增备
1 * * * * binlog备份
恢复步骤:
MEB数据恢复的流程分成prepare和copy-back 两个部分,prepare部分是将所有的增量备份与全量备份合并,从全备之后的第一个增量备份开始,逐个的将增量备份合并到全量备份, 然后将合并完成的全量备份copy-back回数据目录完成恢复。
-
选取数据丢失前最近的全备文件
-
暂停业务访问数据库
- 从第一个增量备份逐个开始合并到全备
mysqlbackup -uUSER -pPASSWORD --incremental-backup-dir= INCREMENTAL-DIR-N --backup-dir=FULL_BACKUP_DIR apply-incremental-backup
- 关闭MySQL实例
- 恢复全量备份
mysqlbackup --defaults-file=/FULL_BACKUP_DIR/backup-my.cnf --datadir=DATA_DIR --backup-dir=FULL_BACKUP_DIR copy-back
- 选取全备时间点的binlog备份,若因误操作删除造成数据丢失则stop-datetime为误操作前时间点
mysqlbinlog --start-datetime='最近全备时间' --stop-datetime='最终误操作前时间点' BINLOG_1 .. BINLOG_N | mysql -uUSER -pPASSWORD
- 验证数据
- 恢复业务访问
MySQL Cluster
MySQL Cluster原生提供了在线热备命令start_backup
,恢复命令ndb_restore
。使用原生的备份方式可以在线同时对所有数据节点执行备份操作,也是MySQL Cluster推荐的备份方式。
MySQL Cluster也支持逻辑备份mysqldump,但为保证备份时数据一致性需进入单用户模式,此模式只有一个SQL节点可以访问数据,所以这种方式会影响业务访问,故不建议使用此方式作为日常的例行备份。
备份方式:在线热备
备份方法:使用ndb_mgm客户端工具连接到管理节点执行备份命令
ndb_mgm -c connectstring -e 'start backup'
恢复步骤:
-
选取数据丢失前每个数据节点最近的备份文件,传输到相应数据节点上
-
暂停业务访问数据库
- 在一个数据节点进行元数据恢复
ndb_restore -m -r -b BACKUP_ID --backup_path=BACKUP_DIR -n NODE_ID
- 在其余数据节点进行数据恢复
ndb_restore -r -b BACKUP_ID --backup_path=BACKUP_DIR -n NODE_ID
- 进入单用户模式,准备进行binlog恢复
ndb_mgm -c connectstring -e "ENTER SINGLE USER MODE <SQL ID>"
- 选取全备时间点的binlog备份,若因误操作删除造成数据丢失则stop-datetime为误操作前时间点
mysqlbinlog --start-datetime='最近全备时间' --stop-datetime='最终误操作前时间点' BINLOG_1 .. BINLOG_N | mysql -uUSER -pPASSWORD
- 验证数据
- 恢复业务访问
补充
- 本地数据备份完成最好是传输到独立的存储中集中管理
- 数据恢复前应写好整个恢复流程,然后按流程一步一步操作
- 定期在演练环境验证数据备份有效性
- 做好备份成败和磁盘空间监控
Comments
comments powered by Disqus