MySQL的备份与恢复利器--Percona XtraBackup

关于Percona XtraBackup

Percona XtraBackup是全球唯一免费的MySQL热备软件,它实现了InnoDBXtraDB数据库引擎的无阻塞热备。

掌握Percona XtraBackup你可以获取下面一些优势:

①备份过程迅速、可靠,

②在备份过程中的事务等原子操作不会被打断,

③节省磁盘空间和网络带宽,

④自动备份验证,

⑤能够更快更安全的恢复备份。

Percona XtraBackup MySQL的衍生版本都适用,包括Percona ServerMySQLMariaDB,并且在每个版本上表现都能流畅、高效,实现增量备份这个特性功能。

 

MySQL Backup Tool Feature(工具特色)

License    GPL  许可证遵守GPL

Price       Free  免费

Streaming and encryption formats     Open source  流式操作和压缩技术开源

Supported MySQL flavors                 MySQL, Percona Server, MariaDB, Percona XtraDB Cluster, MariaDB

Supported operating systems            Linux

Non-blocking InnoDB backups          Yes              InnoDB表无阻塞备份

Blocking MyISAM backups                Yes              innobackupex集成了MyISAM等其他引擎备份方法,不过要注意会阻塞

Incremental backups                       Yes              支持增量备份

Full compressed backups                 Yes              支持全备压缩备份

Incremental compressed backups      Yes              支持增量压缩备份

Fast incremental backups                 Yes              支持快速增量备份

Incremental backups with archived logs feature in Percona Server Yes

Incremental backups with REDO log only

Backup locks                                 Yes

Encrypted backups                         Yes

Streaming backups                         Yes

Parallel local backups                      Yes

Parallel compression                       Yes

Parallel encryption                          Yes

Parallel apply-log                            Yes

Parallel copy-back Partial backups      Yes             支持并行复制

Partial backups of individual partitions Yes            支持单独数据库备份

Throttling                                      Yes

Backup image validation

Point-in-time recovery support           Yes             支持时间点恢复

Safe slave backups                          Yes

Compact backups                           Yes

Buffer pool state backups                 Yes

Individual tables export                   Yes

Individual partitions export               Yes

Restoring tables to a different server   Yes             支持异地恢复备份

Data & index file statistics                    Yes

InnoDB secondary indexes defragmentation Yes     支持InnoDB secondary indexes碎片整理

rsync support to minimize lock time            Yes

Improved FTWRL handling                        Yes

Backup history table                                   Yes

Backup progress table

Offline backups Backup to tape media managers

Cloud backups support

External graphical user interfaces to backup/recovery    Zmanda Recovery Manager for MySQL

 

What are the features of Percona XtraBackup?(这些特性是什么,拥有这些特性我们能做什么事?)

①创建一个InnoDB的热备数据时不需要终止数据库服务

②实现MySQL增量备份

③可以流式压缩备份到另一台机器

④在线移动表数据

⑤更简单容易的创建主从

⑥备份并不会增加服务器的负载

 

安装Percona XtraBackup

二进制安装Percona XtraBackup

安装2进制包前你要知道的常识:

RPM packages for RHEL[5,6,7] ,当然也包括其发行版比如CentOSOracle Enterprise Linux

Debian packages for Debian and Ubuntu

Generic .tar.gz binary packages 通用LINUX二进制包

https://www.percona.com/downloads/XtraBackup/

编译安装Percona XtraBackup

下载源码后:

在基于Debian的操作系统上要安装

apt-get install build-essential flex bison automake autoconf bzr \

libtool cmake libaio-dev mysql-client libncurses-dev zlib1g-dev \

libgcrypt11-dev

 

在基于RPM的操作系统上要安装

yum install cmake gcc gcc-c++ libaio libaio-devel automake autoconf bzr \

bison libtool ncurses5-devel

 

CMake编译参数

cmake -DBUILD_CONFIG=xtrabackup_release && make -j4

 

安装

make install

安装后在/usr/local/xtrabackup

如果你想改变安装后的位置

