【MySQL技术专题】「问题实战系列」深入探索和分析MySQL数据库的数据备份和恢复实战开发指南(数据恢复补充篇)(一)https://developer.aliyun.com/article/1471057
环境准备
- 完全备份目录:
/data/backup/full
。 - 每次成功完成命令操作时,日志结尾处会打印标志【completed OK!】,用于区分完全备份和增量备份。
备份操作
bash
复制代码
innobackupex --user=root --password /data/backup/full
介绍说明
上述命令用于在 /data/backup/full 目录下生成一个名为【yyyy-MM-dd_HH-mm-ss】的文件夹。
然而,此备份通常不能用于恢复,因为备份中可能存在尚未提交的事务或已提交的事务但尚未同步至数据文件的事务,导致数据文件处于不一致状态。
因此,我们需要执行一些操作来回滚未提交的事务并将已提交的事务同步至数据文件,以确保数据文件处于一致状态。 执行以下命令:
bash
复制代码
innobackupex --user=root --password --defaults-file=/data/mysql/my.cnf --apply-log /data/backup/full/yyyy-MM-dd_HH-mm-ss
其中参数 --apply-log 用于启动恢复过程。
恢复操作
关闭数据库,备份原数据,创建新的数据目录
停止MySQL服务
bash
复制代码
[root@mysql]# /data/3306/mysql stop
移动原数据目录至备份目录
bash
复制代码
[root@mysql]# mv /data/3306/data/ /data/3306/data_bak
创建新的数据目录
bash
复制代码
[root@mysql]# mkdir /data/3306/data
注意:恢复全备份必须恢复到一个空目录中,否则会出现错误。
执行innobackupex恢复命令
bash
复制代码
[root@mysql]# innobackupex --defaults-file=/data/3306/my.cnf --user=xxx--password=xxxx--copy-back /data/backup/full/yyyy-MM-dd_HH-mm-ss
对新目录进行授权,此操作需要在innobackupex恢复命令后执行
bash
复制代码
chmod -R mysql.mysql /data/mysql/data
重启服务,并检查数据是否成功恢复。
bash
复制代码
[root@mysql]# /data/3306/mysql start
启动MySQL服务...
bash
复制代码
[root@mysql]# ps -ef|grep 3306
增量备份
环境准备
环境备份目录说明:
- 全量备份目录:/data/backup/full
- 增量备份目录1:/data/backup/inc1
- 增量备份目录2:/data/backup/inc2
以下是备份命令示例:
全量备份:
bash
复制代码
innobackupex --defaults-file=/data/3306/my.cnf --user=root --password=123456 /data/backup/full
第一次增量备份
bash
复制代码
innobackupex --defaults-file=/data/3306/my.cnf --user=root --password=123456 --incremental /data/backup/inc1 --incremental-basedir=/data/backup/full/yyyy-MM-dd_HH-mm-ss
其中,--incremental-basedir 参数指定了完全备份所在的目录
全量备份和增量备份相互结合,可以实现尽可能保证数据的一致性和完整性。
注意事项
- innobackupex命令执行后,在 /data/backup 目录下会创建一个以时间命名的新目录,用于存放所有增量备份数据。
- 如果进行多次增量备份,请确保每次增量备份的 --incremental-basedir 参数指向上一次增量备份的目录。
- 增量备份仅适用于 InnoDB 或 XtraDB 表,对于 MyISAM 表,执行增量备份实际上是进行完全备份的操作。
第二次增量备份
bash
复制代码
innobackupex --defaults-file=/data/3306/my.cnf --user=root --password=123456 --incremental /data/backup/inc2 --incremental-basedir=/data/backup/inc1/yyyy-MM-dd_HH-mm-ss
如果需要恢复的话需要先执行如下操作
bash
复制代码
innobackupex --apply-log --redo-only /data/backup/full/yyyy-MM-dd_HH-mm-ss innobackupex --apply-log --redo-only /data/backup/full/yyyy-MM-dd_HH-mm-ss --incremental-dir=/data/backup/inc1/yyyy-MM-dd_HH-mm-ss
再次重申一下:如果存在多次增量备份的话,就多次执行如下命令。此处执行针对的是第二次增量备份
执行恢复命令
bash
复制代码
innobackupex --defaults-file=/data/3306/my.cnf --user=root --password=123456 --copy-back /data/backup/full/yyyy-MM-dd_HH-mm-ss
指定使用 --databases 参数可以备份指定的数据库。
案例分析
示例1:
bash
复制代码
innobackupex --default-file=/data/3306/my.cnf --user-root --password-123456 --databases="backup" /data/backup/
示例2:
bash
复制代码
innobackupex --default-file=/data/3306/my.cnf --user=root --password=12345 --databases="backup" /data/backup/
指定使用 --stream 参数进行备份,并将备份数据压缩成压缩包。
示例:
bash
复制代码
innobackupex --default-file=/data/3306/my.cnf --user=root --password=123456 --stream=tar /backup/full/ | gzip > /backup/full/back_$(date +%F).tar.gz
请注意,以上示例中的参数和路径应根据实际情况进行调整。