设为首页 收藏本站
查看: 611|回复: 0

[经验分享] percona-xtrabackup完全及增量备份与恢复

[复制链接]
累计签到:1 天
连续签到:1 天
发表于 2016-11-23 08:53:59 | 显示全部楼层 |阅读模式
一、简介

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; #开启二进制日志
[iyunv@centos6]#innobackupex --user=root /mybackups/  #全量备份
[iyunv@centos6]#service mysqld stop  #停止数据库,删除数据目录
[iyunv@centos6]#rm -rf /mydata/data/*
[iyunv@centos6]#innobackupex --apply-log /mybackups/2016-11-22_15-39-09/ #准备完全备份
[iyunv@centos6]#innobackupex --copy-back /mybackups/2016-11-22_15-39-09/ #从完全备份中恢复数据
[iyunv@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
[iyunv@centos6 data]# chown -R mysql.mysql ./* #改变属组和属组
[iyunv@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
[iyunv@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
[iyunv@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
[iyunv@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
[iyunv@centos6 2016-11-22_19-06-45]# cat xtrabackup_binlog_info #当前正使用的二进制日志文件及其二进制位置
master-bin.000005   245
[iyunv@centos6 2016-11-22_19-06-45]# cat xtrabackup_binary #备份中用到的xtrabackup的可执行文件
xtrabackup_55
[iyunv@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
[iyunv@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/ #此时数据已经和最后一次增量同步,使用此数据进行恢复
[iyunv@centos6 data]# cd /mybackups/2016-11-22_19-24-37/
[iyunv@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
[iyunv@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
[iyunv@centos6 2016-11-22_19-24-37]# cat xtrabackup_binlog_info
master-bin.000006    8434
[iyunv@centos6 2016-11-22_19-24-37]# cat ../2016-11-22_19-29-57/xtrabackup_binlog_info
master-bin.000006    8434
[iyunv@centos6 2016-11-22_19-24-37]#
[iyunv@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
[iyunv@centos6 data]# chown -R mysql.mysql ./*
[iyunv@centos6 data]# cd ../binlogs/
[iyunv@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*/;
[iyunv@centos6 binlogs]# mysqlbinlog --start-position=245 master-bin.000007>/root/incr.sql
[iyunv@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+二进制日志可实现数据的完全备份、增量备份、完全备份恢复和增量数据恢复,同时在使用此款备份工具时,不会影响客户的正常访问,达到提高用户体验。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-304242-1-1.html 上篇帖子: 创建MySQL用户及赋予用户权限 下篇帖子: 使用xtrabackup进行数据库备份周日全量+日增量备份脚本
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表