percona-xtrabackup完全及增量备份与恢复

本文涉及的产品
云数据库 RDS MySQL Serverless,0.5-2RCU 50GB
简介:

一、简介

Xtrabackup是由percona提供的mysql数据库备份工具,据官方介绍,这也是世界上惟一一款开源的能够对innodb和xtradb数据库进行热备的工具。其主要特点是备份过程快速、可靠,不会打断正在执行的事务,能够基于压缩等功能节约磁盘空间和流量,自动实现备份检测及其还原速度快。


二、安装及备份、恢复实现            

安装:其最新版的软件可从 http://www.percona.com/software/percona-xtrabackup/ 获得。本文基于centos6.x的系统,因此,直接下载相应版本的rpm包安装即可,这里不再演示其过程。

1
yum -y  install  percona-toolkit-2.2.4-1.noarch.rpm percona-xtrabackup-2.1.8-733.rhel6.x86_64.rpm

完全备份及删除数据目录实现恢复:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
mysql> set  session_sql_log_bin=0;  #导入数据时让其不记录二进制日志
mysql> source  /root/hellodb .sql    #导入数据
mysql> set  session_sql_log_bin=1;  #开启二进制日志
[root@centos6] #innobackupex --user=root /mybackups/  #全量备份
[root@centos6] #service mysqld stop  #停止数据库,删除数据目录
[root@centos6] #rm -rf /mydata/data/*
[root@centos6] #innobackupex --apply-log /mybackups/2016-11-22_15-39-09/ #准备完全备份
[root@centos6] #innobackupex --copy-back /mybackups/2016-11-22_15-39-09/ #从完全备份中恢复数据
[root@centos6 data] # ll #数据已然恢复成功
总用量 28688
drwxr-xr-x. 2 root root     4096 11月 22 15:43 hellodb
-rw-r--r--. 1 root root 18874368 11月 22 15:43 ibdata1
-rw-r--r--. 1 root root  5242880 11月 22 15:43 ib_logfile0
-rw-r--r--. 1 root root  5242880 11月 22 15:43 ib_logfile1
drwxr-xr-x. 2 root root     4096 11月 22 15:43 mysql
drwxr-xr-x. 2 root root     4096 11月 22 15:43 performance_schema
drwxr-xr-x. 2 root root     4096 11月 22 15:43  test
[root@centos6 data] # chown -R mysql.mysql ./* #改变属组和属组
[root@centos6 data] # ll
总用量 28688
drwxr-xr-x. 2 mysql mysql
   4096 11月 22 15:43 hellodb
-rw-r--r--. 1 mysql mysql 18874368 11月 22 15:43 ibdata1
-rw-r--r--. 1 mysql mysql  5242880 11月 22 15:43 ib_logfile0
-rw-r--r--. 1 mysql mysql  5242880 11月 22 15:43 ib_logfile1
drwxr-xr-x. 2 mysql mysql     4096 11月 22 15:43 mysql
drwxr-xr-x. 2 mysql mysql     4096 11月 22 15:43 performance_schema
drwxr-xr-x. 2 mysql mysql     4096 11月 22 15:43  test
[root@centos6 data] #service mysqld start #启动数据库,在恢复数据库时数据库无需启动


从安全角度考虑,如果要使用一个最小权限的用户进行备份,可创建此用户进行完全备份

1
2
3
4
mysql>create user  'bkuser' @ 'localhost'  identified by  'passw ord'
mysql>revoke all privileges,grant option from  'bkuser'
mysql>grant reload,lock tables,replication clinet on *.* to  'bkuser' @ 'localhost' 
mysql>flush privileges;

xtrabackup备份文件说明:

