Xtrabackup
是由 percona
公司 开源 的免费数据库 热备份 软件,它能对 InnoDB
数据库和 XtraDB
存储引擎的数据库进行 非阻塞 地备份。
众所周知,mysqldump
备份方式是采用的逻辑备份,其最大的缺陷是备份和恢复速度较慢,如果数据库大于50G
,mysqldump
备份就不太适合。
相比而言,Xtrabackup
的优势体现在:
- 备份、还原速度快,物理备份可靠
- 备份过程不会打断正在执行的事务(无需锁表)
- 能够基于压缩等功能节约磁盘空间和流量
- 支持流式处理,将备份传输到另外一台机器上
- 自动备份校验
Xtrabackup
安装完成后有 4 个可执行文件:
xtrabackup
: 是专门用来备份InnoD
B表的,和mysql
服务器没有交互;innobackupex
: 是一个封装xtrabackup的Perl
脚本,支持同时备份innodb
和myisam
,但在对myisam
备份时需要加一个全局的读锁。xbcrypt
: 加密解密备份工具xbstream
: 流打包传输工具
全备恢复
首先,准备一个数据库全备份
:
1 | root@zhaobi:~# innobackupex --user=*** --password=*** ./mysql.back |
Xtrabackup
备份原理:
备份开始时首先会开启一个后台检测进程,实时检测
mysql redo log
的变化,一旦发现有新的日志写入,立刻将日志记入后台日志文件xtrabackup_log
中,之后复制InnoDB
的数据文件以及系统表空间文件ibdatax
,复制结束后,将执行flush tables with readlock
,然后复制.frm .MYI .MYD
等文件,最后执行unlock tables
。
输出 completed OK!
信息代表备份成功。
看一下备份后的文件列表:
1 | root@zhaobi:~# ls -l mysql.back/2018-05-08_14-32-32/ |
然后,将备份好的数据拷贝到目标主机,准备进行恢复:
先关掉目标主机的 mysql
服务,准备一个全备份:
1 | $ innobackupex --apply-log /path/to/BACKUP-DIR |
准备完成后,检查下最后输出到信息:
1 | 150806 01:01:57 InnoDB: Shutdown completed; log sequence number 1609228 |
接着进行全备恢复:
1 | $ innobackupex --copy-back /path/to/BACKUP-DIR |
增量备份
优点:
- 数据库太大没有足够的空间全量备份,增量备份能有效节省空间,并且效率高;
- 支持热备份,备份过程不锁表(针对
InnoDB
而言),不阻塞数据库的读写; - 每日备份只产生少量数据,也可采用远程备份,节省本地空间;
- 备份恢复基于文件操作,降低直接对数据库操作风险;
原理:
- 首先完成一个全备份,并记录下此时检查点
LSN
; - 然后增量备份时,比较表空间中每个页的
LSN
是否大于上次备份的LSN
,若是则备份该页并记录当前检查点的LSN
。
增量备份需要用到两个参数:
--incremental
告诉innobackupex
进行增量备份--incremental-basedir
指定增量备份的起始点,这里是之前备份过的某个目录
在全量备份基础上进行第一次增量备份:
1 | root@zhaobi:~# innobackupex --user=** --password=*** --incremental --incremental-basedir=./mysql.back/2018-05-08_14-32-32/ ./mysql.inc1 |
对比两次备份的 xtrabackup_checkpoints
记录可以看到:
backup_type
分别为full-backuped
,incremental
- 增量备份的
from_lsn
对应于上次全量备份的to_lsn
1 | root@zhaobi:~# cat mysql.back/2018-05-08_14-32-32/xtrabackup_checkpoints |
在第一次增量备份基础上,进行第二次增量备份:
1 | root@zhaobi:~# innobackupex --user=** --password=*** --incremental --incremental-basedir=./mysql.inc1/2018-05-08_15-24-35/ ./mysql.inc2 |
同理,第二次增量备份的 from_lsn
对应于第一次增量备份的 to_lsn
:
1 | root@zhaobi:~# cat mysql.inc2/2018-05-08_15-36-58/xtrabackup_checkpoints |
增量恢复
首先,准备一个全备份:
1 | innobackupex --apply-log --redo-only BASE-DIR |
然后,依次将增量备份 append
到全备份,特别需要注意的是:最后一个增量备份不用 --redo-only
1 | innobackupex --apply-log --redo-only BASE-DIR --incremental-dir=INCREMENTAL-DIR-1 |
确保每次操作最后都打出了日志信息: completed OK!
现在,所有的备份都整合到了 BASE-DIR
,对合在一起的完全备份进行一次 apply
操作,回滚未提交的数据:
1 | innobackupex --apply-log BASE-DIR |
最后,恢复所有备份:
1 | innobackupex --copy-back BASE-DIR |
总结
这篇文章简单记录并总结了使用 Xtrabackup
对 mysql
数据库进行 全量/增量
备份并恢复的过程,希望能对初学者有所帮助。
很抱歉,就做了点微小的贡献。