Percona Xtrabackup 快速备份 MySQL
老规矩,开场白,刚开始用 mysqldump,备份 100G+的数据库,再加上服务器繁忙,备份速度像蜗牛似的,于是寻找更高效的备份方法。网上都说用 xtrabackup 比较适合备份大的数据库,而且备份效率也高,就尝试使用一次,结果明显感觉比 mysqldump 备份与恢复速度就是快不少,那以后就用它了。大礼拜日的在家也没事,结合生产环境,写了这篇文档,刚接触的朋友,可以参考下,不多说,入正题!
1、初次备份前准备工作
1.1 了解备份方式
- 热备份:读写不受影响(mysqldump-->innodb)
- 温备份:仅可以执行读操作(mysqldump-->myisam)
- 冷备份:离线备份,读写都不可用
- 逻辑备份:将数据导出文本文件中(mysqldump)
- 物理备份:将数据文件拷贝(xtrabackup、mysqlhotcopy)
- 完整备份:备份所有数据
- 增量备份:仅备份上次完整备份或增量备份以来变化的数据
- 差异备份:仅备份上次完整备份以来变化的数据
1.2 创建备份用户
mysql> grant reload,lock tables,replication client on *.* to 'bak'@'localhost' identified by 'bak2015';
mysql> flush privileges;
1.3 安装方式
CentOS:
# rpm -ivh http://www.percona.com/downloads/percona-release/redhat/0.1-3/percona-release-0.1-3.noarch.rpm
# yum install percona-xtrabackup
xtrabackup2.2 不支持 MySQL5.1 的 Innodb 引擎,如需要可安装 2.0 版本 。
Ubuntu:
# sudo apt-get install xtrabackup
14.04 默认有这个包,14.04 之前版本如果没有在 这个地址 下载对应的版本。
1.4 了解常用参数
- --user= #指定数据库备份用户
- --password= #指定数据库备份用户密码
- --port= #指定数据库端口
- --host= #指定备份主机
- --socket= #指定 socket 文件路径
- --databases= #备份指定数据库,多个空格隔开,如--databases="dbname1 dbname2",不加备份所有库
- --defaults-file= #指定 my.cnf 配置文件
- --apply-log #日志回滚
- --incremental= #增量备份,后跟增量备份路径
- --incremental-basedir= #增量备份,指上次增量备份路径
- --redo-only #合并全备和增量备份数据文件
- --copy-back #将备份数据复制到数据库,数据库目录要为空
- --no-timestamp #生成备份文件不以时间戳为目录名
- --stream= #指定流的格式做备份,--stream=tar,将备份文件归档
- --remote-host=user@ip DST_DIR #备份到远程主机
2、完整备份与恢复
2.1 完整备份
# innobackupex --user=bak --password='bak2015' /mysql_backup
2.2 备份恢复
# innobackupex --defaults-file=/etc/mysql/my.cnf --copy-back /home/loongtao/mysql_backup/2015-02-08_11-56-48/
2.3 备份文件说明
# ls 2015-02-08_11-56-48
- backup-my.cnf:记录 innobackup 使用到 mysql 参数
- xtrabackup_binary:备份中用到的可执行文件
- xtrabackup_checkpoints:记录备份的类型、开始和结束的日志序列号
- xtrabackup_logfile:备份中会开启一个 log copy 线程,用来监控 innodb 日志文件(ib_logfile),如果修改就会复制到这个文件
3、完整备份+增量备份与恢复
3.1 完整备份
# innobackupex --user=bak --password='bak2015' /mysql_backup
备份后位置是:/mysql_backup/2015-02-08_11-56-48
3.2 增量备份 1
# innobackupex --user=bak --password='bak2015' --incremental /data1/mysql_backup --incremental-basedir=/mysql_backup/2015-02-08_11-56-48 #指定上次完整备份目录
3.3 增量备份 2
# innobackupex --user=bak --password='bak2015' --incremental /data1/mysql_backup --incremental-basedir=/mysql_backup/2015-02-08_12-16-06 #指定上次增量备份目录
3.4 查看 xtrabackup_checkpoints 文件
一目了然,可以看到根据日志序号来增量备份
3.5 备份恢复
3.5.1 备份恢复思路
将增量备份 1、增量备份 2...合并到完整备份,加到一起出来一个新的完整备份,将新的完整备份以拷贝的形式到数据库空目录(rm /var/lib/mysql/* -rf)
3.5.2 预备完整备份
xtrabackup 把备份过程中可能有尚未提交的事务或已经提交但未同步数据文件的事务,写到 xtrabackup_logfile 文件,所以要先通过这个日志文件回滚,把未完成的事务同步到备份文件,保证数据文件处于一致性。
# innobackup --apply-log --redo-only 2015-02-08_11-56-48
3.5.3 合并第一个增量备份
# innobackupex --apply-log --redo-only /mysql_backup/2015-02-08_11-56-48/ --incremental-dir=mysql_backup/2015-02-08_12-16-06
3.5.4 合并第二个增量备份
# innobackupex --apply-log --redo-only /mysql_backup/2015-02-08_11-56-48/ --incremental-dir=mysql_backup/2015-02-08_16-06-53
3.5.5 恢复完整备份
这时 2015-02-08_11-56-48 完整备份已经包含所有增量备份,可以通过查看 checkpoints 来核实
# innobackupex --defaults-file=/etc/mysql/my.cnf --copy-back /mysql_backup/2015-02-08_11-56-48/
3.5.6 修改恢复数据文件权限
# chown -R mysql.mysql /var/lib/mysql
3.5.7 启动 MySQL,查看数据库恢复情况
# /etc/init.d/mysqld start
4、备份文件归档压缩
4.1 归档并发送到备份服务器
# innobackupex --databases=test --user=bak --password='bak2015' --stream=tar /mysql_backup 2>/mysql_backup/bak.log |ssh root@192.168.18.251 "cat - > /mysql_backup/`date +%F`.tar"
解压:tar -ixvf `date +%F`.tar
4.2 归档备份
# innobackupex --databases=test --user=bak --password='bak2015' --stream=tar /mysql_backup > /mysql_backup/`date +%F`.tar
解压:tar -ixvf `date +%F`.tar
4.3 压缩归档备份
# innobackupex --databases=test --user=bak --password='bak2015' --stream=tar /mysql_backup |gzip >/mysql_backup/`date +%F`.tar.gz
解压:tar -izxvf `date +%F`.tar.gz
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论