mysql和mariadb备份工具xtrabackup和mariabackup(mariadb上版本必须用这个)

简介 

  xtraBackup(PXB) 工具是 Percona 公司用 perl 语言开发的一个用于 MySQL 数据库物理热备的备份工具,支持 MySQl(Oracle)、Percona Server 和 MariaDB,而且所有开源,真可谓是业界良心。阿里的 RDS MySQL 物理备份就是基于这个工具作的。因为是采起物理拷贝的方式来作的备份,因此速度很是快,几十G数据几分钟就搞定了,而它巧妙的利用了mysql 特性作到了在线热备份,不用像之前作物理备份那样必须关闭数据库才行,直接在线就能完成整库或者是部分库的全量备份和增量备份。新版本的xtrabackup改为了cmake安装,和之前有点不同。html

版本说明:这里安装的版本是2.4.6,而2.3.3以后不备份死锁了,若是数据库是mysql 5.7以后的必需要装2.4.4才能够用,固然了, 会向下兼容的。mysql

bin/
├── innobackupex -> xtrabackup
├── xbcloud
├── xbcloud_osenv
├── xbcrypt
├── xbstream
└── xtrabackup 

  其中最主要的是 innobackupex 和 xtrabackup,前者是一个 perl 脚本,后者是 C/C++ 编译的二进制。Percona 在2.3 版本用C重写了 innobackupex ,innobackupex 功能所有集成到 xtrabackup 里面,只有一个 binary,另外为了使用上的兼容考虑,innobackupex 做为 xtrabackup 的一个软连接。对于二次开发来讲,2.3 摆脱了以前2个进程协做的负担,架构上明显要好于以前版本。(Percona XtraBackup 2.3 发布以后,推荐的备份方法是使用 xtrabackup 脚本。 )linux

xtrabackup 是用来备份 InnoDB 表的,不能备份非 InnoDB 表,和 mysqld server 没有交互;innobackupex 脚本用来备份非 InnoDB 表,同时会调用 xtrabackup 命令来备份 InnoDB 表,还会和 mysqld server 发送命令进行交互,如加读锁(FTWRL)、获取位点(SHOW SLAVE STATUS)等。简单来讲,innobackupex 在 xtrabackup 之上作了一层封装。正则表达式

通常状况下,咱们是但愿能备份 MyISAM 表的,虽然咱们可能本身不用 MyISAM 表,可是 mysql 库下的系统表是 MyISAM 的,所以备份基本都经过 innobackupex 命令进行;另一个缘由是咱们可能须要保存位点信息。sql

另外几个工具相对小众些,xbcrypt 是加解密备份文件用的;xbstream 相似于tar,是 Percona 本身实现的一种支持并发写的流文件格式;二者在备份和解压时都会用到(若是备份用了加密和并发)。xbcloud 工具的做用是:把所有或部分 xbstream 档案从云上下载或上传到云。数据库

XtraBackup原理

  2.3版本以前 innobackupex 和 xtrabackup 这2个工具之间的交互和协调是经过控制文件的建立和删除来实现的,2.3版本将 innobackupex 功能所有集成到 xtrabackup 里面,也就不须要他们之间的通讯。这里介绍基于老的架构(2.2版本),可是原理和2.3是同样的,只是实现上的差异。centos

