博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
xtrabackup备份还原
阅读量:6604 次
发布时间:2019-06-24

本文共 8160 字,大约阅读时间需要 27 分钟。

  公司业务对事务性要求越来越高,再者mysqldump备份锁表情况严重,又赶上服务器更新换代,硬件需求得到能充分满足,因此,决定开始myisam转为innodb,我呢作为排头兵,被安排测试xtrabackup备份还原数据库。下面我把自己测试xtrabackup备份mysql库的过程做个小结;

测试环境

  操作系统:redhat 5.6

  mysql版本:mysql 5.1.38

  port:3333

  库名:wyett

  xtrabackup:下载地址:

    选择2.0.8这个版本,不选2.1以后版本是因为2.1以后版本不支持mysql 5.1的备份;2.0以前版本bug有个碗口大的伤疤啊,对于表文件大于8G的表,在还原时会报错;这两个问题也是笔者在巧合下发现的,特别2.0版本,实在是很受折磨,可能有不缺之处,希望大家见谅!

 

安装xtrabackup

  直接下载xtrabackup的rpm安装包安装;

1 # sudo rpm -ivh percona-xtrabackup-20-2.0.8-587.rhel5.x86_64.rpm --nodeps2 # sudo ln –s /usr/local/mysql/bin/mysql /usr/bin/mysql3 # export PATH=$PATH:/usr/local/mysql/bin

  第1行加nodeps参数,否则:

1 # sudo rpm -ivh percona-xtrabackup-20-2.0.8-587.rhel5.x86_64.rpm2 warning: percona-xtrabackup-20-2.0.8-587.rhel5.x86_64.rpm: Header V4 DSA signature: NOKEY, key ID cd2efd2a3 error: Failed dependencies:4     /usr/bin/mysql is needed by percona-xtrabackup-20-2.0.8-587.rhel5.x86_64

  第2行创建一个软链,因为是从官网下载的rpm包,需要一个/usr/bin/mysql下的环境依赖,也可以自己做一个适合的rpm包

  第3行设置环境变量

  

端口备份还原

  1、备份

1 sudo /usr/bin/innobackupex-1.5.1 \2 --defaults-file=/mysqldata/mysql/data/mysql3333/my3333_master.cnf  \3 --user=root --host=127.0.0.1 --port=3333 --stream=tar --slave-info \4 /mysqlbak/boze/  \5 2>/mysqlbak/boze/1.log | gzip -c9 >/mysqlbak/boze/3333_bak.tar.gz

  打开1.log文件看一看,以下面类似结尾,并且通篇没有error字样,备份成功:

1 innobackupex-1.5.1: Backup created in directory '/mysqlbak/boze'2 innobackupex-1.5.1: MySQL binlog position: filename 'mysql3333.000001', position 1063 innobackupex-1.5.1: MySQL slave binlog position: master host '', filename '', position 4 innobackupex-1.5.1: You must use -i (--ignore-zeros) option for extraction of the tar stream.5 140114 17:13:29  innobackupex-1.5.1: completed OK!

  2、copy备份到新服务器并解压,创建新文件夹/mysqlbak/boze/db

1 # cd /mysqlbak/boze2 # mkdir ./db3 # tar –izxvf 3333_bak.tar.gz –C ./db/

  看一看./db/中的文件,与原库相比较,权限发生了变化,暂时先不管;

# lltotal 10288-rw-r--r-- 1 root root      268 Jan 14 17:13 backup-my.cnf-rw-rw---- 1 root root 10485760 Jan 14 15:51 ibdata1drwxr-xr-x 2 root root     4096 Jan 14 17:26 mysqldrwxr-xr-x 2 root root     4096 Jan 14 17:26 wyett-rw-r--r-- 1 root root       10 Jan 14 17:13 xtrabackup_binary-rw-r--r-- 1 root root       23 Jan 14 17:13 xtrabackup_binlog_info-rw-rw---- 1 root root       73 Jan 14 17:13 xtrabackup_checkpoints-rw-rw---- 1 root root     2560 Jan 14 17:13 xtrabackup_logfile-rw-r--r-- 1 root root       53 Jan 14 17:13 xtrabackup_slave_info

  3、处理新服务器端口:

  Copy出端口配置文件,端口号可以不同,停止新端口服务,删除新端口数据文件

1 # sudo cp /mysqldata/mysql/data/mysql3333/my3333_master.cnf /mysqlbak/boze/2 # sudo /etc/init.d/mysql3333 stop3 # cd /mysqldata/mysql/data/mysql3333/4 # sudo rm –rf ./*

  4、还原;

  应用日志

1 # sudo /usr/bin/innobackupex-1.5.1 --user=root \2 # --host=127.0.0.1 --port=3333 \3 # --defaults-file=/mysqlbak/boze/my3333_master.cnf  \4 # --apply-log /mysqlbak/boze/db/

  执行结果:

