XtraBackup 备份恢复

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~~~

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20180416G1A0EJ00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。

同媒体快讯

扫码关注云+社区

领取腾讯云代金券