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存储引擎的增量备份,工作原理如下:
- 首先完成一个完全备份,并记录下此时检查点的LSN(Log Sequence Number)。
- 在进程增量备份时,比较表空间中每个页的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 |
来源:oschina
链接:https://my.oschina.net/u/78338/blog/49148