使用innobakupex备份时,其会调用xtrabackup备份所有的InnoDB表,复制所有关于表结构定义的相关文件(.frm)、以及MyISAM、MERGE、CSV和ARCHIVE表的相关文件,同时还会备份触发器和数据库配置信息相关的文件。这些文件会被保存至一个以时间命令的目录中。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
[root@centos6 2016-11-22_19-06-45] # ll
总用量 18472
-rw-r--r--. 1 root root      260 11月 22 19:06 backup-my.cnf
drwx------. 2 root root     4096 11月 22 19:06 hellodb
-rw-r-----. 1 root root 18874368 11月 22 19:06 ibdata1
drwx------. 2 root root     4096 11月 22 19:06 mydb
drwxr-xr-x. 2 root root     4096 11月 22 19:06 mysql
drwxr-xr-x. 2 root root     4096 11月 22 19:06 performance_schema
drwxr-xr-x. 2 root root     4096 11月 22 19:06  test
-rw-r--r--. 1 root root       13 11月 22 19:06 xtrabackup_binary
-rw-r--r--. 1 root root       24 11月 22 19:06 xtrabackup_binlog_info
-rw-r-----. 1 root root       89 11月 22 19:06 xtrabackup_checkpoints
-rw-r-----. 1 root root     2560 11月 22 19:06 xtrabackup_logfile
[root@centos6 2016-11-22_19-06-45] # cat xtrabackup_checkpoints
backup_type = full-backuped  #备份类型,例如完全备份、增量备份等
from_lsn = 0  #日志序列号从0开始
to_lsn = 1649842  #日志序列号到哪
last_lsn = 1649842  #日志序列号到哪结束
compact = 0
[root@centos6 2016-11-22_19-06-45] # cat xtrabackup_binlog_info #当前正使用的二进制日志文件及其二进制位置
master-bin.000005   245
[root@centos6 2016-11-22_19-06-45] # cat xtrabackup_binary #备份中用到的xtrabackup的可执行文件
xtrabackup_55
[root@centos6 2016-11-22_19-06-45] # cat backup-my.cnf #备份命令中用到的配置选项信息
# This MySQL options file was generated by innobackupex.
 
# The MySQL server
[mysqld]
innodb_data_file_path=ibdata1:10M:autoextend
innodb_log_files_in_group=2
innodb_log_file_size=5242880
innodb_fast_checksum=0
innodb_page_size=16384
innodb_log_block_size=512
[root@centos6 2016-11-22_19-06-45] #


使用innobackupex进行增量备份及数据恢复:

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

要实现第一次增量备份,可以使用下面的命令进行:

# innobackupex --incremental /backup --incremental-basedir=BASEDIR


其中,BASEDIR指的是完全备份所在的目录,此命令执行结束后,innobackupex命令会在/backup目录中创建一个新的以时间命名的目录以存放所有的增量备份数据。另外,在执行过增量备份之后再一次进行增量备份时,其--incremental-basedir应该指向上一次的增量备份所在的目录。


需要注意的是,增量备份仅能应用于InnoDB或XtraDB表,对于MyISAM表而言,执行增量备份时其实进行的是完全备份。

“准备”(prepare)增量备份与整理完全备份有着一些不同,尤其要注意的是:

(1)需要在每个备份(包括完全和各个增量备份)上,将已经提交的事务进行“重放”。“重放”之后,所有的备份数据将合并到完全备份上。

(2)基于所有的备份将未提交的事务进行“回滚”。


于是,操作就变成了:

# innobackupex --apply-log --redo-only BASE-DIR

接着执行:

# innobackupex --apply-log --redo-only BASE-DIR --incremental-dir=INCREMENTAL-DIR-1

而后是第二个增量:

# innobackupex --apply-log --redo-only BASE-DIR --incremental-dir=INCREMENTAL-DIR-2

 innobackupex --copy-back  /path/to/BACKUP-DIR #最起始的数据

 

其中BASE-DIR指的是完全备份所在的目录,而INCREMENTAL-DIR-1指的是第一次增量备份的目录,INCREMENTAL-DIR-2指的是第二次增量备份的目录,其它依次类推,即如果有多次增量备份,每一次都要执行如上操作


实例说明:本次实战练习增量数据的备份和恢复,在实验过程中经历过两次增量,并对相应的数据库做出了修改,增量完成后,停止mysql数据库,删除数据目录,进行数据恢复操作。