PXB 备份过程服务器

  1. innobackupex 在启动后,会先 fork 一个进程,启动 xtrabackup进程,而后就等待 xtrabackup 备份完 ibd 数据文件;
  2. xtrabackup 在备份 InnoDB 相关数据时,是有2种线程的,1种是 redo 拷贝线程,负责拷贝 redo 文件,1种是 ibd 拷贝线程,负责拷贝 ibd 文件;redo 拷贝线程只有一个,在 ibd 拷贝线程以前启动,在 ibd 线程结束后结束。xtrabackup 进程开始执行后,先启动 redo 拷贝线程,从最新的 checkpoint 点开始顺序拷贝 redo 日志;而后再启动 ibd 数据拷贝线程,在 xtrabackup 拷贝 ibd 过程当中,innobackupex 进程一直处于等待状态(等待文件被建立)。
  3. xtrabackup 拷贝完成idb后,通知 innobackupex(经过建立文件),同时本身进入等待(redo 线程仍然继续拷贝);
  4. innobackupex 收到 xtrabackup 通知后,执行FLUSH TABLES WITH READ LOCK (FTWRL),取得一致性位点,而后开始备份非 InnoDB 文件(包括 frm、MYD、MYI、CSV、opt、par等)。拷贝非 InnoDB 文件过程当中,由于数据库处于全局只读状态,若是在业务的主库备份的话,要特别当心,非 InnoDB 表(主要是MyISAM)比较多的话整库只读时间就会比较长,这个影响必定要评估到。
  5. 当 innobackupex 拷贝完全部非 InnoDB 表文件后,通知 xtrabackup(经过删文件) ,同时本身进入等待(等待另外一个文件被建立);
  6. xtrabackup 收到 innobackupex 备份完非 InnoDB 通知后,就中止 redo 拷贝线程,而后通知 innobackupex redo log 拷贝完成(经过建立文件);
  7. innobackupex 收到 redo 备份完成通知后,就开始解锁,执行 UNLOCK TABLES;
  8. 最后 innobackupex 和 xtrabackup 进程各自完成收尾工做,如资源的释放、写备份元数据信息等,innobackupex 等待 xtrabackup 子进程结束后退出。

在上面描述的文件拷贝,都是备份进程直接经过操做系统读取数据文件的,只在执行 SQL 命令时和数据库有交互,基本不影响数据库的运行,在备份非 InnoDB 时会有一段时间只读(若是没有MyISAM表的话,只读时间在几秒左右),在备份 InnoDB 数据文件时,对数据库彻底没有影响,是真正的热备。架构

InnoDB 和非 InnoDB 文件的备份都是经过拷贝文件来作的,可是实现的方式不一样,前者是以page为粒度作的(xtrabackup),后者是 cp 或者 tar 命令(innobackupex),xtrabackup 在读取每一个page时会校验 checksum 值,保证数据块是一致的,而 innobackupex 在 cp MyISAM 文件时已经作了flush(FTWRL),磁盘上的文件也是完整的,因此最终备份集里的数据文件都是写入完整的。并发

增量备份

PXB 是支持增量备份的,可是只能对 InnoDB 作增量,InnoDB 每一个 page 有个 LSN 号,LSN 是全局递增的,page 被更改时会记录当前的 LSN 号,page中的 LSN 越大,说明当前page越新(最近被更新)。每次备份会记录当前备份到的LSN(xtrabackup_checkpoints 文件中),增量备份就是只拷贝LSN大于上次备份的page,比上次备份小的跳过,每一个ibd文件最终备份出来的是增量 delta 文件。

MyISAM 是没有增量的机制的,每次增量备份都是所有拷贝的。

增量备份过程和全量备份同样,只是在 ibd 文件拷贝上有不一样。

恢复过程

若是看恢复备份集的日志,会发现和 mysqld 启动时很是类似,其实备份集的恢复就是相似 mysqld crash后,作一次 crash recover。

恢复的目的是把备份集中的数据恢复到一个一致性位点,所谓一致就是指原数据库某一时间点各引擎数据的状态,好比 MyISAM 中的数据对应的是 15:00 时间点的,InnoDB 中的数据对应的是 15:20 的,这种状态的数据就是不一致的。PXB 备份集对应的一致点,就是备份时FTWRL的时间点,恢复出来的数据,就对应原数据库FTWRL时的状态。

由于备份时 FTWRL 后,数据库是处于只读的,非 InnoDB 数据是在持有全局读锁状况下拷贝的,因此非 InnoDB 数据自己就对应 FTWRL 时间点;InnoDB 的 ibd 文件拷贝是在 FTWRL 前作的,拷贝出来的不一样 ibd 文件最后更新时间点是不同的,这种状态的 ibd 文件是不能直接用的,可是 redo log 是从备份开始一直持续拷贝的,最后的 redo 日志点是在持有 FTWRL 后取得的,因此最终经过 redo 应用后的 ibd 数据时间点也是和 FTWRL 一致的。