make DESTDIR=... install

或者在CMake的加参数

cmake -DINSTALL_LAYOUT=...

 

 

 

Innobackupex脚本

innobackupex脚本工具是由Perl脚本语言实现对xtrabackupC程序封装,它是一个InnoDB Hot Backup tool补丁版本。

集成了xtrabackup和一些其他功能比如文件拷贝,流式操作数据,也改进了很多地方使功能更加的方便使用。

它可以使用在对InnoDB / XtraDB表进行时间点备份的同时备份definitions, MyISAM tables,and other portions of the server.

 

Prerequisites 使用先决条件

Connection and Privileges Needed

Percona XtraBackup首先要可以连上数据库并有操作权限,而且datadir字段必须要配置了的因为在有的脚本里会用到。

不管是xtrabackup innobackupex,在执行时都会有两个用户:系统用户和数据库用户,即时他们的名字一样的。

在链接数据库时必须指出密码:--user--password

$ innobackupex --user=DBUSER --password=SECRET /path/to/backup/dir/

$ innobackupex --user=LUKE     --password=US3TH3F0RC3 --stream=tar ./ | bzip2 -

$ xtrabackup     --user=DVADER --password=14MY0URF4TH3R --backup --target-dir=/data/bkps/

如果你不使用--user那么脚本会自动用当前系统用户作为数据库用户执行

还有其他的一些链接数据库的选项

--port,--socket,--host

 

Permissions and Privileges Needed

一旦链接上服务器,为了能完成备份操作,一定要给备份执行账号在datadir上有读写执行的权限。

数据库账号必须有一下权限:

 

RELOAD and LOCK TABLES (unless the --no-lock option is specified) in order to FLUSH TABLES WITH

READ LOCK and FLUSH ENGINE LOGS prior to start copying the files, and LOCK TABLES FOR BACKUP

and LOCK BINLOG FOR BACKUP require this privilege when Backup Locks are used,

REPLICATION CLIENT in order to obtain the binary log position,

CREATE TABLESPACE in order to import tables (see Restoring Individual Tables),

PROCESS in order to see all threads which are running on the server (see Improved FLUSH TABLES WITH

READ LOCK handling),

SUPER in order to start/stop the slave threads in a replication environment, use XtraDB Changed Page Tracking

for Incremental Backups and for Improved FLUSH TABLES WITH READ LOCK handling,

CREATE privilege in order to create the PERCONA_SCHEMA.xtrabackup_history database and table,

INSERT privilege in order to add history records to the PERCONA_SCHEMA.xtrabackup_history table,

SELECT privilege in order to use innobackupex --incremental-history-name or

innobackupex --incremental-history-uuid in order for the feature to look up the

innodb_to_lsn values in the PERCONA_SCHEMA.xtrabackup_history table.

下面指出一个要执行全备说需要的最小权限:

mysql> CREATE USER ’bkpuser’@’localhost’ IDENTIFIED BY ’s3cret’;

mysql> GRANT RELOAD, LOCK TABLES, REPLICATION CLIENT ON *.* TO ’bkpuser’@’localhost’;

mysql> FLUSH PRIVILEGES;

 

 

The Backup Cycle - Full Backups (全备备份过程)

使用innobackupex实现全备

innobackupex是提供能备份MySQL整个实例的功能的,使用xtrabackup并且结合了其他工具像xbstreamxbcrypt

要创建一个完整的周期备份,脚本里面必须指出备份存储的目录。

$ innobackupex --user=DBUSER --password=DBUSERPASS /path/to/BACKUP-DIR/

这样备份的话会生成一级时间点的目录,如果不需要则加上

--no-timestamp

不过此时一般会采用/path/to/BACKUP-DIR/$(date +%Y%m%d)/ 一个日期作为一级目录作为数据备份时间点区分,这样就变成一天一个备份了。

--defaults-file

指定MySQL配置文件位置

更多参数innobackupex --help|more

 

Preparing a Full Backup with innobackupex(预备一个可以作为恢复的完全备份)