xtrabackup: starting shutdown with innodb_fast_shutdown = 1140114 17:34:59  InnoDB: Starting shutdown...140114 17:34:59  InnoDB: Shutdown completed; log sequence number 45580140114 17:34:59  innobackupex-1.5.1: completed OK!

  copy备份

1 # sudo /usr/bin/innobackupex-1.5.1 --user=root \2 # --host=127.0.0.1 --port=3333 \3 # --defaults-file=/mysqlbak/boze/my3333_master.cnf   \4 # --copy-back /mysqlbak/boze/db/

  执行结果如下,可以看到这一步实际就是copy过程,当时测试出2.0版本8G这个BUG就是在这一步发现的:

innobackupex-1.5.1: Finished copying back files.140114 17:41:27  innobackupex-1.5.1: completed OK!

  5、修改所有库文件夹的权限和所有者

1 # cd /mysqldata/mysql/data/mysql3333/2 # sudo chown –R mysql.mysql ./3 # sudo ls -l | grep ^d | awk -F " " '{print $9}' | xargs sudo chmod -R 6604 # sudo ls -l | grep ^d | awk -F " " '{print $9}' | xargs sudo chmod 700

  把my3333_master.cnf复制到对应目录中:

# lltotal 797500-rw-r--r-- 1 mysql mysql  10485760 Jan 14 17:37 ibdata1-rw-r--r-- 1 mysql mysql 268435456 Jan 14 17:38 ib_logfile0-rw-r--r-- 1 mysql mysql 268435456 Jan 14 17:41 ib_logfile1-rw-r--r-- 1 mysql mysql 268435456 Jan 14 17:39 ib_logfile2-rw-r--r-- 1 root  root      20399 Jan 14 17:46 my3333_master.cnfdrwx------ 2 mysql mysql      4096 Jan 14 17:37 mysqldrwx------ 2 mysql mysql      4096 Jan 14 17:37 wyett-rw-r--r-- 1 mysql mysql        53 Jan 14 17:37 xtrabackup_slave_info

   :test库哪里去了?

  6、启动端口,搭建从库;

  

  :数据文件中会有以下两个文件:

    如果想做备份机的从库,使用xtrabackup_binlog_info的pos

    如果想做备份机的主库的从库,使用xtrabackup_slave_info的pos

  

  后面内容比较简略,只列出相关脚本,步骤都是一样的。

单库备份还原

  1、备份,加一个参数--database

1 # sudo /usr/bin/innobackupex-1.5.1 \2 --defaults-file=/mysqldata/mysql/data/mysql3333/my3333_master.cnf  \3 --database=wyett \4 --user=root --host=127.0.0.1 --port=3333 --stream=tar --slave-info \5 /mysqlbak/boze/  \6 2>/mysqlbak/boze/1.log | gzip -c9 >/mysqlbak/boze/wyett.tar.gz

  2、copy解压,创建目录/mysqlbak/boze/db1/

[dbauser5@jyw-dm-yhzx01 db1]$ lltotal 10284-rw-r--r-- 1 root root      268 Jan 14 17:59 backup-my.cnf-rw-rw---- 1 root root 10485760 Jan 14 15:51 ibdata1drwxr-xr-x 2 root root     4096 Jan 14 18:05 wyett-rw-r--r-- 1 root root       10 Jan 14 18:00 xtrabackup_binary-rw-r--r-- 1 root root       23 Jan 14 18:00 xtrabackup_binlog_info-rw-rw---- 1 root root       73 Jan 14 18:00 xtrabackup_checkpoints-rw-rw---- 1 root root     2560 Jan 14 18:00 xtrabackup_logfile-rw-r--r-- 1 root root       53 Jan 14 18:00 xtrabackup_slave_info

  3、还原单库,同样要求停止端口,清空datadir目录,脚本不变,也就是说,尽管是单库备份,你需要为它单起一个端口,在已有文件或者库的端口里是没办法恢复xtrabackup库的。笔者对这点一直有怀疑,只是可惜没有进展:

sudo /usr/bin/innobackupex-1.5.1 --user=root \--host=127.0.0.1 --port=3333 \--defaults-file=/mysqlbak/boze/my3333_master.cnf  \--apply-log /mysqlbak/boze/db1/

 

增量备份还原

1、完整备份:

1 sudo /usr/bin/innobackupex-1.5.1 \2 --defaults-file=/mysqldata/mysql/data/mysql3333/my3333_master.cnf  \3 --user=root --host=127.0.0.1 --port=3333 --stream=tar --slave-info \4 /mysqlbak/boze/db2/  >/mysqlbak/boze/1.log

  备份结果:

1 $ ll2 total 43 drwxr-xr-x 4 root root 4096 Feb 17 14:28 2014-02-17_14-28-04

2、增量备份:

1 sudo /usr/bin/innobackupex-1.5.1 \2 --defaults-file=/mysqldata/mysql/data/mysql3333/my3333_master.cnf  \3 --user=root --host=127.0.0.1 --port=3333 --slave-info \4 --incremental --incremental-basedir=/mysqlbak/boze/db2/2014-02-17_14-28-04/ \5 /mysqlbak/boze/db2/  >/mysqlbak/boze/1.log

  --incremental指明是增量备份

  --incremental-basedir指定上次完整备份或者增量备份文件的位置。

  增量备份结果:

