使用innobackupex在线增量备份及恢复mysql数据库

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,高可用系列 2核4GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介:

 这几天一直在研究mysql备份这一块,前几天由于手误对线上生产数据库造成误操作,虽然没有太大影响,但是为了把风险度降到最低,因此最近一直在倒腾mysql的在线热备份,在线热备份有免费开源的,也收费的产品,在这里我们值讨论免费的产品,支持热备的的软件mysqlLVM以及接下来的这款Xtrabackup;Xtrabackup是由percona开发的一个开源软件,它是innodb热备工具ibbackup(收费的商业软件)的一个开源替代品。Xtrabackup由个部分组成:xtrabackup和innobackupex,其中xtrabackup工具用于备份innodb和 xtraDB引擎的表;而innobackupex工具用于备份myisam和innodb引擎的表,本文将介绍如何用innobackupex工具做全量和增量备份。

一、安装解压

1.安装数据库

1
2
3
官网:http: //www.percona.com
下载地址:http: //www.percona.com/redir/downloads/XtraBackup/XtraBackup-2.0.8/binary/Linux/x86_64/percona-xtrabackup-2.0.8-587.tar.gz
yum -y install mysql mysql-libs mysql-server MySQL-python

2.创建数据库

1
2
3
4
5
6
7
8
9
create database dotatest;
mysql -uroot -p dotatest > zhan_data.sql
python mysql_update.py --host localhost --user root --passwd  ""  --db dotatest
use  dotatest;
show tables;
desc item;
insert into item (player, item, count) values ( 1 1 1  );    插入一条数据
insert into item (player, item, count) values ( 2 2 2  );
select * from item;

3.安装依赖包(如果安装新版本需要安装)

1
yum install cmake gcc gcc-c++ libaio libaio-devel automake autoconf bzr bison libtool ncurses-devel zlib-devel libgcrypt libgcrypt-devel perl-Time-HiRes

4.解压安装

1
2
3
4
5
6
7
8
9
10
[root@localhost home]# tar xf percona-xtrabackup- 2.0 . 8 - 587 .tar.gz
[root@localhost home]# mysql --version
mysql  Ver  14.14  Distrib  5.1 . 61 for  redhat-linux-gnu (x86_64) using readline  5.1
[root@localhost percona-xtrabackup- 2.0 . 8 ]# pwd
/home/percona-xtrabackup- 2.0 . 8
[root@localhost percona-xtrabackup- 2.0 . 8 ]# cp bin/
innobackupex        xbstream            xtrabackup_51       xtrabackup_56    
innobackupex- 1.5 . 1   xtrabackup          xtrabackup_55    
[root@localhost percona-xtrabackup- 2.0 . 8 ]# cp bin/innobackupex /usr/bin/
[root@localhost percona-xtrabackup- 2.0 . 8 ]# cp bin/xtrabackup* /usr/bin/

二、常规备份文件以及对单个数据库备份

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
备份全部数据库
[root@localhost /]# mkdir /home/data/backup/
[root@localhost /]# innobackupex --defaults-file=/etc/my.cnf --user=root  /home/data/backup/
--defaults-file 指定mysql的配置文件
--user 指定用户
/home/data/backup/ 备份文件的路径
需要注意的是 如果不指定--defaults-file 默认会读取/etc/my.cnf。如果你的配置文件是自定义的,那么一定要指定目录,然后会在目录下创建一个时间戳的目录(我们本次创建的/home/data/backup/ 2014 - 03 -11_11- 08 - 23 )
查看备份是否成功
[root@localhost /]# cd /home/data/backup/ 2014 - 03 -11_11- 08 - 23 /
[root@localhost  2014 - 03 -11_11- 08 - 23 ]# pwd
/home/data/backup/ 2014 - 03 -11_11- 08 - 23
[root@localhost  2014 - 03 -11_11- 08 - 23 ]# ls
backup-my.cnf  ibdata1  test               xtrabackup_binlog_info  xtrabackup_logfile
dotatest       mysql    xtrabackup_binary  xtrabackup_checkpoints  zabbix
[root@localhost  2014 - 03 -11_11- 08 - 23 ]#
只针对一个数据库备份
--database 是指定需要备份的数据库
[root@localhost ~]# innobackupex --user=root  --defaults-file=/etc/my.cnf --database=dotatest  /home/data/backup/