实现代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
innobackupex --user=root  /mybackups/  #第一次完全备份
innobackupex --incremental  /mybackups/  --incremental-basedir= /mybackups/2016-11-22_19-24-37/  #第一次增量备份,向hellodb数据库中插入了表及其删除了表t1 
innobackupex --incremental  /mybackups/  --incremental-basedir= /mybackups/2016-11-22_19-27-55/  #第二次增量备份,此时修改了数据库mydbs,创建了表和插入了数据
innobackupex --apply-log --redo-only  /mybackups/2016-11-22_19-24-37/  #将已近提交的事务重放
innobackupex --apply-log --redo-only  /mybackups/2016-11-22_19-24-37/  --incremental- dir = /mybackups/2016-11-22_19-27-55/  #重放之后,所有的备份数据合并到完全备份中
innobackupex --apply-log --redo-only  /mybackups/2016-11-22_19-24-37/  --incremental- dir = /mybackups/2016-11-22_19-29-57/  #重放之后,所有的备份数据合并到完全备份中
innobackupex --copy-back  /mybackups/2016-11-22_19-24-37/  #此时数据已经和最后一次增量同步,使用此数据进行恢复
[root@centos6 data] # cd /mybackups/2016-11-22_19-24-37/
[root@centos6 2016-11-22_19-24-37] # cat xtrabackup_checkpoints
backup_type = full-prepared  #第一次完全备份,重放后将和最后一次增量备份中的序列号信息一致
from_lsn = 0
to_lsn = 1708653
last_lsn = 1708653
compact = 0
[root@centos6 2016-11-22_19-24-37] # cat ../2016-11-22_19-29-57/xtrabackup_checkpoints
backup_type = incremental
from_lsn = 1703868
to_lsn = 1708653
last_lsn = 1708653
compact = 0
[root@centos6 2016-11-22_19-24-37] # cat xtrabackup_binlog_info
master-bin.000006    8434
[root@centos6 2016-11-22_19-24-37] # cat ../2016-11-22_19-29-57/xtrabackup_binlog_info
master-bin.000006    8434
[root@centos6 2016-11-22_19-24-37] #
[root@centos6 data] # ll
总用量 18456
drwxr-xr-x. 2 root root     4096 11月 22 19:37 hellodb
-rw-r--r--. 1 root root 18874368 11月 22 19:37 ibdata1
drwxr-xr-x. 2 root root     4096 11月 22 19:37 mydb
drwxr-xr-x. 2 root root     4096 11月 22 19:37 mydbs
drwxr-xr-x. 2 root root     4096 11月 22 19:37 mysql
drwxr-xr-x. 2 root root     4096 11月 22 19:37 performance_schema
drwxr-xr-x. 2 root root     4096 11月 22 19:37  test
[root@centos6 data] # chown -R mysql.mysql ./* 
[root@centos6 data] # cd ../binlogs/
[root@centos6 binlogs] # mysqlbinlog --start-position=245 master-bin.000007
/*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=1*/;
/*!40019 SET @@session.max_insert_delayed_threads=0*/;
/*!50003 SET @OLD_COMPLETION_TYPE=@@COMPLETION_TYPE,COMPLETION_TYPE=0*/;
DELIMITER /*!*/;
# at 4
#161122 19:31:08 server id 1  end_log_pos 245 Start: binlog v 4, server v 5.5.32-MariaDB-log created 161122 19:31:08
# Warning: this binlog is either in use or was not closed properly.
BINLOG '
fCw0WA8BAAAA8QAAAPUAAAABAAQANS41LjMyLU1hcmlhREItbG9nAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAEzgNAAgAEgAEBAQEEgAA2QAEGggAAAAICAgCAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAA+1uD6g==
'/*!*/;
# at 245
#161122 19:31:49 server id 1  end_log_pos 355 Querythread_id=9exec_time=0error_code=0
use `mydbs`/*!*/;
SET TIMESTAMP=1479814309/*!*/;
SET @@session.pseudo_thread_id=9/*!*/;
SET @@session.foreign_key_checks=1, @@session.sql_auto_is_null=0, @@session.unique_checks=1, @@session.autocommit=1/*!*/;
SET @@session.sql_mode=0/*!*/;
SET @@session.auto_increment_increment=1, @@session.auto_increment_offset=1/*!*/;
/*!\C utf8 * // *!*/;
SET @@session.character_set_client=33,@@session.collation_connection=33,@@session.collation_server=8/*!*/;
SET @@session.lc_time_names=0/*!*/;
SET @@session.collation_database=DEFAULT/*!*/;
create table students( id  int,name varchar(20))
/*!*/;
# at 355
#161122 19:32:26 server id 1  end_log_pos 424 Querythread_id=9exec_time=0error_code=0
SET TIMESTAMP=1479814346/*!*/;
BEGIN
/*!*/;
# at 424
#161122 19:32:26 server id 1  end_log_pos 537 Querythread_id=9exec_time=0error_code=0
SET TIMESTAMP=1479814346/*!*/;
insert into students values (1, 'tom' ),(2, 'jerry' )
/*!*/;
# at 537
#161122 19:32:26 server id 1  end_log_pos 564 Xid = 155
COMMIT/*!*/;
DELIMITER ;
# End of log file
ROLLBACK /* added by mysqlbinlog */;
/*!50003 SET COMPLETION_TYPE=@OLD_COMPLETION_TYPE*/;
/*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=0*/;
[root@centos6 binlogs] # mysqlbinlog --start-position=245 master-bin.000007>/root/incr.sql
[root@centos6 ~] # mysql
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection  id  is 3
Server version: 5.5.32-MariaDB-log MariaDB Server
 
