ITPub博客

首页 > 数据库 > MySQL > MySQL二进制热备份工具:Percona XtraBackup的使用和备份原理图解

MySQL二进制热备份工具:Percona XtraBackup的使用和备份原理图解

MySQL 作者:warren20 时间:2015-09-25 16:08:41 0 删除 编辑

Percona XtraBackup

  • Percona XtraBackup二进制版本安装
    # wget -c http://www.percona.com/redir/downloads/XtraBackup/XtraBackup-2.0.6/binary/Linux/x86_64/percona-xtrabackup-2.0.6-523.tar.gz
    # tar zxvf percona-xtrabackup-2.0.6-523.tar.gz
    # mv percona-xtrabackup-2.0.6 /usr/local/xtrabackup
    

MySQL二进制热备份与恢复

  • 创建MySQL备份用户
    # mysql -uroot -p123456 -e "CREATE USER 'backup'@'%' IDENTIFIED BY '123456'"
    # mysql -uroot -p123456 -e "GRANT RELOAD, LOCK TABLES, REPLICATION CLIENT, CREATE TABLESPACE, SUPER ON *.* TO 'backup'@'%'"
    
  • MySQL完整热备份与恢复

    完整备份:

    # innobackupex --user=backup --password=123456 /data/vbackup/hotbackup/full --no-timestamp --parallel=2
    

    备份恢复准备:

    # innobackupex  --apply-log --use-memory=10G /data/vbackup/hotbackup/full
    

    恢复备份:

    ##停止mysql,清空MySQL的datadir
    # service mysql stop 
    # mv /usr/local/mysql/data /usr/local/mysql/data.old
    # mkdir -p /usr/local/mysql/data
    ##恢复备份数据,并修改datadir的权限
    # innobackupex --copy-back  --rsync /data/vbackup/hotbackup/full
    # chown -R mysql:mysql /usr/local/mysql/data
    

    启动MySQL:

    # service mysql start
    
  • MySQL增量热备份

    创建基础备份(全备份):

    # innobackupex --user=backup --password=123456  /data/vbackup/hotbackup/base --no-timestamp --parallel=2
    

    基于基础备份,创建增量备份inc_one:

    # innobackupex --user=backup --password=123456  --incremental /data/vbackup/hotbackup/inc_one --incremental-basedir=/data/vbackup/hotbackup/base  --no-timestamp --parallel=2
    

    基于增量备份inc_one,创建增量备份inc_two:

    # innobackupex --user=backup --password=123456  --incremental /data/vbackup/hotbackup/inc_two --incremental-basedir=/data/vbackup/hotbackup/inc_one  --no-timestamp --parallel=2
    
  • MySQL增量热备份恢复

    准备基础备份(应用基础备份xtrabackup日志中的提交的事务,但不回滚未提交的事务):

    # innobackupex --apply-log --redo-only --use-memory=10G /data/vbackup/hotbackup/base
    

    将增量备份inc_one应用到基础备份:

    # innobackupex --apply-log --redo-only --use-memory=10G /data/vbackup/hotbackup/base/ --incremental-dir=/data/vbackup/hotbackup/inc_one/
    

    将增量备份inc_two应用到基础备份:

    # innobackupex --apply-log --use-memory=10G /data/vbackup/hotbackup/base/ --incremental-dir=/data/vbackup/hotbackup/inc_two
    

    注:当准备基础备份和合并增量备份(最后一个增量备份除外)的时候,需要使用--redo-only参数.

    当所有的增量备份合并完成之后,再一次准备全备份,回滚未提交的事务.

    # innobackupex --apply-log --use-memory=10G /data/vbackup/hotbackup/base/
    

    恢复全备份并启动MySQL:

    # service mysql stop
    # rm -rf /usr/local/mysql/data.old && mv /usr/local/mysql/data /usr/local/mysql/data.old
    # mkdir -p /usr/local/mysql/data
    # innobackupex --copy-back --rsync /data/vbackup/hotbackup/base/
    # chown -R mysql:mysql /usr/local/mysql/data
    # service mysql start
    
  • innobackupex部分备份

    innobackupex部分备份,有以下三个参数可选择:

    1. --databases="database1[.table1] ..."
    比如: --databases="employees sales.orders"
    
    2. --tables-file=tables.txt, tables.txt文件每一行有一个database.table
    
    3. --include=regexp,
    比如: --include='^database(1|2)\.reports'
    

    在准备”部分备份”和拷贝恢复”部分备份”到一个空的datadir之后,请确保datadir中有”mysql”数据库,否则MySQL无法启动.
    如果没有,则需要先创建系统的数据库再启动:

    # mysql_install_db --user=mysql
    
  • innobackupex从库热备份

    在主从复制环境中的”从库”做热备份的时候,可以使用--slave-info和--safe-slave-backup参数.
    在备份的时候使用--slave-info会将Master的binary log的文件名和偏移位置记录打印出来,同时也保存到xtrabackup_slave_info文件中.
    --safe-slave-backup则会暂停Slave的SQL线程,等待到没有打开的临时表的时候开始备份.备份结束后SQL线程会自动启动,这样就可以确保一致性的复制状态.

