天天看点

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

一、简介

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

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

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

1

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

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

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

<code>mysql&gt;</code><code>set</code> <code>session_sql_log_bin=0; </code><code>#导入数据时让其不记录二进制日志</code>

<code>mysql&gt;</code><code>source</code> <code>/root/hellodb</code><code>.sql   </code><code>#导入数据</code>

<code>mysql&gt;</code><code>set</code> <code>session_sql_log_bin=1; </code><code>#开启二进制日志</code>

<code>[root@centos6]</code><code>#innobackupex --user=root /mybackups/  #全量备份</code>

<code>[root@centos6]</code><code>#service mysqld stop  #停止数据库,删除数据目录</code>

<code>[root@centos6]</code><code>#rm -rf /mydata/data/*</code>

<code>[root@centos6]</code><code>#innobackupex --apply-log /mybackups/2016-11-22_15-39-09/ #准备完全备份</code>

<code>[root@centos6]</code><code>#innobackupex --copy-back /mybackups/2016-11-22_15-39-09/ #从完全备份中恢复数据</code>

<code>[root@centos6 data]</code><code># ll #数据已然恢复成功</code>

<code>总用量 28688</code>

<code>drwxr-xr-x. 2 root root     4096 11月 22 15:43 hellodb</code>

<code>-rw-r--r--. 1 root root 18874368 11月 22 15:43 ibdata1</code>

<code>-rw-r--r--. 1 root root  5242880 11月 22 15:43 ib_logfile0</code>

<code>-rw-r--r--. 1 root root  5242880 11月 22 15:43 ib_logfile1</code>

<code>drwxr-xr-x. 2 root root     4096 11月 22 15:43 mysql</code>

<code>drwxr-xr-x. 2 root root     4096 11月 22 15:43 performance_schema</code>

<code>drwxr-xr-x. 2 root root     4096 11月 22 15:43 </code><code>test</code>

<code>[root@centos6 data]</code><code># chown -R mysql.mysql ./* #改变属组和属组</code>

<code>[root@centos6 data]</code><code># ll</code>

<code>drwxr-xr-x. 2 mysql mysql</code>

<code>  </code><code>4096 11月 22 15:43 hellodb</code>

<code>-rw-r--r--. 1 mysql mysql 18874368 11月 22 15:43 ibdata1</code>

<code>-rw-r--r--. 1 mysql mysql  5242880 11月 22 15:43 ib_logfile0</code>

<code>-rw-r--r--. 1 mysql mysql  5242880 11月 22 15:43 ib_logfile1</code>

<code>drwxr-xr-x. 2 mysql mysql     4096 11月 22 15:43 mysql</code>

<code>drwxr-xr-x. 2 mysql mysql     4096 11月 22 15:43 performance_schema</code>

<code>drwxr-xr-x. 2 mysql mysql     4096 11月 22 15:43 </code><code>test</code>

<code>[root@centos6 data]</code><code>#service mysqld start #启动数据库,在恢复数据库时数据库无需启动</code>

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

<code>mysql&gt;create user </code><code>'bkuser'</code><code>@</code><code>'localhost'</code> <code>identified by </code><code>'passw ord'</code>

<code>mysql&gt;revoke all privileges,grant option from </code><code>'bkuser'</code><code>; </code>

<code>mysql&gt;grant reload,lock tables,replication clinet on *.* to </code><code>'bkuser'</code><code>@</code><code>'localhost'</code> 

<code>mysql&gt;flush privileges;</code>

xtrabackup备份文件说明:

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

30

31

32

33

34

35

<code>[root@centos6 2016-11-22_19-06-45]</code><code># ll</code>

<code>总用量 18472</code>

<code>-rw-r--r--. 1 root root      260 11月 22 19:06 backup-my.cnf</code>

<code>drwx------. 2 root root     4096 11月 22 19:06 hellodb</code>

<code>-rw-r-----. 1 root root 18874368 11月 22 19:06 ibdata1</code>

