Mysql之二:利用Xtrabackup完成数据的备份和还原

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,高可用系列 2核4GB
简介:

#####################################

安装和简介

备份和还原的实现

完全+增量+二进制日志的备份和还原

#####################################

一、安装和简介

1、简介

Xtrabackup是由percona提供的mysql数据库备份工具,据官方介绍,这也是世界上惟一一款开源的能够对innodb和xtradb数据库进行热备的工具。特点:

(1)备份过程快速、可靠;

(2)备份过程不会打断正在执行的事务;

(3)能够基于压缩等功能节约磁盘空间和流量;

(4)自动实现备份检验;

(5)还原速度快;

2、安装

其最新版的软件可从 http://www.percona.com/software/percona-xtrabackup/ 获得。本文基于RHEL5.8的系统,因此,直接下载相应版本的rpm包安装即可:

1
rpm -ivh percona-xtrabackup-2.0.0-417.rhel5.i386.rpm


二、备份和还原的实现

1、完全备份

1
2
3
4
#####本文中直接使用root
innobackupex --user=root  /backup/
#####语法
innobackupex --user=DBUSER --password=DBUSERPASS   /path/to/BACKUP-DIR/

如果要使用一个最小权限的用户进行备份,则可基于如下命令创建此类用户:

1
2
3
4
mysql> CREATE USER ’bkpuser’@’localhost’ IDENTIFIED BY ’s3cret’;
mysql> REVOKE ALL PRIVILEGES, GRANT OPTION FROM ’bkpuser’;
mysql> GRANT RELOAD, LOCK TABLES, REPLICATION CLIENT ON *.* TO ’bkpuser’@’localhost’;
mysql> FLUSH PRIVILEGES;

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

在备份的同时,innobackupex还会在备份目录中创建如下文件:

(1)xtrabackup_checkpoints —— 备份类型(如完全或增量)、备份状态(如是否已经为prepared状态)和LSN(日志序列号)范围信息;每个InnoDB页(通常为16k大小)都会包含一个日志序列号,即LSN。LSN是整个数据库系统的系统版本号,每个页面相关的LSN能够表明此页面最近是如何发生改变的。

(2)xtrabackup_binlog_info —— mysql服务器当前正在使用的二进制日志文件及至备份这一刻为止二进制日志事件的位置。

(3)xtrabackup_binlog_pos_innodb —— 二进制日志文件及用于InnoDB或XtraDB表的二进制日志文件的当前position。

(4)xtrabackup_binary —— 备份中用到的xtrabackup的可执行文件;

(5)backup-my.cnf —— 备份命令用到的配置选项信息;


2、准备(prepare)一个完全备份

一般情况下,在备份完成后,数据尚且不能用于恢复操作,因为备份的数据中可能会包含尚未提交的事务或已经提交但尚未同步至数据文件中的事务。因此,此时数据文件仍处理不一致状态。“准备”的主要作用正是通过回滚未提交的事务及同步已经提交的事务至数据文件也使得数据文件处于一致性状态。

innobakupex命令的--apply-log选项可用于实现上述功能。如下面的命令:

1
# innobackupex --apply-log  /path/to/BACKUP-DIR

在实现“准备”的过程中,innobackupex通常还可以使用--use-memory选项来指定其可以使用的内存的大小,默认通常为100M。如果有足够的内存可用,可以多划分一些内存给prepare的过程,以提高其完成速度。



3、从一个完全备份中恢复数据

innobackupex命令的--copy-back选项用于执行恢复操作,其通过复制所有数据相关的文件至mysql服务器DATADIR目录中来执行恢复过程。innobackupex通过backup-my.cnf来获取DATADIR目录的相关信息。

1
# innobackupex --copy-back  /path/to/BACKUP-DIR

当数据恢复至DATADIR目录以后,还需要确保所有数据文件的属主和属组均为正确的用户,如mysql,否则,在启动mysqld之前还需要事先修改数据文件的属主和属组。如:

1
# chown -R  mysql:mysql  /mydata/data/


4、使用innobackupex进行增量备份

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

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

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

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

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

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

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

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

于是,操作就变成了:

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

接着执行:

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

而后是第二个增量:

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

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



三、完全+增量+二进制日志的备份和还原

完全备份

1
2
3
4
5
6
7
8
9
10
11
#####备份前表中数据如下
mysql>  select  * from tb1;
+----+------+
id  | name |
+----+------+
|  1 | kobe |
|  2 | wade |
|  3 | nash |
+----+------+
#####使用Xtrabackup对所有库做完全备份
innobackupex --user=root  /backup