XtraBackup流备份与压缩备份

  • tar流备份及压缩

    将完全备份直接存储到tar压缩包,并将它进行gzip压缩:

    # innobackupex --user=backup --password=123456 --stream=tar ./ | gzip - > backup.tar.gz
    

    完全备份并gzip压缩发送到远程机器:

    # innobackupex --user=backup --password=123456 --stream=tar ./ | gzip | ssh root@192.168.1.192 "cat - > /data/www/mysql/tarbackup/backup.tar.gz"
    

    解压缩(必须使用-i参数):

    # tar -izxvf backup.tar.gz -C ./data/
    

    注:解压之后的数据仍然需要进行apply-log之后才可以用于恢复.

  • xbstream流备份及压缩

    将备份压缩到名为”backup.xbstream”的压缩包:

    # innobackupex --user=backup --password=123456 --stream=xbstream ./ > backup.xbstream
    

    解压backup.xbstream到./backup/:

    # xbstream -x < backup.xbstream -C ./backup/
    

    多线程并行文件拷贝和qpress并行快速压缩备份,然后直接发送到远程机器并进行xbstream解压保存:

    # innobackupex --user=backup --password=123456 --compress --compress-threads=8 --parallel=4 --stream=xbstream ./ | ssh root@192.168.1.192 "xbstream -x -C /data/www/mysql/backup"
    

    远程机器上对xbstream解压后的备份文件中的qpress压缩文件进行解压:

    # cd /data/www/mysql/backup
    # for f in `find ./ -iname "*\.qp"`; do qpress -dT2 $f  $(dirname $f) && rm -f $f; done
    

    注:解压之后的数据仍然需要进行apply-log之后才可以用于恢复.

  • xbstream流增量备份

    当前XtraBackup的稳定版本(2.06)的流增量备份仅支持xbstream格式.

    创建基础全备份,发送到远程机器并解压:

    # innobackupex --user=backup --password=123456 --parallel=4 --stream=xbstream ./ | ssh root@192.168.1.192 "xbstream -x -C /data/www/mysql/incremental/base"
    

    查看基础备份的checkpoint信息:

    # ssh root@192.168.1.192 -C "cat /data/www/mysql/incremental/base/xtrabackup_checkpoints"
    backup_type = full-backuped
    from_lsn = 0
    to_lsn = 1807243286
    last_lsn = 1807243286
    

    基于基础备份,创建增量备份one:

    # innobackupex --user=backup --password=123456 --parallel=4 --incremental --incremental-lsn=1807243286 --stream=xbstream ./ | ssh root@192.168.1.192 "xbstream -x -C /data/www/mysql/incremental/one"
    

    注:关于增量备份的日志应用和备份恢复,请参考上文的"MySQL增量热备份恢复"部分.

    XtraBackup备份原理图解
    完整备份过程如图:



    准备和恢复数据阶段过程如图:

    首先应用xtrabackup日志提交事务应用到InnoDB,然后回滚未提交事务




    增量备份过程如图:

    对于增量备份只对InnoDB,MyISAM和其它引擎仍然是完整备份的方式,增量备份主要是处理InnoDB中有变更的页(页的LSN).LSN信息在xtrabackup_checkpoints中.


    增量应用:


    InnoDB表空间的结构:


    恢复过程如图:


    流备份过程图:


    注释:此篇博文图片来自谷歌搜索,文字描述借鉴官方文档同时加上自己总结而成.

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/30150152/viewspace-1809259/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2015-03-03

  • 博文量
    56
  • 访问量
    376702