热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

XtraBackup备份原理和实战详解

nsitionalENhttp:www.w3.orgTRxhtml1DTDxhtml1-transitional.dtd

第1章 XtraBackup

1.1 XtraBackup介绍

InnoDB 有个商业的InnoDB Hotbackup,可以对InnoDB引擎的表实现在线热备。而 percona出品的Xtrabackup,是InnoDB Hotbackup的一个开源替代品,可以在线对InnoDB/XtraDB引擎的表进行物理备份。mysqldump支持在线备份,不过是逻辑备份,效率比较差。xtrabackup是开源的MySQL备份工具,物理备份,效率很不错。

Xtrabackup有两个主要的工具:xtrabackup、innobackupex,其中xtrabackup只能备份InnoDB和XtraDB两种数据表,innobackupex则封装了xtrabackup,同时可以备份MyISAM数据表。Xtrabackup做备份的时候不能备份表结构、触发器等等,智能纷纷.idb数据文件。另外innobackupex还不能完全支持增量备份,需要和xtrabackup结合起来实现全备的功能。

1.2 XtraBackup特点介绍

C语言编写,可以备份InnodbXtraD,不拷贝*.frm文件

支持的引擎有:

InnoDB、Xtradb:hotbackup

MyISAM: with read lock

具有的特点有如下几点:

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

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

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

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

§  (5)还原速度快;

1.3 XtraBackup的下载安装

Xtrabackup工具由Percona公司开发的开源热备工具,可以到官网下载到最新的版本文件。

https://www.percona.com/downloads/下载各种版本,也可以在系统中使用wget下载。

方法一:

wget https://www.percona.com/downloads/XtraBackup/Percona-XtraBackup-2.4.4/binary/RedHat/6/x86_64/percona-xtrabackup-24-2.4.4-1.el6.x86_64.rpm

安装依赖的包

yum install perl-DBI  perl-DBD-MySQL  perl-Time-HiRes perl-IO-Socket-SSL installperl perl-devel libaio libaio-devel perl-Time-HiRes perl-DBD-MySQL

方法二:

下载好的rpm包,直接使用yum 安装,自动安装依赖包,但是需要有epel源的支持,所以要下载配置好epe'

wget -O /etc/yum.repos.d/epel.repo  http://mirrors.aliyun.com/repo/epel-6.repo

yum install -y percona-xtrabackup-24-2.4.4-1.el6.x86_64.rpm

1.4 XtraBackup备份用户需要的权限

RELOAD LOCKTABLES 权限为了执行 FLUSHTABLES WITH READ LOCK

REPLICATION CLIENT 为了获取binary log位置

CREATE TABLESPACE 权限为了导入表,用户表级别的恢复

SUPER权限在slave环境下备份用来启动和关闭slave线程

1.5 XtraBackup备份

InnoDB 和非InnoDB文件的备份都是通过拷贝文件,但是实现的方式是不同的。

  • InnoDB是以page为粒度做的的(Xtrabackup),Xtrabackup在读取每个page时会校验checksum值,保证数据块是一致的

  • InnoDBcp或者tar 命令,innobackupexcp MyISAM文件时已经做了flushFTWRL),磁盘上的文件也是完整的,所以最终备份集里的数据文件都是写入完整的

  • 1.5.1备份流程

1.5.2 全备流程图

1.5.3 增量备份流程图

1.6 Xtrabackup恢复

1.6.1 恢复流程图

1.7 Xtrabackup的使用

规范操作,我们先建好全备和增量备份的路径

[root@db01 backups]# pwd

/data/backups

[root@db01 backups]# ll

总用量 12

drwxr-xr-x 4 root root 4096 9  4 17:28 full

drwxr-xr-x 4 root root 4096 9  4 17:26 inc

操作过程:

 mkdir/data/backups/{full,inc} -p

1.7.1 全备

*****生产环境中为了数据一致性最好是ROW模式,因为其他的模式数据会丢失*****

命令语法格式:

innobackupex --user=User--password=PWD/data/backup/full --slave-info --safe-slave-backup --parallel=4--safe-slave-backup-timeout=7200  --rsync

--rsync 这个参数一般用作分布式数据库集群的时候

全备步骤:

