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

3.2.2 主从环境执行备份

3.2.3 在服务器上保存备份历史(2.1.4新特性)

PerconaXtraBackup-2.2.8手册翻译的更多相关文章

  1. MariaDB官方手册翻译

    MariaDB官方手册 翻译:create database语句(已提交到MariaDB官方手册) 翻译:rename table语句(已提交到MariaDB官方手册) 翻译:alter table语 ...

  2. Java垃圾回收手册翻译 - 什么是垃圾回收

    Java垃圾回收手册翻译 - 什么是垃圾回收 初看之下,垃圾回收应该要做其名称之事 - 找到和丢掉垃圾.然而事实上它正好做着相反的事,垃圾回收会记录所有仍在使用中的对象,然后将其他标记为垃圾.谨记这点 ...

  3. Hive官方手册翻译(Getting Started)

    翻译Hive官方文档系列,文中括号中包含 注: 字样的,为我自行标注的,水平有限,翻译不是完美无缺的.如有疑问,请参照Hive官方文档对照查看.   内容列表 Cloudera制作的Hive介绍视频 ...

  4. Matlab手册翻译

    MATLAB 语言是一种工程语言,语法很像 VB 和 C,比 R 语言容易学,你知道 R 语言的语法有多糟糕么.同样,相对于 Python,MATLAB 的优点是天生为了算而算,数与数之间的运算就是矩 ...

  5. LLVM language 参考手册 翻译停止相关

    再翻译LLVM language 参考手册的时候,个人感觉很多东西都不是很懂,因此打算学习完编译原理后再去继续研究翻译,多有不便望见谅

  6. Hive官方手册翻译(Getting Started)(转)

    原文:http://slaytanic.blog.51cto.com/2057708/939950 翻译Hive官方文档系列,文中括号中包含 注: 字样的,为我自行标注的,水平有限,翻译不是完美无缺的 ...

  7. Storm官方帮助手册翻译(下)

    使用其他语言编写Bolt Bolt可以使用任意语言编写.用另外一种语言编写Bolt来作为子进程运行.Storm会在标准输入输出的基础上使用Json来与子进程通信.通信协议之需要一个100行的适配器库, ...

  8. Storm官方帮助手册翻译(上)

    Storm作为当前最流行的实时计算框架,自Twitter将其开源后就一直备受关注.由于其具有先天的稳定性以及便捷性,目前被许多大公司所采用,国外像雅虎.雅虎日本.Twitter.OOYALA.Spot ...

  9. NumPy 数组学习手册·翻译完成

    原文:Learning NumPy Array 协议:CC BY-NC-SA 4.0 欢迎任何人参与和完善:一个人可以走的很快,但是一群人却可以走的更远. 在线阅读 ApacheCN 面试求职交流群 ...

  10. Netty使用手册翻译

    前言 痛点 时至今日,我们通常会使用应用程序或第三方库去提供通信功能.比如:我们通常使用HTTP客户端库去Web服务器检索信息;通过web服务调用一个远程程序.然而,一个通用协议或者它的实现往往不能适 ...

随机推荐

  1. Android文件操作工具类(转)

    Android文件操作工具类(转)  2014/4/3 18:13:35  孤独的旅行家  博客园 这个工具类包含Android应用开发最基本的几个文件操作方法,也是我第一次发博客与大家分享自己写的东 ...

  2. flex skin

    原文地址:http://blog.163.com/to_yht/blog/static/1227257742009741359326/当程序做完后,你是否还在为老套的flex组件默认效果发愁?是否还在 ...

  3. 为什么输入shutdown -h -t会报错:command not fount

    如果是直接用普通用户($)的身份进行输入[user@localhost ~]$ shutdown -h -t 是不能执行,因为普通用户没有关闭机器的权限. 然而直接使用[user@localhost ...

  4. Myeclipse 编译等级

    1.Java compiler level does not match the version of the installed Java project facet. 问题描述:编译等级不匹配 解 ...

  5. hive on spark VS SparkSQL VS hive on tez

    http://blog.csdn.net/wtq1993/article/details/52435563 http://blog.csdn.net/yeruby/article/details/51 ...

  6. C#控件之DataGridView

    第一种:DataSet ds=new DataSet (); this.dataGridView1.DataSource=ds.Table[0]; 第二种:DataTable dt=new DataT ...

  7. google兴趣点下载工具

    继上次百度兴趣点版本的发布以后,发现百度只能下载本国数据,并且数据完整度还是和google的少一些,所以本次经过钻研与解密,实现了google地图下载工具,版本的主要功能如下: 1.支持多线程下载,支 ...

  8. 在HTML页面中实现一个简单的Tab

    参考:http://blog.sina.com.cn/s/blog_6cccb1630100m23i.html HTML页面代码如下: <!DOCTYPE html PUBLIC "- ...

  9. Xcode强大的多视图立体分层显示View UI Herarchy

    Xcode能够显示执行页面的立体uivew结构图,能够让你看到一个页面包括哪些视图,在哪一层,在页面的什么位置. 一看就能看到你的uiview是否显示.显示在哪里了. 用鼠标点击页面移动鼠标能够看到页 ...

  10. Android 冷兵器 之 tools

    代码地址如下:http://www.demodashi.com/demo/12612.html 前言 Android开发在所难免的就是UI的预览和调整,一般情况下都是直接run看效果,或者是使用AS的 ...