一.简介

原理

其实XtraBackup也是基于INNODB的 crash-recovery功能来实现的,他是对于数据文件的直接拷贝,为了保证数据内部的一致性,就需要使用到了crash-recovery来确保恢复的数据库是一致性的,而且是可用的。

mysql本身是有一个自己自身的事务日志文件,也就是redo log,也就是说当INNODB启动的时候会做两步操作,事务日志中已经提交的事物会重做,之前没有提交的事物但是已经对数据文件做了修改的就会回滚,借此来保证数据的一致性。大部分关系型数据库都是这个原理。

XtraBackup 也是基于LSN( log sequence number)来工作的,每次启动备份,都会记录LSN,然后开始拷贝文件,拷贝文件是要花费一部分时间的,所以说这期间一般情况都会有数据交互,所以说所有文件也可能记录的并不是一个时间点的数据,这个时候XtraBackup 就会启动一个后台进程来观测mysql的事务日志,而且把事务日志中的改变记录下来。我们知道事物日志是回重用的(redo log),所以说这个监控事务日志的后台进程从启动那一刻起就会不停的运作,直到备份结束。这个后台监控进程会记录所有的事务日志的改变,这些是保证数据一致性所必须的。

前面有提到,XtraBackup 在备份的时候会用一个备份锁( Backup locks )来取代FLUSH TABLES WITH READ LOCK,这是一个轻量级的替代锁(percona server 5.6+),XtraBackup 也会利用这个特性自动备份非INNODB表数据,可以防止阻塞DML语句的操作,当 backup locks 被支持的时候,xtrabackup 就会先拷贝INNODB的数据表,运行LOCK TABLES FOR BACKUP来拷贝MYASIM表和 .frm 文件,当拷贝结束后,在开始拷贝 .frm, .MRG, .MYD, .MYI, .TRG, .TRN, .ARM, .ARZ, .CSM, .CSV, .par, 和.opt等文件。当然需要注意的是,备份的第一步是先完成INNODB的备份(文件和日志),LOCK TABLES FOR BACKUP只是针对非INNODB表来说的。

以上执行完毕以后,XtraBackup 会执行LOCK BINLOG FOR BACKUP来锁定日志文件用以记录在日志中的位置,或者是Exec_Master_Log_Pos 或者Exec_Gtid_Set的值,这些记录值是和SHOW MASTER/SLAVE STATUS中report的是一致的。然后停止拷贝事务日志,记录位置信息,结束以后unlock日志和表。

在恢复的准备阶段,XtraBackup 会执行crash-recovery执行备份的日志,然后将数据库启动到可用的状态。最终备份的INNODB和MYASIM表都会数据一致,INNODB表数据一致是到备份结束的时间点,而不是备份开始的时间点,因为日志是要应用到这个时间点的。这个时间点是和FLUSH TABLES WITH READ LOCK是一致的。

下面看一下怎么去Restoring 一个 backup:

我们可以使用--copy-back 或者 --move-backup参数来还原一个数据库。在还原的时候,xtrabackup 会首先去读取配置文件里面的一些参数( datadir, innodb_data_home_dir,innodb_data_file_path,innodb_log_group_home_dir)已确定这些目录是否存在。

如果存在的话就回去执行拷贝,首先被拷贝的是MYASIM表,索引还有一些其他存储引擎的文件,接下来才会拷贝INNODB表和索引,然后是事务日志文件,在复制的时候是要保留源文件的所有属性,所以说这些目录的所有者最好是给mysql用户。但是我们要特别注意--move-back这个参数,它是会移动备份文件,而不仅仅是恢复那么简单。这样的话原来的备份就没有了,是一个很危险的操作,唯一的适用场景就是磁盘空间不足了,只能通过移动的方式来恢复,SO这个参数还是少用为妙。

对于非innodb表(比如myisam)是直接锁表cp数据文件,属于一种温备。

对于innodb的表(支持事务),不锁表,cp数据页最终以数据文件方式保存下来,并且把redo和undo一并备走,属于热备方式。

创建授权用户:

create user 'back'@'localhost' identified by '123456';

grant reload,lock tables,replication client,create tablespace,process,super on *.* to 'back'@'localhost' ;

grant create,insert,select on percona_schema.* to 'back'@'localhost';

优缺点

优点:

物理备份可以绕过MySQL Server层,加上本身就是文件系统级别的备份,备份速度块,恢复速度快,可以在线备份,热备份,持续增量备份,支持并发备份,支持加密传输,支持备份限速

缺点:

要提取部分库表数据比较麻烦,不能按照基于时间点来恢复数据,并且不能远程备份,只能本地备份,增量备份的恢复也比较麻烦。如果使用innobackupex的全备+binlog增量备份就可以解决基于时间点恢复的问