三、常规恢复数据库

恢复之前先停止数据库,并且要删除数据和日志文件

1
2
3
4
01 .首先停止数据库
[root@localhost  2014 - 03 -11_16- 52 - 44 ]# /etc/rc.d/init.d/mysqld stop
Stopping mysqld:                                           [  OK  ]
[root@localhost  2014 - 03 -11_16- 52 - 44 ]#
1
2
3
4
5
6
7
8
9
02 .备份删除mysql文件
[root@localhost lib]# cp -a mysql/ mysql.bak
[root@localhost lib]# ls
alternatives  dav   dhclient  games             misc     mysql      nfs  plymouth  postfix  random-seed  rpm      stateles
authconfig    dbus  fprint    logrotate.status  mlocate  mysql.bak  ntp  polkit- 1   prelink  readahead    rsyslog  udev
[root@localhost lib]# cd mysql
[root@localhost mysql]# ls
dotatest  ibdata1  ib_logfile0  ib_logfile1  mysql  test  zabbix
[root@localhost mysql]# rm -rf *

03.来恢复文件

恢复文件分两步,

第1步是apply-log,为了加快速度,一般建议设置--use-memory,这个步骤完成之后,目录/backup/mysql/data/2013-10-29_09-05-25下的备份文件已经准备就绪。

因为我们的文件比较少,因此我们不需要设置--user-memory产数文件

第2步是copy-back,即把备份文件拷贝至原数据目录下。

1
2
[root@localhost mysql]# innobackupex --defaults-file=/etc/my.cnf --user=root  --apply-log /home/data/backup/ 2014 - 03 -11_16- 52 - 44 /
[root@localhost mysql]# innobackupex --defaults-file=/etc/my.cnf --user=root --copy-back /home/data/backup/ 2014 - 03 -11_16- 52 - 44 /

04.修改权限 启动服务

[root@localhost lib]# chown mysql:mysql /var/lib/mysql/ -R

[root@localhost lib]# /etc/rc.d/init.d/mysqld start

Starting mysqld:                                           [  OK  ]

[root@localhost lib]#


四、配置增量备份

增量备份及其恢复

注意:innobackupex 增量备份仅针对InnoDB这类支持事务的引擎,对于MyISAM等引擎,则仍然是全备。

01.首先在数据库插入一条数据

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
mysql>  use  dotatest;
Reading table information  for  completion of table and column names
You can turn off  this  feature to  get  a quicker startup  with  -A
Database changed
mysql> select * from item;
+----+--------+------+-------+
| id | player | item | count |
+----+--------+------+-------+
|   1  |       1  |     1  |      1  |
|   2  |       2  |     2  |      2  |
+----+--------+------+-------+
2  rows  in  set  ( 0.00  sec)
mysql> insert into item (player, item, count) values ( 3 3 3  );
Query OK,  1  row affected ( 0.00  sec)
mysql> select * from item;
+----+--------+------+-------+
| id | player | item | count |
+----+--------+------+-------+
|   1  |       1  |     1  |      1  |
|   2  |       2  |     2  |      2  |
|   3  |       3  |     3  |      3  |
+----+--------+------+-------+
3  rows  in  set  ( 0.00  sec)
mysql>

02.增量备份是基于一个数据库的全部备份文件的,在刚才我们备份了一个全备份,我们现在的增量备份就基于刚才的全部备份来做(2014-03-11_16-52-44)

需要注意如下两个参数:

--incremental-basedir指向全备目录;

--incremental指向增量备份的目录;

1
2
3
4
5
[root@localhost backup]# innobackupex --defaults-file=/etc/my.cnf --user=root --incremental-basedir=/home/data/backup/ 2014 - 03 -11_16- 52 - 44 / --incremental /home/data/backup/
……略……
innobackupex: Backup created  in  directory  '/home/data/backup/2014-03-11_17-33-57'
innobackupex: MySQL binlog position: filename  '' , position
140311  17 : 34 : 16   innobackupex: completed OK!

