参考:
http://blog.csdn.net/justdb/article/details/17054579# MySQL备份与恢复之percona-xtrabackup软件的使用
http://blog.csdn.net/justdb/article/details/17054667# MySQL备份与恢复之percona-xtrabackup实现增量备份及恢复
http://devliangel.blog.51cto.com/469347/1374232# 使用innobackupex在线增量备份及恢复mysql数据库
http://www.percona.com/doc/percona-xtrabackup/2.2/# 官方使用手册文档
http://blog.chinaunix.net/uid-20785090-id-4212816.html# xtraBackup备份原理剖析
http://blog.csdn.net/tianlesoftware/article/details/7028733 # MySQL 数据文件 说明
xtrabackup 备份恢复测试过程
1、安装
cd /data/soft
wget http://www.percona.com/redir/downloads/XtraBackup/LATEST/binary/redhat/6/x86_64/percona-xtrabackup-2.2.6-5042.el6.x86_64.rpm
yum -y install perl perl-devel libaio libaio-devel perl-Time-HiRes perl-DBD-MySQL
rpm -ivh percona-xtrabackup-2.2.6-5042.el6.x86_64.rpm
2、完全备份及恢复
# mysql备份用户授权
mysql> grant select,show view,Replication client,SUPER,RELOAD on *.* to ‘backup‘@‘127.0.0.1‘ identified by ‘passwd‘;flush privileges;
完全备份
innobackupex --host=127.0.0.1 --port=3306 --user=backup --password=‘passwd‘ --no-lock --defaults-file=/usr/local/services/mysql/etc/my.cnf --parallel=4 /data/backup
完全恢复
#检查及准备备份完的数据 --use-memory 参数默认100M, 表示可以给innobackupex使用的内存,越多越好
innobackupex --parallel=4 --use-memory=1G --apply-log /data/backup/2014-11-18_15-52-40
#恢复
innobackupex --defaults-file=/usr/local/services/mysql/etc/my.cnf --parallel=4 --copy-back /data/backup/2014-11-18_15-52-40
chown mysql:mysql /data/mysql_data -R
service mysql start
3、增量备份及恢复
#针对已经备份的目录进行增量备份
innobackupex --host=127.0.0.1 --port=3306 --user=backup --password=‘passwd‘ --no-lock --defaults-file=/usr/local/services/mysql/etc/my.cnf --incremental /data/backup/ --incremental-dir /data/backup/2014-11-18_15-52-40
#再次插入数据
# 再次增量备份
innobackupex --host=127.0.0.1 --port=3306 --user=backup --password=‘passwd‘ --no-lock --defaults-file=/usr/local/services/mysql/etc/my.cnf --incremental /data/backup/ --incremental-dir /data/backup/2014-11-18_18-11-35
#再次插入数据
# 再次增量备份
innobackupex --host=127.0.0.1 --port=3306 --user=backup --password=‘passwd‘ --no-lock --defaults-file=/usr/local/services/mysql/etc/my.cnf --incremental /data/backup/ --incremental-dir /data/backup/2014-11-18_18-14-56
#模拟数据丢失
service mysql stop
rm -rf /data/mysql_data/*
#三次增量备份数据合并到全备份中去
innobackupex --apply-log --redo-only --incremental /data/backup/2014-11-18_15-52-40 --incremental-dir /data/backup/2014-11-18_18-11-35
innobackupex --apply-log --redo-only --incremental /data/backup/2014-11-18_15-52-40 --incremental-dir /data/backup/2014-11-18_18-14-56
innobackupex --apply-log --redo-only --incremental /data/backup/2014-11-18_15-52-40 --incremental-dir /data/backup/2014-11-18_18-17-07
#恢复整合后的全备数据
#检查及准备备份完的数据
innobackupex --parallel=4 --use-memory=1G --apply-log /data/backup/2014-11-18_15-52-40
#恢复
innobackupex --defaults-file=/usr/local/services/mysql/etc/my.cnf --parallel=4 --copy-back /data/backup/2014-11-18_15-52-40
chown mysql:mysql /data/mysql_data -R
service mysql start
4、单数据库备份及恢复
#指定数据库备份
innobackupex --host=127.0.0.1 --port=3306 --user=backup --password=‘passwd‘ --no-lock --defaults-file=/usr/local/services/mysql/etc/my.cnf --parallel=4 --databases=‘test_backup5‘ /data/backup
#模拟表数据丢失
mysql > drop test_backup5 MyClass;
mysql > create table MyClass( id int(4) not null primary key auto_increment, name char(20) not null, sex int(4) not null default ‘0‘, degree double(16,2));
ALTER TABLE test_backup5.MyClass IMPORT TABLESPACE:
# 恢复指定库表数据
#指定数据库恢复检查及导出表空间文件
innobackupex --apply-log --export /data/backup/2014-11-19_18-05-35
# 删除表空间
mysql > use test_backup5;
mysql > ALTER TABLE test_backup5.MyClass DISCARD TABLESPACE;
#复制需要导入的表空间文件到相应数据库目录,复制MyClass.ibd 和 MyClass.cfg (mysql5.6以前的版本是.exp)
cp /data/backup/2014-11-19_18-05-35/test_backup5/{MyClass.ibd,MyCLass.cfg} /data/mysql_data/test_backup5
# 导入表空间
mysql > use test_backup5;
mysql > ALTER TABLE test_backup5.MyClass IMPORT TABLESPACE;
5、使用定制的xtrabackup备份及恢复脚本 + binlog备份恢复
为简化操作编写了三个脚本,各脚本中有数据库及备份目录参数设置(附件有下载链接)
脚本列表说明:
#全数据库备份脚本 用法: ./xtrabackup_backup.sh
xtrabackup_backup.sh
#全数据库导入脚本 用法: ./xtrabackup_all_import.sh <BAK_IMPORT_DATETIME>
xtrabackup_all_import.sh
#单数据库导入脚本 用法: ./xtrabackup_import <BAK_IMPORT_DATETIME> <DBNAME>
xtrabackup_import.sh
#备份及恢复过程如下
# 完全备份数据表结构,此处省略过程(注意,备份表结构需加-R(备份函数及存储过程) --no-data(不备份数据))
# 完全备份数据,使用备份脚本
sudo sh xtrabackup_backup.sh
# 备份目录在为
# innobackupex: Backup created in directory ‘/data/backup/2014-12-01_16-51-00‘
# binlog信息在 xtrabackup_binlog_info 或 xtrabackup_info 中
# innobackupex: MySQL binlog position: filename ‘mysql-bin.000006‘, position 191, GTID of the last change ‘7d481ded-790b-11e4-9d81-00e081e00029:1-178‘
# Game数据库,表cGameServerList 修改一条、添加一条数据、删除一条数据 (三次修改数据,为binlog恢复验证做准备)
# 此处省略过程
# 删除Game数据库
drop database Game
# binlog日志生成新文件
mysql -uroot -e "flush logs;"
# 查看binlog新日志名称
mysql -uroot -e "show binary logs;"|tail
# 创建数据库,并导入表结构
mysql -uroot -e "create database Game"
mysql -uroot Game < Game-nodata.sql
# 用xtrabackup 单库恢复Game, 执行恢复脚本 ,输入参数 恢复备份目录及恢复数据库 (注意:mysiam 引擎表或在现有的innodb表基础上恢复,需要重启mysql服务)
sudo sh xtrabackup_import.sh 2014-12-01_16-51-00 Game
#检查cGameServerList 表数据正常
# 通过binlog 恢复从定时备份到drop 数据库前的数据
# 查看xtrabackup备份的binlog-info 备份时 MySQL binlog position: filename ‘mysql-bin.000009‘, position 191
# 查看drop database Game 时 MySQL binlog position
sudo /usr/local/services/mysql/bin/mysqlbinlog --start-position=191 /data/mysql_data/mysql-bin.000006|grep -B 10 -i ‘DROP DATABASE‘
#备份现有binlog
cp /data/mysql_data/mysql-bin* /data/mysqlbinlogbak/
#初始化binlog,清空现有的mysqlbinlog日志,如果不执行这步,导入不了最后需要执行的binlog中的数据记录
mysql -uroot -e "reset master"
#导入需要恢复的binlog(按备份的position 至drop 前的position 恢复),如果需要恢复多个mysql-bin 文件,执行多条下面命令
sudo /usr/local/services/mysql/bin/mysqlbinlog /data/mysqlbinlogbak/mysql-bin.000009 --start-position=191 --stop-position=2814 | mysql -uroot
#再次检查cGameServerList 表数据正常,发现这次数据为做过三次修改的数据,到现在为止,全部数据恢复正常
6、从数据库使用参数 --slave-info --safe-slave-backup 记录备份时的slave状态,注意:slave信息备份需要的backup备份账户有 SUPER 权限