xtrabackup 备份工具

1、xtrabackup 工具介绍

percona提供的mysql数据库备份工具,惟一开源的能够对innodb和xtradb数据库进行热备的工具

官网:www.percona.com

下载: https://www.percona.com/downloads/

xtrabackup 特点:

  • 备份还原过程快速、可靠
  • 备份过程不会打断正在执行的事务
  • 能够基于压缩等功能节约磁盘空间和流量
  • 自动实现备份检验
  • 开源,免费

xtrabackup工具文件组成

Xtrabackup2.2 版之前包括4个可执行文件:

  • innobackupex Perl 脚本
  • xtrabackup: C/C++ 编译的二进制程序
  • xbcrypt 加解密
  • xbstream 支持并发写的流文件格式

xtrabackup 是用来备份 InnoDB 表的,不能备份非 InnoDB 表,和 MySQL Server 没有交互

innobackupex 脚本用来备份非 InnoDB 表,同时会调用 xtrabackup 命令来备份 InnoDB 表,还会和MySQL Server 发送命令进行交互,如加全局读锁(FTWRL)、获取位点(SHOW SLAVE STATUS)等。即innobackupex是在 xtrabackup 之上做了一层封装实现的

xtrabackup的新版变化

xtrabackup版本升级到2.4后,相比之前的2.1有了比较大的变化:innobackupex 功能全部集成 xtrabackup 里面,只有一个 binary程序,另外为了兼容考虑,innobackupex作为 xtrabackup 的软链接,即xtrabackup现在支持非Innodb表备份,并且 Innobackupex 在下一版本中移除,建议通过xtrabackup替换innobackupex。

图片[1]-xtrabackup 备份工具-李佳程的个人主页
xtrabackup备份过程

备份生成的相关文件

使用innobackupex备份时,其会调用xtrabackup备份所有的InnoDB表,复制所有关于表结构定义的相关文件(.frm)、以及MyISAM、MERGE、CSV和ARCHIVE表的相关文件,同时还会备份触发器和数据库配置信息相关的文件。这些文件会被保存至一个以时间命名的目录中,在备份时,innobackupex还会在备份目录中创建如下文件:

  • xtrabackup_info
    • 文本文件,innobackupex工具执行时的相关信息,包括版本,备份选项,备份时长,备份LSN(log sequence number日志序列号),BINLOG的位置
  • xtrabackup_checkpoints
    • 文本文件,备份类型(如完全或增量)、备份状态(如是否已经为prepared状态)和LSN范围信息,每个InnoDB页(通常为16k大小)都会包含一个日志序列号LSN。LSN是整个数据库系统的系统版本号,每个页面相关的LSN能够表明此页面最近是如何发生改变的
  • xtrabackup_binlog_info
    • 文本文件,MySQL服务器当前正在使用的二进制日志文件及至备份这一刻为止二进制日志事件的位置,可利用实现基于binlog的恢复
  • backup-my.cnf
    • 文本文件,备份命令用到的配置选项信息
  • xtrabackup_logfile
    • 备份生成的二进制日志文件

2、xtrabackup 安装

https://www.percona.com/downloads/Percona-XtraBackup-2.4/LATEST/
[root@centos79-mysql01 ~]# yum install -y percona-xtrabackup-24-2.4.26-1.el7.x86_64.rpm

[root@centos79-mysql01 ~]# rpm -ql percona-xtrabackup-24
/usr/bin/innobackupex
/usr/bin/xbcloud
/usr/bin/xbcloud_osenv
/usr/bin/xbcrypt
/usr/bin/xbstream
/usr/bin/xtrabackup
/usr/lib64/xtrabackup/plugin/keyring_file.so
/usr/lib64/xtrabackup/plugin/keyring_vault.so
/usr/share/doc/percona-xtrabackup-24-2.4.26
/usr/share/doc/percona-xtrabackup-24-2.4.26/LICENSE
/usr/share/man/man1/innobackupex.1.gz
/usr/share/man/man1/xbcrypt.1.gz
/usr/share/man/man1/xbstream.1.gz
/usr/share/man/man1/xtrabackup.1.gz

