Chinaunix首页 | 论坛 | 博客
  • 博客访问: 631781
  • 博文数量: 244
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 130
  • 用 户 组: 普通用户
  • 注册时间: 2016-06-27 09:53
个人简介

记录学习,记录成长

文章分类

全部博文(244)

我的朋友

分类: LINUX

2015-10-11 07:08:47

使用xtrabackup进行数据库备份

一.安装xtrabackup
Xtrabackup介绍:
Xtrabackup是一个对INnoDB做数据备份的工具,支持在线热备份(备份时不影响数据读写),是商业备份工具InnoDB Hotbackup的一个很好的替代品。
Xtrabackup有两个主要的工具:xtrabackup、innobackupex
1、xtrabackup只能备份InnoDB和XtraDB两种数据表,而不能备份MyISAM数据表
2、innobackupex是参考了InnoDB Hotbackup的innoback脚本修改而来的.innobackupex是一个perl脚本封装,封装了xtrabackup。主要是为了方便的 同时备份InnoDB和MyISAM引擎的表,但在处理myisam时需要加一个读锁。
其特点:
(1)备份过程快速、可靠;
(2)备份过程不会打断正在执行的事务;
(3)能够实现压缩等功能节约磁盘空间和流量;
(4)自动实现备份检验;
(5)还原速度快;
xtrabackup下载地址: />
安装xtrabackup:
[root@www ~]# rpm -ivh percona-xtrabackup-2.2.12-1.el6.i686.rpm
warning: percona-xtrabackup-2.2.12-1.el6.i686.rpm: Header V4 DSA/SHA1 Signature, key ID cd2efd2a: NOKEY
error: Failed dependencies:
        perl(Time::HiRes) is needed by percona-xtrabackup-2.2.12-1.el6.i686
解决:(要装上perl-DBI  perl-DBD-MySQL  perl-Time-HiRes  perl-IO-Socket-SSL  perl-TermReadKey几个包,不过我只缺少perl-Time-HiRes包)
[root@www ~]# yum install perl-Time-HiRes.i686 -y
[root@www ~]# rpm -ivh percona-xtrabackup-2.2.12-1.el6.i686.rpm
warning: percona-xtrabackup-2.2.12-1.el6.i686.rpm: Header V4 DSA/SHA1 Signature, key ID cd2efd2a: NOKEY
Preparing...                ########################################### [100%]
   1:percona-xtrabackup     ########################################### [100%]

二.使用xtrabackup进行备份(1)
此次备份策略为xtrabackup(完全备份)+二进制日志(增量备份)
1.完全备份
[root@www ~]# innobackupex --user=root --password=redhat --socket=/tmp/mysql.sock /backup/all_backup/
使用innobakupex备份时,其会调用xtrabackup备份所有的InnoDB表,复制所有关于表结构定义的相关文件(.frm)、以及MyISAM、MERGE、CSV和ARCHIVE表的相关文件,同时还会备份触发器和数据库配置信息相关的文件,备份完成后会在指定目录下创建一个以备份时间为名的目录,里面就是此次备份的内容:
[root@www all_backup]# cd /backup/all_backup/2015-10-10_20-45-06/
[root@www 2015-10-10_20-45-06]# ls
backup-my.cnf  mysql                   xtrabackup_checkpoints
ibdata1        performance_schema      xtrabackup_info
mydb           xtrabackup_binlog_info  xtrabackup_logfile
其中:
mydb,mysql和performance_schema:备份的数据库;

ibdata1:表空间文件;

backup-my.cnf:备份的配置文件即用到的配置选项信息;

xtrabackup_binlog_info:备份时的二进制日志文件和记录位置;
[root@www 2015-10-10_20-45-06]# cat xtrabackup_binlog_info
www-bin.000001  120

xtrabackup_checkpoints:备份类型,备份状态和LSN(日志序列号)范围信息等;
[root@www 2015-10-10_20-45-06]# cat xtrabackup_checkpoints 
backup_type = full-backuped
from_lsn = 0
to_lsn = 1750815
last_lsn = 1750815
compact = 0