03.查看是否有备份文件,最新的配置文件就是我们刚才的增量备份文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
[root@localhost backup]# pwd
/home/data/backup
[root@localhost backup]# ls
2014 - 03 -11_16- 52 - 44   2014 - 03 -11_17- 33 - 57
[root@localhost backup]#
在如下的文件中我们可以发现增量备份的文件from_lsn刚好等于全部备份的to_lsn
[root@localhost  2014 - 03 -11_17- 33 - 57 ]# cat xtrabackup_checkpoints    增量备份文件
backup_type = incremental
from_lsn =  657645
to_lsn =  659090
last_lsn =  659090  
[root@localhost  2014 - 03 -11_17- 33 - 57 ]# cat ../ 2014 - 03 -11_16- 52 - 44 /xtrabackup_checkpoints     全局备份
backup_type = full-prepared
from_lsn =  0
to_lsn =  657645
last_lsn =  657645
[root@localhost  2014 - 03 -11_17- 33 - 57 ]#

五、在增量备份的基础上再做增量备份

1
2
3
4
5
6
7
8
9
10
11
12
13
14
在备份之前我们在item表中再插入数据
mysql> insert into item (player, item, count) values ( 4 4 4  );
Query OK,  1  row affected ( 0.03  sec)
mysql> select * from item;
+----+--------+------+-------+
| id | player | item | count |
+----+--------+------+-------+
|   1  |       1  |     1  |      1  |
|   2  |       2  |     2  |      2  |
|   3  |       3  |     3  |      3  |
|   4  |       4  |     4  |      4  |
+----+--------+------+-------+
4  rows  in  set  ( 0.00  sec)
mysql>

在增量备份的基础上再做增量备份,我们需要添加如下参数

--incremental-basedir执行上一次增量备份的目录

1
2
3
4
5
6
7
8
9
如下备份:
[root@localhost  2014 - 03 -11_17- 33 - 57 ]# innobackupex --defaults-file=/etc/my.cnf --user=root --incremental-basedir=/home/data/backup/ 2014 - 03 -11_17- 33 - 57 / --incremental /home/data/backup/
………中间部分略………
innobackupex: Backup created  in  directory  '/home/data/backup/2014-03-11_18-03-54'
innobackupex: MySQL binlog position: filename  '' , position
140311  18 : 04 : 13   innobackupex: completed OK!
innobackupex: Backup created  in  directory  '/home/data/backup/2014-03-11_18-10-13'
innobackupex: MySQL binlog position: filename  '' , position
140311  18 : 10 : 31   innobackupex: completed OK!

然后来查看lsn号来:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
[root@localhost  2014 - 03 -11_18- 10 - 13 ]# cat xtrabackup_checkpoints
backup_type = incremental
from_lsn =  659090
to_lsn =  659214
last_lsn =  659090
[root@localhost  2014 - 03 -11_18- 10 - 13 ]# cat ../ 2014 - 03 -11_17- 33 - 57 /
backup-my.cnf           ibdata1.meta            xtrabackup_binary       xtrabackup_logfile   
dotatest/               mysql/                  xtrabackup_binlog_info  zabbix/              
ibdata1.delta           test/                   xtrabackup_checkpoints
[root@localhost  2014 - 03 -11_18- 10 - 13 ]# cat ../ 2014 - 03 -11_17- 33 - 57 /xtrabackup_checkpoints
backup_type = incremental
from_lsn =  657645
to_lsn =  659090
last_lsn =  659090
[root@localhost  2014 - 03 -11_18- 10 - 13 ]#

六、恢复增量数据库

1
2
3
4
5
6
7
8
9
停止数据库
[root@localhost backup]# /etc/rc.d/init.d/mysqld stop
Stopping mysqld:                                           [  OK  ]
[root@localhost backup]#
备份数据库
[root@localhost lib]# mv mysql mysql.bak. 2
[root@localhost lib]# pwd
/ var /lib
[root@localhost lib]#