Copyright (c) 2000, 2013, Oracle, Monty Program Ab and others.
 
Type  'help;'  or  '\h'  for  help. Type  '\c'  to  clear  the current input statement.
 
MariaDB [(none)]> set  sql_log_bin=0; 
MariaDB [hellodb]> source  /root/incr .sql
MariaDB [hellodb]> set  sql_log_bin=1;
MariaDB [hellodb]>use mydbs;
MariaDB [mydbs]> show tables;
+-----------------+
| Tables_in_mydbs |
+-----------------+
| students        |
| t1              |
+-----------------+
2 rows  in  set  (0.00 sec)
 
MariaDB [mydbs]>  select  * from studnets;
ERROR 1146 (42S02): Table  'mydbs.studnets'  doesn't exist
MariaDB [mydbs]>  select  * from students;
+------+-------+
id    | name  |
+------+-------+
|    1 | tom   |
|    2 | jerry |
+------+-------+
2 rows  in  set  (0.00 sec)
MariaDB [mydbs]> use hellodb;
Database changed
MariaDB [hellodb]> show tables;
+-------------------+
| Tables_in_hellodb |
+-------------------+
| classes           |
| coc               |
| courses           |
| scores            |
| students          |
| tbl               |
| teachers          |
| toc               |
+-------------------+
8 rows  in  set  (0.00 sec)
 
MariaDB [hellodb]>



    经过查看数据和删除数据目录前进行对比,如数据一致则代表数据恢复成功,xtrabackup+二进制日志可实现数据的完全备份、增量备份、完全备份恢复和增量数据恢复,同时在使用此款备份工具时,不会影响客户的正常访问,达到提高用户体验。

    


本文转自chengong1013 51CTO博客,原文链接:http://blog.51cto.com/purify/1875560,如需转载请自行联系原作者

相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
3月前
|
存储 关系型数据库 MySQL
利用Xtrabackup进行mysql增量备份和全量备份
利用Xtrabackup进行mysql增量备份和全量备份
168 0
|
8天前
|
关系型数据库 MySQL 数据库
用XtraBackup 备份
用XtraBackup 备份
21 0
|
关系型数据库 MySQL 数据库
mysql 8.0 使用 XtraBackup增量备份及恢复
使用 XtraBackup 进行备份,并使用备份数据进行恢复。
633 0
|
MySQL 关系型数据库 数据库
使用XtraBackup完成对mysql全量、增量备份与恢复
使用XtraBackup完成对mysql全量、增量备份与恢复
3261 0
|
网络协议 关系型数据库 MySQL
Xtrabackup实现数据的备份与恢复
目录 Xtrabackup实现数据的备份与恢复 Xtrabackup介绍 Xtrabackup优点 Xtrabackup备份原理 Xtrabackup增量备份介绍 Xtrabackup安装 创建测试数据 ...
1213 0
|
监控 关系型数据库 MySQL
|
关系型数据库 MySQL 数据库
|
存储 关系型数据库 MySQL