CentOS下使用MySQL5.5备份工具xtrabackup
时间:2015-05-01 20:58 来源:51cto.com 作者:51cto.com
mysql> show global variables like
'%innodb_file_per_table%'
;
+-----------------------+-------+
| Variable_name | Value |
+-----------------------+-------+
| innodb_file_per_table | ON |
+-----------------------+-------+
-
(1)备份过程快速、可靠;
-
(2)备份过程不会打断正在执行的事务;
-
(3)能够基于压缩等功能节约磁盘空间和流量;
-
(4)自动实现备份检验;
-
(5)还原速度快;
# 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
# rpm -ql percona-xtrabackup |grep bin
/
usr
/
bin
/
innobackupex
/
usr
/
bin
/
xbcrypt
/
usr
/
bin
/
xbstream
/
usr
/
bin
/
xtrabackup
-
xbsteam:支持流式备份
-
xtrbackup:用于热备innodb、xtradb表中数据的工具,不能备份其它类型的表,也不能备份数据表结构
-
innobackupex:是将xtrabackup进行封装的perl脚本,提供了备份MyISAM表的能力
-
--apply-log
-
--redo-only
-
--copy-back
-
完全备份+完全恢复
完全备份
# 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指的是第二次增量备份的目录,
其它依次类推,即如果有多次增量备份,每一次都要执行如上操作;
-
完全备份+完全恢复
1、实验前的准备工作
# 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)
2、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!
3、查看备份目录和文件
# 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
4、准备一个完全备份
# innobackupex --user=root --password=123456 --apply-log /backup/2015-03-18_21-00-17/
#####模拟数据库故障#####
5、这里还是采用老方法直接删除所有的数据文件
# service mysqld stop
# rm -rf /mydata/data/*
6、从一个完全备份中恢复数据库
# innobackupex --copy-back /backup/2015-03-18_21-00-17/
7、修改数据目录权限
# chown -R mysql.mysql /mydata/data/
8、启动mysqld服务
# service mysqld start
9、登陆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 |
+------+---------------+--------+------+
#数据已经成功恢复到数据库当中
-
完全备份+增量备份+完全恢复
1、实验前的准备工作
# 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)
2、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!
3、仅查看备份目录
# ls /backup/
2015-03-18_21-14-49
4、操作数据库并插入数据
# 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)
5、执行第一次增量备份并查看备份目录
# 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
6、再次操作数据库并插入多条数据
# 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)
7、执行第二次增量备份并查看备份文件
# 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的第二次增量备份目录
8、开始准备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/
#####模拟数据库故障#####
9、这里还是采用老方法直接删除所有的数据文件
# service mysqld stop
# rm -rf /mydata/data/*
10、从完全备份中恢复数据库
# innobackupex --user=root --password=123456 --copy-back /backup/2015-03-18_21-14-49/
11、修改数据目录权限
# chown -R mysql.mysql /mydata/data/
12、启动mysqld服务
# service mysqld start
13、登陆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 |
+------+---------------+--------+------+
#两次增量添加的数据也已经成功添加到数据库当中。恢复成功
-
流式压缩功能
# 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
-
Xtrabackup也可以实现部分备份,即只备份某个或某些指定的数据库或某数据库中的某个或某些表。但要使用此功能,必须启用innodb_file_per_table选项,即每张表保存为一个独立的文件。同时,其也不支持--stream选项,即不支持将数据通过管道传输给其它程序进行处理。
-
此外,还原部分备份跟还原全部数据的备份也有所不同,即你不能通过简单地将prepared的部分备份使用--copy-back选项直接复制回数据目录,而是要通过导入表的方向来实现还原。当然,有些情况下,部分备份也可以直接通过--copy-back进行还原,但这种方式还原而来的数据多数会产生数据不一致的问题,因此,无论如何不推荐使用这种方式。
-
正则表达式(--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
prepare部分备份的过程类似于导出表的过程,要使用--
export
选项进行:
# innobackupex --apply-log --export /pat/to/partial/backup
此命令执行过程中,innobackupex会调用xtrabackup命令从数据字典中移除缺失的表,因此,会显示出许多关于“表不存在”类的警告信息。同时,也会显示出为备份文件中存在的表创建.exp文件的相关信息。
还原部分备份的过程跟导入表的过程相同。当然,也可以通过直接复制prepared状态的备份直接至数据目录中实现还原,不要此时要求数据目录处于一致状态。
1、查看数据库和表
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 |
+------+---------------+--------+------+
2、innobackupex进行备份
# innobackupex --user=root --password=123456 --databases='jiaowu' /opt/
3、准备并导入jiaowu表
# innobackupex --user=root --password=123456 --apply-log --export /opt/2015-03-18_22-46-47/
4、删除jiaowu数据库
# rm -rf /mydata/data/jiaowu
5、登陆数据库查看是否还存在jiaowu数据库
[root@localhost ~]
# mysql -e 'show databases;'
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
|
test
|
+--------------------+
#jiaowu数据库不存在了
6、还原jiaowu数据库
# cp -a /opt/2015-03-18_22-46-47/jiaowu/ /mydata/data/
7、修改jiaowu权限
# chown -R mysql.mysql /mydata/data/jiaowu
8、再次查看jiaowu数据库是否存在
[root@localhost ~]
# mysql -e 'use jiaowu;show tables;'
+------------------+
| Tables_in_jiaowu |
+------------------+
| tutor |
+------------------+
#jiaowu数据库已经被还原并且表tutor还在。成功!!!
导出表是在备份的prepare阶段进行的,因此,一旦完全备份完成,就可以在prepare过程中通过--
export
选项将某表导出了:
# innobackupex --apply-log --export /path/to/backup
此命令会为每个innodb表的表空间创建一个以.exp结尾的文件,这些以.exp结尾的文件则可以用于导入至其它服务器。
要在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;
1、查看表
mysql> use jiaowu;
Database changed
mysql> show tables;
+------------------+
| Tables_in_jiaowu |
+------------------+
| tutor |
+------------------+
1 row
in
set
(0.00 sec)
2、修改表的存储引擎为InnoDB
mysql> alter table tutor engine=innodb;
Query OK, 15 rows affected (0.05 sec)
Records: 15 Duplicates: 0 Warnings: 0
3、innobackupex对其进行备份
# innobackupex --user=root --password=123456 --databases='jiaowu.tutor' /opt/
4、准备并导出
# innobackupex --user=root --password=123456 --apply-log --export /opt/2015-03-18_23-05-44/
5、删除此表的表空间
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
6、接下来,将来自于“导出”表的服务器的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)
#单表还原已经成功!结束。
(责任编辑:IT)
|