innobackupex全量备份和增量备份

一、innobackupex备份与恢复简介

1、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 -base64 24。

--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:该选项可以表示不要创建一个时间戳目录来存储备份,指定到自己想要的备份文件夹。

--ibbackup:该选项指定了使用哪个xtrabackup二进制程序。IBBACKUP-BINARY是运行percona xtrabackup的命令。这个选项适用于xtrbackup二进制不在你是搜索和工作目录,如果指定了该选项,innoabackupex自动决定用的二进制程序。

--slave-info:该选项表示对slave进行备份的时候使用,打印出master的名字和binlog pos,同样将这些信息以change master的命令写入xtrabackup_slave_info文件。可以通过基于这份备份启动一个从库。

--safe-slave-backup:该选项表示为保证一致性复制状态,这个选项停止SQL线程并且等到show status中的slave_open_temp_tables为0的时候开始备份,如果没有打开临时表,bakcup会立刻开始,否则SQL线程启动或者关闭知道没有打开的临时表。如果slave_open_temp_tables在--safe-slave-backup-timeount(默认300秒)秒之后不为0,从库sql线程会在备份完成的时候重启。

--rsync:该选项表示通过rsync工具优化本地传输,当指定这个选项,innobackupex使用rsync拷贝非Innodb文件而替换cp,当有很多DB和表的时候会快很多,不能--stream一起使用。

--kill-long-queries-timeout:该选项表示从开始执行FLUSH TABLES WITH READ LOCK到kill掉阻塞它的这些查询之间等待的秒数。默认值为0,不会kill任何查询,使用这个选项xtrabackup需要有Process和super权限。

--kill-long-query-type:该选项表示kill的类型,默认是all,可选select。

--ftwrl-wait-threshold:该选项表示检测到长查询,单位是秒,表示长查询的阈值。

--ftwrl-wait-query-type:该选项表示获得全局锁之前允许那种查询完成,默认是ALL,可选update。

--galera-info:该选项表示生成了包含创建备份时候本地节点状态的文件xtrabackup_galera_info文件,该选项只适用于备份PXC。

--stream:该选项表示流式备份的格式,backup完成之后以指定格式到STDOUT,目前只支持tar和xbstream。

--defaults-file:该选项指定了从哪个文件读取MySQL配置,必须放在命令行第一个选项的位置。

--defaults-extra-file:该选项指定了在标准defaults-file之前从哪个额外的文件读取MySQL配置,必须在命令行的第一个选项的位置。一般用于存备份用户的用户名和密码的配置文件。

----defaults-group:该选项表示从配置文件读取的组,innobakcupex多个实例部署时使用。

--no-lock:该选项表示关闭FTWRL的表锁,只有在所有表都是Innodb表并且不关心backup的binlog pos点,如果有任何DDL语句正在执行或者非InnoDB正在更新时(包括mysql库下的表),都不应该使用这个选项,后果是导致备份数据不一致,如果考虑备份因为获得锁失败,可以考虑--safe-slave-backup立刻停止复制线程。

--tmpdir:该选项表示指定--stream的时候,指定临时文件存在哪里,在streaming和拷贝到远程server之前,事务日志首先存在临时文件里。在 使用参数stream=tar备份的时候,你的xtrabackup_logfile可能会临时放在/tmp目录下,如果你备份的时候并发写入较大的话 xtrabackup_logfile可能会很大(5G+),很可能会撑满你的/tmp目录,可以通过参数--tmpdir指定目录来解决这个问题。

--history:该选项表示percona server 的备份历史记录在percona_schema.xtrabackup_history表。

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

--incremental-history-uuid:该选项表示存储在percona_schema.xtrabackup_history基于增量备份的特定历史记录的UUID。

--close-files:该选项表示关闭不再访问的文件句柄,当xtrabackup打开表空间通常并不关闭文件句柄目的是正确的处理DDL操作。如果表空间数量巨大,这是一种可以关闭不再访问的文件句柄的方法。使用该选项有风险,会有产生不一致备份的可能。

--compact:该选项表示创建一份没有辅助索引的紧凑的备份。