这个恢复比恢复全部备份稍微复杂点,接下来我们来恢复,如果有多个增量备份,需要叠加就可以

1
2
3
innobackupex --apply-log --redo-only BASE-DIR   BASE-DIR指完整的全部备份目录
innobackupex --apply-log --redo-only BASE-DIR --incremental-dir=INCREMENTAL-DIR- 1            INCREMENTAL-DIR- 1 指第一次增量备份的目录
innobackupex --apply-log BASE-DIR --incremental-dir=INCREMENTAL-DIR- 2                        BASE-DIR指完整的全部备份目录 INCREMENTAL-DIR- 2 第二次增量备份的目录

01.在我们的环境中我们来执行如下操作,因为我们只有两次的增量备份如下即可:

1
2
3
innobackupex --apply-log --redo-only /home/data/backup/ 2014 - 03 -11_16- 52 - 44 /
innobackupex --apply-log --redo-only /home/data/backup/ 2014 - 03 -11_16- 52 - 44  --incremental-dir=/home/data/backup/ 2014 - 03 -11_17- 33 - 57 /
innobackupex --apply-log /home/data/backup/ 2014 - 03 -11_16- 52 - 44 / --incremental-dir=/home/data/backup/ 2014 - 03 -11_18- 10 - 13 /

02.回滚未完成的日志(需要注意的是恢复的时候,我们只恢复全备份文件就可以了)

1
2
innobackupex --apply-log /home/data/backup/ 2014 - 03 -11_16- 52 - 44 /
innobackupex --copy-back /home/data/backup/ 2014 - 03 -11_16- 52 - 44 /

03.授权启动

1
2
3
4
[root@localhost lib]# chown mysql:mysql / var /lib/mysql -R
[root@localhost lib]# /etc/rc.d/init.d/mysqld start
Starting mysqld:                                           [  OK  ]
[root@localhost lib]#

04.检查备份是否回来

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
mysql>  use  dotatest;
Reading table information  for  completion of table and column names
You can turn off  this  feature to  get  a quicker startup  with  -A
Database changed
mysql> select * from item;
+----+--------+------+-------+
| id | player | item | count |
+----+--------+------+-------+
|   1  |       1  |     1  |      1  |
|   2  |       2  |     2  |      2  |
|   3  |       3  |     3  |      3  |
|   4  |       4  |     4  |      4  |
+----+--------+------+-------+
4  rows  in  set  ( 0.00  sec)
mysql>