第一次增量备份

1
2
3
4
5
6
7
8
9
10
11
12
13
第一次增量备份
mysql> insert into tb1 (name) values ( 'firstday' );
mysql>  select  * from tb1;
+----+----------+
id  | name     |
+----+----------+
|  1 | kobe     |
|  2 | wade     |
|  3 | nash     |
|  9 | firstday |
+----+----------+
#####basedir指向完全备份目录
innobackupex --incremental  /backup  --incremental-basedir= /backup/2013-09-19_15-45-49/

第二次增量备份

1
2
3
4
5
6
7
8
9
10
11
12
13
mysql> insert into tb1 (name) values ( 'secondday' );
mysql>  select  * from tb1;
+----+-----------+
id  | name      |
+----+-----------+
|  1 | kobe      |
|  2 | wade      |
|  3 | nash      |
|  9 | firstday  |
| 10 | secondday |
+----+-----------+
#####basedir指向第一次增量备份目录
innobackupex --incremental  /backup  --incremental-basedir= /backup/2013-09-19_15-47-49/

第一次滚动日志插入新数据

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
mysql> flush logs;
#####查看当前使用二进制日志文件
mysql> show master status;
+------------------+----------+--------------+------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000002 |      107 |              |                  |
+------------------+----------+--------------+------------------+
#####删除制定二进制日志文件之前的所有文件(不包含制定文件)
mysql> PURGE BINARY LOGS TO  'mysql-bin.000002' ;
mysql> insert into tb1 (name) values ( 'thirdday' );
mysql>  select  * from tb1;
+----+-----------+
id  | name      |
+----+-----------+
|  1 | kobe      |
|  2 | wade      |
|  3 | nash      |
|  9 | firstday  |
| 10 | secondday |
| 11 | thirdday  |
+----+-----------+

第二次滚动日志插入数据

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
mysql> flush logs;
mysql> show master status;
+------------------+----------+--------------+------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000003 |      341 |              |                  |
+------------------+----------+--------------+------------------+
mysql> insert into tb1 (name) values ( 'forthday' );
#####最后数据为
mysql>  select  * from tb1;
+----+-----------+
id  | name      |
+----+-----------+
|  1 | kobe      |
|  2 | wade      |
|  3 | nash      |
|  9 | firstday  |
| 10 | secondday |
| 13 | thirdday  |
| 14 | forthday  |
+----+-----------+

基于多个二进制日志生成单个SQL格式文件

1
2
3
4
5
6
7
8
9
#####查看快照时刻所处位置的时间点
[root@localhost ~] # mysqlbinlog --start-position=107 /mydata/data/mysql-bin.000002
/*!40019 SET @@session.max_insert_delayed_threads=0*/;
/*!50003 SET @OLD_COMPLETION_TYPE=@@COMPLETION_TYPE,COMPLETION_TYPE=0*/;
DELIMITER /*!*/;
# at 4
#130919 15:59:00 server id 1  end_log_pos 107   Start: binlog v 4, server v 5.5.28-log created 130919 15:59:00   #时间
#####基于时间做限定来合并多个日志文件为一个SQL格式的文件(很明显是从2的开始到3的结束)
mysqlbinlog --start-datetime= '2013-09-19 15:59:00 '  /mydata/data/mysql-bin .000002  /mydata/data/mysql-bin .000003 >  /backup/increment- ` date  +%F`.sql

准备操作(合并所有Xtrabackup备份数据)

1
2
3
4
5
6
#####准备完全备份
innobackupex --apply-log --redo-only  /backup/2013-09-19_15-45-49/
#####合并第一次增量备份
innobackupex --apply-log --redo-only  /backup/2013-09-19_14-00-12/  --incremental- dir = /backup/2013-09-19_14-07-35/
#####合并第二次增量备份
innobackupex --apply-log --redo-only  /backup/2013-09-19_15-45-49/  --incremental- dir = /backup/2013-09-19_15-50-46/

模拟数据库损坏

1
2
service mysqld stop
rm  -rf  /mydata/data/ *

完全+增量的数据还原

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#####一次性即可还原合并后用Xtrabackup备份过的所有文件
innobackupex --copy-back  /backup/2013-09-19_15-45-49/
chown  -R mysql.mysql  /mydata/data/
service mysqld start
mysql> use soulboy
#####还原成功
mysql>  select  * from tb1;
+----+-----------+
id  | name      |
+----+-----------+
|  1 | kobe      |
|  2 | wade      |
|  3 | nash      |
|  9 | firstday  |
| 10 | secondday |
+----+-----------+