1、准备一个xtr_test数据库,并在xtr_test数据库中插入testbackup表,字段包含idstep两个字段

mysql -uroot -p789 -S /data/3306/mysql.sock
show databases;
create database xtr_test;
use xtr_test;
select database();
create table testbackup(id int not nullauto_increment primary key,step varchar(50))engine=innodb;
show tables;
desc testbackup;
show create table testbackup\G

结果样子:

mysql> desc testbackup;
+-------+-------------+------+-----+---------+----------------+
| Field | Type        | Null | Key | Default | Extra          |
+-------+-------------+------+-----+---------+----------------+
id    |int(11)     | NO   | PRI | NULL    | auto_increment |
| step  |varchar(50) | YES  |     | NULL   |                |
+-------+-------------+------+-----+---------+----------------+
2 rows in set (0.02 sec)
mysql> show create table testbackup\G
*************************** 1. row***************************
       Table:testbackup
Create Table: CREATE TABLE `testbackup` (
  `id`int(11) NOT NULL AUTO_INCREMENT,
  `step`varchar(50) DEFAULT NULL,
  PRIMARY KEY(`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
1 row in set (0.00 sec)

2、插入字段“firstfull backup”testbackup表中

insert into testbackup(step) values('first fullbackup');

操作结果:

mysql> select * from testbackup;
+----+-------------------+
id | step              |
+----+-------------------+
|  1 | firstfull backup |
+----+-------------------+
1 row in set (0.02 sec)

3、执行全备

此时,我们创建的xtr_test数据库中的testbackup表中有数据,而且我们创建的/data/backups/full文件下面没有任何内容。下面执行全备,操作命令上面已经给出,此次操作使用的多实例所以用到了--socket参数。

innobackupex --user=root --password=789/data/backups/full --slave-info --safe-slave-backup --parallel=4--safe-slave-backup-timeout=7200 --socket=/data/3306/mysql.sock

执行结果一定要看到“160905 20:01:38 completedOK!" OK的字样,才表示成功,从打出的日志我们也能看到备份的过程和上面给出的全备流程图对比起来。

正确输出以后会在/data/backups/full 指定的目录中生成一个有时间和序号的目录,这个目录就是全备文件存放地方如:

[root@db01 ~]# ls -lrt /data/backups/full/
总用量 4
drwxr-x--- 8 root root 4096 9月   5 20:012016-09-05_20-01-32 

1.7.2 增量备份

增量备份的前提是一定要有一个全备 ,只有有了全备才能进行所谓的增量备份!!!

增量备份的方式有两种,分别为:

第一种:通过全备的文件

innobackupex --user=root --password=789 --incremental --incremental-lsn=1783249/data/backups/inc  --slave-info--safe-slave-backup --parallel=4 --safe-slave-backup-timeout=7200--socket=/data/3306/mysql.sock

第二种方法:通过LSN

innobackupex --user=root --password=789 --incremental --incremental-lsn=1783249/data/backups/inc  --slave-info--safe-slave-backup --parallel=4 --safe-slave-backup-timeout=7200--socket=/data/3306/mysql.sock

1、准备好全备最新一次的全备文件,这里只做了一次,所以只有一个目录

[root@db01 ~]# ls -lrt /data/backups/full/
总用量 4
drwxr-x--- 8 root root 4096 9月   5 20:01 2016-09-05_20-01-32 

2、xtr_test数据库中的testbackup表,进行数据的插入,插入内容为“fist increment backup”

mysql> insert into testbackup(step)values('first increment backup');
Query OK, 1 row affected (0.02 sec)
   
mysql> select * from testbackup;
+----+------------------------+
id | step                  |
+----+------------------------+
|  1 | firstfull backup      |
|  2 | firstincrement backup |
+----+------------------------+
2 rows in set (0.01 sec)

3、执行增量备份

这里我们要确定好最新一次的全备(强调)!!!

innobackupex --user=root --password=789--incremental  --incremental-basedir=/data/backups/full/
2016-09-05_20-01-32 
 /data/backups/inc --slave-info--safe-slave-backup --parallel=4 --safe-slave-backup-timeout=7200 --socket=/data/3306/mysql.sock

这里执行结果一定要看到completed OK!" OK的字样,才表示成功如果是分布式也可以用--rsync,我们会在创建的inc目录下发现创建了一个以时间和序号命名的目录,这个目录就是Xtrabackup备份的增量。

执行结果:

[root@db01 ~]# ll /data/backups/inc
总用量 4
drwxr-x--- 8 root root 4096 9月   5 20:19 2016-09-05_20-19-48 

TIP:innodb默认是使用的系统表空间,我们可以通过配置参数来使idb文件到独立空间中innodb_file_per_table = 1 这个是修改idb到独立空间,如果数据库是线上的,我们可以在配置文件my.cnf配置以上参数后,再使用set globalinnodb_file_per_table= 1 临时生效。

alter table backupstep engine=innodb; 修改表的引擎,这个操作很费时间,需要在业务低点的时候操作

1.7.3 再增量备份的基础上再备份

在创建的xtr_test数据库中的testbackup表中再次插入内容“secondincrement backup”

mysql> insert into testbackup(step) values('secondincrement backup');
Query OK, 1 row affected (0.01 sec)
   
mysql> select * from testbackup;
+----+-------------------------+
id | step                    |
+----+-------------------------+
|  1 | firstfull backup       |
|  2 | first incrementbackup  |
|  3 | secondincrement backup |
+----+-------------------------+
3 rows in set (0.00 sec)

1确定最新的全备文件

[root@db01 full]# pwd
/data/backups/full
[root@db01 full]# ls -lrt
总用量 4
drwxr-x--- 8 root root 4096 9月   5 20:01 2016-09-05_20-01-32

   2确定上一次增量备份的LSN

[root@db01 inc]# ls -lrt
总用量 4
drwxr-x--- 8 root root 4096 9月   5 20:19 2016-09-05_20-19-48
[root@db01 inc]# cd 2016-09-05_20-19-48/
[root@db01 2016-09-05_20-19-48]# ls
backup-my.cnf krik    performance_schema      xtrabackup_checkpoints  xtr_test
ibdata1.delta mysql   test                    xtrabackup_info
ibdata1.meta  oldboy xtrabackup_binlog_info xtrabackup_logfile
[root@db01 2016-09-05_20-19-48]# cat xtrabackup_checkpoints 
backup_type = incremental
from_lsn = 1793716   #这个值一定是和上一次全备的last_lsn一样,否则就是数据不全
to_lsn = 1794019
last_lsn = 1794019
compact = 0
recover_binlog_info = 0

4、
执行增量备份命令

innobackupex  --user=root --password=789 --incremental--incremental-lsn=1794019 /data/backups/inc --slave-info --safe-slave-backup --parallel=4 --safe-slave-backup-timeout=7200--socket=/data/3306/mysql.sock

这个值是通过查看最近一次增量备份的xtrabackup_checkpoints得到

这里执行结果一定要看到“completed OK!" OK的字样,才表示成功

执行结果会在指定的目录/data/backups/inc下生成一个新的文件

[root@db01 2016-09-05_20-19-48]# cd ..
[root@db01 inc]# pwd
/data/backups/inc
[root@db01 inc]# ls -lrt
总用量 8
drwxr-x--- 8 root root 4096 9月   5 20:19 2016-09-05_20-19-48
drwxr-x--- 8 root root 4096 9月   5 21:18 2016-09-05_21-18-30

到此我们对数据进行了完整的备份,下面会再创建一条语句,但是不会做增量备份,为了是下面测试二进制日志恢复数据。接下来要玩大的了,删库,后面看看能恢复回来不

生产环境中为了数据一致性最好是ROW模式,因为其他的模式数据会丢失

mysql> show variables like "log_bin";
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| log_bin      | ON    |
+---------------+-------+
1 row in set (0.00 sec)
   
mysql> show variables like"%binlog_format%";
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| binlog_format | ROW   |
+---------------+-------+
1 row in set (0.00 sec)
   
ot root   418 9月   4 15:34backup-my.cnf

更多详情见请继续阅读下一页的精彩内容: 2017-04/142477p2.htm


推荐阅读
  • MySQL Decimal 类型的最大值解析及其在数据处理中的应用艺术
    在关系型数据库中,表的设计与SQL语句的编写对性能的影响至关重要,甚至可占到90%以上。本文将重点探讨MySQL中Decimal类型的最大值及其在数据处理中的应用技巧,通过实例分析和优化建议,帮助读者深入理解并掌握这一重要知识点。 ... [详细]
  • 在CentOS 7环境中安装配置Redis及使用Redis Desktop Manager连接时的注意事项与技巧
    在 CentOS 7 环境中安装和配置 Redis 时,需要注意一些关键步骤和最佳实践。本文详细介绍了从安装 Redis 到配置其基本参数的全过程,并提供了使用 Redis Desktop Manager 连接 Redis 服务器的技巧和注意事项。此外,还探讨了如何优化性能和确保数据安全,帮助用户在生产环境中高效地管理和使用 Redis。 ... [详细]
  • php更新数据库字段的函数是,php更新数据库字段的函数是 ... [详细]
  • Nacos 0.3 数据持久化详解与实践
    本文详细介绍了如何将 Nacos 0.3 的数据持久化到 MySQL 数据库,并提供了具体的步骤和注意事项。 ... [详细]
  • 本文详细介绍了 InfluxDB、collectd 和 Grafana 的安装与配置流程。首先,按照启动顺序依次安装并配置 InfluxDB、collectd 和 Grafana。InfluxDB 作为时序数据库,用于存储时间序列数据;collectd 负责数据的采集与传输;Grafana 则用于数据的可视化展示。文中提供了 collectd 的官方文档链接,便于用户参考和进一步了解其配置选项。通过本指南,读者可以轻松搭建一个高效的数据监控系统。 ... [详细]
  • Oracle字符集详解:图表解析与中文乱码解决方案
    本文详细解析了 Oracle 数据库中的字符集机制,通过图表展示了不同字符集之间的转换过程,并针对中文乱码问题提供了有效的解决方案。文章深入探讨了字符集配置、数据迁移和兼容性问题,为数据库管理员和开发人员提供了实用的参考和指导。 ... [详细]
  • 包含phppdoerrorcode的词条 ... [详细]
  • Spring Data JdbcTemplate 入门指南
    本文将介绍如何使用 Spring JdbcTemplate 进行数据库操作,包括查询和插入数据。我们将通过一个学生表的示例来演示具体步骤。 ... [详细]
  • 本文介绍如何在将数据库从服务器复制到本地时,处理因外键约束导致的数据插入失败问题。 ... [详细]
  • 网站访问全流程解析
    本文详细介绍了从用户在浏览器中输入一个域名(如www.yy.com)到页面完全展示的整个过程,包括DNS解析、TCP连接、请求响应等多个步骤。 ... [详细]
  • 本文介绍如何使用 Python 的 DOM 和 SAX 方法解析 XML 文件,并通过示例展示了如何动态创建数据库表和处理大量数据的实时插入。 ... [详细]
  • PTArchiver工作原理详解与应用分析
    PTArchiver工作原理及其应用分析本文详细解析了PTArchiver的工作机制,探讨了其在数据归档和管理中的应用。PTArchiver通过高效的压缩算法和灵活的存储策略,实现了对大规模数据的高效管理和长期保存。文章还介绍了其在企业级数据备份、历史数据迁移等场景中的实际应用案例,为用户提供了实用的操作建议和技术支持。 ... [详细]
  • DVWA学习笔记系列:深入理解CSRF攻击机制
    DVWA学习笔记系列:深入理解CSRF攻击机制 ... [详细]
  • Keepalived 提供了多种强大且灵活的后端健康检查机制,包括 HTTP_GET、SSL_GET、TCP_CHECK、SMTP_CHECK 和 MISC_CHECK 等多种检测方法。这些健康检查功能确保了高可用性环境中的服务稳定性和可靠性。通过合理配置这些检查方式,可以有效监测后端服务器的状态,及时发现并处理故障,从而提高系统的整体性能和可用性。 ... [详细]
  • MongoDB核心概念与基础知识解析
    MongoDB 是一种基于分布式文件存储的非关系型数据库系统,主要采用 C++ 语言开发。本文将详细介绍 MongoDB 的核心概念和基础知识,包括其与传统 SQL 数据库的区别,数据库及集合的基本操作,如数据的插入、更新、删除和查询等。通过本文,读者可以全面了解 MongoDB 的基本功能及其应用场景。 ... [详细]
author-avatar
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有