在一个备份完成后,这个备份数据并不能直接用来恢复,因为里面可能还包含了未提交的事务或者要回滚的要按照日志在数据库重演。

完成了这个过程才能保证数据的一致性,这个时候这个数据才能作为一个备份用来恢复数据库。

准备过程你需要用到

$ innobackupex --apply-log /path/to/BACKUP-DIR

执行最后输出语句

111225 1:01:57 InnoDB: Shutdown completed; log sequence number 1609228

111225 01:01:57 innobackupex: completed OK!

那么就表示成功了,这个备份我们就可以使用了。

其他可选项

--use-memory

准备数据这个过程在使用内存越多的时候能速度越快,这个依赖你系统的可能RAM,通常越多的内存在该过程那么这个速度会快一些。

$ innobackupex --apply-log --use-memory=4G  /path/to/BACKUP-DIR

 

 

Restoring a Full Backup with innobackupex(全备恢复数据库)

为了操作方便,innobackupex指定了一个--copy-back作为恢复数据库的选项,后接准备好的完整备份。

$ innobackupex --copy-back /path/to/BACKUP-DIR

该命令会把整个数据拷贝到数据库读取的my.cnf里指定的datadir,检查最后一行判断是否恢复成功:

innobackupex: Finished copying back files.

111225 01:08:13 innobackupex: completed OK!

特别提示:

The datadir must be empty

数据库指定datadir目录必须为空,Percona XtraBackup innobackupex --copy-back 并不会覆盖文件,

除非你使用innobackupex --force-non-empty-directories

还有另一点,恢复操作的时候数据库一定是被关闭的(service mysql stop),你不能恢复数据库在一个运行的实例上(当然部分备份的导入除外)

 

 

Incremental Backups with innobackupex(使用innobackupex实现增量备份)

随着两个备份直接的差异并不是很大,增量备份的出现可以减少磁盘空间的占用,也可以作为一个不间断备份的手段。

增量备份是可以实现在每一个有日志序列号的InnoDB页,这个日志号是整个数据库的一个版本号,任何一个更新,这个号都是自增。

 

在创建增量备份的时候,首先你需要有一个全备数据作为增量基础数据:

$ innobackupex  /data/backups

如果你查看备份目录下的xtrabackup-checkpoints文件

[root@localhost 20150527]# cat xtrabackup_checkpoints

backup_type = full-backuped

from_lsn = 0

to_lsn = 1595926

last_lsn = 1595926

compact = 0

我们把第一个备份的目录叫做INCREMENTAL-DIR-1

 

至于接下来的增量备份就是相似的,但是每一个备份都是基于上一个时间点的。

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

[root@localhost 2015-05-28_16-25-12]# cat xtrabackup_checkpoints

backup_type = incremental

from_lsn = 1595926

to_lsn = 1596247

last_lsn = 1596247

compact = 0

刚刚我在测试表插入了一个数据后这个编号就+1了,这样就完成了增量备份的目的。

 

开始我们说了这个增量备份是基于InnoDB的日志号的,那么这里也提供了另一种备份的方法,基于日志号:

$ innobackupex --incremental /data/backups --incremental-lsn=1595926

特别提示:整个增量过程的备份都是基于XtraDB or InnoDB-based tables,其他表的增量是不可能实现的,所以在innobackupex整理备的时候非InnoDB/XtraDB表都是直接复制全备。

 

 

Preparing an Incremental Backup with innobackupex(预备一个可以作为恢复的增量备份)

增量备份的准备数据和完备有点点差别,原因自己想想也知道。

增量备份准备数据:

在完备上:

$ innobackupex --apply-log --redo-only BASE-DIR

在增量上:

$ innobackupex --apply-log --redo-only BASE-DIR --incremental-dir=INCREMENTAL-DIR-1

$ innobackupex --apply-log --redo-only BASE-DIR --incremental-dir=INCREMENTAL-DIR-2

但是最后一个备份不需要--redo-only

$ innobackupex --apply-log BASE-DIR --incremental-dir=INCREMENTAL-DIR-last

