mysql在线备份恢复--Xtrabackup

Xtrabackup


Xtrabackup是一个对InnoDB做数据备份的工具,支持在线热备份(备份时不影响数据读写),是商业备份工具InnoDB Hotbackup的一个很好的替代品。

Xtrabackup介绍

Xtrabackup有两个主要的工具:xtrabackup、innobackupex

  • xtrabackup只能备份InnoDB和XtraDB两种数据表,而不能备份MyISAM数据表
  • innobackupex是参考了InnoDB Hotbackup的innoback脚本修改而来的.innobackupex是一个perl脚本封装,封装了xtrabackup。主要是为了方便的同时备份InnoDB和MyISAM引擎的表,但在处理myisam时需要加一个读锁。并且加入了一些使用的选项。如slave-info可以记录备份恢复后,作为slave需要的一些信息,根据这些信息,可以很方便的利用备份来重做slave。

Xtrabackup功能

  • 在线(热)备份整个库的InnoDB、 XtraDB

在xtrabackup的上一次整库备份基础上做增量备份(innodb only) 以流的形式产生备份,可以直接保存到远程机器上(本机硬盘空间不足时很有用)

  • MySQL数据库本身提供的工具并不支持真正的增量备份,二进制日志恢复是point-in-time(时间点)的恢复而不是增量备份。Xtrabackup工具支持对InnoDB存储引擎的增量备份,工作原理如下:
  1. 首先完成一个完全备份,并记录下此时检查点的LSN(Log Sequence Number)。
  2. 在进程增量备份时,比较表空间中每个页的LSN是否大于上次备份时的LSN,如果是,则备份该页,同时记录当前检查点的LSN。
  • 首先,在logfile中找到并记录最后一个checkpoint(“last checkpoint LSN”),然后开始从LSN的位置开始拷贝InnoDB的logfile到xtrabackup_logfile;接着,开始拷贝全部的数据文件.ibd;在拷贝全部数据文件结束之后,才停止拷贝logfile。
  • 因为logfile里面记录全部的数据修改情况,所以,即时在备份过程中数据文件被修改过了,恢复时仍然能够通过解析xtrabackup_logfile保持数据的一致。

Xtrabackup备份原理

  • XtraBackup基于InnoDB的crash-recovery功能。它会复制innodb的data file,由于不锁表,复制出来的数据是不一致的,在恢复的时候使用crash-recovery,使得数据恢复一致。
  • InnoDB维护了一个redo log,又称为transaction log,事务日志,它包含了innodb数据的所有改动情况。当InnoDB启动的时候,它会先去检查data file和transaction log,并且会做二步操作:
  • XtraBackup在备份的时候, 一页一页地复制innodb的数据,而且不锁定表,与此同时,XtraBackup还有另外一个线程监视着transactions log,一旦log发生变化,就把变化过的log pages复制走。为什么要急着复制走呢? 因为transactions log文件大小有限,写满之后,就会从头再开始写,所以新数据可能会覆盖到旧的数据。
  • 在prepare过程中,XtraBackup使用复制到的transactions log对备份出来的innodb data file进行crash recovery。


1.下载&安装

  yum安装

    配置源

     #vim /etc/yum.repos.d/percona.repo