3、xtrabackup 用法

xtrabackup工具备份和还原,需要三步实现

  • 备份:对数据库做完全或增量备份
  • 预准备: 还原前,先对备份的数据,整理至一个临时目录
  • 还原:将整理好的数据,复制回数据库目录中
# 备份
innobackupex [option] BACKUP-ROOT-DIR
# 选项
--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] BACKUP-DIR
# 选项
--apply-log:#一般情况下,在备份完成后,数据尚且不能用于恢复操作,因为备份的数据中可能会包含尚未提交的事务或已经提交但尚未同步至数据文件中的事务。因此,此时数据文件仍处理不一致状态。此选项作用是通过回滚未提交的事务及同步已经提交的事务至数据文件使数据文件处于一致性状态

--use-memory:#和--apply-log选项一起使用,当prepare 备份时,做crash recovery分配的内存大,单位字节,也可1MB,1M,1G,1GB等,推荐1G

--export:#表示开启可导出单独的表之后再导入其他Mysql中

--redo-only:#此选项在prepare base full backup,往其中合并增量备份时候使用,但不包括对最后一个增量备份的合并
# 还原
innobackupex --copy-back [选项] BACKUP-DIR
innobackupex --move-back [选项] [--defaults-group=GROUP-NAME] BACKUP-DIR
# 选项
--copy-back:#做数据恢复时将备份数据文件拷贝到MySQL服务器的datadir

--move-back:#这个选项与--copy-back相似,唯一的区别是它不拷贝文件,而是移动文件到目的地。这个选项移除backup文件,用时候必须小心。使用场景:没有足够的磁盘空间同事保留数据文件和Backup副本

--force-non-empty-directories #指定该参数时候,使得innobackupex --copy-back或--move-back选项转移文件到非空目录,已存在的文件不会被覆盖。如果--copy-back和--move-back文件需要从备份目录拷贝一个在datadir已经存在的文件,会报错失败

还原注意事项:

  • datadir 目录必须为空。除非指定innobackupex –force-non-empty-directorires选项指定,否则–
    copy-back选项不会覆盖
  • 在restore之前,必须shutdown MySQL实例,不能将一个运行中的实例restore到datadir目录中
  • 由于文件属性会被保留,大部分情况下需要在启动实例之前将文件的属主改为mysql,这些文件将
    属于创建备份的用户, 执行chown -R mysql:mysql /data/mysql,以上需要在用户调用
    innobackupex之前完成

4、案例:利用 xtrabackup 实现完全备份及还原

# 利用xtrabackup8.0 完全备份和还原MySQL8.0

# 安装xtrabackup包
[root@centos79-mysql02 ~]# yum install -y percona-xtrabackup-80-8.0.30-23.1.el7.x86_64.rpm

# 在原主机做完全备份到/backup
[root@centos79-mysql02 ~]# mkdir /backup/
[root@centos79-mysql02 ~]# xtrabackup -uroot -p123456 --backup --target-dir=/backup/base

# 目标主机无需创建/backup目录,直接复制目录本身
[root@centos79-mysql02 ~]# scp -r /backup/ 192.168.1.23:/

# 在目标主机上还原
# 恢复主机MySQL服务停止,并且数据目录为空
# 预准备:确保数据一致,提交完成的事务,回滚未完成的事务

[root@centos79-mysql03 ~]# yum install -y percona-xtrabackup-80-8.0.30-23.1.el7.x86_64.rpm
[root@centos79-mysql03 ~]# xtrabackup --prepare --target-dir=/backup/base

# 复制到数据库目录
# 数据库目录必须为空,MySQL服务不能启动
[root@centos79-mysql03 ~]# xtrabackup --copy-back --target-dir=/backup/base

# 还原属性
[root@centos79-mysql03 ~]# chown -R mysql:mysql /data/mysql