利用二进制日志完成即时点恢复

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#####禁止二进制日志记录功能
mysql>  set  sql_log_bin=0;
#####即时点回复
mysql>  source  /backup/increment-2013-09-19 .sql
#####开启二进制日志记录功能
mysql>  set  sql_log_bin=1;
#####还原成功,至此所有数据还原成功
mysql>  select  * from tb1;
+----+-----------+
id  | name      |
+----+-----------+
|  1 | kobe      |
|  2 | wade      |
|  3 | nash      |
|  9 | firstday  |
| 10 | secondday |
| 13 | thirdday  |
| 14 | forthday  |
+----+-----------+




本文转自 ftmoonfans  51CTO博客,原文链接:http://blog.51cto.com/soulboy/1299070
相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
1月前
|
关系型数据库 MySQL Java
【MySQL+java+jpa】MySQL数据返回项目的感悟
【MySQL+java+jpa】MySQL数据返回项目的感悟
44 1
|
1月前
|
安全 关系型数据库 MySQL
如何将数据从MySQL同步到其他系统
【10月更文挑战第17天】如何将数据从MySQL同步到其他系统
176 0
|
1月前
|
SQL 前端开发 关系型数据库
全表数据核对 ,行数据核对,列数据核对,Mysql 8.0 实例(sample database classicmodels _No.3 )
全表数据核对 ,行数据核对,列数据核对,Mysql 8.0 实例(sample database classicmodels _No.3 )
49 0
全表数据核对 ,行数据核对,列数据核对,Mysql 8.0 实例(sample database classicmodels _No.3 )
|
1月前
|
关系型数据库 MySQL 数据库
mysql 里创建表并插入数据
【10月更文挑战第5天】
122 1
|
1月前
|
分布式计算 关系型数据库 MySQL
大数据-88 Spark 集群 案例学习 Spark Scala 案例 SuperWordCount 计算结果数据写入MySQL
大数据-88 Spark 集群 案例学习 Spark Scala 案例 SuperWordCount 计算结果数据写入MySQL
50 3
|
14天前
|
存储 Oracle 关系型数据库
【赵渝强老师】MySQL InnoDB的数据文件与重做日志文件
本文介绍了MySQL InnoDB存储引擎中的数据文件和重做日志文件。数据文件包括`.ibd`和`ibdata`文件,用于存放InnoDB数据和索引。重做日志文件(redo log)确保数据的可靠性和事务的持久性,其大小和路径可由相关参数配置。文章还提供了视频讲解和示例代码。
122 11
【赵渝强老师】MySQL InnoDB的数据文件与重做日志文件
|
14天前
|
缓存 NoSQL 关系型数据库
Redis和Mysql如何保证数据⼀致?
在项目中,为了解决Redis与Mysql的数据一致性问题,我们采用了多种策略:对于低一致性要求的数据,不做特别处理;时效性数据通过设置缓存过期时间来减少不一致风险;高一致性但时效性要求不高的数据,利用MQ异步同步确保最终一致性;而对一致性和时效性都有高要求的数据,则采用分布式事务(如Seata TCC模式)来保障。
52 14
|
17天前
|
SQL 前端开发 关系型数据库
SpringBoot使用mysql查询昨天、今天、过去一周、过去半年、过去一年数据
SpringBoot使用mysql查询昨天、今天、过去一周、过去半年、过去一年数据
46 9
|
15天前
|
关系型数据库 MySQL Linux
Linux环境下MySQL数据库自动定时备份实践
数据库备份是确保数据安全的重要措施。在Linux环境下,实现MySQL数据库的自动定时备份可以通过多种方式完成。本文将介绍如何使用`cron`定时任务和`mysqldump`工具来实现MySQL数据库的每日自动备份。
37 3
|
15天前
|
监控 关系型数据库 MySQL
Linux环境下MySQL数据库自动定时备份策略
在Linux环境下,MySQL数据库的自动定时备份是确保数据安全和可靠性的重要措施。通过设置定时任务,我们可以每天自动执行数据库备份,从而减少人为错误和提高数据恢复的效率。本文将详细介绍如何在Linux下实现MySQL数据库的自动定时备份。
29 3
下一篇
无影云桌面