[percona]
name = CentOS $releasever - Percona
baseurl=http://repo.percona.com/centos/$releasever/os/$basearch/
enabled = 1
gpgkey = file:///etc/pki/rpm-gpg/RPM-GPG-KEY-percona
gpgcheck = 1

       添加key

          #cd  /etc/pki/rpm-gpg

          #wget http://www.percona.com/downloads/RPM-GPG-KEY-percona

        yum安装xtrabackup

           [root@server ~]# yum list |grep percona

            Percona-SQL-50-debuginfo.i686              5.0.92-b23.85.rhel5         percona  

            Percona-SQL-client-50.i686                 5.0.92-b23.85.rhel5         percona  

            Percona-SQL-devel-50.i686                  5.0.92-b23.85.rhel5         percona  

            Percona-SQL-server-50.i686                 5.0.92-b23.85.rhel5         percona  

            Percona-SQL-shared-50.i686                 5.0.92-b23.85.rhel5         percona  

            Percona-SQL-shared-compat.i686             5.0.92-b23.85.rhel5         percona  

            Percona-SQL-test-50.i686                   5.0.92-b23.85.rhel5         percona  

            Percona-Server-51-debuginfo.i686           5.1.59-rel13.0.325.rhel5    percona  

            Percona-Server-51-debuginfo.i386           5.1.61-rel13.2.430.rhel5    percona  

            Percona-Server-55-debuginfo.i686           5.5.20-rel24.1.217.rhel5    percona  

            Percona-Server-client-51.i686              5.1.59-rel13.0.325.rhel5    percona  

            Percona-Server-client-51.i386              5.1.61-rel13.2.430.rhel5    percona  

            Percona-Server-client-55.i686              5.5.20-rel24.1.217.rhel5    percona  

            Percona-Server-devel-51.i686               5.1.59-rel13.0.325.rhel5    percona      

            Percona-Server-devel-51.i386               5.1.61-rel13.2.430.rhel5    percona  

            Percona-Server-devel-55.i686               5.5.20-rel24.1.217.rhel5    percona  

            Percona-Server-server-51.i686              5.1.59-rel13.0.325.rhel5    percona  

            Percona-Server-server-51.i386              5.1.61-rel13.2.430.rhel5    percona  

            Percona-Server-server-55.i686              5.5.20-rel24.1.217.rhel5    percona  

            Percona-Server-shared-51.i686              5.1.59-rel13.0.325.rhel5    percona  

            Percona-Server-shared-51.i386              5.1.61-rel13.2.430.rhel5    percona  

            Percona-Server-shared-55.i686              5.5.20-rel24.1.217.rhel5    percona  

            Percona-Server-shared-compat.i386          5.1.61-rel13.2.430.rhel5    percona  

            Percona-Server-shared-compat.i686          5.5.20-rel24.1.217.rhel5    percona  

            Percona-Server-test-51.i686                5.1.59-rel13.0.325.rhel5    percona  

            Percona-Server-test-51.i386                5.1.61-rel13.2.430.rhel5    percona  

            Percona-Server-test-55.i686                5.5.20-rel24.1.217.rhel5    percona  

            percona-toolkit.noarch                     2.0.3-1                     percona  

            xtrabackup.i386                            1.6.5-328.rhel5             percona  

            xtrabackup-debuginfo.i386                  1.6.5-328.rhel5             percona

          #yum install xtrabackup

  rpm安装

    安装依赖包

     $ yum install cmake gcc gcc-c++ libaio libaio-devel automake autoconf bzr bison libtool ncurses5-devel

       下载包&安装

           #wget http://www.percona.com/downloads/XtraBackup/XtraBackup-1.6.5/RPM/rhel6/x86_64/xtrabackup-1.6.5-328.rhel6.x86_64.rpm

           #rpm xtrabackup-1.6.5-328.rhel6.x86_64.rpm

2,使用

        Usage: [./xtrabackup [DEFAULTS OPTION] —backup | ./xtrabackup [DEFAULTS OPTION] —prepare] [OPTIONS] 

         Default options are read from the following files in this order: /etc/my.cnf, /opt/mysql-5.0.xx/etc/my.cnf, ~/.my.cnf

参数说明:

--defaults-file=   读my.cnf的位置,在DB服务器上有多实例时很有用,未指定将读/etc/my.cnf~(如要备份DB 3307的数据库,要单独指定3307的 my.cnf文件)