以为加上后,服务器虽然还是会保证数据一直性,但是可能会导致最后的数据恢复后还会回滚。

增备上执行的这个命令具体操作:

把所有非InnoDB/XtraDB表最新的版本复制到完整备份,然后InnoDB/XtraDB表更新操作日志

 

在执行增量准备过程中一定要按照顺序执行,否则恢复的数据也是无用的,如果你不确定你执行到哪儿了,可以查看xtrabackup_checkpoints再选择下一个增量的起始位置是多少。

当所有日志都跑完了后,现在我们要执行:

$ innobackupex --apply-log BASE-DIR

回滚所有未提交的事务。

然后就回到了Restoring a Full Backup with innobackupex(全备恢复数据库)这个过程了:

$ innobackupex --copy-back BASE-DIR

 

 

Partial Backups(部分备份)

percona xtrabackup支持部分备份,也就是说我们可以备份单表或单库。

但是备份的数据必须都在独立的表空间里面,这样的话我们就要开启服务器上的innodb_file_per_table参数。

部分备份有3个选项可以使用:

--include:设置正则表达式的格式,匹配的就备份

--table-file:在文件中指定要备份的表,然后通过这个选项传入文件

--database:指定数据库列表

使用include方式

$ innobackupex --include=’^mydatabase[.]mytable’ /path/to/backup

这个选项是传给xtrabackup tables,所有的数据库目录都会被创建,但是里面可能是空的。

使用tables-file方式

$ echo "mydatabase.mytable" > /tmp/tables.txt

$ innobackupex --tables-file=/tmp/tables.txt /path/to/backup

这个选项是应用xtrabackup tablefile,只有匹配到表的数据库目录才会被创建

使用database方式

innobackupex可以传递用空格隔开的数组,格式为:databasename[.tablename]

$ innobackupex --databases="mydatabase.mytable mysql" /path/to/backup

注意:--databasees选项只会对非innodb引擎表和frm文件产生影响,对于innodb数据文件总是备份的

 

预备部分备份

$ innobackupex --apply-log –export /path/to/backup

恢复部分备份(见后面恢复单表方法Restoring Individual Tables)

 

Compact Backups(紧凑备份、窄备份)

在备份InnoDB表过程中不备份索引,这样会减少很大空间,但是这样的缺点就是要花很久的时间来重建索引。

For example full backup taken without and with the --compact option:

#backup size without --compact

2.0G 2013-02-01_10-18-38

#backup size taken with --compact option

1.4G 2013-02-01_10-29-48

 

特别提示:紧凑备份不支持系统自带的表空间,所以为了正确的完成紧凑备份,我们建议把innodb-file-per-table 启用,但是好像不起用也没遇见什么问题。

Creating Compact Backups

$ innobackupex --compact /data/backups

这样都会在/data/backups目录下还产生一个时间戳目录,如果你不需要就加上--no-timestamp参数

可以在备份目录下查看xtrabackup_checkpoints文件:

[root@localhost 2015-05-29_14-30-15]# cat xtrabackup_checkpoints

backup_type = full-backuped

from_lsn = 0

to_lsn = 1596247

last_lsn = 1596247

compact = 1

 

Preparing Compact Backups

预备一个紧凑备份,我们需要加一个--rebuild-indexes --apply-logs 配合使用

$ innobackupex --apply-log --rebuild-indexes /data/backups/2015-05-29_14-30-15

注意:为了重建速度,可以使用并发创建索引,使用参数—rebuild-threads指定并发数。

 

Restoring Compact Backups

$ innobackupex --copy-back /path/to/BACKUP-DIR

 

 

Encrypted Backups(加密备份)

Percona XtraBackup2.1起的版本使用libgcrypt library 实现了本机的加密解密备份,流备份现在支持xbstreamtar流还不支持。

Creating Encrypted Backups

为了实现备份的加密,我们需要交互使用--encrypt-key --encrypt-key-file

--encryption  =ALGORITHM 目前支持的加密算法有AES128, AES192 AES256