因此恢复过程只涉及 InnoDB 文件的恢复,非 InnoDB 数据是不动的。备份恢复完成后,就能够把数据文件拷贝到对应的目录,而后经过mysqld来启动了。

查看数据库支持引擎(mysql和mariadb默认是Innodb引擎):

show engines;

查看数据库表支持的引擎

show create table table_name; 

安装

一、下载地址

  你能够根据本身的需求选择不一样的操做系统和版本(我这里是用最新的版本)

wget https://www.percona.com/downloads/XtraBackup/Percona-XtraBackup-2.4.11/binary/tarball/percona-xtrabackup-2.4.11-Linux-x86_64.libgcrypt145.tar.gz

二、加压缩后,mv更改目录名为xtrabackup,而后加入环境变量方便使用。

export PATH=$PATH:/root/xtrabackup/bin/
source /etc/profile

完整备份

   xtrabackup选项

  xtrabackup 工具备许多参数,具体可去官网查询(xtrabackup 参数选项 | innobackupex 参数选项),这里简单介绍 innobackupex 一些经常使用的参数。

  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)阶段,这对于增量备份很是重要

 

  这里这用的是centos7.4.x和5.5.56-MariaDB MariaDB Server,这里以zabbix数据库备份为背景。

三、建立备份的目录

mkdir -p /data/mysql

四、进行完整备份

innobackupex --defaults-file=/etc/my.cnf --user=root  --password=123456 --socket=/var/lib/mysql/mysql.sock  /data/root

五、查看备份目录(链接数据库,开始拷贝redo log,拷贝innodb表文件,锁表、拷贝非innodb表文件,中止拷贝redo log,解锁。)

  其中zabbix和test、mysql、performance_schema都是已经备份的数据库,backup-my.cnf是备份的my.cnf配置文件。

xtrabackup_checkpoints:备份类型(如彻底或增量)、备份状态(如是否已经为prepared状态)和LSN(日志序列号)范围信息;

 xtrabackup_info:记录备份的基本信息,uuid、备份命令、备份时间、binlog、LSN、以及其余加密压缩等信息。

xtrabackup_logfile:备份的重作日志文件。

 六、全盘恢复

   6.1首先中止数据库服务,并准备好数据的恢复目录(为了避免覆盖原有的数据,建议从新找个位置存放数据库文件,我这里是默认的/var/lib/mysql/),

systemctl stop mariadb

  6.2准备(prepare)一个彻底备份: --apply-log ( /data/root/2018-05-09_01-28-45/ 为备份目录,执行以后 xtrabackup_checkpoints 文件中的 backup_type = full-prepared )

[root@bogon root]# innobackupex --apply-log /data/root/2018-05-09_01-28-45/

  6.3执行恢复操做:

innobackupex  --defaults-file=/etc/my.cnf --copy-back --rsync /data/root/2018-05-09_01-28-45/

  提示咱们这个说原来数据库存放目录是否是空的(它其实说不让咱们在原来的数据库目录恢复,要不你换地方,要不你删除原来全部的数据库文件,我这里为了防止意外,就换个地方)

  

  首先,咱们得修改my.cnf配置文件中数据库存放位置的路径,更改后的目录是咱们刚才新建的目录。

  

  再此执行恢复操做,提示OK。

  

  6.四、刚才咱们中止了mariadb服务,如今咱们除了要开启数据库服务外,还得给新的mysql目录全部文件mysql用的属主和属组的权限。

[root@bogon root]# chown -R mysql.mysql /data/mysql
[root@bogon root]# systemctl start mariadb

  测试,咱们最开始备份了全部全部数据库(备份完成后,我删除了zabbix配置里面的几个监控项,当恢复完成后原来的监控项都已经恢复)

增量备份、恢复

   注意、只有InnoDB引擎支持增量备份,MyISAM只支持完整备份。

  一、首先咱们要对数据库进行一个全备。