--throttle:该选项表示每秒IO操作的次数,只作用于bakcup阶段有效。apply-log和--copy-back不生效不要一起用。

 


 

2、prepare:

定义:


innobackupex --apply-log [--use-memory=B]

[--defaults-file=MY.CNF]

[--export] [--redo-only] [--ibbackup=IBBACKUP-BINARY]

BACKUP-DIR


 

参数说明:

--apply-log:该选项表示同xtrabackup的--prepare参数,一般情况下,在备份完成后,数据尚且不能用于恢复操作,因为备份的数据中可能会包含尚未提交的事务或已经提交但尚未同步至数据文件中的事务。因此,此时数据 文件仍处理不一致状态。--apply-log的作用是通过回滚未提交的事务及同步已经提交的事务至数据文件使数据文件处于一致性状态。

--use-memory:该选项表示和--apply-log选项一起使用,prepare 备份的时候,xtrabackup做crash recovery分配的内存大小,单位字节。也可(1MB,1M,1G,1GB),推荐1G。

--defaults-file:该选项指定了从哪个文件读取MySQL配置,必须放在命令行第一个选项的位置。

--export:这个选项表示开启可导出单独的表之后再导入其他Mysql中。

--redo-only:这个选项在prepare base full backup,往其中merge增量备份(但不包括最后一个)时候使用。

 

3、解压解密:

定义:


innobackupex [--decompress] [--decrypt=ENCRYPTION-ALGORITHM]

[--encrypt-key=LITERAL-ENCRYPTION-KEY] | [--encryption-key-file=MY.KEY]

[--parallel=NUMBER-OF-FORKS] BACKUP-DIR


参数说明:

--decompress:该选项表示解压--compress选项压缩的文件。

--parallel:该选项表示允许多个文件同时解压。为了解压,qpress工具必须有安装并且访问这个文件的权限。这个进程将在同一个位置移除原来的压缩/加密文件。

--decrypt:该选项表示解密通过--encrypt选项加密的.xbcrypt文件。

 

4、还原:

定义:


innobackupex --copy-back [--defaults-file=MY.CNF] [--defaults-group=GROUP-NAME] BACKUP-DIR

innobackupex --move-back [--defaults-file=MY.CNF] [--defaults-group=GROUP-NAME] BACKUP-DIR


参数说明:

--copy-back:做数据恢复时将备份数据文件拷贝到MySQL服务器的datadir。

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

注意:重要  *

1.datadir目录必须为空。除非指定innobackupex --force-non-empty-directorires选项指定,否则--copy-backup选项不会覆盖

2.在restore之前,必须shutdown MySQL实例,你不能将一个运行中的实例restore到datadir目录中

3.由于文件属性会被保留,大部分情况下你需要在启动mysql服务器之前将文件的属主改为mysql,这些文件将属于创建备份的用户

chown -R mysql:mysql /var/lib/mysql    #mysql的数据路径

以上需要在用户调用Innobackupex之前完成

 

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

 

二、具体实例

1、普通全量备份、还原:

如果是对所有数据库备份的话,可以使用--copy-back恢复。但如果是部分备份,不能直接用--copy-back,只能手动来复制需要的库,也要复制ibdata(数据字典)

备份所有数据库:备份目录里生成日期命名的文件夹


innobackupex  --defaults-file=/etc/my.cnf --user=root [email protected]  /home/backup/xtrabackup/


还原

利用--apply-log的作用是通过回滚未提交的事务及同步已经提交的事务至数据文件使数据文件处于一致性状态


innobackupex --apply-log /home/backup/xtrabackup/2018-07-28_09-35-25/


恢复数据:需要数据目录为空,关掉mysql服务器


innobackupex --defaults-file=/etc/my.cnf --copy-back /home/backup/xtrabackup/2018-07-28_09-35-25/


修改权限


sudo chown mysql:mysql /var/lib/mysql -R    #/var/lib/mysql是我mysql的数据路径


重新启动服务器,数据恢复完成


service mysqld start


 --no-timestamp 增加选项,备份文件直接在指定目录下产生,不会生成日期命名的文件夹

++++++++++++++++++++++++++++++++++++++++++++++++++++

