Xtrabackup是一个对InnoDB做数据备份的工具,支持在线热备份(备份时不影响数据读写),是商业备份工具InnoDB Hotbackup的一个很好的替代品。Xtrabackup是由percona开源的免费数据库热备份软件,它能对InnoDB数据库和XtraDB存储引擎的数据库非阻塞地备份(对于MyISAM的备份同样需要加表锁);mysqldump备份方式是采用的逻辑备份,其最大的缺陷是备份和恢复速度较慢,如果数据库大于50G,mysqldump备份就不太适合。
Xtrabackup优点
- 备份速度快,物理备份可靠
- 备份过程不会打断正在执行的事务(无需锁表)
- 能够基于压缩等功能节约磁盘空间和流量
- 自动备份校验
- 还原速度快
- 可以流传将备份传输到另外一台机器上
- 在不增加服务器负载的情况备份数据
Xtrabackup备份原理
备份开始时首先会开启一个后台检测进程,实时检测mysql redo的变化,一旦发现有新的日志写入,立刻将日志记入后台日志文件xtrabackup_log中,之后复制innodb的数据文件一系统表空间文件ibdatax,复制结束后,将执行flush tables with readlock,然后复制.frm MYI MYD等文件,最后执行unlock tables,最终停止xtrabackup_log。
Xtrabackup增量备份介绍
xtrabackup增量备份的原理是:
- 首先完成一个完全备份,并记录下此时检查点LSN;
- 然后增量备份时,比较表空间中每个页的LSN是否大于上次备份的LSN,若是则备份该页并记录当前检查点的LSN。
- 增量备份优点:
- 数据库太大没有足够的空间全量备份,增量备份能有效节省空间,并且效率高;
- 支持热备份,备份过程不锁表(针对InnoDB而言),不阻塞数据库的读写;
- 每日备份只产生少量数据,也可采用远程备份,节省本地空间;
- 备份恢复基于文件操作,降低直接对数据库操作风险;
- 备份效率更高,恢复效率更高。
使用 epel 方式安装 XtraBackup
Xtrabackup用法:备份
- innobackupex [option] /PATH/TO/YOUR_BAKUP_DIR
- option 常用选项
- --user:该选项表示备份账号
--password:该选项表示备份的密码
--host:该选项表示备份数据库的地址
--databases:该选项接受的参数为数据库名,如果要指定多个数据库,彼此间需要以空格隔开;如:"xtra_test dba_test",同时,在指定某数据库时,也可以只指定其中的某张表。如:"mydatabase.mytable"。该选项对innodb引擎表无效,还是会备份所有innodb表
--defaults-file:该选项指定从哪个文件读取MySQL配置,必须放在命令行第一个选项位置
--incremental:该选项表示创建一个增量备份,需要指定--incremental-basedir
--incremental-basedir:该选项指定为前一次全备份或增量备份的目录,与--incremental同时使用
--incremental-dir:该选项表示还原时增量备份的目录
--include=name:指定表名,格式:databasename.tablename - innobackupex --apply-log [option] /PATH/TO/YOUR_BAKUP_DIR
- --apply-log:一般情况下,在备份完成后,数据尚且不能用于恢复操作,因为备份的数据中可能会包含尚未提交的事务或已经提交但尚未同步至数据文件中的事务。因此,此时数据文件仍处理不一致状态。此选项作用是通过回滚未提交的事务及同步已经提交的事务至数据文件使数据文件处于一致性状态( 最后一次时使用,中间不用)
--use-memory:和--apply-log选项一起使用,当prepare 备份时,做crash recovery分配的内存大小,单位字节,也可1MB,1M,1G,1GB等,推荐1G
--export:表示开启可导出单独的表之后再导入其他Mysql中
--redo-only:此选项在prepare base full backup,往其中合并增量备份时候使用,但不包括对最后一个增量备份的合并(中间使用,最后一次不用)
-
全量备份
将备份的文件存放在 /bak/mariadb 目录下
innobackupex --defaults-file=/etc/my.cnf --host=192.168.10.2 --user=root --password=123456 /bak/mariadb/
200112 18:43:10 completed OK! 备份成功
-
backup-my.cnf 包含了my.cnf中备份时需要的信息。
xtrabackup_checkpoints 备份属于那种类型的备份,是全量还是增量,备份时起始的LSN号码,结束的LSN号码等信息。
xtrabackup_info 本次备份的概要信息
xtrabackup_logfile 记录了备份过程中的日志,在对数据进行prepare时需要通过日志将数据还原成一致的可用的数据。
- 恢复数据
- 删除部分数据库后停止数据库服务
-
事务日志应用到备份
-
备份出的数据并不能直接使用,因为备份出的数据是不一致的,我们还需要将同时备份出的事务日志应用到备份中,才能得到一份完整、一致、可用的数据,xtrabackup称这一步操作为 prepare,也就是还原数据前的"准备"工作。
-
在事务日志容量很大的情况下,可以使用--use-memory选项加速,在不指定内存大小的情况下,默认会占用100MB的内存。
-
innobackupex --apply-log /全量备份目录
- 执行还原数据操作
- innobackupex --datadir=/var/lib/mysql --copy-back /bak/mariadb/2020-01-12_18-42-57/
--datadir:指定的目录就是还原后数据要存放的目录,如果my.cnf设置了datadir,可以省略--datadir,执行copyback时会读取my.cnf中的配置,还原数据时 datadir 目录必须为空目录。
--copy-back:对应的就是全量备份的目录。
- 开启服务后登录查看数据状况
-
增量备份
针对上次全量备份进行增量备份
-
innobackupex --user root --password 123456 --incremental /增量备份目录 --incremental-basedir=/全量备份目录
-
--incremental /bak/mariadb/inc1 新增加的备份目录,事先必须存在
-
--incremental-basedir 全量备份的目录
- 删除刚才增加的内容恢复测试
- 先对最开始的全量备份进行prepare工作,如果后面还有增量备份,此处prepare时需要使用 --redo-only 选项。
- innobackupex --apply-log --redo-only /bak/mariadb/2020-01-12_18-42-57/
- 将增量备份合并到全量备份中
- innobackupex --apply-log --redo-only /全量备份目录 --incremental-dir=/增量备份目录
- 如果有多个增量备份,最后一个增量之前的所有增量都可以使用类似如下命令进行prepare
- 唯一需要改变的就是 --incremental-dir 选项对应的增量目录
- 确认mysql服务已经停止,且对应的数据目录中没有任何文件
- systemctl stop mariadb
- rm -rf /var/lib/mysql/*
- 只还原最终准备好的全量备份即可
- innobackupex --copy-back /bak/mariadb/2020-01-12_18-42-57/
- 注意数据文件的属主属组,确认无误启动服务
- chown -R mysql: /var/lib/mysql/
- systemctl start mariadb
- 实际还原时还需要将对应的配置文件(例如my.cnf)也都还原了