使用Xtrabackup备份mysql数据库(全备、增量)
环境:
CentOS6.8 Mysql5.6
Xtrabackup优点
备份速度快,物理备份可靠
备份过程不会打断正在执行的事务(无需锁表)
能够基于压缩等功能节约磁盘空间和流量
自动备份校验
还原速度快
可以流传将备份传输到另外一台机器上
在不增加服务器负载的情况备份数据
备份原理
备份开始时首先会开启一个后台检测进程,实时检测mysq redo的变化,一旦发现有新的日志写入,立刻将日志记入后台日志文件xtrabackup_log中,之后复制innodb的数据文件一系统表空间文件ibdatax,复制结束后,将执行flush tables with readlock,然后复制.frm MYI MYD等文件,最后执行unlock tables,最终停止xtrabackup_log输出如下提示信息:
xtrabackup: Transaction log of lsn (2543172) to (2543181) was copied.
171205 10:17:52 completed OK!
增量备份的原理是:
首先完成一个完全备份,并记录下此时检查点LSN;然后增量备份时,比较表空间中每个页的LSN是否大于上次备份的LSN,若是则备份该页并记录当前检查点的LSN。
增量备份优点:
数据库太大没有足够的空间全量备份,增量备份能有效节省空间,并且效率高;
支持热备份,备份过程不锁表(针对InnoDB而言),不阻塞数据库的读写;
每日备份只产生少量数据,也可采用远程备份,节省本地空间;
备份恢复基于文件操作,降低直接对数据库操作风险;
备份效率更高,恢复效率更高。
Xtrabackup安装
wget https://www.percona.com/downloads/XtraBackup/Percona-XtraBackup-2.4.9/binary/redhat/6/x86_64/Percona-XtraBackup-2.4.9-ra467167cdd4-el6-x86_64-bundle.tar
tar xf Percona-XtraBackup-2.4.9-ra467167cdd4-el6-x86_64-bundle.tar
yum -y install percona-xtrabackup-24-2.4.9-1.el6.x86_64.rpm
若报错Requires: libev.so.4()(64bit),则需安装
yum -y install epel-release
yum -y install libev.x86_64 libev-devel.x86_64
然后再次安装,安装完成
Xtrabackup备份与恢复
全备
innobackupex --defaults-file=/opt/mysql/etc/my.cnf --user=root --password="wang123" --backup /opt/mysql_bak/
--defaults-file 指定当前mysql的配置文件
--backup 指定要备份到的目录
恢复数据
innobackupex --apply-log /opt/mysql_bak/2019-01-25_16-40-44/
注意恢复数据时要保证mysql原来的data目录为空,可手动mv以后新建
注意数据恢复后要重启数据库
Xtrabackup增量备份与恢复
增量备份
innobackupex --defaults-file=/opt/mysql/etc/my.cnf --user=root --password=wang123 --incremental /opt/mysql_bak/zhengliang/ --incremental-basedir=/opt/mysql_bak/2019-01-25_16-40-44/
--incremental /backup/ 指定增量备份文件备份的目录
--incremental-basedir 指定上一次全备或增量备份的目录
恢复数据
注意产生增量备份后想要恢复数据需要先将后续生成的增量备份文件和之前的全被文件进行数据一致性操作,使用--redo-only
innobackupex --apply-log --redo-only /opt/mysql_bak/2019-01-25_16-40-44/
innobackupex --apply-log --redo-only /opt/mysql_bak/2019-01-25_16-40-44/ --incremental-dir=/opt/mysql_bak/zhengliang/2019-01-28_16-07-44/
将所有后续的增量本分同全备做一致性操作以后再使用全备文件恢复
innobackupex --defaults-file=/opt/mysql/etc/my.cnf --copy-back /opt/mysql_bak/2019-01-25_16-40-44/