2、普通增量备份、还原

如果是对所有数据库备份的话,可以使用--copy-back恢复。但如果是部分备份,不能直接用--copy-back,只能手动来复制需要的库,也要复制ibdata(数据字典)

#全量备份


innobackupex --defaults-file=/etc/my.cnf --user=root [email protected] /home/backup/xtrabackup/


#增量备份1


innobackupex --defaults-file=/etc/my.cnf --user=root [email protected] --incremental --incremental-basedir=/home/backup/xtrabackup/2018-07-28_22-37-26/ /home/backup/increment_data/


#增量备份2


innobackupex --defaults-file=/etc/my.cnf --user=root [email protected] --incremental --incremental-basedir=/home/backup/increment_data/2018-07-28_22-39-28/  /home/backup/increment_data/


 

注:    1.通过上面三个目录里的xtrabackup_checkpoints文件,可以看出是哪种备份类型,全量(full-backuped)还是增量 并且全量到增量的from_lsn和last_lsn是一一对应的。

          2.在第2次做增量备份的时候 --incremental-basedir 指向全量备份,则第一次增量备份中的数据会被第2次包含,只需要还原一次就可以恢复,现在则需要还原2次增量备份。  

          3.其中,--incremental指明是增量备份,--incremental-basedir指定上次完整备份或者增量备份文件的位置。这里的增量备份其实只针对的是InnoDB,对于MyISAM来说,还是完整备份。

 

#还原

1.先prepare全备


innobackupex --incremental --apply-log --redo-only /home/backup/xtrabackup/2018-07-28_22-37-26


2.再prepare第一个增量


innobackupex --incremental --apply-log --redo-only /home/backup/xtrabackup/2018-07-28_22-37-26 --incremental-dir=/home/backup/increment_data/2018-07-28_22-39-28


3.然后prepare最后一个增量


innobackupex --incremental --apply-log --redo-only /home/backup/xtrabackup/2018-07-28_22-37-26 --incremental-dir=/home/backup/increment_data/2018-07-28_22-41-21


此时两次增量备份其实都合并到全备上了,恢复是只需要使用全备进行恢复就可以了

4.最后再prepare全量备份


innobackupex --apply-log /home/backup/xtrabackup/2018-07-28_22-37-26/


 

数据恢复,需要mysql数据目录为空,如果非空,恢复命令将报错


innobackupex --defaults-file=/etc/my.cnf --copy-back /home/backup/xtrabackup/2018-07-28_22-37-26/


 

修改权限,因为--copy-back恢复产生的文件的用户为root,需要把mysql数据库目录下的文件用户都修改为mysql,mysql的服务器才能正常启动


sudo chown mysql:mysql /var/lib/mysql -R    #/var/lib/mysql是我mysql的数据路径


重新启动服务器,数据恢复完成。

 

以上是对所有数据库的一个增量备份过程,如果想要指定备份的数据库,只需要在每条的备份命令里增加:

--databases=DataBaseName(指定的数据库个>1时,用空格隔开)

如果只想备份指定数据库下的某个表,只需要在每条的备份命令里增加:

--databases=DataBaseName.tableName

部分备份,不能直接用--copy-back,只能手动来复制需要的库,也要复制ibdata(数据字典)

++++++++++++++++++++++++++++++++++++++++++++++++++++

3、部分备份

1、部分备份多个数据库时,多个数据库用空格分开

注意的是:如果备份单个的表,备份的表必须是在独立的表空间中,即该表在创建以前,你的MySQL开启了innodb_file_per_table设置。

还一点要注意的是:不要将prepared backup备份的东西拷贝回去。部分备份使用的是导入表(importing the tables),而不是全库备份的--copy-back参数。尽管有时简单的拷贝备份文件可以成功,但是这种方法很容易导致数据库的不一致,因此不推荐大家这么做

部分备份共有三种方式,分别是:1. 用正则表达式表示要备份的库名及表名(参数为--include);2. 将要备份的表名或库名都写在一个文本文件中(参数为--tables-file)以及 3. 将要备份表名或库名完整的写在命令行中(参数为:--databases)。(注:不管你备份哪个库或是哪张表,强烈推荐把mysql库也一起备份,恢复的时候要用。)

 