1 drwxr-xr-x 4 root root 4096 Feb 17 14:28 2014-02-17_14-28-042 drwxr-xr-x 4 root root 4096 Feb 17 14:33 2014-02-17_14-33-33

3、还原:

  apply_log全备:

1 sudo /usr/bin/innobackupex-1.5.1 --user=root \2 --host=127.0.0.1 --port=3333 \3 --defaults-file=/mysqlbak/boze/my3333_master.cnf  \4 --apply-log /mysqlbak/boze/db2/2014-02-17_14-28-04/

  apply_log增量备份到全备:

1 sudo /usr/bin/innobackupex-1.5.1 --user=root \2 --host=127.0.0.1 --port=3333 \3 --defaults-file=/mysqlbak/boze/my3333_master.cnf  \4 --apply-log /mysqlbak/boze/db2/2014-02-17_14-28-04/ \5 --incremental-dir=/mysqlbak/boze/db2/2014-02-17_14-33-33/

  然后copy回datadir下,修改权限,启动端口即可;

 

xtrabackup备份原理

完整备份的原理:

  对于InnoDB,XtraBackup基于InnoDB的crash-recovery功能进行备份。
  crash-recovery是这样的:InnoDB维护了一个redo log,又称为 transaction log,也叫事务日志,它包含了InnoDB数据的所有改动情况。InnoDB启动的时候先去检查datafile和transaction log,然后应用所有已提交的事务并回滚所有未提交的事务。
  XtraBackup在备份的时候并不锁定表,而是一页一页地复制InnoDB的数据,与此同时,XtraBackup还有另外一个线程监视着transactions log,一旦log发生变化,就把变化过的log pages复制走(因为transactions log文件大小有限,写满之后,就会从头再开始写,新数据可能会覆盖到旧的数据,所以一旦变化就要立刻复制走)。在全部数据文件复制完成之后,停止复制logfile。
  XtraBackup采用了其内置的InnoDB库以read-write模式打开InnoDB的数据文件,然后每次读写1MB(1MB/16KB=64page)的数据,一页一页地遍历,同时用InnoDB的buf_page_is_corrupted()函数检查此页的数据是否正常,如果正常则进行复制,如不正常则重新读取,最多重读10次,如果还是失败,则备份失败退出。复制transactions log的原理也是一样的,只不过每次读写512KB(512KB/16KB=32page)的数据。
  由于XtraBackup其内置的InnoDB库打开文件的时候是rw的,所以运行XtraBackup的用户,必须对InnoDB的数据文件具有读写权限。
  由于XtraBackup要从文件系统中复制大量的数据,所以它尽可能地使用posix_fadvise(),来告诉OS不要缓存读取到的数据(因为这些数据不会重用到了),从而提升性能。如果要缓存的话,大量的数据会对OS的虚拟内存造成很大的压力,其它进程(如mysqld)很有可能会被swap出去,这样就出问题了。同时,XtraBackup在读取数据的时候还尽可能地预读。
  由于不锁表,所以复制出来的数据是不一致的,数据的一致性是在恢复的时候使用crash-recovery进行实现的。
  对于MyISAM,XtraBackup还是首先锁定所有的表,然后复制所有文件。

 

增量备份的原理:

  在完整备份和增量备份文件中都有一个文件xtrabackup_checkpoints会记录备份完成时检查点的LSN。在进行新的增量备份时,XtraBackup会比较表空间中每页的LSN是否大于上次备份完成的LSN,如果是,则备份该页,并记录当前检查点的LSN。

  原理部分摘自:http://blog.csdn.net/yongsheng0550/article/details/6682162

   更多内容请参考:http://www.mike.org.cn/articles/xtrabackup-guide/

转载于:https://www.cnblogs.com/wyett/p/mysql_backup_xtrabackup.html

你可能感兴趣的文章
六、nginx搭建织梦DedeCms网站
查看>>
Tair学习小记
查看>>
网卡绑定(服务器&&交换机),缓存服务器Squid架构配置
查看>>
web网站加速之CDN(Content Delivery Network)技术原理
查看>>
打算写一款框架来提高自己 写个结构吧
查看>>
vue学习:10、第一个项目,实践中遇到的问题
查看>>
sed的基本用法
查看>>
一个不错的shell 脚本入门教程
查看>>
JVM、GC相关资料
查看>>
dell r620装cenots7遇到的问题
查看>>
Ansible之playbook的使用
查看>>
ansible模块批量管理
查看>>
redis命令 - GET
查看>>
[Maven问题总结]Jetty9的Maven配置——嵌入式服务器
查看>>
httpd.conf的基本设置
查看>>
RHEL/Centos7新功能
查看>>
第一部分 思科九年 一(1)
查看>>
DBA日常工作职责
查看>>
Redis的持久化
查看>>
linux安装NFS服务器学习
查看>>