xtrabackup_info:备份信息;

xtrabackup_logfile:备份的数据;

补充:此次是用root用户来备份的,如果为了安全,也可以创建一个最小权限的用户来完成备份:
mysql> CREATE USER ’backupuser’@’localhost’ IDENTIFIED BY ’secret’;
mysql> REVOKE ALL PRIVILEGES, GRANT OPTION FROM ’backupuser’;
mysql> GRANT RELOAD, LOCK TABLES, REPLICATION CLIENT ON *.* TO ’backupuser’@’localhost’;
mysql> FLUSH PRIVILEGES;

2.一般情况下,在备份完成后,数据还不能用于恢复操作,因为备份的数据中可能会包含尚未提交的事务或已经提交但尚未同步至数据文件中的事务。因此,此时得数据文件处于不一致状态。这一步的主要作用是将尚未提交的事务做日志滚动及将已经提交的事务从二进制日志文件同步到数据文件,使得数据文件处于一致性状态。

innobackupex的--apply-log参数使INnoDB配置读取配置文件backup-my.cnf将以上所说的事务应用到备份目录下的xtrabackup_logfile中(或者应用到一个新建的事务日志文件中),完成这些后就是一个数据一致的可以直接使用的备份了;

如,对上述完全备份后的数据做数据同步:
[root@www ~]# innobackupex --apply-log /backup/all_backup/2015-10-10_20-45-06/

3.上述操作只是对备份时进行的事务有效,但是假如上述操作完成后正好有对数据库的操作写入,那么只能再通过二进制日志文件来恢复刚写入的数据:
mysql> select * from course;
+-----+-------+
| cno | cname |
+-----+-------+
|   1 | Linux |
|   2 | C++   |
|   3 | C     |
|   4 | sql   |
|   5 | A     |
|   6 | HTML  |
|   7 | ARM   |
+-----+-------+
mysql> insert into course values(8,'Java');

 先对二进制日志文件做一次备份(模拟数据库损坏前必须要做,否则备份后的数据时无法还原的);
mysql> flush logs;
[root@www data]# ls /mysqldata/data/www-bin*
/mysqldata/data/www-bin.000001     /mysqldata/data/www-bin.000002
[root@www data]# mysqlbinlog -uroot -p www-bin.000001 > /tmp/binlog.sql
Enter password: 
 
4.模拟数据库损坏并还原数据
4.1模拟数据库损坏:
[root@www data]# service mysqld stop
Shutting down MySQL.. SUCCESS! 
[root@www data]# pwd
/mysqldata/data
[root@www data]# rm -rf ./*

4.2还原数据
innobackupex的--copy-back参数能将备份目录中的所有文件还原到原位置;
[root@www ~]# innobackupex --copy-back /backup/all_backup/2015-10-10_20-45-06/
.........
151011 01:14:45  innobackupex: completed OK!

4.3更改还原文件的属主属组
[root@www ~]# cd /mysqldata/data/
[root@www data]# ll
-rw-r--r-- 1 root root 12582912 Oct 11 01:14 ibdata1
-rw-r--r-- 1 root root 50331648 Oct 11 01:14 ib_logfile0
-rw-r--r-- 1 root root 50331648 Oct 11 01:14 ib_logfile1
drwxr-xr-x 2 root root     4096 Oct 11 01:14 mydb
drwxr-xr-x 2 root root     4096 Oct 11 01:14 mysql
drwxr-xr-x 2 root root     4096 Oct 11 01:14 performance_schema
-rw-r--r-- 1 root root       19 Oct 11 01:14 xtrabackup_binlog_pos_innodb
-rw-r--r-- 1 root root      591 Oct 11 01:14 xtrabackup_info
[root@www data]# chown -R mysql.mysql ./*

4.4启动MYSQL服务
[root@www data]# service mysqld start
Starting MySQL... SUCCESS! 