本文转自devilangel 51CTO博客,原文链接:http://blog.51cto.com/devliangel/1374232,如需转载请自行联系原作者
相关实践学习
如何快速连接云数据库RDS MySQL
本场景介绍如何通过阿里云数据管理服务DMS快速连接云数据库RDS MySQL,然后进行数据表的CRUD操作。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
24天前
|
存储 关系型数据库 MySQL
【赵渝强老师】使用select...into outfile语句备份MySQL
本文介绍了MySQL中使用`SELECT...INTO OUTFILE`语句将表数据导出为文本文件的方法。通过示例演示了如何备份员工表(emp)的数据,包括创建存储目录、设置权限、配置参数`secure_file_priv`以及解决相关错误的过程。字段分隔符和行终止符可自定义,确保数据格式符合需求。最后展示了备份文件的内容,验证操作成功。
128 36
|
4月前
|
关系型数据库 MySQL Shell
MySQL 备份 Shell 脚本:支持远程同步与阿里云 OSS 备份
一款自动化 MySQL 备份 Shell 脚本,支持本地存储、远程服务器同步(SSH+rsync)、阿里云 OSS 备份,并自动清理过期备份。适用于数据库管理员和开发者,帮助确保数据安全。
|
25天前
|
存储 SQL 关系型数据库
【赵渝强老师】使用mysqldump备份MySQL
本文介绍了 MySQL 自带的逻辑备份工具 mysqldump 的使用方法。通过 mysqldump,可以将数据库中的数据转换为对应的 SQL 插入语句,便于备份和还原。文章详细说明了如何备份所有数据库、指定数据库及特定表,排除某些表不备份的操作,以及删除数据库后如何通过备份文件恢复数据。同时提供了视频讲解和具体命令示例,帮助用户更好地理解和应用该工具。
105 5
|
23天前
|
存储 SQL 关系型数据库
【赵渝强老师】使用mydumper备份MySQL
本文介绍了使用mydumper工具进行MySQL数据库备份与恢复的操作方法。相比单线程工作的mysqldump,mydumper支持多线程,速度提升可达10倍。其功能包括事务性表快照、快速压缩、导出binlog等,并提供详细的参数说明和操作步骤。文章通过实例演示了安装mydumper、创建存储目录、全库备份、指定数据库及表备份、删除数据库以及使用myloader恢复数据的完整流程,并附带视频讲解,帮助用户更好地理解和应用该工具。
|
3月前
|
关系型数据库 MySQL Linux
在Linux环境下备份Docker中的MySQL数据并传输到其他服务器以实现数据级别的容灾
以上就是在Linux环境下备份Docker中的MySQL数据并传输到其他服务器以实现数据级别的容灾的步骤。这个过程就像是一场接力赛,数据从MySQL数据库中接力棒一样传递到备份文件,再从备份文件传递到其他服务器,最后再传递回MySQL数据库。这样,即使在灾难发生时,我们也可以快速恢复数据,保证业务的正常运行。
189 28
|
3月前
|
存储 关系型数据库 MySQL
利用Cron表达式实现MySQL数据库的定时备份
以上就是如何使用Cron表达式和mysqldump命令实现MySQL数据库的定时备份。这种方法的优点是简单易用,而且可以根据需要定制备份的时间和频率。但是,它也有一些限制,例如,它不能备份MySQL服务器的配置文件和用户账户信息,也不能实现增量备份。如果需要更复杂的备份策略,可能需要使用专门的备份工具或服务。
88 15
|
4月前
|
关系型数据库 Shell 网络安全
定期备份数据库:基于 Shell 脚本的自动化方案
本篇文章分享一个简单的 Shell 脚本,用于定期备份 MySQL 数据库,并自动将备份传输到远程服务器,帮助防止数据丢失。
|
26天前
|
人工智能 运维 关系型数据库
数据库运维:mysql 数据库迁移方法-mysqldump
本文介绍了MySQL数据库迁移的方法与技巧,重点探讨了数据量大小对迁移方式的影响。对于10GB以下的小型数据库,推荐使用mysqldump进行逻辑导出和source导入;10GB以上可考虑mydumper与myloader工具;100GB以上则建议物理迁移。文中还提供了统计数据库及表空间大小的SQL语句,并讲解了如何使用mysqldump导出存储过程、函数和数据结构。通过结合实际应用场景选择合适的工具与方法,可实现高效的数据迁移。
206 1
|
2月前
|
负载均衡 算法 关系型数据库
大数据大厂之MySQL数据库课程设计:揭秘MySQL集群架构负载均衡核心算法:从理论到Java代码实战,让你的数据库性能飙升!
本文聚焦 MySQL 集群架构中的负载均衡算法,阐述其重要性。详细介绍轮询、加权轮询、最少连接、加权最少连接、随机、源地址哈希等常用算法,分析各自优缺点及适用场景。并提供 Java 语言代码实现示例,助力直观理解。文章结构清晰,语言通俗易懂,对理解和应用负载均衡算法具有实用价值和参考价值。
大数据大厂之MySQL数据库课程设计:揭秘MySQL集群架构负载均衡核心算法:从理论到Java代码实战,让你的数据库性能飙升!
|
4月前
|
关系型数据库 MySQL Java
【YashanDB知识库】原生mysql驱动配置连接崖山数据库
【YashanDB知识库】原生mysql驱动配置连接崖山数据库
【YashanDB知识库】原生mysql驱动配置连接崖山数据库

推荐镜像

更多