innobackupex -uroot -p123456 --socket=/var/lib/mysql/mysql.sock --no-timestamp /data/backup/all_backup

  二、而后咱们修改数据库操做,再进行第一次增量备份。注意,--incremental-basedir=指的是对谁进行增量备份,这里咱们是第一次增量备份,因此这里指的应该是全备。

innobackupex -uroot -p123456 --socket=/var/lib/mysql/mysql.sock  --no-timestamp --incremental /data/backup/incremental-dir-1 --incremental-basedir=/data/backup/all_backup/

  三、而后咱们再对数据库进行修改,再进行第二次增量备份。这里咱们增量的部分是相对第一次增量备份到第二次增量备份的差别部分,因此这里--incremental-basedir=应该是指的第一次增量备份incremental-dir-1

innobackupex -uroot -p123456 --no-timestamp --socket=/var/lib/mysql/mysql.sock  --incremental /data/backup/incremental-dir-2/  --incremental-basedir=/data/backup/incremental-dir-1/

  四、上面咱们对数据库进行了两次不一样的修改,也作了两次增量,下面咱们来看增量备份的恢复方法(为了试验效果明显,我这里删除了两次增量备份增长的部分)。首先咱们要准备一个完整备份(全备)

innobackupex --apply-log --redo-only /data/backup/all_backup/

  五、而后恢复第一次增量备份恢复,注意:只要不是最后一次增量备份的恢复,都须要加上--redo-only参数。

innobackupex --apply-log --redo-only /data/backup/all_backup/  --incremental-dir=/data/backup/incremental-dir-1

  六、第二次增量备份的恢复,这里是最后一次增量备份的恢复,因此不用加--redo-only参数。

innobackupex --apply-log /data/backup/all_backup/  --incremental-dir=/data/backup/incremental-dir-2

  七、将两次增量备份,合并到完整备份中(合并完成后,跟完整备份的恢复方法同样)

innobackupex --apply-log /data/backup/all_backup/

  八、为了数据一致性,先中止mariadb数据库服务。这里咱们的数据库文件目录是/var/lib/mysql下,我给他换个位置到/data/mysql(你也能够直接mv  /var/lib/mysql  var/lib/mysql.bak,而后再新建一个mysql目录),记得要修改/etc/my.cnf文件中datadir=路径。

mkdir -p /data/mysql

  九、恢复的目录有了,咱们下面开始恢复,想到与被上面合成到一块儿的增量备份文件copy到/data/mysql/这个目录下。

innobackupex --copy-back /data/backup/all_backup/

  十、只恢复文件还不行,这会儿/data/mysql/下的文件(包含一级目录都是属主和属组都是root,,咱们须要给mysql权限)

chown mysql:mysql -R /data/mysql/

  十一、启动数据库服务,增量备份的备份和恢复完整。

systemctl restart  mariadb

差别备份、恢复(建议使用)

   增量备份的优缺点:

  一、上面咱们说了xtrabackup的增量备份和恢复,增量备份有它的好处,就是每次进行相对上次备份有不一样的地方进行备份,可是中间若是哪一个备份挂了(丢失了),那就无法恢复了,并且增量备份通常都是每间隔几个小时备份一次(最次也得天天进行一次增量备份)。恢复起来实际上是很麻烦的,可能须要你恢复的时候,增量备份已经好几百个了,除非你写脚本,不然我的感受很麻烦的。

  二、咱们知道增量备份的时候有个参数--incremental-dir=,它的意思是根据以前的哪次备份进行差别性备份,之前增量状况是首先一个全备,第一次增量的作法是根据全备进行备份,第二次增量备份的作法是根据第一次增量备份进行备份,依次类推。很麻烦。

  三、既然能够指定根据哪次作增量备份,咱们就直接每次根据完整备份进行增量备份----差别备份。这样作的好处是恢复时候只须要恢复最后一次增量备份就行,缺点是咱们每次都是根据完整备份进行备份,长时间下去会占用空间很大。

备份:

一、首先进行一次完整备份

innobackupex -uroot -p123456 --socket=/var/lib/mysql/mysql.sock --no-timestamp /data/backup/all_backup