2、#备份指定表

        保证:InnoDB_File_Per_Table = ON   --此参数修改InnoDB为独立表空间模式,每个数据库的每个表都会生成一个数据空间.

          以数据库xtra_test下表 I 为例实验,这个涉及到两个mysql的服务器,在一个服务器上备份,在另一台服务器上恢复。

第一步:备份数据库xtra_test下的 I 表,备份前保证表里有一定的数据


innobackupex --defaults-file=/etc/my.cnf --user=root [email protected] --databases="xtra_test.I mysql" /home/backup/xtrabackup


第二步:准备部分备份(Preparing Partial Backups)


innobackupex --apply-log --export /home/backup/xtrabackup


第三步:查看备份表的结构


mysql> show create table I;

 


 

第四步:把创建表的命令复制下来,在另一台服务器上,创建一模一样的表


CREATE TABLE `I` (

  `id` int(11) DEFAULT NULL,

  `name` varchar(10) DEFAULT NULL

) ENGINE=InnoDB DEFAULT CHARSET=utf8;


第五步:discard its tablespace


ALTER TABLE test.I DISCARD TABLESPACE;


第六步:将备份文件中的I.exp  和  I.ibd 文件拷贝到你创建的表空间,即mysqldatadir/databaseName/tableName/下


scp [email protected]:/home/backup/xtrabackup/2018-07-30_23-40-13/xtra_test/I.exp .


scp远程拷贝命令,注意最后有个点表示拷贝到当前目录,可以换成绝对路径:/var/lib/mysql/test/I/

第七步:修改拷贝文件的权限


sudo chown mysql:mysql /var/lib/mysql/test/I -R


或者在当前目录执行:


sudo chown mysql:mysql I.exp -R

sudo chown mysql:mysql  I.ibd -R


第八步:IMPORT TABLESPACE


ALTER TABLE test.I IMPORT TABLESPACE;


最后查看表中的数据,恢复完成。

++++++++++++++++++++++++++++++++++++++++++++++++++++

三、其他备份形式(没有亲自操作,留着以后用到再做研究)

③.打包压缩备份,注意:--compress不能和--stream=tar一起使用

#压缩备份


innobackupex --defaults-file=/etc/mysql/my.cnf --user=root --password=123 --compress --compress-threads=8 --no-timestamp --databases="xtra_test.I" /home/zhoujy/xtrabackup/


#在perpare之前需要decompress,需要安装qpress


innobackupex --decompress /home/zhoujy/xtrabackup/


#prepare


innobackupex --apply-log /home/zhoujy/xtrabackup/


最后还原方法和上面一致

 

#打包备份


innobackupex --defaults-file=/etc/mysql/my.cnf --user=root --password=123 --stream=tar --no-timestamp --databases="xtra_test" /home/zhoujy/xtrabackup/ 1>/home/zhoujy/xtrabackup/xtra_test.tar


#解包


tar ixvf xtra_test.tar


最后还原方法和上面一致

#第三方压缩备份:


innobackupex --defaults-file=/etc/mysql/my.cnf --user=root --password=123 --compress --compress-threads=8 --parallel=4 --stream=tar --no-timestamp --databases="xtra_test" /home/zhoujy/xtrabackup/ | gzip >/home/zhoujy/xtrabackup/xtra_test.tar.gz


 

#prepare之前先解压


tar izxvf xtra_test.tar.gz

 

#prepare

innobackupex --apply-log /home/zhoujy/xtrabackup/


 

④.加密备份

说明:在参数说明里看到加密备份的几个参数:--encrypt、--encrypt-threads、--encrypt-key、--encryption-key-file。其中encrypt-key和encryption-key-file不能一起使用,encryption-key需要把加密的密码写到命令行,不推荐。

#加密备份:

先生成key:

openssl rand -base64 24

把Key写到文件:

echo -n "Ue2Wp6dIDWszpI76HQ1u57exyjAdHpRO" > keyfile

最后备份:

