标签:
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
标签:
原文地址:http://www.cnblogs.com/forilen/p/4275706.html