1.1.2 Percona Xtrabackup特性
* 不停机创建Innodb数据库热备
* 对Mysql数据库创建增量备份
* 压缩数据流方式备份到异地服务器
* 更加便捷创建新的mysql从库
* 无需登录数据库执行mysql备份
2.2 源码编译安装Percona Xtrabackup
下载地址:http://www.percona.com/downloads/XtraBackup/XtraBackup-2.2.8/source/
2.2.1 Linux上编译
系统配置要求
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
安装Percona XtraBackup 的全部二进制文件,默认安装目录到/usr/local/xtrabackup
3.1 Percona XtraBackup 用户手册
3.1.1 innobackupex 脚本
innobackupex工具是Xtrabackup的一个插件,以支持对其他存储引擎(MyISAM等)数据库的备份
前提
连接和权限:使用--user 和 --password选项
Connecting to the server
$ innobackupex --user=DBUSER --password=PASSWORD /path/to/backup/dir/
$ innobackupex --user=DBUSER --password=PASSWORD --stream=tar ./ | bzip2 -
$ xtrabackup --user=DBUSER --password=PASSWORD --backup --target=/data/bkps/
其他连接选项:
-port
-socket
-host
权限:
* RELOAD LOCK TABLES
* REPLICATION CLIENT
* CREATE TABLESPACE
* PROCESS
* SUPER
* CREATE
* INSERT
* SELECT
mysql> create user 'bkpuser'@'localhost' identified by 'password';
mysql> grant RELOAD,LOCK TABLES , REPLICATION CLIENT ON *.* to 'bkpuser'@'localhost';
mysql> flush privileges;
3.1.2 Backup Cycle之全备
* 用innobackupex创建一个备份
创建一个全备,除了需要连接服务器的参数外,还需要一个参数:存放备份文件的路径
$ innobackupex --user=USER --password=PASSWORD /path/to/backup-dir/
显示下面信息,表示备份成功:
innobackupex: Backup created in directory '/path/to/backup-dir/2015-02-04_19-03-58'
111225 19:03:58 innobackupex: completed OK!
备份将会被保存在指定路径以一个时间戳命名的目录下,如:'/path/to/backup-dir/2015-02-04_19-03-58'
其他可以考虑的选项:
* --no-timestamp 选项 innobackupex不创建时间戳目录存放备份,而是备份文件放在backup-dir中
$ innobackupex --user= --password= /path/to/backup-dir/ --no-timestamp
innobackupex 将创建子目录存放在/path/to/backup-dir/ [注:backup-dir目录必须不存在]
* --defaults-file 选项 指定配置文件路径,必须放在第一个参数
$ innobackupex --defaults-file=/tmp/other-my.cnf --user= --password= /path/to/backup-dir/
* 全备恢复-prepare
创建备份后,这些数据并非可以直接执行恢复,可能存在未提交的事务在relay log中,执行这步补充操作可以使数据文件完整,而且是prepare stage的目的,一旦执行完,数据就可以用了。
$ 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!
其他可以考虑的选项:
* --user-memory 选项 prepare操作可用内存大小,原则上越大越快
$ innobackupex --apply-log --use-memory=4G /path/to/backup-dir/
* 全备恢复-restore
为了方便,innobackupex 有一个--copy-back的选项,可以执行恢复数据到数据库服务器的datadir目录
$ innobackupex --copy-back /data/to/back-dir/
检查输出最后一行:
innobackupex: Finished copying back files.
111225 01:08:13 innobackupex: completed OK!
NOTE:datadir目录必须为空,innobackupex --copy-back并不会复制并覆盖原有文件,而且执行时,数据库服务器必须是shutdown状态
数据恢复后,需要修改数据文件的属性
$ chown -R mysql:mysql /var/lib/mysql
3.1.3 innobackupex 执行增量备份
在两次全备之间并非所有的数据都发生了改变,所以增量备份可以减少备份文件的大小
在innodb上可以执行增量的原因是,每个innodb的页都有一个log sequence number (LSN),作为整个数据库的版本号,每次当数据库发生改变时,这个值都会发生变化。
* 创建一次全备
[root@server databak]# innobackupex --defaults-file=/usr/local/mysql/my.cnf --user=root --password=redhat --no-timestamp /data/mysql/databak/14-46-00
查看xtrabackup-checkpoints文件
[root@server 14-46-00]# cat xtrabackup_checkpoints
backup_type = full-backuped
from_lsn = 0
to_lsn = 1603094
last_lsn = 1603094
compact = 0
* 在全备基础上创建一次增量备份
[root@server 14-46-00]# innobackupex --defaults-file=/usr/local/mysql/my.cnf --user=root --password=redhat --incremental /data/mysql/databak/ --incremental-dir /data/mysql/databak/14-46-00/
查看
[root@server databak]# cat 2015-02-05_14-57-54/xtrabackup_checkpoints
backup_type = incremental
from_lsn = 1603094
to_lsn = 1603094
last_lsn = 1603094
compact = 0
* 在上一次增量备份的基础上再做一次增量备份
[root@server databak]# innobackupex --defaults-file=/usr/local/mysql/my.cnf --user=root --password=redhat --incremental /data/mysql/databak/ --incremental-dir /data/mysql/databak/2015-02-05_14-57-54/
查看
[root@server databak]# cat 2015-02-05_15-00-47/xtrabackup_checkpoints
backup_type = incremental
from_lsn = 1603094
to_lsn = 1603203
last_lsn = 1603203
compact = 0
警告:
这个过程只影响XtraDB或者InnoDB引擎表,其他引擎表(如:Myisam)只复制整个库
* 增量备份-prepare
prepare工作和全备份略有不同,下面两点需要注意:
* 首先,只有已经提交的事务必须重做在每次备份中,将删除base全备中未提交的事务
* 其次,未提交的事务必须回滚,使数据处于ready-to-use状态
如果在全备中重做已经提交的事务,同时回滚未提交的事务,将无法添加增量备份数据;如果在增量备份中这样做,将不能添加增量备份中数据。
上面的内容铭记于心,使用--redo-only选项在base backup中
[root@server 14-46-00]# innobackupex --apply-log --redo-only /data/mysql/databak/14-46-00/
然后第一个增量备份applay到base Backup中:
[root@server 2015-02-05_15-00-47]# innobackupex --apply-log --redo-only --incremental /data/mysql/databak/14-46-00/ --incremental-dir=/data/mysql/databak/2015-02-05_15-00-47/
如果不指定--incremental-dir ,innobackupex将指定最新生成的子目录
重复上面的操作,继续恢复增量备份数据
[root@server 2015-02-05_15-02-47]# innobackupex --apply-log --incremental /data/mysql/databak/14-46-00/ --incremental-dir=/data/mysql/databak/2015-02-05_15-02-47/
Note:--redo-only 应该被使用在merging除了最后一个外的所有的增量备份文件,Even if the --redo-only was used on the last step,backup would stilll be consistent but in that case server would perform the roolback phase.
可以使用上面的步骤添加更多的增量备份文件,只要是按顺序执行的,否则base backup 将失效,如果无法确定文件的具体顺序,可以查看xtrabackup_checkpoints。
在base backup中执行完merge所有的增量备份文件后,就可以准备回滚未提交的事务:
[root@server 14-46-00]# innobackupex --apply-log --redo-only /data/mysql/databak/14-46-00/
现在base backup立刻可以被还原了
Note:iblog*文件将不会被innobackupex创建,如果想创建他,在目录下执行xtrabackup-prepare,另外,这些文件在数据库服务启动的时候会被自动创建。
* 增量备份数据restore
[root@server data]# innobackupex --defaults-file=/usr/local/mysql/my.cnf --copy-back /data/mysql/databak/14-46-00/
3.1.4 使用xbstream和tar执行增量流备份
使用流参数xbstream参数实现增量流备份
执行一次base备份:
innobackupex /data/backups
执行一次本地备份:
innobackupex --incremental --incremental-lsn=LSN-number --stream=xbstream ./ > incremental.xbstream
不打包备份:
xbstream -x < incremental.xbstream
压缩传送本地备份到远程:
innobackupex --incremental --incremental-lsn=LSN-number --stream=xbstream ./ | ssh user@hostname "cat - | xbstream -x -C > /backup-dir/"
3.1.5 部分备份
可以备份特定的表或者是库,备份的表必须在单独的表空间中,即开启innodb_file_per_table选项。
需要注意的一点:不要直接复制prepared backup文件,必须使用import恢复部分备份,而不是用--copy-back选项
创建部分备份:有三种方法:--include; --table-file; --databases
* 使用--include选项:采用正则表达式匹配
$ innobackupex --include='^mydatabase[.]mytable' /path/to/backup
上面的命令将创建一个时间戳目录,只有匹配的data文件被创建
[root@server databak]# innobackupex --defaults-file=/usr/local/mysql/my.cnf --user=root --password=redhat --include='^test.students' /data/mysql/databak/
[root@server databak]# ls 2015-02-05_16-41-59/
backup-my.cnf ibdata1 mysql performance_schema test xtrabackup_checkpoints xtrabackup_info xtrabackup_logfile
只有test目录下有数据文件和表结构文件
* 使用--tables-file选项:text file提供选项参数,包含需要备份的表
$ echo "test.students" > table.txt
$ innobackupex --tables-file=/tmp/table.txt /path/to/backup/
[root@server databak]# innobackupex --defaults-file=/usr/local/mysql/my.cnf --user=root --password=redhat --tables-file=/data/mysql/databak/table.txt /data/mysql/databak/
* 使用--databases选项:这个选项接收单独表空间列表库
$ innobackupex --databases="test.students mysql" /path/to/backup/
[root@server databak]# innobackupex --defaults-file=/usr/local/mysql/my.cnf --user=root --password=redhat --databases="test.students mysql" /data/mysql/databak/
* 部分备份prepare
$ innobackupex --apply-log --export /path/to/partial/backup/
[root@server databak]# innobackupex --defaults-file=/usr/local/mysql/my.cnf --user=root --password=redhat --apply-log --export /data/mysql/databak/2015-02-05_17-22-19
执行上面命令会出现一些表不存在的警告,因为基于InnoDB的表保存自身的数据在自身的目录下,而不是.frm文件,innobackupex 使用xtraback工具删除不存在的表。
* restore部分部分
复制文件到datadir
6.1.6 创建压缩备份
使用--compact选项创建压缩备份
$ innobackupex --compact /data/backups
Note:可以是用innobackupex --no-timestamp选项创建新目录保存备份
[root@server databak]# innobackupex --defaults-file=/usr/local/mysql/my.cnf --user=root --password=redhat --compact /data/mysql/databak/
* 可以看到压缩参数为1
[root@server databak]# cat 2015-02-05_17-36-06/xtrabackup_checkpoints
backup_type = full-backuped
from_lsn = 0
to_lsn = 1606688
last_lsn = 1606688
compact = 1
压缩备份恢复-prepare
prepare压缩备份需要重建indexs,使用--rebuild-indexs和--apply-logs选项
$ innobackupex --apply-log --rebuild-indexs /data/backups/2015-02-05_17-36-06
压缩备份恢复-restore
$ innobackupex --copy-back /path/to/backup-dir/
3.1.7 加密备份
* 创建加密备份
使用--encrypt-key或者--encrypt-key-file,其中之一必须指定
* --encryption=ALGORITHM 支持AES128,AES192,AES256加密方式
* --encryption-key=ENCRYPTION_KEY 在没有访问权限控制的机器上不支持这样操作
* --encrypt-key-file=KEYFILE 指定加密密钥文件
--encrypt-key和--encrypt-key-file都可以被使用来指定加密密钥,如下创建密钥key:
openssl enc -aes-256-cbc -pass pass:PASSWORD -P -md shal
输出结果如下:
****
使用--encrypt-key选项:
$ innobackupex --encrypt=AES256 --encrypt-key="****" /data/backups
使用--encrypt-key-file选项
$ innobackupex --encrypt=AES256 --encrypt-key-file=/data/backups/keyfile /data/backups
调整加密进程:
--encrypt-threads 指定加密进程数
--encrypt-chunk-size 指定每个加密进程的buffer size,默认是64K
* 解密备份
$ for i in `find . -iname "*.xbcrypt"`; do xbcrypt -d --encrypt-key-file=/data/backups/keyfile --encrypt=AES256 /data/backups
在Percona XtraBackup2.1.4 引入新的选项--decrypt
$ innobackupex --decrypt=AES256 --encrypt-key="*****" /data/backups
使用--decrypt选项将删除原来的加密文件,保存解密后的文件在相同的目录位置
Note:使用--parallel 在--decrypt中
* 加密备份--prepare
解密后使用--apply-logs来执行prepare,就像前面的标准备份一样
$ innobackupex --apply-log /data/backups/2015-02-05_17-36-06/
* 加密备份--restore
$ innobackupex --copy-back /path/to/backup-dir
3.2 高级功能
3.2.1 流压缩备份
以tar或者xbstream格式安装标准输出,而不是往目录下复制文件,可以通过其他程序接收标准输出流,如linux的管道
使用流功能的时候必须使用--stream选项,同时提供流格式(tar或者xbstream)以及接收流输出的位置
* xbstream格式压缩
* 保存全备到单个文件
[root@server mysql]# innobackupex --defaults-file=/usr/local/mysql/my.cnf --user=root --password=redhat --stream=xbstream /data/mysql/databak > /data/mysql/databak/backup.xbstream
* 保存压缩到单个文件
[root@server mysql]# innobackupex --defaults-file=/usr/local/mysql/my.cnf --user=root --password=redhat --stream=xbstream --compress /data/mysql/databak > /data/mysql/databak/backup.xbstream.tgz
* 对比压缩和不压缩文件大小
[root@server mysql]# du -sh databak/*
1.1G databak/backup.xbstream
16M databak/backup.xbstream.tgz]
* 解压缩备份到指定目录(/data/mysql/databak/tmp/)
[root@server databak]# xbstream -x < backup.xbstream.tgz -C /data/mysql/databak/tmp/
[root@server databak]# ls tmp/
backup-my.cnf ibdata1.qp mysql performance_schema test xtrabackup_checkpoints xtrabackup_info xtrabackup_logfile
* 发送压缩备份到其他机器并解压[传输时,终端被刷屏,直接盲输入密码]
[root@server databak]# innobackupex --defaults-file=/usr/local/mysql/my.cnf --user=root --password=redhat --compress --stream=xbstream /data/mysql/databak/ | ssh root@192.168.100.252 "xbstream -x -C /data/forilen/databak/"
* 发送压缩备份到其他机器不解压[传输时,终端被刷屏,直接盲输入密码]
[root@server databak]# innobackupex --defaults-file=/usr/local/mysql/my.cnf --user=root --password=redhat --compress --stream=xbstream /data/mysql/databak/ | ssh root@192.168.100.252 "cat - > /data/forilen/db.xbstream"
* tar格式压缩
* 备份单个文件
$ innobackupex --stream=tar /root/backup/ > /root/backup/out.tar
* 备份到其他主机,不压缩
$ innobackupex --stream=tar ./ | ssh user@ip "cat - > /data/backups/backup.tar"
例如:
[root@server databak]# innobackupex --defaults-file=/usr/local/mysql/my.cnf --user=root --password=redhat --stream=tar /data/mysql/databak/ | ssh root@192.168.100.252 "cat - > /data/forilen/db.tar.gz"
* 解压缩,必须使用-i选项
$ tar -xizf backup.tar.gz
* 附加其他压缩:
$ innobackupex --stream=tar ./ | gzip - > backup.tar.gz
$ innobackupex --stream=tar ./ | bzip2 - > backup.bz2
例如:
[root@server databak]# innobackupex --defaults-file=/usr/local/mysql/my.cnf --user=root --password=redhat --stream=tar /data/mysql/databak/ | gzip | ssh root@192.168.100.252 "cat - > /data/forilen/db.tar.gz"
* Note:stream备份的文件需要先执行prepare才能被restore