innobackupex --defaults-file=/etc/mysql/my.cnf --user=root --password=123 --compress --compress-threads=3 --no-timestamp --encrypt=AES256 --encrypt-key-file=/home/zhoujy/keyfile ----encrypt-threads=3 --parallel=5 /home/zhoujy/xtrabackup2/

#解密:

for i in `find . -iname "*\.xbcrypt"`; do xbcrypt -d --encrypt-key-file=/home/zhoujy/keyfile --encrypt-algo=AES256 < $i > $(dirname $i)/$(basename $i .xbcrypt) && rm $i; done

#解压:

innobackupex --decompress /home/zhoujy/xtrabackup2/

#prepare:

innobackupex --apply-log /home/zhoujy/xtrabackup2/

#还原copy

innobackupex --defaults-file=/etc/mysql/my.cnf --move-back /home/zhoujy/xtrabackup2/

 

⑤.复制环境中的备份:一般生产环境大部分都是主从模式,主提供服务,从提供备份。

#备份 5个线程备份2个数据库,并且文件xtrabackup_slave_info记录GTID和change的信息

innobackupex --defaults-file=/etc/mysql/my.cnf --user=root --password=123 --no-timestamp --slave-info --safe-slave-backup --parallel=5 --databases='xtra_test dba_test' /home/zhoujy/xtrabackup/

#还原

还原方法同上

总结:关于更多的innobackupex的备份可以看官方文档和xtrabackup 安装使用。强烈推荐研究研究帮助文档

 

 

四、个人感觉一些比较重要的文档,大多博客没有提到的放在了下边

Once the pages have been put together in their respective order, applying the logs will recreate the process that affected

the database, yielding the data at the moment of the most recently created backup.

Creating an Incremental Backups with innobackupex First, you need to make a full backup as the BASE for

subsequent incremental backups:

$ innobackupex /data/backups

This will create a timestamped directory in /data/backups. Assuming that the backup is done last day of the

month, BASEDIR would be /data/backups/2013-03-31_23-01-18, for example.

Note: You can use the innobackupex --no-timestamp option to override this behavior and the backup will

be created in the given directory.

If you check at the xtrabackup-checkpoints file in BASE-DIR, you should see something like:

backup_type = full-backuped

from_lsn = 0

to_lsn = 1291135

To create an incremental backup the next day, use the --incremental option and provide the BASEDIR:

$ innobackupex --incremental /data/backups --incremental-basedir=BASEDIR

and another timestamped directory will be created in /data/backups, in this example,

/data/backups/2013-04-01_23-01-18 containing the incremental backup. We will call this

INCREMENTAL-DIR-1.

If you check at the xtrabackup-checkpoints file in INCREMENTAL-DIR-1, you should see something like:

backup_type = incremental

from_lsn = 1291135

to_lsn = 1352113

Creating another incremental backup the next day will be analogous, but this time the previous incremental one will

be base:

$ innobackupex --incremental /data/backups --incremental-basedir=INCREMENTAL-DIR-1

yielding (in this example) /data/backups/2013-04-02_23-01-18. We will use INCREMENTAL-DIR-2

instead for simplicity.

At this point, the xtrabackup-checkpoints file in INCREMENTAL-DIR-2 should contain something like:

backup_type = incremental

from_lsn = 1352113

to_lsn = 1358967

As it was said before, an incremental backup only copy pages with a LSN greater than a specific value. Providing the

LSN would have produced directories with the same data inside:

innobackupex --incremental /data/backups --incremental-lsn=1291135

innobackupex --incremental /data/backups --incremental-lsn=1358967

This is a very useful way of doing an incremental backup, since not always the base or the last incremental will be

available in the system.

 

Warning: This procedure only affects XtraDB or InnoDB-based tables. Other tables with a different storage

engine, e.g. MyISAM, will be copied entirely each time an incremental backup is performed.

 

Note: Currently in Percona XtraBackup the –databases option has no effect for InnoDB files for both local and

streaming backups, i.e. all InnoDB files are always backed up. Currently, only .frm and non-InnoDB tables are limited

by that option.
 

你可能感兴趣的:(MySQL,MySQL,备份恢复,MySQL,架构)