XtraBackup 备份恢复
已经两天拖更,小编这周因儿女情长之事,经历了一场蜕变,也算是浴火重生,希望大家能够珍惜身边的人和感情,切记一句话:办法总比问题多。也祝愿有情人终成眷属。好了,话不多说,先说说今天的XtraBackup。
Xtrabackup 是Percona公司提供的一款第三方开源在线备份工具,所以我们可以在percona的官方网站上下载相应的压缩包,进行解压安装。
解压之后会生成这样一个目录:
在目录之下会有一下bin和share俩目录,其中bin目录是命令目录,我们为了方便使用,可以将bin目录下的命令文件考到/usr/local/mysql/bin/下(或者是自己配环境变量也行,目的是为了方便使用。
这里innobackupex就是我们使用备份的工具命令,我们先看一下具体可以添加的参数文件:
--compress:该选项表示压缩innodb数据文件的备份。
--compress-threads:该选项表示并行压缩worker线程的数量。
--compress-chunk-size:该选项表示每个压缩线程worker buffer的大小,单位是字节,默认是64K。
--encrypt:该选项表示通过ENCRYPTION_ALGORITHM的算法加密innodb数据文件的备份,目前支持的算法有ASE128,AES192,AES256。
--encrypt-threads:该选项表示并行加密的worker线程数量。
--encrypt-chunk-size:该选项表示每个加密线程worker buffer的大小,单位是字节,默认是64K。
--encrypt-key:该选项使用合适长度加密key,因为会记录到命令行,所以不推荐使用。
--encryption-key-file:该选项表示文件必须是一个简单二进制或者文本文件,加密key可通过以下命令行命令生成:openssl rand -base6424。
--include:该选项表示使用正则表达式匹配表的名字[db.tb],要求为其指定匹配要备份的表的完整名称,即databasename.tablename。
--user:该选项表示备份账号。
--password:该选项表示备份的密码。
--port:该选项表示备份数据库的端口。
--host:该选项表示备份数据库的地址。
--databases:该选项接受的参数为数据名,如果要指定多个数据库,彼此间需要以空格隔开;如:"xtra_test dba_test",同时,在指定某数据库时,也可以只指定其中的某张表。如:"mydatabase.mytable"。该选项对innodb引擎表无效,还是会备份所有innodb表。此外,此选项也可以接受一个文件为参数,文件中每一行为一个要备份的对象。
--tables-file:该选项表示指定含有表列表的文件,格式为database.table,该选项直接传给--tables-file。
--socket:该选项表示mysql.sock所在位置,以便备份进程登录mysql。
--no-timestamp:该选项可以表示不要创建一个时间戳目录来存储备份,指定到自己想要的备份文件夹。
--incremental:该选项表示创建一个增量备份,需要指定--incremental-basedir。
--incremental-basedir:该选项表示接受了一个字符串参数指定含有full backup的目录为增量备份的base目录,与--incremental同时使用。
--incremental-dir:该选项表示增量备份的目录。
--incremental-force-scan:该选项表示创建一份增量备份时,强制扫描所有增量备份中的数据页。
--incremental-lsn:该选项表示指定增量备份的LSN,与--incremental选项一起使用。
--incremental-history-name:该选项表示存储在PERCONA_SCHEMA.xtrabackup_history基于增量备份的历史记录的名字。Percona Xtrabackup搜索历史表查找最近(innodb_to_lsn)成功备份并且将to_lsn值作为增量备份启动出事lsn.与innobackupex--incremental-history-uuid互斥。如果没有检测到有效的lsn,xtrabackup会返回error。
我们发现xtrabackup 具有好的灵活性,可以压缩备份,增量备份,备份加密等,功能十分强大,下面通过实验让我们对XtraBackup进行进一步的了解:
1. 全库备份
首先在进行备份的时候我们需要做一些准备:
我们要为备份的结果创建一个目录
所在的环境中,一定要有perl-DBD-mysql这个包安装在数据库当中,这是一个集成模块,如果没有它的话会,innobackup命令执行失败。可以通过rpm包安装或者通过yum安装。
下面我们看下执行全备
innobackupex --defaults-file=/etc/my.cnf --user root -password oracle --socket=/tmp/mysql.sock /data/xtrabackup/
innobackupex: Backup created in directory '/data/xtrabackup/2018-04-16_14-21-56'
innobackupex: MySQL binlog position: filename 'mysql-bin.000034', position 11502049
180416 14:23:18 innobackupex: Connection to database server closed
180416 14:23:18 innobackupex: completed OK!
看到这里表示我们的备份已经执行完成了。
我们将执行命令之后的提示命令截出来,看看进行了什么操作
180416 14:21:56 innobackupex: Connecting to MySQL server with DSN 'dbi:mysql:;mysql_read_default_file=/etc/my.cnf;mysql_read_default_group=xtrabackup;mysql_socket=/tmp/mysql.sock' as 'root' (using password: YES).
180416 14:21:56 innobackupex: Connected to MySQL server
180416 14:21:56 innobackupex: Executing a version check against the server...
180416 14:21:56 innobackupex: Done.
IMPORTANT: Please check that the backup run completes successfully.
At the end of a successful backup run innobackupex
prints "completed OK!".
innobackupex: Using mysql server version 5.6.16-log
innobackupex: Created backup directory /data/xtrabackup/2018-04-16_14-21-56
180416 14:21:56 innobackupex: Starting ibbackup with command: xtrabackup_56 --defaults-file="/etc/my.cnf" --defaults-group="mysqld" --backup --suspend-at-end --target-dir=/data/xtrabackup/2018-04-16_14-21-56 --tmpdir=/tmp
我们看到,首先是在验证参数文件。验证套接字是否可以登陆。
[01] Copying ./ibdata1 to /data/xtrabackup/2018-04-16_14-21-56/ibdata1
这里显示的数字就是当前的lsn号,因为当前数据库没有事物变化,所以这个数没有向下推进。
[01] Copying ./mysql/slave_relay_log_info.ibd to /data/xtrabackup/2018-04-16_14-36-16/mysql/slave_relay_log_info.ibd
[01] ...done
[01] Copying ./mysql/innodb_index_stats.ibd to /data/xtrabackup/2018-04-16_14-36-16/mysql/innodb_index_stats.ibd
[01] ...done
[01] Copying ./mysql/slave_worker_info.ibd to /data/xtrabackup/2018-04-16_14-36-16/mysql/slave_worker_info.ibd
[01] ...done
[01] Copying ./mysql/innodb_table_stats.ibd to /data/xtrabackup/2018-04-16_14-36-16/mysql/innodb_table_stats.ibd
[01] ...done
[01] Copying ./mysql/slave_master_info.ibd to /data/xtrabackup/2018-04-16_14-36-16/mysql/slave_master_info.ibd
[01] ...done
[01] Copying ./test/aaa.ibd to /data/xtrabackup/2018-04-16_14-36-16/test/aaa.ibd
[01] ...done
[01] Copying ./test/naonao.ibd to /data/xtrabackup/2018-04-16_14-36-16/test/naonao.ibd
[01] ...done
[01] Copying ./test/ttt.ibd to /data/xtrabackup/2018-04-16_14-36-16/test/ttt.ibd
[01] ...done
[01] Copying ./test/mytab.ibd to /data/xtrabackup/2018-04-16_14-36-16/test/mytab.ibd
[01] ...done
xtrabackup: Creating suspend file '/data/xtrabackup/2018-04-16_14-36-16/xtrabackup_suspended_2' with pid '27474'
这里我们可以看出数据正在向外备份,生成对应的ibd文件。
innobackupex: Backing up file '/data/mysql/test/mytab.frm'
innobackupex: Backing up file '/data/mysql/test/aaa.frm'
innobackupex: Backing up file '/data/mysql/test/naonao.frm'
innobackupex: Backing up file '/data/mysql/test/ttt.frm'
180416 14:37:34 innobackupex: Finished backing up non-InnoDB tables and files
还将相应的.frm结构导出。
我们进入相应的目录查看一下备份文件,这种目录都是数据库自动以时间进行生成的。
进入目录后发现,将会为每个数据库创建一个目录放置相应的文件
进入相应的数据库文件中也会看到生成了相应的文件
2. 全库恢复
我们试着去删除一张表
使用备份将其恢复
innobackup --defaults-file =/etc/my.cnf --user root --password oracle --socket=/tmp/mysql.sock --apply-log /data/xtrabackup/2018-04-16_14-13-35
这里日志应用完成,但是没有回复到数据库当中,还有一步需要操作:
将之前的mysql数据文件删掉,将xtrabakcup的文件拷到对应的目录下,并且授权mysql,再将数据库重启,即可恢复。
3. 增量备份
增量备份其实主要是针对innodb数据库而言的,对于myisam和其他的存储引擎而言,其实任然是全备,增量备份主要是通过拷贝innodb有变更的页,就是说和全备的lsn号有差异的那一部分。所以想要进行增量备份的话,必须得有一次全备的过程,第一次增量备份基于之前的全备去做,之后的增备基于之前的增备。
innobackupex --defaults-file =/etc/my.cnf --user root --password oracle --no-timestamp --socket=/tmp/mysql.sock --incremental --incremental-basedir=/data/xtrbackup/2018-04-16_14-21-56 /data/xtrbackup/2018-04-16_14-21-56-incre
这里一定要带上--no-timestamp,否则的话没有办法生成新的自定义文件。
命令生成的内容不多叙述,和全备相似。
我们查看生成的文件,以test数据库为例,生成的文件有meta文件和delta,meta记录了具体的页的信息,delta记录了具体的数据信息,大小也有所不同,这里要注意。
4. 增量备份的恢复
增量备份的恢复有很多需要注意的地方,增量备份的恢复切记要永远基于全备去恢复。
我们先看试验,查看表中数据,现在删除几条
我们查看一下增量备份的目录,一次增备,一次全备,现在我们进行恢复操作。
第一次:
要做一次全库恢复
innobackupex --defaults-file=/etc/my.cnf --socket=/tmp/mysql.sock --user root --password oracle --apply-log --redo-only /data/xtrbackup/2018-04-16_14-21-56
第二次:
要做一次增量恢复
innobackupex --defaults-file=/etc/my.cnf --socket=/tmp/mysql.sock --user root --password oracle --apply-log --redo-only /data/xtrabackup/ 2018-04-16_14-21-56 --incremental-dir=/data/xtrabackup/ 2018-04-16_14-21-56-incre
第三次:
如果还有增量备份的话,再次恢复的时候要基于全备去做
innobackupex --defaults-file=/etc/my.cnf --socket=/tmp/mysql.sock --user root --password oracle --apply-log --redo-only /data/xtrabackup/ 2018-04-16_14-21-56 --incremental-dir=/data/xtrabackup/ 2018-04-16_14-21-56-incre2
接下来和全备一样,将之前的mysql文件替换掉,使用新的备份文件,这里注意的是,使用的文件是全备的文件,因为这个文件已经被增量备份所增追加过了,授权重启数据库,数据就回来了。
That's allBY CUI PEACE~~~
领取专属 10元无门槛券
私享最新 技术干货