<code>drwx------. 2 root root     4096 11月 22 19:06 mydb</code>

<code>drwxr-xr-x. 2 root root     4096 11月 22 19:06 mysql</code>

<code>drwxr-xr-x. 2 root root     4096 11月 22 19:06 performance_schema</code>

<code>drwxr-xr-x. 2 root root     4096 11月 22 19:06 </code><code>test</code>

<code>-rw-r--r--. 1 root root       13 11月 22 19:06 xtrabackup_binary</code>

<code>-rw-r--r--. 1 root root       24 11月 22 19:06 xtrabackup_binlog_info</code>

<code>-rw-r-----. 1 root root       89 11月 22 19:06 xtrabackup_checkpoints</code>

<code>-rw-r-----. 1 root root     2560 11月 22 19:06 xtrabackup_logfile</code>

<code>[root@centos6 2016-11-22_19-06-45]</code><code># cat xtrabackup_checkpoints</code>

<code>backup_type = full-backuped </code><code>#备份类型,例如完全备份、增量备份等</code>

<code>from_lsn = 0 </code><code>#日志序列号从0开始</code>

<code>to_lsn = 1649842 </code><code>#日志序列号到哪</code>

<code>last_lsn = 1649842 </code><code>#日志序列号到哪结束</code>

<code>compact = 0</code>

<code>[root@centos6 2016-11-22_19-06-45]</code><code># cat xtrabackup_binlog_info #当前正使用的二进制日志文件及其二进制位置</code>

<code>master-bin.000005   245</code>

<code>[root@centos6 2016-11-22_19-06-45]</code><code># cat xtrabackup_binary #备份中用到的xtrabackup的可执行文件</code>

<code>xtrabackup_55</code>

<code>[root@centos6 2016-11-22_19-06-45]</code><code># cat backup-my.cnf #备份命令中用到的配置选项信息</code>

<code># This MySQL options file was generated by innobackupex.</code>

<code># The MySQL server</code>

<code>[mysqld]</code>

<code>innodb_data_file_path=ibdata1:10M:autoextend</code>

<code>innodb_log_files_in_group=2</code>

<code>innodb_log_file_size=5242880</code>

<code>innodb_fast_checksum=0</code>

<code>innodb_page_size=16384</code>

<code>innodb_log_block_size=512</code>

<code>[root@centos6 2016-11-22_19-06-45]</code><code>#</code>

使用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数据库,删除数据目录,进行数据恢复操作。

实现代码如下:

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

<code>innobackupex --user=root </code><code>/mybackups/</code> <code>#第一次完全备份</code>

<code>innobackupex --incremental </code><code>/mybackups/</code> <code>--incremental-basedir=</code><code>/mybackups/2016-11-22_19-24-37/</code> <code>#第一次增量备份,向hellodb数据库中插入了表及其删除了表t1 </code>

<code>innobackupex --incremental </code><code>/mybackups/</code> <code>--incremental-basedir=</code><code>/mybackups/2016-11-22_19-27-55/</code> <code>#第二次增量备份,此时修改了数据库mydbs,创建了表和插入了数据</code>

<code>innobackupex --apply-log --redo-only </code><code>/mybackups/2016-11-22_19-24-37/</code> <code>#将已近提交的事务重放</code>

<code>innobackupex --apply-log --redo-only </code><code>/mybackups/2016-11-22_19-24-37/</code> <code>--incremental-</code><code>dir</code><code>=</code><code>/mybackups/2016-11-22_19-27-55/</code> <code>#重放之后,所有的备份数据合并到完全备份中</code>

<code>innobackupex --apply-log --redo-only </code><code>/mybackups/2016-11-22_19-24-37/</code> <code>--incremental-</code><code>dir</code><code>=</code><code>/mybackups/2016-11-22_19-29-57/</code> <code>#重放之后,所有的备份数据合并到完全备份中</code>

<code>innobackupex --copy-back </code><code>/mybackups/2016-11-22_19-24-37/</code> <code>#此时数据已经和最后一次增量同步,使用此数据进行恢复</code>