4.5还原二进制日志
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mydb               |
| mysql              |
| performance_schema |
+--------------------+
mysql> use mydb;
mysql> select * from course;
+-----+-------+
| cno | cname |
+-----+-------+
|   1 | Linux |
|   2 | C++   |
|   3 | C     |
|   4 | sql   |
|   5 | A     |
|   6 | HTML  |
|   7 | ARM   |
+-----+-------+
开始还原:
mysql> set sql_log_bin=0;

mysql> source /tmp/binlog.sql;

mysql> set sql_log_bin=1;

mysql> select * from course;
+-----+-------+
| cno | cname |
+-----+-------+
|   1 | Linux |
|   2 | C++   |
|   3 | C     |
|   4 | sql   |
|   5 | A     |
|   6 | HTML  |
|   7 | ARM   |
|   8 | Java  |
+-----+-------+

三.使用xtrabackup进行备份(2):
此次备份策略为xtrabackup(完全备份)+xtrabackup(增量备份)

1.对数据库进行操作(纯粹是为了看起来直观点,也可以省略次步直接备份)
mysql> delete from course where cno>=4;
mysql> select * from course;
+-----+-------+
| cno | cname |
+-----+-------+
|   1 | Linux |
|   2 | C++   |
|   3 | C     |
+-----+-------+

2.完全备份
[root@www ~]# innobackupex --user=root --password=redhat --socket=/tmp/mysql.sock /backup/all_backup/
xtrabackup: Transaction log of lsn (1758888) to (1758888) was copied.
3.备份后再次插入新数据作为增量备份内容
mysql> insert into course values(4,'Python'),(5,'Cisco');
mysql> select * from course;
+-----+--------+
| cno | cname  |
+-----+--------+
|   1 | Linux  |
|   2 | C++    |
|   3 | C      |
|   4 | Python |
|   5 | Cisco  |
+-----+--------+

4.增量备份
xtrabackup对InnoDB或xtraDB表可以做完全备份或者增量备份,对于MYISAM表做的备份是完全备份;
每个INnoDB的页面都会包含一个LSN信息,每当相关的数据发生改变,相关的页面的LSN就会自动增长,这正是INnoDB表可以进行增量备份的基础,即innobackupex通过备份上次完全备份之后发生改变的页面来实现增量备份;

innobackupex的--incremental参数会通知xtrabackup做一次增量备份而不是完全备份,该参数被使用时,--incremental-lsn或
--incremental-basedir选项也可以被使用,当二者都未给出时,--incremental-basedir默认会传递给xtrabackup,在备份目录中设定第一次增量备份文件的时间标记(就是第一次创建增量备份文件名的时间是多少);

第一次增量备份:
[root@www ~]# innobackupex --user=root --password=redhat --socket=/tmp/mysql.sock --incremental /backup/all_backup/ --incremental-basedir=/backup/all_backup/2015-10-11_01-37-19/
.........
xtrabackup: Transaction log of lsn (1762740) to (1762740) was copied.
innobackupex: Backup created in directory '/backup/all_backup/2015-10-11_02-06-02'
innobackupex: MySQL binlog position: filename 'www-bin.000001', position 568
151011 02:06:13  innobackupex: Connection to database server closed
151011 02:06:13  innobackupex: completed OK!

其中,/backup/all_backup/是完全备份所在的目录,此命令执行结束后,innobackupex命令会在/backup/all_backup/目录中创建一个新的以时间命名的目录以存放所有的增量备份数据。另外,在执行过增量备份之后再一次进行增量备份时,其--incremental-basedir应该指向上一次的增量备份所在的目录。
[root@www all_backup]# ll
drwxr-xr-x 5 root root 4096 Oct 11 00:35 2015-10-10_20-45-06 #第二步创建的完全备份目录
drwxr-xr-x 5 root root 4096 Oct 11 01:37 2015-10-11_01-37-19 #第三步创建的完全备份目录
drwxr-xr-x 5 root root 4096 Oct 11 02:06 2015-10-11_02-06-02 #上次完全备份以后的增量备份目录