二、第一次次增量备份

innobackupex -uroot -p123456 --socket=/var/lib/mysql/mysql.sock  --no-timestamp --incremental /data/backup/incremental-dir-1 --incremental-basedir=/data/backup/all_backup/

三、第二次增量备份

innobackupex -uroot -p123456 --socket=/var/lib/mysql/mysql.sock  --no-timestamp --incremental /data/backup/incremental-dir-2 --incremental-basedir=/data/backup/all_backup/

四、第三次增量备份

innobackupex -uroot -p123456 --socket=/var/lib/mysql/mysql.sock  --no-timestamp --incremental /data/backup/incremental-dir-3 --incremental-basedir=/data/backup/all_backup/

注意,上面咱们每次备份都是根据完整备份进行增量备份的。

恢复:

一、首先准备一个全备

innobackupex --apply-log --redo-only /data/backup/all_backup/

二、恢复最后一次备份,这里恢复是确定最后一次恢复,因此不用加--redo-only参数

innobackupex --apply-log /data/backup/all_backup/  --incremental-dir=/data/backup/incremental-dir-3

三、将增量备份合并到完整备份中。

innobackupex --apply-log /data/backup/all_backup/

四、为了数据一致性,先中止mariadb数据库服务。这里咱们的数据库文件目录是/var/lib/mysql下,我给他换个位置到/data/mysql(你也能够直接mv  /var/lib/mysql  var/lib/mysql.bak,而后再新建一个mysql目录),记得要修改/etc/my.cnf文件中datadir=路径。

mkdir -p /data/mysql

五、恢复的目录有了,咱们下面开始恢复,想到与被上面合成到一块儿的增量备份文件copy到/data/mysql/这个目录下。

innobackupex --copy-back /data/backup/all_backup/

六、只恢复文件还不行,这会儿/data/mysql/下的文件(包含一级目录都是属主和属组都是root,,咱们须要给mysql权限)

chown mysql:mysql -R /data/mysql/

七、启动数据库服务,增量备份的备份和恢复完整。

systemctl restart  mariadb

注意:

  一、完整备份须要备份到另一个位置,若是你恢复失败的,你的完整备份里面的参数也会跟着改变了,这个时候须要再恢复就困难了。相反我只须要把完整备份的备份cp到完整备份的目录里面就OK了,能够接着折腾了。

  二、若是你不备份你的完整备份,一旦恢复失败,想要从新恢复,那你就等着哭吧。

参考与:https://www.linuxidc.com/Linux/2017-03/142380.htm

 

mariadb10.1以上版本使用的是mariabackup这个备份工具,而不是 xtrabackup,mariabackup是要单独安装的。安装完后按照一下步骤操做:

yum -y  install MariaDB-backup

  

源服务器:

  注意:这里若是你备份的是10.3的版本数据库,必定要以10.3版本的数据恢复,不然将没法恢复,亲测,10.3.8的版本文件没法在10.1.34上没法恢复。

一、源服务器建立一个备份的目标目录,例如mkdir var/databasebackup,附加读写权限;

二、用mariabackup --backup --target-dir /data/mysqlbak --user username --password userpassword ,备份的是服务器上全部数据库,固然你也能够加参数--databases来指定要备份数据库;

目标服务器:

一、一样创建一个还原的目标目录,例如mkdir /data/mysqlbak,附加读写权限;

二、把源服务器上备份的数据库文件拷贝到目标服务器/data/mysqlbak下;

三、先用mariabackup --prepare --target-dir /data/mysqlbak --user username --password userpassword,将备份文件规范化,这里能够得到备份文件的备份log节点,有助于主从同步使用,假如你有主从同步的话;

四、用 mariabackup --copy-back --target-dir /data/mysqlbak --user username --password userpassword ,来还原数据库;(记住在还原前清掉数据库目录)

五、将数据库文件附上数据库权限,chown -R mysql:mysql /var/lib/mysql

六、重启服务器systemctl restart mysql。

 https://blog.csdn.net/qooer_tech/article/details/80811615

相关文章
相关标签/搜索