<code>[root@centos6 data]</code><code># cd /mybackups/2016-11-22_19-24-37/</code>

<code>[root@centos6 2016-11-22_19-24-37]</code><code># cat xtrabackup_checkpoints</code>

<code>backup_type = full-prepared </code><code>#第一次完全备份,重放后将和最后一次增量备份中的序列号信息一致</code>

<code>from_lsn = 0</code>

<code>to_lsn = 1708653</code>

<code>last_lsn = 1708653</code>

<code>[root@centos6 2016-11-22_19-24-37]</code><code># cat ../2016-11-22_19-29-57/xtrabackup_checkpoints</code>

<code>backup_type = incremental</code>

<code>from_lsn = 1703868</code>

<code>[root@centos6 2016-11-22_19-24-37]</code><code># cat xtrabackup_binlog_info</code>

<code>master-bin.000006    8434</code>

<code>[root@centos6 2016-11-22_19-24-37]</code><code># cat ../2016-11-22_19-29-57/xtrabackup_binlog_info</code>

<code>[root@centos6 2016-11-22_19-24-37]</code><code>#</code>

<code>总用量 18456</code>

<code>drwxr-xr-x. 2 root root     4096 11月 22 19:37 hellodb</code>

<code>-rw-r--r--. 1 root root 18874368 11月 22 19:37 ibdata1</code>

<code>drwxr-xr-x. 2 root root     4096 11月 22 19:37 mydb</code>

<code>drwxr-xr-x. 2 root root     4096 11月 22 19:37 mydbs</code>

<code>drwxr-xr-x. 2 root root     4096 11月 22 19:37 mysql</code>

<code>drwxr-xr-x. 2 root root     4096 11月 22 19:37 performance_schema</code>

<code>drwxr-xr-x. 2 root root     4096 11月 22 19:37 </code><code>test</code>

<code>[root@centos6 data]</code><code># chown -R mysql.mysql ./* </code>

<code>[root@centos6 data]</code><code># cd ../binlogs/</code>

<code>[root@centos6 binlogs]</code><code># mysqlbinlog --start-position=245 master-bin.000007</code>

<code>/*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=1*/;</code>

<code>/*!40019 SET @@session.max_insert_delayed_threads=0*/;</code>

<code>/*!50003 SET @OLD_COMPLETION_TYPE=@@COMPLETION_TYPE,COMPLETION_TYPE=0*/;</code>

<code>DELIMITER /*!*/;</code>

<code># at 4</code>

<code>#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</code>

<code># Warning: this binlog is either in use or was not closed properly.</code>

<code>BINLOG '</code>

<code>fCw0WA8BAAAA8QAAAPUAAAABAAQANS41LjMyLU1hcmlhREItbG9nAAAAAAAAAAAAAAAAAAAAAAAA</code>

<code>AAAAAAAAAAAAAAAAAAAAAAAAEzgNAAgAEgAEBAQEEgAA2QAEGggAAAAICAgCAAAAAAAAAAAAAAAA</code>

<code>AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA</code>

<code>AAAAAAAAAAAA+1uD6g==</code>

<code>'/*!*/;</code>

<code># at 245</code>

<code>#161122 19:31:49 server id 1  end_log_pos 355 Querythread_id=9exec_time=0error_code=0</code>

<code>use `mydbs`/*!*/;</code>

<code>SET TIMESTAMP=1479814309/*!*/;</code>

<code>SET @@session.pseudo_thread_id=9/*!*/;</code>

<code>SET @@session.foreign_key_checks=1, @@session.sql_auto_is_null=0, @@session.unique_checks=1, @@session.autocommit=1/*!*/;</code>

<code>SET @@session.sql_mode=0/*!*/;</code>

<code>SET @@session.auto_increment_increment=1, @@session.auto_increment_offset=1/*!*/;</code>

<code>/*!\C utf8 *</code><code>//</code><code>*!*/;</code>