第二次增量备份:
mysql> insert into course values(6,'CAD');

mysql> select * from course;
+-----+--------+
| cno | cname  |
+-----+--------+
|   1 | Linux  |
|   2 | C++    |
|   3 | C      |
|   4 | Python |
|   5 | Cisco  |
|   6 | CAD    |
+-----+--------+

[root@www ~]# innobackupex --user=root --password=redhat --socket=/tmp/mysql.sock --incremental /backup/all_backup/ --incremental-basedir=/backup/all_backup/2015-10-11_02-06-02/
xtrabackup: Transaction log of lsn (1763032) to (1763032) was copied.
innobackupex: Backup created in directory '/backup/all_backup/2015-10-11_02-31-54'
innobackupex: MySQL binlog position: filename 'www-bin.000001', position 786
151011 02:32:03  innobackupex: Connection to database server closed
151011 02:32:03  innobackupex: completed OK!

因此这三次备份的LSN是连续的:
完全备份:
[root@www all_backup]# cat 2015-10-11_01-37-19/xtrabackup_checkpoints
backup_type = full-backuped
from_lsn = 0
to_lsn = 1758888
last_lsn = 1758888
compact = 0
第一次增量备份:
[root@www all_backup]# cat 2015-10-11_02-06-02/xtrabackup_checkpoints
backup_type = incremental
from_lsn = 1758888
to_lsn = 1762740
last_lsn = 1762740
compact = 0
第二次增量备份:
[root@www all_backup]# cat 2015-10-11_02-31-54/xtrabackup_checkpoints
backup_type = incremental
from_lsn = 1762740
to_lsn = 1763032
last_lsn = 1763032
compact = 0

5.如果再做备份时有正在执行尚未提交的事务或已经提交但尚未同步至数据文件中的事务,还需要同步一下,但是却只将redo-log中的事务同步而不是undo-log中的事务同步;如果没有事务进行,在上述做好增量备份后也要进行这一步;

对于完全备份:
[root@www all_backup]# innobackupex --apply-log --redo-only /backup/all_backup/2015-10-11_01-37-19/
对于第一次增量备份:
[root@www all_backup]# innobackupex --apply-log --redo-only /backup/all_backup/2015-10-11_01-37-19/ --incremental-dir=/backup/all_backup/2015-10-11_02-06-02/ 
第二次增量备份:
[root@www all_backup]# innobackupex --apply-log --redo-only /backup/all_backup/2015-10-11_01-37-19/ --incremental-dir=/backup/all_backup/2015-10-11_02-31-54/
此时所有的redo操作和增量备份都被还原到完全备份上去了,所以还原的时候可以直接还原完全备份;
注意:这里用到的参数是--incremental-dir不是--incremental-basedir,否则备份会无法还原;

5.模拟数据库损坏
如果此前没有数据写入,那么还原方式就是完全备份+增量备份,如果此刚好有数据写入,那么损坏后的还原方式就是完全备份+增量备份+二进制日志
[root@www ~]# service mysqld stop
Shutting down MySQL.. SUCCESS! 
[root@www ~]# cd /mysqldata/data/
[root@www data]# rm -rf ./* (如果此前有数据写入,那么二进制日志文件也要备份,此例不备份)

6.还原数据(还原完全备份)
[root@www data]# innobackupex --copy-back /backup/all_backup/2015-10-11_01-37-19/

7.更改还原数据的属组属主
[root@www data]# chown -R mysql.mysql ./*

8.测试
[root@www ~]# service mysqld start
Starting MySQL.... SUCCESS! 

mysql> select * from course;
+-----+--------+
| cno | cname  |
+-----+--------+
|   1 | Linux  |
|   2 | C++    |
|   3 | C      |
|   4 | Python |
|   5 | Cisco  |
|   6 | CAD    |
+-----+--------+

关于xtrabackup的使用说明很不错:
http://www.cnblogs.com/Amaranthus/archive/2014/08/19/3922570.html#_Toc396231228
阅读(369) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~