# 启动服务
[root@centos79-mysql03 ~]# service mysqld start

5、案例:利用xtrabackup完全,增量备份及还原

# 利用xtrabackup8.0 完全,增量备份及还原MySQL8.0

# 安装xtrabackup包
[root@centos79-mysql02 ~]# yum install -y percona-xtrabackup-80-8.0.30-23.1.el7.x86_64.rpm

# 完全备份到/backup
[root@centos79-mysql02 ~]# mkdir /backup/
[root@centos79-mysql02 ~]# xtrabackup -uroot -p123456 --backup --target-dir=/backup/base

# 第一次增加数据
insert students (name,age,gender)value('wang ning',20,'M');
insert students (name,age,gender)value('ai lun',20,'M');
insert students (name,age,gender)value('shen teng',20,'M');

# 第一次增量备份
xtrabackup -uroot -p123456 --backup --target-dir=/backup/inc1 --incremental-basedir=/backup/base

# 第二次增加数据
insert students (name,age,gender)value('ma li',20,'M');
insert students (name,age,gender)value('liu jiajia',20,'M');
insert students (name,age,gender)value('hu jiang',20,'M');

# 第二次增量备份
xtrabackup -uroot -p123456 --backup --target-dir=/backup/inc2 --incremental-basedir=/backup/inc1

[root@centos79-mysql02 ~]# scp -r /backup/*  192.168.1.23:/

# 还原过程
# 预准备完成备份,此选项--apply-log-only 阻止回滚未完成的事务
[root@centos79-mysql03 ~]# xtrabackup --prepare --apply-log-only --target-dir=/backup/base

# 合并第1次增量备份到完全备份
[root@centos79-mysql03 ~]# xtrabackup --prepare --apply-log-only --target-dir=/backup/base --incremental-dir=/backup/inc1

# 合并第2次增量备份到完全备份:最后一次还原不需要加选项--apply-log-only
[root@centos79-mysql03 ~]# xtrabackup --prepare --target-dir=/backup/base --incremental-dir=/backup/inc2

# 复制到数据库目录,注意数据库目录必须为空,MySQL服务不能启动
[root@centos79-mysql03 ~]# xtrabackup --copy-back --target-dir=/backup/base
[root@centos79-mysql03 ~]# chown -R mysql:mysql /data/mysql
[root@centos79-mysql03 ~]# service mysqld start

6、案例:xtrabackup单表导出和导入

# 导出

# 单表备份
[root@centos79-mysql01 ~]# innobackupex -uroot -p123456 --include='hellodb.students' /backup

# 备份表结构
[root@centos79-mysql01 backup]# mysql -uroot -p123456 -e 'show create table hellodb.students' > student.sql

# 删除表
[root@centos79-mysql01 backup]# mysql -uroot -p123456 -e 'drop table hellodb.students'

# 导出
[root@centos79-mysql01 ~]# innobackupex  --apply-log --export /backup/2022-11-19_15-27-34/

# 创建表
mysql> CREATE TABLE `students` (`StuID` int(10) unsigned NOT NULL AUTO_INCREMENT,`Name` varchar(50) NOT NULL,`Age` tinyint(3) unsigned NOT NULL,`Gender` enum('F','M') NOT NULL,`ClassID` tinyint(3) unsigned DEFAULT NULL,`TeacherID` int(10) unsigned DEFAULT NULL,PRIMARY KEY (`StuID`)) ENGINE=InnoDB AUTO_INCREMENT=26 DEFAULT CHARSET=utf8;

# 删除表空间
mysql> alter table students discard tablespace;

# 复制表文件到数据库目录下
[root@centos79-mysql01 ~]# cp /backup/2022-11-19_15-27-34/hellodb/students.{cfg,exp,ibd} /data/mysql/hellodb/

# 修改权限
[root@centos79-mysql01 ~]# chown -R mysql.mysql /data/mysql/hellodb

# 恢复表空间
mysql> alter table students import tablespace;

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享