<code>SET @@session.character_set_client=33,@@session.collation_connection=33,@@session.collation_server=8/*!*/;</code>

<code>SET @@session.lc_time_names=0/*!*/;</code>

<code>SET @@session.collation_database=DEFAULT/*!*/;</code>

<code>create table students(</code><code>id</code> <code>int,name varchar(20))</code>

<code>/*!*/;</code>

<code># at 355</code>

<code>#161122 19:32:26 server id 1  end_log_pos 424 Querythread_id=9exec_time=0error_code=0</code>

<code>SET TIMESTAMP=1479814346/*!*/;</code>

<code>BEGIN</code>

<code># at 424</code>

<code>#161122 19:32:26 server id 1  end_log_pos 537 Querythread_id=9exec_time=0error_code=0</code>

<code>insert into students values (1,</code><code>'tom'</code><code>),(2,</code><code>'jerry'</code><code>)</code>

<code># at 537</code>

<code>#161122 19:32:26 server id 1  end_log_pos 564 Xid = 155</code>

<code>COMMIT/*!*/;</code>

<code>DELIMITER ;</code>

<code># End of log file</code>

<code>ROLLBACK /* added by mysqlbinlog */;</code>

<code>/*!50003 SET COMPLETION_TYPE=@OLD_COMPLETION_TYPE*/;</code>

<code>/*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=0*/;</code>

<code>[root@centos6 binlogs]</code><code># mysqlbinlog --start-position=245 master-bin.000007&gt;/root/incr.sql</code>

<code>[root@centos6 ~]</code><code># mysql</code>

<code>Welcome to the MariaDB monitor.  Commands end with ; or \g.</code>

<code>Your MariaDB connection </code><code>id</code> <code>is 3</code>

<code>Server version: 5.5.32-MariaDB-log MariaDB Server</code>

<code>Copyright (c) 2000, 2013, Oracle, Monty Program Ab and others.</code>

<code>Type </code><code>'help;'</code> <code>or </code><code>'\h'</code> <code>for</code> <code>help. Type </code><code>'\c'</code> <code>to </code><code>clear</code> <code>the current input statement.</code>

<code>MariaDB [(none)]&gt;</code><code>set</code> <code>sql_log_bin=0; </code>

<code>MariaDB [hellodb]&gt;</code><code>source</code> <code>/root/incr</code><code>.sql</code>

<code>MariaDB [hellodb]&gt;</code><code>set</code> <code>sql_log_bin=1;</code>

<code>MariaDB [hellodb]&gt;use mydbs;</code>

<code>MariaDB [mydbs]&gt; show tables;</code>

<code>+-----------------+</code>

<code>| Tables_in_mydbs |</code>

<code>| students        |</code>

<code>| t1              |</code>

<code>2 rows </code><code>in</code> <code>set</code> <code>(0.00 sec)</code>

<code>MariaDB [mydbs]&gt; </code><code>select</code> <code>* from studnets;</code>

<code>ERROR 1146 (42S02): Table </code><code>'mydbs.studnets'</code> <code>doesn't exist</code>

<code>MariaDB [mydbs]&gt; </code><code>select</code> <code>* from students;</code>

<code>+------+-------+</code>

<code>| </code><code>id</code>   <code>| name  |</code>

<code>|    1 | tom   |</code>

<code>|    2 | jerry |</code>

<code>MariaDB [mydbs]&gt; use hellodb;</code>

<code>Database changed</code>

<code>MariaDB [hellodb]&gt; show tables;</code>

<code>+-------------------+</code>

<code>| Tables_in_hellodb |</code>

<code>| classes           |</code>

<code>| coc               |</code>

<code>| courses           |</code>

<code>| scores            |</code>

<code>| students          |</code>

<code>| tbl               |</code>

<code>| teachers          |</code>

<code>| toc               |</code>

<code>8 rows </code><code>in</code> <code>set</code> <code>(0.00 sec)</code>

<code>MariaDB [hellodb]&gt;</code>

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

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