二.安装

1.安装依赖

yum -y install perl perl-devel libaio libaio-devel perl-Time-HiRes perl-DBD-MySQL libev-devel

2.下载安装

wget https://www.percona.com/downloads/XtraBackup/Percona-XtraBackup-2.4.12/binary/redhat/7/x86_64/percona-xtrabackup-24-2.4.12-1.el7.x86_64.rpm

yum -y install percona-xtrabackup-24-2.4.12-1.el7.x86_64.rpm

三.日常使用

备份所有库

备份目录里生成日期命名的文件夹,指定的目录不存在会自动创建

innobackupex --defaults-file=/etc/my.cnf --user=root --password=123456 /mysql/back

在目录下xtrabackup_info文件夹里有写明binlog文件和pos点

恢复第一步。先停止数据库或者禁止数据库写入,再清空数据目录,并关闭数据库

systemctl stop mysql

mv /usr/local/mysql/data .

mkdir /usr/local/mysql/data

恢复第二步。利用--apply-log来将备份时候有些未同步或者提交的事物进行处理,达到一致性状态

innobackupex --defaults-file=/etc/my.cnf --user=root --password=123456 --apply-log /mysql/back/2018-09-23_10-53-51/

恢复第三步。用如下命令恢复

innobackupex --defaults-file=/etc/my.cnf --user=root --password=123456 --copy-back /mysql/back/2018-09-23_10-53-51/

恢复第四部。权限恢复

chown -R mysql:mysql /usr/local/mysql/data

恢复第五部。启动mysql并检查

systemctl start mysql

增量备份

  • 基于上一次备份进行增量
  • 增量备份无法单独恢复,必须基于全备进行恢复
  • 所有增量必须要按顺序合并到全备当中

必须要全量备份后才能进行增量备份,先新建一个备份目录,--no-timestamp是指定目录名叫什么

mkdir /bakcup

innobackupex --user=root --password=123 --no-timestamp /backup/full

对数据进行变化,可以写个脚本,insert方式一直写入数据

指明上次全备份的目录位置,再指定增量备份文件名叫什么

--incremental开启增量备份功能,--incremental-basedir上一次备份的路径

innobackupex --user=root --password=123 --no-timestamp --incremental --incremental-basedir=/backup/full/ /backup/inc1

对数据进行变化,修改完数据后就不要再动了

再次进行增量备份,指定上次增量备份的文件夹,再指定第二次增量备份的文件夹叫什么

innobackupex --user=root --password=123 --no-timestamp --incremental --incremental-basedir=/backup/inc1/ /backup/inc2

对数据进行破坏,删除mysql的数据目录

rm -fr /usr/local/mysql/data/

恢复

full+inc1+inc2,需要将inc1和inc2按顺序合并到full中,分步骤进行--apply-log

关闭mysql

systemctl stop mysql

第一步:对全备份进行封装

innobackupex --apply-log --redo-only /backup/full/

第二步:合并inc1到全备份

innobackupex --apply-log --redo-only --incremental-dir=/backup/inc1/ /backup/full/

第三步:合并inc2到全备份,以此类推

innobackupex --apply-log --redo-only --incremental-dir=/backup/inc2/ /backup/full/

正式恢复

innobackupex --copy-back /backup/full/

添加权限并启动

chown -R mysql.mysql /usr/local/mysql/data/

systemctl start mysql

远程备份

在本地目录的磁盘不够的情况下,可以使用远程备份,用流备份方式持续将本地备份到远程服务器上。

数据库服务器对磁盘服务器做免密登录,不然无法将备份传送到磁盘服务器。10.93就是磁盘服务器,在磁盘服务器建立/backup目录

innobackupex --defaults-file=/etc/my.cnf --user=root --password=123456 --stream=tar /tmp | ssh root@10.10.10.93 \ "gzip >/backup/bak.tar.gz"

四.参数

