mysqldump是一种逻辑备份方式,将数据转换成sql文件,其最大的缺陷就是备份和恢复时间很长,对于一个小于10G的数据库而言,这个速度仍是能够接受的,可是若是数据库较大,那在使用mysqldump备份就很是不合适了。python
lvm是一种采用逻辑卷快照功能对数据进行备份,能够实现几乎热备,可是备份过程较为复杂(来回切换终端),很难用shell脚本直接实现,不过如今彷佛有个工具mylvmbackup能够实现自动化备份,可是没有尝试过,改天我也试试。mysql
Xtrabackup对MyISAM表只能实现温备,而且不支持增量备份,因此每次对MyISAM表备份都是全备正则表达式
XtraBackup更多高级特性一般只能在innodb存储引擎上实现,并且高级特性还都依赖于mysql数据库对innodb引擎实现了单独表空间,不然没办法实现单表或单库导出sql
mysql> show global variables like '%innodb_file_per_table%'; +-----------------------+-------+ | Variable_name | Value | +-----------------------+-------+ | innodb_file_per_table | ON | +-----------------------+-------+
那么今天就和你们聊聊第三款开源备份工具xtrabackup:shell
官方站点:http://www.percona.com数据库
官方在线文档:http://www.percona.com/doc/percona-xtrabackup/2.2/bash
最新软件包下载地址:http://www.percona.com/downloads/XtraBackup/服务器
1、简介app
Xtrabackup是由percona提供的mysql数据库开源热备工具。特色以下:ssh
(1)备份过程快速、可靠;
(2)备份过程不会打断正在执行的事务;
(3)可以基于压缩等功能节约磁盘空间和流量;
(4)自动实现备份检验;
(5)还原速度快;
2、安装
XtraBackup目前最新版为2.2.9,本篇博客采用yum安装方式
一、yum安装
# yum -y install libaio perl-Time-HiRes perl-DBD-MySQL perl-IO-Socket-SSL # rpm -ivh http://www.percona.com/downloads/XtraBackup/XtraBackup-2.2.9/binary/redhat/6/x86_64/percona-xtrabackup-2.2.9-5067.el6.x86_64.rpm
二、查看Xtrabackup安装的工具
# rpm -ql percona-xtrabackup |grep bin /usr/bin/innobackupex /usr/bin/xbcrypt /usr/bin/xbstream /usr/bin/xtrabackup
三、XtraBackup中主要包含了三个工具
xbsteam:支持流式备份
xtrbackup:用于热备innodb、xtradb表中数据的工具,不能备份其它类型的表,也不能备份数据表结构
innobackupex:是将xtrabackup进行封装的perl脚本,提供了备份MyISAM表的能力
3、innobackupex几个很是重要的参数
--apply-log
通常状况下,在备份完成后,数据尚且不能用于恢复操做,由于备份的数据中可能会包含还没有提交的事务或已经提交但还没有同步至数据文件中的事务。所以,此时数据文件仍处理不一致状态。“准备”的主要做用正是经过回滚未提交的事务及同步已经提交的事务至数据文件也使得数据文件处于一致性状态。
--redo-only
准备(prepare)增量备份与整理彻底备份有着一些不一样,尤为要注意的是:
(1)须要在每一个备份(包括彻底和各个增量备份)上,将已经提交的事务进行“重放”。“重放”以后,全部的备份数据将合并到彻底备份上。
(2)基于全部的备份将未提交的事务进行“回滚”。
--copy-back
该选项用于执行恢复(还原)操做,其经过复制全部数据相关的文件至mysql服务器DATADIR目录中来执行恢复过程。innobackupex经过backup-my.cnf来获取DATADIR目录的相关信息。
4、innobackup备份语法
彻底备份+彻底恢复
彻底备份 # innobackupex --user=DBUSER --password=DBUSERPASS /path/to/BACKUP-DIR/ 准备一个彻底备份 # innobackupex --apply-log /path/to/BACKUP-DIR 从一个彻底备份中恢复数据 # innobackupex --copy-back /path/to/BACKUP-DIR 修改datadir目录权限 # chown -R mysql:mysql /mydata/data/
彻底备份+增量备份+彻底恢复
彻底备份: # innobackupex --user=DBUSER --password=DBUSERPASS /path/to/BACKUP-DIR/ 第一次增量备份 # innobackupex --user=DBUSER --password=DBUSERPASS --incremental /backup --incremental-basedir=BASEDIR 第二次增量备份 # innobackupex --user=DBUSER --password=DBUSERPASS --incremental /backup --incremental-basedir=BASEDIR 准备: 执行彻底备份redo # innobackupex --apply-log --redo-only BASE-DIR 执行第一次增量备份redo # innobackupex --apply-log --redo-only BASE-DIR --incremental-dir=INCREMENTAL-DIR-1 执行第二次增量备份redo # innobackupex --apply-log --redo-only BASE-DIR --incremental-dir=INCREMENTAL-DIR-2 还原: # innobackupex --copy-back BASE-DIR 解释: 其中BASE-DIR指的是彻底备份所在的目录, 而INCREMENTAL-DIR-1指的是第一次增量备份的目录, INCREMENTAL-DIR-2指的是第二次增量备份的目录, 其它依次类推,即若是有屡次增量备份,每一次都要执行如上操做;
5、以上两种方式案列重放
彻底备份+彻底恢复
一、实验前的准备工做 # service mysqld stop # rm -rf /mydata/data/* # /usr/local/mysql/scripts/mysql_install_db --user=mysql --datadir=/mydata/data/ --basedir=/usr/local/mysql/ # service mysqld start # mysqladmin -uroot -p password 123456 # mysql -uroot -p123456 mysql> create database jiaowu; mysql> use jiaowu; mysql> set sql_log_bin = 0; mysql> source /root/tutor.sql; //导入tutor数据表 mysql> set sql_log_bin = 1; mysql> select * from tutor; +------+---------------+--------+------+ | TID | Tname | Gender | Age | +------+---------------+--------+------+ | 1 | ZhengYansheng | M | 25 | | 2 | LiJian | M | 26 | | 3 | OuYangyu | M | 27 | | 4 | LuoChenghui | M | 25 | | 5 | LiuYunbo | M | 25 | | 6 | FuJian | M | 24 | | 7 | LiMenglu | F | 23 | | 8 | BaoYintu | M | 28 | | 9 | WangYana | F | 25 | +------+---------------+--------+------+ 9 rows in set (0.00 sec) 二、innobackupex对DB进行彻底备份 # innobackupex --user=root --password=123456 /backup/ 若是执行正确,其最后输出的几行信息一般以下: innobackupex: Backup created in directory '/backup/2015-03-18_21-00-17' innobackupex: MySQL binlog position: filename 'mysql-bin.000003', position 332 150318 21:00:23 innobackupex: Connection to database server closed 150318 21:00:23 innobackupex: completed OK! 三、查看备份目录和文件 # ls /backup/ 2015-03-18_21-00-17 # ls /backup/2015-03-18_21-00-17/ backup-my.cnf jiaowu performance_schema xtrabackup_binlog_info xtrabackup_info ibdata1 mysql test xtrabackup_checkpoints xtrabackup_logfile 四、准备一个彻底备份 # innobackupex --user=root --password=123456 --apply-log /backup/2015-03-18_21-00-17/ #####模拟数据库故障##### 五、这里仍是采用老方法直接删除全部的数据文件 # service mysqld stop # rm -rf /mydata/data/* 六、从一个彻底备份中恢复数据库 # innobackupex --copy-back /backup/2015-03-18_21-00-17/ 七、修改数据目录权限 # chown -R mysql.mysql /mydata/data/ 八、启动mysqld服务 # service mysqld start 九、登录mysql查看是不是否一致 # mysql -e 'use jiaowu;select * from tutor;' +------+---------------+--------+------+ | TID | Tname | Gender | Age | +------+---------------+--------+------+ | 1 | ZhengYansheng | M | 25 | | 2 | LiJian | M | 26 | | 3 | OuYangyu | M | 27 | | 4 | LuoChenghui | M | 25 | | 5 | LiuYunbo | M | 25 | | 6 | FuJian | M | 24 | | 7 | LiMenglu | F | 23 | | 8 | BaoYintu | M | 28 | | 9 | WangYana | F | 25 | +------+---------------+--------+------+ #数据已经成功恢复到数据库当中
彻底备份+增量备份+彻底恢复
一、实验前的准备工做 # service mysqld stop # rm -rf /mydata/data/* //删除原来的备份文件 # rm -rf /backup/* # /usr/local/mysql/scripts/mysql_install_db --user=mysql --datadir=/mydata/data/ --basedir=/usr/local/mysql/ # service mysqld start # mysqladmin -uroot -p password 123456 # mysql -uroot -p123456 mysql> create database jiaowu; mysql> use jiaowu; mysql> set sql_log_bin = 0; mysql> source /root/tutor.sql; //导入tutor数据表 mysql> set sql_log_bin = 1; mysql> select * from tutor; +------+---------------+--------+------+ | TID | Tname | Gender | Age | +------+---------------+--------+------+ | 1 | ZhengYansheng | M | 25 | | 2 | LiJian | M | 26 | | 3 | OuYangyu | M | 27 | | 4 | LuoChenghui | M | 25 | | 5 | LiuYunbo | M | 25 | | 6 | FuJian | M | 24 | | 7 | LiMenglu | F | 23 | | 8 | BaoYintu | M | 28 | | 9 | WangYana | F | 25 | +------+---------------+--------+------+ 9 rows in set (0.00 sec) 二、innobackupex对DB进行彻底备份 # innobackupex --user=root --password=123456 /backup/ 若是执行正确,其最后输出的几行信息一般以下: innobackupex: Backup created in directory '/backup/2015-03-18_21-14-49' innobackupex: MySQL binlog position: filename 'mysql-bin.000003', position 332 150318 21:14:54 innobackupex: Connection to database server closed 150318 21:14:54 innobackupex: completed OK! 三、仅查看备份目录 # ls /backup/ 2015-03-18_21-14-49 四、操做数据库并插入数据 # mysql jiaowu; mysql> insert into tutor(TID) values(11); mysql> insert into tutor(TID) values(12); mysql> insert into tutor(TID) values(13); mysql> select * from tutor; +------+---------------+--------+------+ | TID | Tname | Gender | Age | +------+---------------+--------+------+ | 1 | ZhengYansheng | M | 25 | | 2 | LiJian | M | 26 | | 3 | OuYangyu | M | 27 | | 4 | LuoChenghui | M | 25 | | 5 | LiuYunbo | M | 25 | | 6 | FuJian | M | 24 | | 7 | LiMenglu | F | 23 | | 8 | BaoYintu | M | 28 | | 9 | WangYana | F | 25 | | 11 | NULL | NULL | NULL | | 12 | NULL | NULL | NULL | | 13 | NULL | NULL | NULL | +------+---------------+--------+------+ 12 rows in set (0.00 sec) 五、执行第一次增量备份并查看备份目录 # innobackupex --user=root --password=123456 --incremental /backup/ --incremental-basedir=/backup/2015-03-18_21-14-49/ # ls /backup/ 2015-03-18_21-14-49 2015-03-18_21-18-45 六、再次操做数据库并插入多条数据 # mysql jiaowu; mysql> insert into tutor(TID) values(21); mysql> insert into tutor(TID) values(22); mysql> insert into tutor(TID) values(23); mysql> select * from tutor; +------+---------------+--------+------+ | TID | Tname | Gender | Age | +------+---------------+--------+------+ | 1 | ZhengYansheng | M | 25 | | 2 | LiJian | M | 26 | | 3 | OuYangyu | M | 27 | | 4 | LuoChenghui | M | 25 | | 5 | LiuYunbo | M | 25 | | 6 | FuJian | M | 24 | | 7 | LiMenglu | F | 23 | | 8 | BaoYintu | M | 28 | | 9 | WangYana | F | 25 | | 11 | NULL | NULL | NULL | | 12 | NULL | NULL | NULL | | 13 | NULL | NULL | NULL | | 21 | NULL | NULL | NULL | | 22 | NULL | NULL | NULL | | 23 | NULL | NULL | NULL | +------+---------------+--------+------+ 15 rows in set (0.00 sec) 七、执行第二次增量备份并查看备份文件 # innobackupex --user=root --password=123456 --incremental /backup/ --incremental-basedir=/backup/2015-03-18_21-18-45/ # ls /backup/ 2015-03-18_21-14-49 2015-03-18_21-18-45 2015-03-18_21-22-31 解释: 2015-03-18_21-14-49:为innobackupex的彻底备份目录 2015-03-18_21-18-45:为innobackupex的第一次增量备份目录 2015-03-18_21-22-31:为innobackupex的第二次增量备份目录 八、开始准备innobackupex 首先执行彻底备份redo-only # innobackupex --user=root --password=123456 --apply-log --redo-only /backup/2015-03-18_21-14-49/ 执行第一个增量备份redo-only # innobackupex --user=root --password=123456 --apply-log --redo-only /backup/2015-03-18_21-14-49/ --incremental-dir=/backup/2015-03-18_21-18-45/ 执行第二个增量备份redo-only # innobackupex --user=root --password=123456 --apply-log --redo-only /backup/2015-03-18_21-14-49/ --incremental-dir=/backup/2015-03-18_21-22-31/ #####模拟数据库故障##### 九、这里仍是采用老方法直接删除全部的数据文件 # service mysqld stop # rm -rf /mydata/data/* 十、从彻底备份中恢复数据库 # innobackupex --user=root --password=123456 --copy-back /backup/2015-03-18_21-14-49/ 十一、修改数据目录权限 # chown -R mysql.mysql /mydata/data/ 十二、启动mysqld服务 # service mysqld start 1三、登录mysql查看是不是否一致 # mysql -e 'use jiaowu;select * from tutor;' +------+---------------+--------+------+ | TID | Tname | Gender | Age | +------+---------------+--------+------+ | 1 | ZhengYansheng | M | 25 | | 2 | LiJian | M | 26 | | 3 | OuYangyu | M | 27 | | 4 | LuoChenghui | M | 25 | | 5 | LiuYunbo | M | 25 | | 6 | FuJian | M | 24 | | 7 | LiMenglu | F | 23 | | 8 | BaoYintu | M | 28 | | 9 | WangYana | F | 25 | | 11 | NULL | NULL | NULL | | 12 | NULL | NULL | NULL | | 13 | NULL | NULL | NULL | | 21 | NULL | NULL | NULL | | 22 | NULL | NULL | NULL | | 23 | NULL | NULL | NULL | +------+---------------+--------+------+ #两次增量添加的数据也已经成功添加到数据库当中。恢复成功
6、Xtrabackup的高级功能
流式压缩功能
Xtrabackup对备份的数据文件支持“流”功能,便可以将备份的数据经过STDOUT传输给tar程序进行归档,而不是默认的直接保存至某备份目录中。要使用此功能,仅须要使用--stream选项便可。如:
# innobackupex --user=root --password=123456 --stream=tar /backup | gzip > /backup/`date +%F_%H-%M-%S`.tar.gz
甚至也可使用相似以下命令将数据备份至其它服务器:强烈推荐这种方式
# innobackupex --user=root --password=123456 --stream=tar /backup | ssh root@192.168.1.100 'cat - > /backup/`date +%F_%H-%M-%S`.tar'
在执行本地备份时,还可使用--parallel选项对多个文件进行并行复制(暂时尚未看懂此选项)
此外,在执行本地备份时,还可使用--parallel选项对多个文件进行并行复制。此选项用于指定在复制时启动的线程数目。固然,在实际进行备份时要利用此功能的便利性,也须要启用innodb_file_per_table选项或共享的表空间经过innodb_data_file_path选项存储在多个ibdata文件中。对某一数据库的多个文件的复制没法利用到此功能。其简单使用方法以下: # innobackupex --parallel /path/to/backup 同时,innobackupex备份的数据文件也能够存储至远程主机,这可使用--remote-host选项来实现: # innobackupex --remote-host=root@www.magedu.com /path/IN/REMOTE/HOST/to/backup
7、使用Xtrabackup对数据库进行部分备份
Xtrabackup也能够实现部分备份,即只备份某个或某些指定的数据库或某数据库中的某个或某些表。但要使用此功能,必须启用innodb_file_per_table选项,即每张表保存为一个独立的文件。同时,其也不支持--stream选项,即不支持将数据经过管道传输给其它程序进行处理。
此外,还原部分备份跟还原所有数据的备份也有所不一样,即你不能经过简单地将prepared的部分备份使用--copy-back选项直接复制回数据目录,而是要经过导入表的方向来实现还原。固然,有些状况下,部分备份也能够直接经过--copy-back进行还原,但这种方式还原而来的数据多数会产生数据不一致的问题,所以,不管如何不推荐使用这种方式。
(1)建立部分备份
建立部分备份的方式有三种:
正则表达式(--include)
枚举表文件(--tables-file)
列出要备份的数据库(--databases)。
(a)使用--include 使用--include时,要求为其指定要备份的表的完整名称,即形如databasename.tablename,如: # innobackupex --include='^mageedu[.]tb1' /path/to/backup (b)使用--tables-file 此选项的参数须要是一个文件名,此文件中每行包含一个要备份的表的完整名称;如: # echo -e 'mageedu.tb1\nmageedu.tb2' > /tmp/tables.txt # innobackupex --tables-file=/tmp/tables.txt /path/to/backup (c)使用--databases 此选项接受的参数为数据名,若是要指定多个数据库,彼此间须要以空格隔开;同时,在指定某数据库时,也能够只指定其中的某张表。此外,此选项也能够接受一个文件为参数,文件中每一行为一个要备份的对象。如: # innobackupex --databases="mageedu testdb" /path/to/backup
(2)整理(preparing)部分备份
prepare部分备份的过程相似于导出表的过程,要使用--export选项进行: # innobackupex --apply-log --export /pat/to/partial/backup 此命令执行过程当中,innobackupex会调用xtrabackup命令从数据字典中移除缺失的表,所以,会显示出许多关于“表不存在”类的警告信息。同时,也会显示出为备份文件中存在的表建立.exp文件的相关信息。
(3)还原部分备份
还原部分备份的过程跟导入表的过程相同。固然,也能够经过直接复制prepared状态的备份直接至数据目录中实现还原,不要此时要求数据目录处于一致状态。
案列演示:
对jiaowu数据库进行备份和还原
一、查看数据库和表 mysql> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | jiaowu | | mysql | | performance_schema | | test | +--------------------+ 5 rows in set (0.00 sec) mysql> select * from jiaowu.tutor; +------+---------------+--------+------+ | TID | Tname | Gender | Age | +------+---------------+--------+------+ | 1 | ZhengYansheng | M | 25 | | 2 | LiJian | M | 26 | | 3 | OuYangyu | M | 27 | | 4 | LuoChenghui | M | 25 | | 5 | LiuYunbo | M | 25 | | 6 | FuJian | M | 24 | | 7 | LiMenglu | F | 23 | | 8 | BaoYintu | M | 28 | | 9 | WangYana | F | 25 | | 11 | NULL | NULL | NULL | | 12 | NULL | NULL | NULL | | 13 | NULL | NULL | NULL | | 21 | NULL | NULL | NULL | | 22 | NULL | NULL | NULL | | 23 | NULL | NULL | NULL | +------+---------------+--------+------+ 二、innobackupex进行备份 # innobackupex --user=root --password=123456 --databases='jiaowu' /opt/ 三、准备并导入jiaowu表 # innobackupex --user=root --password=123456 --apply-log --export /opt/2015-03-18_22-46-47/ 四、删除jiaowu数据库 # rm -rf /mydata/data/jiaowu 五、登录数据库查看是否还存在jiaowu数据库 [root@localhost ~]# mysql -e 'show databases;' +--------------------+ | Database | +--------------------+ | information_schema | | mysql | | performance_schema | | test | +--------------------+ #jiaowu数据库不存在了 六、还原jiaowu数据库 # cp -a /opt/2015-03-18_22-46-47/jiaowu/ /mydata/data/ 七、修改jiaowu权限 # chown -R mysql.mysql /mydata/data/jiaowu 八、再次查看jiaowu数据库是否存在 [root@localhost ~]# mysql -e 'use jiaowu;show tables;' +------------------+ | Tables_in_jiaowu | +------------------+ | tutor | +------------------+ #jiaowu数据库已经被还原而且表tutor还在。成功!!!
8、导入或导出单张表
默认状况下,InnoDB表不能经过直接复制表文件的方式在mysql服务器之间进行移植,即使使用了innodb_file_per_table选项。而使用Xtrabackup工具能够实现此种功能,
不过,此时须要“导出”表的mysql服务器启用了innodb_file_per_table选项(严格来讲,是要“导出”的表在其建立以前,mysql服务器就启用了innodb_file_per_table选项),
而且“导入”表的服务器同时启用了innodb_file_per_table和innodb_expand_import选项。
(1)“导出”表
导出表是在备份的prepare阶段进行的,所以,一旦彻底备份完成,就能够在prepare过程当中经过--export选项将某表导出了: # innobackupex --apply-log --export /path/to/backup 此命令会为每一个innodb表的表空间建立一个以.exp结尾的文件,这些以.exp结尾的文件则能够用于导入至其它服务器。
(2)“导入”表
要在mysql服务器上导入来自于其它服务器的某innodb表,须要先在当前服务器上建立一个跟原表表结构一致的表,然后才能实现将表导入: mysql> CREATE TABLE mytable (...) ENGINE=InnoDB; 而后将此表的表空间删除: mysql> ALTER TABLE mydatabase.mytable DISCARD TABLESPACE; 接下来,未来自于“导出”表的服务器的mytable表的mytable.ibd和mytable.exp文件复制到当前服务器的数据目录,而后使用以下命令将其“导入”: mysql> ALTER TABLE mydatabase.mytable IMPORT TABLESPACE;
案列演示:
一、查看表 mysql> use jiaowu; Database changed mysql> show tables; +------------------+ | Tables_in_jiaowu | +------------------+ | tutor | +------------------+ 1 row in set (0.00 sec) 二、修改表的存储引擎为InnoDB mysql> alter table tutor engine=innodb; Query OK, 15 rows affected (0.05 sec) Records: 15 Duplicates: 0 Warnings: 0 三、innobackupex对其进行备份 # innobackupex --user=root --password=123456 --databases='jiaowu.tutor' /opt/ 四、准备并导出 # innobackupex --user=root --password=123456 --apply-log --export /opt/2015-03-18_23-05-44/ 五、删除此表的表空间 mysql> ALTER TABLE jiaowu.tutor DISCARD TABLESPACE; Query OK, 0 rows affected (0.01 sec) mysql> use jiaowu; Database changed mysql> select * from tutor; #数据已经不存在了 ERROR 1030 (HY000): Got error -1 from storage engine 六、接下来,未来自于“导出”表的服务器的mytable表的mytable.ibd和mytable.exp文件复制到当前服务器的数据目录,而后使用以下命令将其“导入”:并修改权限 # cp /opt/2015-03-18_23-24-23/jiaowu/{tutor.exp,tutor.ibd} /mydata/data/jiaowu/ cp:是否覆盖"/mydata/data/jiaowu/tutor.exp"? yes # chown -R mysql.mysql /mydata/data/jiaowu/* mysql> ALTER TABLE jiaowu.tutor IMPORT TABLESPACE; Query OK, 0 rows affected (0.00 sec) mysql> use jiaowu; Database changed mysql> select * from tutor; +------+---------------+--------+------+ | TID | Tname | Gender | Age | +------+---------------+--------+------+ | 1 | ZhengYansheng | M | 25 | | 2 | LiJian | M | 26 | | 3 | OuYangyu | M | 27 | | 4 | LuoChenghui | M | 25 | | 5 | LiuYunbo | M | 25 | | 6 | FuJian | M | 24 | | 7 | LiMenglu | F | 23 | | 8 | BaoYintu | M | 28 | | 9 | WangYana | F | 25 | | 11 | NULL | NULL | NULL | | 12 | NULL | NULL | NULL | | 13 | NULL | NULL | NULL | | 21 | NULL | NULL | NULL | | 22 | NULL | NULL | NULL | | 23 | NULL | NULL | NULL | +------+---------------+--------+------+ 15 rows in set (0.00 sec) #单表还原已经成功!结束。