利用Xtrabackup进行mysql增量备份
现在xtrabackup版本升级到了8.0,但是只对mysql8.0
才有支持, 我们这或者使用2.4
, 但是2.4
相比之前的2.1
有了比较大的变化:innobackupex
功能全部集成到 xtrabackup
里面,只有一个 binary
,另外为了使用上的兼容斟酌,innobackupex
作为 xtrabackup
的一个软链,即 xtrabackup
现在支持非Innodb表备份,并且 Innobackupex
在下一版本中移除(8.0已移除),建议通过xtrabackup
替换innobackupex
。还有其他的一些新特性,更多的说明可以看xtrabackup
新版详细说明。
下载地址: https://www.percona.com/downloads/Percona-XtraBackup-LATEST/
文档地址: https://docs.percona.com/percona-xtrabackup/2.4/index.html
安装
如果安装需要依赖就把依赖安装一下
wget https://repo.percona.com/apt/percona-release_latest.$(lsb_release -sc)_all.deb
sudo dpkg -i percona-release_latest.$(lsb_release -sc)_all.deb
sudo apt-get update
sudo apt-get install percona-xtrabackup⑵4
设置数据库用于备份账户
mysql> CREATE USER ‘bkpuser’@’localhost’ IDENTIFIED BY ‘123456’;
mysql> GRANT RELOAD, LOCK TABLES, PROCESS, REPLICATION CLIENT ON *.* TO ‘bkpuser’@’localhost’;
mysql> FLUSH PRIVILEGES;
全量备份
xtrabackup –user=bkpuser –password=123456 –backup –target-dir=/data/backups/mysql
# 会看到输出
200603 09:55:37 Executing UNLOCK TABLES
200603 09:55:37 All tables unlocked
200603 09:55:37 [00] Copying ib_buffer_pool to /data/backups/mysql/ib_buffer_pool
200603 09:55:37 [00] …done
200603 09:55:37 Backup created in directory ‘/data/backups/mysql/’
200603 09:55:37 [00] Writing /data/backups/mysql/backup-my.cnf
200603 09:55:37 [00] …done
200603 09:55:37 [00] Writing /data/backups/mysql/xtrabackup_info
200603 09:55:37 [00] …done
xtrabackup: Transaction log of lsn (837940114) to (837940123) was copied.
200603 09:55:37 completed OK!
xtrabackup –prepare –target-dir=/data/backups/mysql
我这里为了演示全量备份就直接将我博客 mysql
存储的数据目录给移动一下
mv /var/lib/mysql /var/lib/mysql_bak
mkdir /var/lib/mysql
xtrabackup –copy-back –target-dir=/data/backups/mysql # 这样会保存原始备份 他会将当时读到my.cnf的datadir设置为恢复路径
200603 10:47:42 [01] …done
200603 10:47:42 [01] Copying ./performance_schema/mutex_instances.frm to /var/lib/mysql/performance_schema/mutex_instances.frm
200603 10:47:42 [01] …done
200603 10:47:42 [01] Copying ./performance_schema/events_transactions_history_long.frm to /var/lib/mysql/performance_schema/events_transactions_history_long.frm
200603 10:47:42 [01] …done
200603 10:47:42 [01] Copying ./xtrabackup_info to /var/lib/mysql/xtrabackup_info
200603 10:47:42 [01] …done
200603 10:47:42 [01] Copying ./ibtmp1 to /var/lib/mysql/ibtmp1
200603 10:47:42 [01] …done
200603 10:47:42 completed OK!
# 将恢复目录的属主更改一下
chown -R mysql:mysql mysql
/etc/init.d/mysql start
如果恢复玩不想要备份数据可使用 xtrabackup --move-back
命令
增量备份
增量是基于已有数据进行备份的,也就行需要先创建一次全量备份,然后记录当时的记录点
xtrabackup –user=bkpuser –password=123456 –backup –target-dir=/data/backups/base
# 基于全量备份进行增量
xtrabackup –user=bkpuser –password=123456 –backup –target-dir=/data/backups/inc1 –incremental-basedir=/data/backups/base
root@longing:/data/backups/inc1# cat xtrabackup_checkpoints
backup_type = incremental
from_lsn = 837943393
to_lsn = 837943393
last_lsn = 837943402
compact = 0
recover_binlog_info = 0
flushed_lsn = 837943402
from_lsn
是备份的起始 LSN
,对增量备份,它一定要to_lsn
与先前 base
备份的相同。
在这类情况下,您可以看到to_lsn
(最后一个检查点LSN)和last_lsn
(最后一个复制的LSN
)之间存在差异,这意味着在备份进程中服务器上有一些流量。
- 我们可以测试一下 对第一个增加继续创建增量 创建增量之前先创建几条数据
xtrabackup –user=bkpuser –password=123456 –backup –target-dir=/data/backups/inc2 –incremental-basedir=/data/backups/inc1
已有3个备份了,我们要先对基础数据进行准备,然后对两个增量进行准备
xtrabackup –user=bkpuser –password=123456 –prepare –apply-log-only –target-dir=/data/backups/base
xtrabackup –user=bkpuser –password=123456 –prepare –apply-log-only –target-dir=/data/backups/base –incremental-dir=/data/backups/inc1
xtrabackup –user=bkpuser –password=123456 –prepare –target-dir=/data/backups/base –incremental-dir=/data/backups/inc2
xtrabackup --apply-log-only
合并除最后一个之外的所有增量时应使用, 一旦准备好,增量备份就与完全备份相同,可以用相同的方式还原它们。
xtrabackup –copy-back –target-dir=/data/backups/base
中间插入的数据就可以看见了,真棒!
发问总结
- 创建基础备份
- 一定条件进行增量备份创建
- 对所有备份进行准备 所有增量基于基础备份 相当于合并操作
- 最后和全量备份一样 直接恢复便可
原理
在InnoDB
内部会保护一个redo日志文件,我们也能够叫做事务日志文件.事务日志会存储每个InnoDB表数据的记录修改。当InnoDB启动时,InnoDB会检查数据文件和事务日志,并履行两个步骤:它利用(前滚)已提交的 事务日志到数据文件,并将修改过但没有提交的数据进行回滚操作。
Xtrabackup
在启动时会记住log sequence number(LSN)
, 并且复制所有的数据文件。复制进程需要一些时间,所以这期间如果数据文件有改动,那末将会使数据库处于一个区别的时间点。这时候,xtrabackup
会运行一个后台进程,用于监视事务日志,并从事务日志复制最新的修改。Xtrabackup
一定要延续的做这个操作,是由于事务日志是会轮转重复的写入,并且事务日志可以被重用。所以 xtrabackup
自启动开始,就不停的将事务日志中每一个数据文件的修改都记录下来。上面就是 xtrabackup
的备份进程。
为何最后一次增量备份不用 "–apply-log-only"
最后一次"准备"操作可以不用跳过回滚操作,这样用来恢复的数据文件本地就处理好了,当服务启动后就不会再进入到回滚阶段,如果最后一次使用了这个参数,服务器启动后将进入回滚阶段。所以这个--apply-log-only
只是用来合并增量用的避免下一个增量不可用。 可以参见 参见 man xtrabackup
为何备份完后要准备备份 "prepare"
一般情况下,在备份完成后,数据尚且不能用于恢复操作,由于备份的数据中可能会包括还没有提交的事务或已提交但还没有同步至数据文件中的事务。因此,此时数据文件仍处理不一致状态。他作用是通过回滚未提交的事务及同步已提交的事务至数据文件使数据文件处于一致性状态。
为何选择这个做备份?
效力较低,备份和还原速度慢,份进程中,数据插入和更新操作会被挂起
跨平台性差,备份时间长,冗余备份,浪费存储空间
备份进程中不锁库表,合适生产环境,由专业组织Percona
提供( 改进MySQL
分支 )
固然了,只不过博主太懒了,写起来太麻烦了,不过原理都是差不多,操作也差不多,大家自己弄弄!
还原
- 先
prepare
,利用--apply-log
的作用是通过回滚未提交的事务及同步已提交的事务至数据文件使数据文件处于一致性状态
copy
,由于是部份备份,不能直接用--copy-back
,只能手动来复制需要的库,也要复制ibdata(数据字典)
cp /data/backups/u/ibdata1 /var/lib/mysql/
cp -r u/u_test /var/lib/mysql/
本篇文章到此结束,如果您有相关技术方面疑问可以联系我们技术人员远程解决,感谢大家支持本站!
文章来源:丸子建站
文章标题:详解如何利用Xtrabackup进行mysql增量备份
https://www.wanzijz.com/view/45212.html