xtrabackup 选项
xtrabackup 工具有许多参数,具体可去官网查询(xtrabackup 参数选项 | innobackupex 参数选项),这里简单介绍 innobackupex 一些常用的参数。 #指定文件夹
--no-timestamp 2016-3-2 1) innobackupex 参数选项 --defaults-file=[MY.CNF]    //指定配置文件:只能从给定的文件中读取默认选项。 且必须作为命令行上的第一个选项;必须是一个真实的文件,它不能是一个符号链接。 --databases=#    //指定备份的数据库和表,格式为:--database="db1[.tb1] db2[.tb2]" 多个库之间以空格隔开,如果此选项不被指定,将会备份所有的数据库。 --include=REGEXP    //用正则表达式的方式指定要备份的数据库和表,格式为 --include=‘^mydb[.]mytb’ ,对每个库中的每个表逐一匹配,因此会创建所有的库,不过是空的目录。--include 传递给 xtrabackup --tables。 --tables-file=FILE    //此选项的参数需要是一个文件名,此文件中每行包含一个要备份的表的完整名称,格式为databasename.tablename。该选项传递给 xtrabackup --tables-file,与--tables选项不同,只有要备份的表的库才会被创建。 注意:部分备份(--include、--tables-file、--database)需要开启 innodb_file_per_table 。 --compact    //创建紧凑型备份,忽略所有辅助索引页,只备份data page;通过--apply-log中重建索引--rebuild-indexs。 --compress    //此选项指示xtrabackup压缩备份的InnoDB数据文件,会生成 *.qp 文件。 --decompress    //解压缩qp文件,为了解压缩,必须安装 qpress 工具。 Percona XtraBackup不会自动删除压缩文件,为了清理备份目录,用户应手动删除 * .qp文件:find /data/backup -name "*.qp" | xargs rm。 --no-timestamp    //指定了这个选项备份将会直接存储在 BACKUP-DIR 目录,不再创建时间戳文件夹。 --apply-log    //应用 BACKUP-DIR 中的 xtrabackup_logfile 事务日志文件。一般情况下,在备份完成后,数据尚且不能用于恢复操作,因为备份的数据中可能会包含尚未提交的事务或已经提交但尚未同步至数据文件中的事务。因此,此时数据文件仍处于不一致状态。“准备”的主要作用正是通过回滚未提交的事务及同步已经提交的事务至数据文件使得数据文件处于一致性状态。 --use-memory=#    //此选项接受一个字符参数(1M/1MB,1G/1GB,默认100M),仅与--apply-log一起使用,该选项指定prepare时用于崩溃恢复(crash-recovery)的内存。 --copy-back    //拷贝先前备份所有文件到它们的原始路径。但原路径下不能有任何文件或目录,除非指定 --force-non-empty-directories 选项。 --force-non-empty-directories    //恢复时指定此选项,可使 --copy-back 和 --move-back 复制文件到非空目录,即原data目录下可以有其他文件,但是不能有与恢复文件中同名的文件,否则恢复失败。 --rsync    //此选项可优化本地文件(非InnoDB)的传输。rsync工具一次性拷贝所有非InnoDB文件,而不是为每个文件单独创建cp,在备份恢复很多数据库和表时非常高效。此选项不能和 --stream 一起使用。 --incremental    //这个选项告诉 xtrabackup 创建一个增量备份,而不是完全备份。它传递到 xtrabackup 子进程。当指定这个选项,可以设置 --incremental-lsn 或 --incremental-basedir。如果这2个选项都没有被指定,--incremental-basedir 传递给 xtrabackup 默认值,默认值为:基础备份目录的第一个时间戳备份目录。 --incremental-basedir=DIRECTORY    //该选项接受一个字符串参数,该参数指定作为增量备份的基本数据集的完整备份目录。它与 --incremental 一起使用。 --incremental-dir=DIRECTORY    //该选项接受一个字符串参数,该参数指定了增量备份将与完整备份相结合的目录,以便进行新的完整备份。它与 --incremental 选项一起使用。 --redo-only    //在“准备基本完整备份” 和 “合并所有的增量备份(除了最后一个增备)”时使用此选项。它直接传递给xtrabackup的 xtrabackup --apply-log-only 选项,使xtrabackup跳过"undo"阶段,只做"redo"操作。如果后面还有增量备份应用到这个全备,这是必要的。有关详细信息,请参阅xtrabackup文档。 --parallel=NUMBER-OF-THREADS    //此选项接受一个整数参数,指定xtrabackup子进程应用于同时备份文件的线程数。请注意,此选项仅适用于文件级别,也就是说,如果您有多个.ibd文件,则它们将被并行复制; 如果您的表一起存储在一个表空间文件中,它将不起作用。 2) xtrabackup 参数选项 --apply-log-only    //这个选项使在准备备份(prepare)时,只执行重做(redo)阶段,这对于增量备份非常重要。

