xtrabackup 备份工具
percona提供的mysql数据库备份工具,唯一开源的能够对innodb和xtradb数据库进行热备的工具
- 特点:
- 备份还原过程快速、可靠
- 备份过程不会打断正在执行的事务
- 能够基于压缩等功能节约磁盘空间和流量
- 自动实现备份检验
- 开源,免费
- 4个工具(2.2版本前)
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的新版变化
xtrabackup版本升级到2.4后,相比之前的2.1有了比较大的变化:innobackupex 功能全部集成到 xtrabackup 里面,只有一个 binary程序,另外为了兼容考虑,innobackupex作为 xtrabackup 的软链接,即xtrabackup现在支持非Innodb表备份,并且 Innobackupex 在下一版本中移除,建议通过xtrabackup替换innobackupex
xtrabackup安装:
方式1. yum安装
#EPEL源
yum install percona-xtrabackup
安装的时候可能会有依赖,使用epel源
yum localinstall percona-xtrabackup-80-8.0.6-1.el7.x86_64.rpm
注意:在Percona XtraBackup 2.4官方文档中,写着
It can back up data from InnoDB, XtraDB, and MyISAM tables on MySQL 5.1 [1], 5.5, 5.6 and 5.7 servers, as well as Percona Server with XtraDB
2.4版本只支持5.1,5.5,5.6,5.7版本。如果你安装的10.2版本的MariDB或者8版本的MySQL,
innobackupex工具
- 备份格式
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副本 |
- 还原注意事项:
1.datadir 目录必须为空。除非指定innobackupex --force-non-empty-directorires选项指定,否则–copy-back选项不会覆盖
2.在restore之前,必须shutdown MySQL实例,不能将一个运行中的实例restore到datadir目录中
3.由于文件属性会被保留,大部分情况下需要在启动实例之前将文件的属主改为mysql,这些文件将属于创建备份的用户
chown -R mysql:mysql /data/mysql
以上需要在用户调用innobackupex之前完成--force-non-empty-directories
:指定该参数时候,使得innobackupex --copy-back或–move-back选项转移文件到非空目录,已存在的文件不会被覆盖。如果–copy-back和–move-back文件需要从备份目录拷贝一个在datadir已经存在的文件,会报错失败
备份生成的相关文件
使用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
:备份生成的日志文件
实验:xtrabackup完全备份及还原
在原主机做完全备份到/backups
#备份
[centos]$ xtrabackup --backup --target-dir=/backup/
#拷贝到要还原的主机
[centos]$ scp -r /backup/* 目标IP:/backup
备份时出错?:
[101]$ xtrabackup --backup --user='root' --password
xtrabackup: recognized server arguments: --datadir=/data/mysql
xtrabackup: recognized client arguments: --datadir=/data/mysql --target-dir=/data/backup --backup=1 --user=root --password
Enter password:
190708 22:01:49 version_check Connecting to MySQL server with DSN 'dbi:mysql:;mysql_read_default_group=xtrabackup' as 'root' (using password: NO).
190708 22:01:49 version_check Connected to MySQL server
190708 22:01:49 version_check Executing a version check against the server...
190708 22:01:49 version_check Done.
190708 22:01:49 Connecting to MySQL server host: localhost, user: root, password: set, port: not set, socket: not set
Using server version 10.4.6-MariaDB
xtrabackup version 2.4.13 based on MySQL server 5.7.19 Linux (x86_64) (revision id: 3e7ca7c)
xtrabackup: uses posix_fadvise().
xtrabackup: cd to /data/mysql
xtrabackup: open files limit requested 0, set to 1024
xtrabackup: using the following InnoDB configuration:
xtrabackup: innodb_data_home_dir = .
xtrabackup: innodb_data_file_path = ibdata1:12M:autoextend
xtrabackup: innodb_log_group_home_dir = ./
xtrabackup: innodb_log_files_in_group = 2
xtrabackup: innodb_log_file_size = 50331648
InnoDB: Number of pools: 1
InnoDB: Unsupported redo log format. The redo log was created with MariaDB 10.4.6. Please follow the instructions at http://dev.mysql.com/doc/refman/5.7/en/upgrading-downgrading.html
这是因为我们安装的是mariadb-server-10.2版本,xtrabackup已经不支持了。
我们用的是这个版本,用yum直接安装。做实验建议使用
[103]$ yum info mariadb-server
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
Installed Packages
Name : mariadb-server
Arch : x86_64
Epoch : 1
Version : 5.5.60
Release : 1.el7_5
Size : 58 M
Repo : installed
...
在目标主机上,也就是你要还原数据库的主机上
- 预准备:确保数据一致,提交完成的事务,回滚未完成的事务
[centos]$ xtrabackup --prepare --target-dir=/backup/
...
InnoDB: Starting shutdown...
InnoDB: Shutdown completed; log sequence number 1642024
190710 16:50:51 completed OK!
#最后一条OK就表示成功了
- 复制到数据库目录
注意:数据库目录必须为空,MySQL服务不能启动
[centos]$ systemctl stop mariadb
#这里是你数据库的目录,别把mysql这个目录删除了,
[centos]$ rm -rf /var/lib/mysql/*
[centos]$ xtrabackup --copy-back --target-dir=/backup/
......
190710 16:52:37 [01] ...done
190710 16:52:37 [01] Copying ./ibtmp1 to /var/lib/mysql/ibtmp1
190710 16:52:37 [01] ...done
190710 16:52:37 completed OK!
#最后一条OK,就表示成功了
- 还原属性
[centos]$ chown -R mysql:mysql /var/lib/mysql
[centos]$ ll /var/lib/mysql/
total 40976
drwxr-x--- 2 mysql mysql 310 Jul 10 16:52 hellodb
-rw-r----- 1 mysql mysql 18874368 Jul 10 16:52 ibdata1
-rw-r----- 1 mysql mysql 5242880 Jul 10 16:52 ib_logfile0
-rw-r----- 1 mysql mysql 5242880 Jul 10 16:52 ib_logfile1
-rw-r----- 1 mysql mysql 12582912 Jul 10 16:52 ibtmp1
drwxr-x--- 2 mysql mysql 4096 Jul 10 16:52 mysql
drwxr-x--- 2 mysql mysql 4096 Jul 10 16:52 performance_schema
drwxr-x--- 2 mysql mysql 20 Jul 10 16:52 test
-rw-r----- 1 mysql mysql 460 Jul 10 16:52 xtrabackup_info
-rw-r----- 1 mysql mysql 1 Jul 10 16:52 xtrabackup_master_key_id
- 启动服务
[centos]$ systemctl start mariadb
实验:xtrabackup完全,增量备份及还原
如果你做过上一个实验,请先还原下虚拟机
完全备份:
- 完全备份:
[centos]$ xtrabackup --backup --target-dir=/backup/base/
......
190710 17:01:03 [00] Writing /backup/base/xtrabackup_info
190710 17:01:03 [00] ...done
xtrabackup: Transaction log of lsn (1641721) to (1641721) was copied.
190710 17:01:03 completed OK!
增量备份:
- 第一次修改数据
[centos]$ mysql
MariaDB [hellodb]> use hellodb;
#随便做一些变化
MariaDB [hellodb]> insert students(name,age)value('chen000',000);
MariaDB [hellodb]> insert students(name,age)value('chen999',999);
- 记住它,这是第一次的变化
MariaDB [hellodb]> select * from students;
.....
| 27 | wang | 100 | F | NULL | NULL |
| 28 | wang100 | 100 | F | NULL | NULL |
| 29 | chen000 | 0 | F | NULL | NULL |
| 30 | chen999 | 255 | F | NULL | NULL |
+-------+---------------+-----+--------+---------+-----------+
30 rows in set (0.00 sec)
- 第一次增量备份
#incremental-basedir后面跟的参数是指你对谁的增量,那就是对完全备份来增量咯
[centos]$ xtrabackup --backup --target-dir=/backup/inc1 --incremental-basedir=/backup/base
......
190710 17:05:02 [00] Writing /backup/inc1/xtrabackup_info
190710 17:05:02 [00] ...done
xtrabackup: Transaction log of lsn (1644991) to (1644991) was copied.
190710 17:05:02 completed OK!
- 对比下增量备份和完全备份
[centos]$ du -h /backup/base
...
21M /backup/base
[centos]$ du -h /backup/inc1
...
1.8M /backup/inc1
第二次增量备份
- 第二次修改数据
[centos]$ mysql
MariaDB [hellodb]> use hellodb
MariaDB [hellodb]> insert students(name,age)value('zhao222',222);
Query OK, 1 row affected (0.00 sec)
MariaDB [hellodb]> insert students(name,age)value('li222',222);
Query OK, 1 row affected (0.00 sec)
- 改完后
MariaDB [hellodb]> select * from students;
......
| 28 | wang100 | 100 | F | NULL | NULL |
| 29 | chen000 | 0 | F | NULL | NULL |
| 30 | chen999 | 255 | F | NULL | NULL |
| 31 | zhao222 | 222 | F | NULL | NULL |
| 32 | li222 | 222 | F | NULL | NULL |
+-------+---------------+-----+--------+---------+-----------+
- 第二次增量
[centos]$ xtrabackup --backup --target-dir=/backup/inc2 --incremental-basedir=/backup/inc1
......
190710 17:11:34 [00] Writing /backup/inc2/xtrabackup_info
190710 17:11:34 [00] ...done
xtrabackup: Transaction log of lsn (1647068) to (1647068) was copied.
190710 17:11:34 completed OK!
如果是对本机还原,就不用做下面这一步了
3. 复制到目标主机
[centos]$ ll
drwxr-x--- 6 root root 217 Jul 10 17:01 base
drwxr-x--- 6 root root 243 Jul 10 17:05 inc1
drwxr-x--- 6 root root 243 Jul 10 17:11 inc2
[centos]$ scp -r /backup/* 目标IP:/backup/
还原过程
- 预准备完成备份,此选项–apply-log-only 阻止回滚未完成的事务
[centos]$ xtrabackup --prepare --apply-log-only --target-dir=/backup/base
- 合并第1次增量备份到完全备份,
[centos]$ xtrabackup --prepare --apply-log-only --target-dir=/backup/base --incremental-dir=/backup/inc1
- 合并第2次增量备份到完全备份:最后一次还原不需要加选项–apply-log-only
[centos]$ xtrabackup --prepare --target-dir=/backup/base --incremental-dir=/backup/inc2
- 在还原前先把服务停了,把数据库目录删除了
[centos]$ systemctl stop mariadb
#注意,不要把mysql这个目录给删除了
[centos]$ rm -rf /var/lib/mysql/*
- 复制到数据库目录,注意数据库目录必须为空,MySQL服务不能启动
[centos]$ xtrabackup --copy-back --target-dir=/backup/base
- 还原属性:
[centos]$ chown -R mysql:mysql /var/lib/mysql
- 启动服务:
[centos]$ systemctl start mariadb