--encrypt-key =ENCRYPTION_KEY 作为的加密的问价必须是2进制文件或者txt

$ innobackupex --encrypt=AES256 --encrypt-key="GCHFLrDFVx6UAsRb88uLVbAVWbK+Yzfs" /data/backups

$ innobackupex --encrypt=AES256 --encrypt-key-file=/data/backups/keyfile /data/backups

解密

$ innobackupex --decrypt=AES256 --encrypt-key="GCHFLrDFVx6UAsRb88uLVbAVWbK+Yzfs" /data/backups/时间戳

innobackupex decrypt使用这个解密会把原文件删除,留下解压好的文件放在相同的目录下面。

解密后的预备备份和恢复与上面的方法一致。

 

高级特性:Streaming and Compressing Backups(流式压缩备份) Incremental Streaming Backups using xbstream and tar(流式压缩增量备份)

$ innobackupex --user=root -password=xxx --stream=xbstream --compress /tmp | ssh root@192.168.74.129 "xbstream -x -C /home/bak"

顺便在这里把压缩备份一起写上

①基于tar格式备份

本地:

$ innobackupex --stream=tar  /tmp >/backup/bak.tar        非压缩方式备份          

$ innobackupex --stream=tar  /tmp |gzip >/backup/bakz.tar.gz  压缩方式备份

$ innobackupex --stream=tar ./ | gzip - > backup.tar.gz

$ innobackupex --stream=tar ./ | bzip2 - > backup.tar.bz2

解压方法:tar -xivf bak.tar    

                       tar -xizvf bakz.tar.gz

都加上参数i解压innobackupex的备份

远程:

$ innobackupex --stream=tar /tmp | ssh root@192.168.74.129 / "cat - > /backup/bak.tar"   非压缩方式备份

$ innobackupex --stream=tar /tmp | ssh root@192.168.74.129 / "gzip >/backup/bak.tar.gz"  压缩方式备份

②基于xbstream格式备份

本地:

$ innobackupex --stream=xbstream /tmp >/backup/bak.xbstream                   非压缩方式备份

$ innobackupex --stream=xbstream --compress /tmp >/backup/bak_compress.xbstream      压缩方式备份

输出日志

$ innobackupex --stream=xbstream /tmp 2>>"$backupLog" | gzip > "$backup_file" 2>>"$backupLog"

 

Taking Backups in Replication Environments(复制环境下的备份)

这个是特别针对主从复制环境中的从库做的备份改进。

slave-info

--slave-info,会打印binary log的位置和master server名,并且以change master的方式写到xtrabackup_slave_info中。

safe-slave-backup

--safe-slave-backup,为了保证复制状态的一致性,这个选项会关闭slave sql线程,等待直到SHOW STATUS 中的Slave_open_temp_tabls为了才启动备份。如果等待时间超过—safe-slave-backup-timeout就会报错默认300秒。备份成功后 slave sql thread会自动启动。

 

Accelerating the backup process(加速备份进程)

 

Accelerating with --parallel copy and compress-threads(使用parallelcompress-threads加速)

当有多个文件时,可以使用使用—parallel加速备份,这个选项会指定xtrabackup备份文件的线程数。

$ innobackupex --parallel=4 /path/to/backup

如果使用xbstream可以考虑通过—compress-threads加速压缩进程,默认为1

$ innobackupex --stream=xbstream --compress --compress-threads=4 ./ > backup.xbstream

 

Accelerating with --rsync option(使用rsync加速)

为了加速复制过程,最小化FLUSH TABLES WITH READ LOCK堵塞时间,使用innobackupex rsync。使用了这个选项所有文件都会在一个cp命令里面,而不是每个文件一个cp。并且innobackupex会调用2 rsync,一次在执行FLUSH TABLES WITH READ LOCL之前,一次在之后。第二次执行的时候会把第一次之后的修改过的数据。

 

Throttling backups with innobackupex(节流备份)