Mysql资料 xtrabackup的更多相关文章

  1. mysql innobackupex xtrabackup 大数据量 备份 还原

    大数据量备份与还原,始终是个难点.当MYSQL超10G,用mysqldump来导出就比较慢了.在这里推荐xtrabackup,这个工具比mysqldump要快很多. 一.Xtrabackup介绍 1, ...

  2. MySQL 采用Xtrabackup对数据库进行全库备份

    1,xtrabackup简介 关于数据库备份以及备份工具,参考:http://blog.itpub.net/26230597/viewspace-1460065/,这里来介绍xtrabackup已经如 ...

  3. MySQL 利用xtrabackup进行增量备份详细过程汇总 (转)

    Xtrabackup下载.安装以及全量备份请参考:http://blog.itpub.net/26230597/viewspace-1465772/ 1,创建mysql备份用户 mysql -uroo ...

  4. MySQL备份--xtrabackup与mysqldump工具使用

    MySQL备份----xtrabackup与mysqldump工具的使用 一.Xtrabackup8.0: 一个用于MySQL数据库物理热备的备份工具,支持MySQL.Percona server和M ...

  5. MySQL 使用XtraBackup的shell脚本介绍

    mysql_backup.sh是关于MySQL的一个使用XtraBackup做备份的shell脚本,实现了简单的完整备份和增量备份.以及邮件发送备份信息等功能.功能目前还比较简单,后续将继续完善和增加 ...

  6. mysql innobackupex xtrabackup 大数据量 备份 还原(转)

    原文:http://blog.51yip.com/mysql/1650.html 作者:海底苍鹰 大数据量备份与还原,始终是个难点.当MYSQL超10G,用mysqldump来导出就比较慢了.在这里推 ...

  7. backup mysql for xtrabackup with xbstream and lz4

    极品暂时mysql加入一个实例,采用xtrabackup最简单的速度. 在现有数据节点上: /home/work/app/xtrabackup-2.2.3/innobackupex --ibbacku ...

  8. MySQL主从复制-xtrabackup的使用与延时复制(附原理图)

    标签(linux): mysql 笔者Q:972581034 交流群:605799367.有任何疑问可与笔者或加群交流 xtrabackup是percona公司针对MySQL开发的一款开源的物理备份工 ...

  9. MySQL利用xtrabackup在线修复或新增从库

    如果数据库的数据量很大,表大小有几十个G,利用mysqldump导出备份会消耗非常长的时间,会对数据库产生不稳定风险,这时可以利用xtrabackup工具在线复制主库文件,利用复制出来的主库文件可以修 ...

随机推荐

  1. 从华为新发布的WeAutomate 3.0,看RPA如何在政企领域落地生长

    文/王吉伟 11月11日,是电商的重要节日.即便今年双11的气氛不如往年浓烈,人们依旧关注双11厂商战报,关注购物车里的商品有没有降价. 当然在RPA领域,大家除了关注双11的商品价格,更关注华为RP ...

  2. Maven 依赖调解源码解析(六):dependencyManagement 版本锁定

    本文是系列文章<Maven 源码解析:依赖调解是如何实现的?>第六篇,主要介绍 dependencyManagement 版本锁定原则.请按顺序阅读其他系列文章,系列文章总目录参见:htt ...

  3. vue局部过滤器和全局过滤器

    全局过滤器在main.js中写 //注册全局过滤器 Vue.filter('wholeMoneyFormat',(value)=>{   return '¥'+Number(value).toF ...

  4. 关于uni-app导航栏中 中间大图标的设置

    在uni-app的开发过程中,想要将位于中间的图标设置更大,通过一般的更改导航栏图标大小方式实现不了.经过查看官方文档可以发现,我们可以通过midbutton来设置中间tabbar的样式. 但前提是, ...

  5. python3使用concurrent执行多进程任务

    技术背景 随着计算机技术的发展,诸如GPU和超算平台等越来越发达,这些技术的本质其实并没有带来算法上的革新,之所以能够提升计算的速度和规模,很大程度上是因为分布式和并行计算的优势.这里我们介绍一个简单 ...

  6. [linux] 大批量删除任务

    一不小心投了巨多任务,或者投递的资源不合理时,想批量杀掉这些任务. kill的方法就不说了,我这里用qdel的方法. 用了这么一条命令: qstat |sed '1,2d' |awk -F' ' '{ ...

  7. Python基础之数字类型内置方法

    目录 1. 整型内置方法(int) 2. 浮点型内置方法 3. 常用操作 1. 整型内置方法(int) 用途:年龄,号码,等级等 定义: age = 18 常用操作 # 算数运算.比较运算 age = ...

  8. 用C语言的LED实验,有汇编哦!

    C语言LED实验 1.汇编激活CPU 首先要明白对于没有系统开发板(也就是裸机)来说,是没办法直接对C进行识别.所以需要一段汇编语言,来配置CPU的资源,选择CPU运行模式,初始化指针位置. 代码如下 ...

  9. C#数据库连接方式【简版】

    using System;using System.Collections.Generic;using System.ComponentModel;using System.Drawing;using ...

  10. mysql事务控制语言TCL

    Transaction Control Language 事务控制语言 事务:一个或一组sql语句组成一个执行单元,这个执行单元作为不可分割的整体执行.如果某个语句执行错误,整个单元回滚到最初的状态. ...