--datadir= 数据存放目录,和my.cnf中要相一致~ (必须,但实际上一般不用特别指定,因为会从my.cnf中去读取~)
--target-dir= 存放备份文件的目录,要使用绝对路径~ 若此目录开始不存在,则--backup选项会建立此目录~
--backup   备份InnoDB/XTraDB表空间,存放*.ibd及备份的log文件(xtrabackup_logfile)到 --target-dir目录~
--stats   统计分析innodb表存储信息,eg. xtrabackup --stats --defaults-file=/data/scrips/mysql_3306.cnf 
--prepare 返原innodb前要执行,prepare命令~ eg. xtrabackup --prepare --defaults-file=`pwd`/mysql_3306.cnf --throttle=2000 --target-dir=`pwd`/dbbak   
--print-param 主要用于innobackupex脚本copyback操作时, 打印出目标mysqld的参数~
--use-memory= 用于--prepare 或 --stats,在prepare相当于innodb_buffer_pool_size 作用~ eg.xtrabackup --use-memory=1G --stat
--export       --prepare操作时,导入其它数据库使用。在使用'ALTER TABLE … IMPORT TABLESPACE' 命令时,输出干净的.ibd files 或 .exp 文件.
--suspend-at-end 在backup操作时用于同步(synchronizing)
--log-stream --backup操作时,输出xtrabackup_logfile内容,innobackupex --stream 就使用此选项~
--incremental-lsn= 用于--backup. Copy only .ibd pages newer than specified LSN 'high:low'
--incremental-basedir= 用于增量备份backup~只拷贝比目标目录中更新的.ibd 文件~
--incremental-dir=name= 用于增量prepare,
--tables= innodb数据库使用file-per-table模式时,可用此选项备份部分表~也可用于stat操作时~
--throttle= 用于限制每秒中磁盘的读写操作~ 在线备份时非常有用~
--create-ib-logfile 用于--prepare时生成ib-logfile~ 注意:当前版本未实现,还是要re–prepare^_^
--tmpdir= 存放temporary files的路径~

 

3、innobackupex工具

(1)备份操作(下列是几个例子)

####备份employess数据库(普通备份)#### 
[root@SQL1 ~]# innobackupex-1.5.1 --defaults-file=/usr/local/mysql/etc/my.cnf --user=root --host=192.168.1.52 --password=XXXX --port=3306 --socket=/tmp/mysql.sock --slave-info --databases=employees /root/backup 1> process_log 2>&1 & 
注意:将数据库employees备份到目录/root/backup/XXXX下 
[root@SQL1 ~]# ls -l /root/backup 
total 4 
drwxr-xr-x 3 root root 4096 Apr 13 14:16 2010-04-13_14-14-43 
####备份给定的数据库列表中的数据库中(普通备份)#### 
[root@SQL1 ~]# cat backup_db_name 
school 
employees 
[root@SQL1 ~]# innobackupex-1.5.1 --defaults-file=/usr/local/mysql/etc/my.cnf --user=root --host=192.168.1.52 --password=XXXX --port=3306 --socket=/tmp/mysql.sock --slave-info --databases=/root/backup_db_name /root/backup 1> process_log 2>&1 & 
或者 
[root@SQL1 ~]# innobackupex-1.5.1 --defaults-file=/usr/local/mysql/etc/my.cnf --user=root --host=192.168.1.52 --password=XXXX --port=3306 --socket=/tmp/mysql.sock --slave-info --databases=“school employees” /root/backup 1> process_log 2>&1 & 
####备份employess数据库中的employess表(普通备份)#### 
[root@SQL1 ~]# innobackupex-1.5.1 --defaults-file=/usr/local/mysql/etc/my.cnf --user=root --host=192.168.1.52 --password=XXXX --port=3306 --socket=/tmp/mysql.sock --slave-info --databases="employees.employees" /root/backup 1> process_log 2>&1 & 
####备份所有的数据库,并打包(tar方式)##### 
[root@SQL1 ~]# innobackupex-1.5.1 --defaults-file=/usr/local/mysql/etc/my.cnf --user=root --host=192.168.1.52 --password=XXXX --port=3306 --socket=/tmp/mysql.sock --slave-info --stream=tar /root/backup 1> /root/backup/all_databases.tar 2> process_log & 
####备份所有的数据库并压缩,并打包压缩(tar+gzip方式)#### 
[root@SQL1 ~]# innobackupex-1.5.1 --defaults-file=/usr/local/mysql/etc/my.cnf --user=root --host=192.168.1.52 --password=XXXX --port=3306 --socket=/tmp/mysql.sock --slave-info --stream=tar /root/backup 2> process_log | gzip > /root/backup/all_databases.tar.gz &