尽管innobackupex不会堵塞数据库操作,但是备份终会消耗系统资源。为了减少资源消耗,可以使用—throttle来限制每秒钟读写对次数。

innobackupex --throttle option works only during the backup phase, ie. it will not work with

innobackupex --apply-log and innobackupex --copy-back options。只对备份操作有效。

 

Restoring Individual Tables(还原独立表)

5.6以前的服务器版本是不能通过表空间恢复数据的,即使是启用了innodb_file_per_table.

现在Percona XtraBackup能在Percona Server或者MySQL 5.6以上版本能实现还原。这个功能只作用在*.ibd文件,并且不能导入不包含自己的.ibd文件。

$ innobackupex --apply-log --export /path/to/backup

OTHERSERVER|mysql> CREATE TABLE mytable (...) ENGINE=InnoDB;

OTHERSERVER|mysql> ALTER TABLE mydatabase.mytable DISCARD TABLESPACE;

OTHERSERVER|mysql> ALTER TABLE mydatabase.mytable IMPORT TABLESPACE;

 

 

Point-In-Time recovery

首先我们有一个完备恢复

然后查看cat /path/to/backup/xtrabackup_binlog_info

获取到File:mysql-bin.000003    Position: 57

再获取一个最新的完备:

$ innobackupex --copy-back /path/to/backup

最新新的完备会把日志拷过来

确认好在上一个完备之后又多少日子写在数据库,获取差异日志导出SQL

$ mysqlbinlog  /path/to/datadir/mysql-bin.000003 /path/to/datadir/mysql-bin.000004 /path/to/datadir/mysql-bin.00XXXX\

--start-position=57 > mybinlog.sql

这时你可以指定任何时间点作为数据截止时间,比如我们使用2015-3-25 01:00:00

$ mysqlbinlog /path/to/datadir/mysql-bin.000003 /path/to/datadir/mysql-bin.000004 \

--start-position=57 --stop-datetime="2015-3-25 01:00:00" | mysql -u root –p

这样你就可以时间点恢复数据库了,前提是你得有日志哈,不要过期被自动删除了就悲剧了。

 

Improved FLUSH TABLES WITH READ LOCK handling(提高对FLUSH TABLES WITH READ LOCK控制)

在备份的时候,为了保证数据一致性,在备份非innodb表的之前会先使用FLUSH TABLES WITH READ LOCK,这个语句在有长时间查询运行的情况下也能执行,但是其他的所有事都会被堵塞,Waiting for table flush或者Waiting for master to send event,这个时候不应该kill FLUSH TABLES WITH READ LOCK,而是应该kill掉那个大的查询。因为当有大的查询的时候,FLUSH TABLES WITH READ LOCK会被卡住。

为了能够避免这种事情发生需要实现2个事情:

1.innobackupex等一个好的时机运行

2.innobackupex可以kiil 所有查询或者只能存在SELECT查询。即kill所有阻止获取全局锁的查询。

等待查询完成

为了避免innobackupex等待FLUSH TABLES WITH READ LOCK执行太长时间,可以使用innobackupex lock-wait-timeout,可以用来限制等待时间,一旦超时就会报错退出。

另外一个是设置等待查询的类型,innobackupex  --lock-wait-query-type 可取的值是all或者update,如果为all那么会等待所有长运行查询完成,如果是update,会等待除select之外的DML完成。

--lock-wait-threshold用来定义 --locl-wait-query-type中的长运行查询,如果超过--lock-wait-threshold都算长运行查询。

Kill堵塞查询

innobackupex可以kill所有阻止获取全局锁的查询。

可以通过指定--kill-long-queries-timeout用来指定执行FLUSH TABLES WITH READ LOCK后还可以执行的时间,0为不kill--kill-long-query-type用来指定超时之后,kill的查询类型,可以是all或者select

$ innobackupex --lock-wait-threshold=40 --lock-wait-query-type=all --lock-wait-timeout=180 --kill-long-queries-timeout=20 --kill-long-query-type=all /data/backups/

 


来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/30290247/viewspace-1699919/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/30290247/viewspace-1699919/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值