注意:首先要先创建备份目录:/root/backup,--databases=[ db_name.tb_name | db_name ],如果不使用--databases参数的话,那么将备份所有的数据库

(2)恢复操作

(步骤:先apply log,再copy back,最后再chown -R mysql:mysql datadir)

####(普通备份)的还原操作###### 
[root@SQL1 ~]# ls -l /root/backup/2010-04-13_15-02-37/ 
total 223484 
-rw-r--r-- 1 root root 348 Apr 13 15:02 backup-my.cnf 
drwxr-xr-x 2 root root 4096 Apr 13 15:03 employees 
-rw-r--r-- 1 root root 228589568 Apr 13 15:03 ibdata1 
-rw-r--r-- 1 root root 0 Apr 13 15:03 mysql-stderr 
-rw-r--r-- 1 root root 379 Apr 13 15:03 mysql-stdout 
-rw-r--r-- 1 root root 1 Apr 13 15:03 xtrabackup_binlog_info 
-rw-r--r-- 1 root root 60 Apr 13 15:03 xtrabackup_checkpoints 
-rw-r--r-- 1 root root 2048 Apr 13 15:02 xtrabackup_logfile 
-rw-r--r-- 1 root root 53 Apr 13 15:03 xtrabackup_slave_info 
[root@SQL1 ~]# innobackupex-1.5.1 --defaults-file=/usr/local/mysql/etc/my.cnf --user=root --host=192.168.1.52 --password=XXXX --port=3306 --socket=/tmp/mysql.sock --apply-log /root/backup/2010-04-13_15-02-37 
[root@SQL1 ~]# innobackupex-1.5.1 --defaults-file=/usr/local/mysql/etc/my.cnf --user=root --host=192.168.1.52 --password=XXXX --port=3306 --socket=/tmp/mysql.sock --copy-back /root/backup/2010-04-13_15-02-37 
[root@SQL1 ~]# chown -R mysql:mysql /usr/local/mysql/data 
[root@SQL1 ~]# rm -rf /usr/local/mysql/data/xtrabackup* 
####(tar方式备份)的还原操作###### 
[root@SQL1 ~]# mkdir /root/backup/db 
[root@SQL1 ~]# tar -ixvf all_databases.tar -C /root/backup/db(先解压,注意必须跟-i参数) 
[root@SQL1 ~]# innobackupex-1.5.1 --defaults-file=/usr/local/mysql/etc/my.cnf --user=root --host=192.168.1.52 --password=XXXX --port=3306 --socket=/tmp/mysql.sock --apply-log /root/backup/db 
[root@SQL1 ~]# innobackupex-1.5.1 --defaults-file=/usr/local/mysql/etc/my.cnf --user=root --host=192.168.1.52 --password=XXXX --port=3306 --socket=/tmp/mysql.sock --copy-back /root/backup/db 
[root@SQL1 ~]# chown -R mysql:mysql /usr/local/mysql/data 
[root@SQL1 ~]# rm -rf /usr/local/mysql/data/xtrabackup 
[root@SQL1 ~]# rm -rf /root/backup/db 
####(tar+gzip方式备份)的还原操作###### 
[root@SQL1 ~]# mkdir /root/backup/db 
[root@SQL1 ~]# tar -izxvf all_databases.tar.gz -C /root/backup/db(先解压,注意必须跟-i参数) 
[root@SQL1 ~]# innobackupex-1.5.1 --defaults-file=/usr/local/mysql/etc/my.cnf --user=root --host=192.168.1.52 --password=XXXX --port=3306 --socket=/tmp/mysql.sock --apply-log /root/backup/db 
[root@SQL1 ~]# innobackupex-1.5.1 --defaults-file=/usr/local/mysql/etc/my.cnf --user=root --host=192.168.1.52 --password=XXXX --port=3306 --socket=/tmp/mysql.sock --copy-back /root/backup/db 
[root@SQL1 ~]# chown -R mysql:mysql /usr/local/mysql/data 
[root@SQL1 ~]# rm -rf /usr/local/mysql/data/xtrabackup 
[root@SQL1 ~]# rm -rf /root/backup/db

转载于:https://my.oschina.net/duxuefeng/blog/49148

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值