xtrabackup备份原理xtrabackup远程备份及恢复xtrabackup 远程备份




xtrabackup备份原理xtrabackup远程备份及恢复xtrabackup 远程备份

2022-07-21 2:27:04 网络知识 官方管理员

一、Xtrabackup介绍

  MySQL冷备、mysqldump、MySQL热拷贝都无法实现对数据库进行增量备份。在实际生产环境中增量备份是非常实用的,如果数据大于50G或100G,存储空间足够的情况下,可以每天进行完整备份,如果每天产生的数据量较大,需要定制数据备份策略。例如每周实用完整备份,周一到周六实用增量备份。而Percona-Xtrabackup就是为了实现增量备份而出现的一款主流备份工具,xtrabakackup有2个工具,分别是xtrabakup、innobakupe。

  Percona-xtrabackup是Percona公司开发的一个用于MySQL数据库物理热备的备份工具,支持MySQL、Perconaserver和MariaDB,开源免费,是目前较为受欢迎的主流备份工具。xtrabackup只能备份innoDB和xtraDB两种数据引擎的表,而不能备份MyISAM数据表。

二、Xtrabackup优点

(1)备份速度快,物理备份可靠

(2)备份过程不会打断正在执行的事务(无需锁表)

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

(4)自动备份校验

(5)还原速度快

(6)可以流传将备份传输到另外一台机器上

(7)在不增加服务器负载的情况备份数据

三、Xtrabackup备份原理

Xtrabackup备份流程图:

xtrabackup备份原理(xtrabackup远程备份及恢复)(1)

(1)innobackupex启动后,会先fork一个进程,用于启动xtrabackup,然后等待xtrabackup备份ibd数据文件

(2)xtrabackup在备份innoDB数据是,有2种线程:redo拷贝线程和ibd数据拷贝线程。xtrabackup进程开始执行后,会启动一个redo拷贝的线程,用于从最新的checkpoint点开始顺序拷贝redo.log;再启动ibd数据拷贝线程,进行拷贝ibd数据。这里是先启动redo拷贝线程的。在此阶段,innobackupex进行处于等待状态(等待文件被创建)

(4)xtrabackup拷贝完成ibd数据文件后,会通知innobackupex(通过创建文件),同时xtrabackup进入等待状态(redo线程依旧在拷贝redo.log)

(5)innobackupex收到xtrabackup通知后哦,执行FLUSHTABLESWITHREADLOCK(FTWRL),取得一致性位点,然后开始备份非InnoDB文件(如frm、MYD、MYI、CSV、opt、par等格式的文件),在拷贝非InnoDB文件的过程当中,数据库处于全局只读状态。

(6)当innobackup拷贝完所有的非InnoDB文件后,会通知xtrabackup,通知完成后,进入等待状态;

(7)xtrabackup收到innobackupex备份完成的通知后,会停止redo拷贝线程,然后通知innobackupex,redo.log文件拷贝完成;

(8)innobackupex收到redo.log备份完成后,就进行解锁操作,执行:UNLOCKTABLES;

(9)最后innbackupex和xtrabackup进程各自释放资源,写备份元数据信息等,innobackupex等xtrabackup子进程结束后退出。

四、xtrabackup的安装部署以及备份恢复实现

1、xtrabackup的安装

软件包:见附件【附带依赖包】

或者官网下载:https://www.percona.com/downloads/XtraBackup/LATEST/

可以选择rpm包方式安装,也可以下载源码包编译安装,这里直接采用rpm包的方式进行安装,安装过程省略

Xtrabackup中主要包含两个工具:

xtrabackup:是用于热备innodb,xtradb表中数据的工具,不能备份其他类型的表,也不能备份数据表结构;

innobackupex:是将xtrabackup进行封装的perl脚本,提供了备份myisam表的能力;

常用选项:--host指定主机--user指定用户名--password指定密码--port指定端口--databases指定数据库--incremental创建增量备份--incremental-basedir指定包含完全备份的目录--incremental-dir指定包含增量备份的目录--apply-log对备份进行预处理操作,一般情况下,在备份完成后,数据尚且不能用于恢复操作,因为备份的数据中可能会包含尚未提交的事务或已经提交但尚未同步至数据文件中的事务。因此,此时数据文件仍处理不一致状态。“准备”的主要作用正是通过回滚未提交的事务及同步已经提交的事务至数据文件也使得数据文件处于一致性状态。--redo-only不回滚未提交事务--copy-back恢复备份目录一些常用的其他可选参数:--lock-wait-query-type该参数允许用户指定,哪类的SQL语句是需要Flushtablewithreadlock等待的--lock-wait-threshold运行超过这个时间的查询才算长查询--lock-wait-timeout等待长查询多少时间后再尝试FTWRL,一旦Flushtablewithreadlock被阻塞超过预定时间,则XtraBackup出错返回退出,参数允许用户指定了超过该阈值时间的查询会被Kill,同时也允许用户指定Kill

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

xtrabackup_checkpoints--备份类型(如完全或增量)、备份状态(如是否已经为prepared状态)和LSN(日志序列号)范围信息:每个InnoDB页(通常为16k大小)都会包含一个日志序列号,即LSN,LSN是整个数据库系统的系统版本号,每个页面相关的LSN能够表明此页面最近是如何发生改变的。xtrabackup_binlog_info--mysql服务器当前正在使用的二进制日志文件及备份这一刻位置二进制日志时间的位置。xtrabackup_binlog_pos_innodb--二进制日志文件及用于InnoDB或XtraDB表的二进制日志文件的当前position。xtrabackup_binary--备份中用到的xtrabackup的可执行文件;backup-my.cnf--备份命令用到的配置选项信息在使用innobackupex进行备份时,还可以使用--no-timestamp选项来阻止命令自动创建一个以时间命名的目录:如此一来,innobackupex命令将会创建一个BACKUP-DIR目录来存储备份数据。

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

mysql>CREATEUSER'test'@'localhost'IDENTIFIEDBY'fxkjnj.com';  #创建用户mysql>REVOKEALLPRIVILEGES,GRANTOPTIONFROM'test';  #回收此用户所有权限mysql>GRANTRELOAD,LOCKTABLES,RELICATIONCLIENTON*.*TO'test'@'localhost'; #授权刷新、锁定表、用户查看服务器状态mysql>FLUSHPRIVILEGES;  #刷新授权表

2、xtrabackup全量备份与恢复

备份:1、innobackupex--user=DBUSER--password=DBUSERPASS--defaults-file=/etc/my.cnf/path/to/BACKUP-DIR/2、拷贝数据到远程主机上:scp恢复:1、停止数据库2、删除数据库目录下的数据3、innobackupex--apply-log/backups/2018-07-30_11-04-55/4、innobackupex--copy-back--defaults-file=/etc/my.cnf/backups/2018-07-30_11-04-55/

实战演示:

(1)全量备份[root@masterbackups]#innobackupex--user=root--password=123456--host=127.0.0.1/backups/  #在master上进行全库备份#语法解释说明:#--user=root指定备份用户#--password=123456指定备份用户密码#--host  指定主机#/backups  指定备份目录[root@masterbackups]#lltotal0drwxr-x---7rootroot232Jul3011:012018-07-30_11-01-37[root@masterbackups]#ll2018-07-30_11-01-37/  #查看备份数据total77856-rw-r-----1rootroot418Jul3011:01backup-my.cnf  #备份用到的配置选项信息文件-rw-r-----1rootroot79691776Jul3011:01ibdata1  #数据文件drwxr-x---2rootroot20Jul3011:01kimdrwxr-x---2rootroot4096Jul3011:01mysqldrwxr-x---2rootroot4096Jul3011:01performance_schemadrwxr-x---2rootroot20Jul3011:01reppppdrwxr-x---2rootroot4096Jul3011:01wordpress-rw-r-----1rootroot21Jul3011:01xtrabackup_binlog_info  #mysql服务器当前正在使用的二进制日志文件和此时二进制日志时间的位置信息文件-rw-r-----1rootroot113Jul3011:01xtrabackup_checkpoints  #备份的类型、状态和LSN状态信息文件-rw-r-----1rootroot482Jul3011:01xtrabackup_info-rw-r-----1rootroot2560Jul3011:01xtrabackup_logfile    #备份的日志文件(2)恢复,停止slave上的mysql[root@slave~]#/etc/init.d/mysqldstop  ShuttingdownMySQL..SUCCESS!(3)从库也安装上xtrabackup[root@slavetools]#yuminstall-ypercona-xtrabackup-24-2.4.9-1.el7.x86_64.rpm  #安装xtrabackup(4)从master上拷贝备份[root@masterbackups]#scp-r2018-07-30_11-01-37/root@192.168.56.12:/backups/(5)合并数据,使数据文件处于一致性的状态[root@slavetools]#innobackupex--apply-log/backups/2018-07-30_11-01-37/18072923:18:23innobackupex:Startingtheapply-logoperationIMPORTANT:Pleasecheckthattheapply-logruncompletessuccessfully.Attheendofasuccessfulapply-logruninnobackupexprints"completedOK!".innobackupexversion2.4.9basedonMySQLserver5.7.13Linux(x86_64)(revisionid:a467167cdd4)xtrabackup:cdto/backups/2018-07-30_11-01-37/xtrabackup:Thistargetseemstobenotpreparedyet.InnoDB:Numberofpools:1xtrabackup:xtrabackup_logfiledetected:size=8388608,start_lsn=(3127097)......InnoDB:FTSoptimizethreadexiting.InnoDB:Startingshutdown...InnoDB:Shutdowncompleted;logsequencenumber312991518072923:18:30completedOK!(6)在slave上删除原有的数据[root@slave~]#rm-rf/usr/local/mysql/data/(7)确保my.cnf的数据目录路径,否则会报错,要和master的/etc/my.cnf配置一致[root@slave~]#vim/etc/my.cnf.......datadir=/usr/local/mysql/data..................(8)在slave上数据恢复[root@slave~]#innobackupex--copy-back/backups/2018-07-30_11-01-37/  18072923:32:03innobackupex:Startingthecopy-backoperationIMPORTANT:Pleasecheckthatthecopy-backruncompletessuccessfully.Attheendofasuccessfulcopy-backruninnobackupexprints"completedOK!".......18072923:32:08completedOK!  #看到completedOK就是恢复正常了(9)查看slave上查看数据目录可以看到数据已经恢复,但是属主会有问题,需要进行修改,所以一般使用mysql的运行用户进行恢复,否则需要进行修改属主和属组信息,,够改为mysql用户权限[root@slave~]#ll/usr/local/mysql/data/total188432-rw-r-----1rootroot79691776Jul2923:32ibdata1-rw-r-----1rootroot50331648Jul2923:32ib_logfile0-rw-r-----1rootroot50331648Jul2923:32ib_logfile1-rw-r-----1rootroot12582912Jul2923:32ibtmp1drwxr-x---2rootroot20Jul2923:32kimdrwxr-x---2rootroot4096Jul2923:32mysqldrwxr-x---2rootroot4096Jul2923:32performance_schemadrwxr-x---2rootroot20Jul2923:32reppppdrwxr-x---2rootroot4096Jul2923:32wordpress-rw-r-----1rootroot482Jul2923:32xtrabackup_info(10)修改属主属组为mysql[root@slave~]#chown-Rfmysql:mysql/usr/local/mysql/data/  (11)启动mysql[root@slave~]#/etc/init.d/mysqldstart  StartingMySQL.SUCCESS!或者[root@slave~]#systemctlstartmysqld(12)查看数据,是否恢复[root@slave~]#mysql-uroot-p-e"showdatabases;"Enterpassword:+--------------------+|Database|+--------------------+|information_schema||kim||mysql||performance_schema||repppp||wordpress|+--------------------+

总结全库备份与恢复三步曲:

a. innobackupex全量备份,并指定备份目录路径,拷贝数据到远程主机;

b. 在恢复前,需要使用--apply-log参数先进行合并数据文件,确保数据的一致性要求;

c. 恢复时,直接使用--copy-back参数进行恢复,需要注意的是,在my.cnf中要指定数据文件目录的路径。

3、xtrabackup增量备份与恢复

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

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

--incremental创建增量备份

--incremental-basedir指定包含完全备份的目录

--incremental-dir指定包含增量备份的目录

(1)先全量备份[root@masterbackups]#innobackupex--user=root--password=123456--host=127.0.0.1/backups/#全备数据[root@master~]#mysql-uroot-p  #在master上创建student库并创建testtb表插入若干数据Enterpassword:mysql>createdatabasestudent;QueryOK,1rowaffected(0.03sec)mysql>usestudent;Databasechangedmysql>createtabletesttb(idint);QueryOK,0rowsaffected(0.07sec)mysql>insertintotesttbvalues(1),(10),(99);QueryOK,3rowsaffected(0.04sec)Records:3Duplicates:0Warnings:0mysql>select*fromtesttb;+------+|id|+------+|1||10||99|+------+3rowsinset(0.00sec)mysql>quit;Bye(2)使用innobackupex进行增量备份[root@masterbackups]#innobackupex--user=root--password=123456--host=127.0.0.1--incremental/backups/--incremental-basedir=/backups/2018-07-30_11-01-37/......18073013:51:50ExecutingUNLOCKTABLES18073013:51:50Alltablesunlocked18073013:51:50Backupcreatedindirectory'/backups/2018-07-30_13-51-47/'MySQLbinlogposition:filename'mysql-bin.000005',position'664'18073013:51:50[00]Writing/backups/2018-07-30_13-51-47/backup-my.cnf18073013:51:50[00]...done18073013:51:50[00]Writing/backups/2018-07-30_13-51-47/xtrabackup_info18073013:51:50[00]...donextrabackup:Transactionlogoflsn(3158741)to(3158741)wascopied.18073013:51:50completedOK!(3)查看备份数据[root@masterbackups]#ll  total0drwxr-x---7rootroot232Jul3011:012018-07-30_11-01-37  #全量备份数据目录drwxr-x---8rootroot273Jul3013:512018-07-30_13-51-47  #增量备份数据目录[root@master2018-07-30_11-01-37]#catxtrabackup_checkpoints#查看全量备份的xtrabackup_checkpointsbackup_type=full-backuped  #备份类型为全量备份from_lsn=0  #lsn从0开始to_lsn=3127097  #lsn到3127097结束last_lsn=3127097compact=0recover_binlog_info=0(4)查看增量备份的xtrabackup_checkpoints[root@master2018-07-30_13-51-47]#catxtrabackup_checkpoints  backup_type=incremental  #备份类型为增量备份from_lsn=3127097  #lsn从3127097开始to_lsn=3158741  #lsn到啊3158741结束last_lsn=3158741  compact=0recover_binlog_info=0(5)模拟mysql故障,删除数据目录所有数据[root@master~]#/etc/init.d/mysqldstop  #模拟mysql故障,停止mysqlShuttingdownMySQL..SUCCESS![root@master~]#rm-rf/usr/local/mysql/data/*  #删除数据目录中的所有数据(6)合并全备数据目录,确保数据的一致性[root@master~]#innobackupex--apply-log--redo-only/backups/2018-07-30_11-01-37/18073014:05:27innobackupex:Startingtheapply-logoperationIMPORTANT:Pleasecheckthattheapply-logruncompletessuccessfully.Attheendofasuccessfulapply-logruninnobackupexprints"completedOK!".innobackupexversion2.4.9basedonMySQLserver5.7.13Linux(x86_64)(revisionid:a467167cdd4)xtrabackup:cdto/backups/2018-07-30_11-01-37/............xtrabackup:startingshutdownwithinnodb_fast_shutdown=1InnoDB:Startingshutdown...InnoDB:Shutdowncompleted;logsequencenumber3127106InnoDB:Numberofpools:118073014:05:29completedOK!(7)将增量备份数据合并到全备数据目录当中[root@master~]#innobackupex--apply-log--redo-only/backups/2018-07-30_11-01-37/--incremental-dir=/backups/2018-07-30_13-51-47/18073014:06:42innobackupex:Startingtheapply-logoperationIMPORTANT:Pleasecheckthattheapply-logruncompletessuccessfully.Attheendofasuccessfulapply-logruninnobackupexprints"completedOK!".............18073014:06:44[00]...done18073014:06:44completedOK![root@master~]#cat/backups/2018-07-30_11-01-37/xtrabackup_checkpointsbackup_type=log-applied  #查看到数据备份类型是增加from_lsn=0  #lsn从0开始to_lsn=3158741  #lsn结束号为最新的lsnlast_lsn=3158741compact=0recover_binlog_info=0(8)恢复数据[root@master~]#innobackupex--copy-back/backups/2018-07-30_11-01-37/18073014:07:51innobackupex:Startingthecopy-backoperationIMPORTANT:Pleasecheckthatthecopy-backruncompletessuccessfully.Attheendofasuccessfulcopy-backruninnobackupexprints"completedOK!"...............18073014:08:17[01]...done18073014:08:17completedOK![root@master~]#ll/usr/local/mysql/data/total77844-rw-r-----1rootroot79691776Jul3014:08ibdata1drwxr-x---2rootroot20Jul3014:08kimdrwxr-x---2rootroot4096Jul3014:08mysqldrwxr-x---2rootroot4096Jul3014:08performance_schemadrwxr-x---2rootroot20Jul3014:08reppppdrwxr-x---2rootroot56Jul3014:08studentdrwxr-x---2rootroot4096Jul3014:08wordpress-rw-r-----1rootroot21Jul3014:08xtrabackup_binlog_pos_innodb-rw-r-----1rootroot554Jul3014:08xtrabackup_info[root@master~]#chown-Rmysql.mysql/usr/local/mysql/data  #更改数据的属主属组[root@master~]#/etc/init.d/mysqldstart  #启动mysqlStartingMySQL.Loggingto'/usr/local/mysql/data/master.err'...SUCCESS![root@master~]#mysql-uroot-p-e"showdatabases;"  #查看数据是否恢复Enterpassword:+--------------------+|Database|+--------------------+|information_schema||kim||mysql||performance_schema||repppp||student||wordpress|+--------------------+

总结:

(1)增量备份需要使用参数--incremental指定需要备份到哪个目录,使用incremental-dir指定全备目录;

(2)进行数据备份时,需要使用参数--apply-logredo-only先合并全备数据目录数据,确保全备数据目录数据的一致性;

(3)再将增量备份数据使用参数--incremental-dir合并到全备数据当中;

(4)最后通过最后的全备数据进行恢复数据,注意,如果有多个增量备份,需要逐一合并到全备数据当中,再进行恢复。

五、xtrabackup异机远程流式备份

1、xtrabackup异机远程流式备份脚本

备注:

  • 需要提前在数据库主机上安装好xtrabackup备份软件
  • 需要有免密环境(到远程主机上)
  • 采用流备份的方式,短时间内网络流量不会很高,数据库压力也不会太大
  • 删除远程主机上超过30天以上的备份文件

[root@master~]#vim/home/data/backup/xtrbackup_full.sh

#!/bin/bash#Author:fxkjnj.com########################################################xtrabackupscript##backupdataatremotehost##youshouldconfigsshtrust####Usage:##1.Youmustcheckandmodifythevariable##invariablesection########################################################MSNAME=yzBAKDIR=/home/data/backup/xtrbackupBAKFILE=$MSNAME-`date+%Y%m%d%H%M`LOGFILE=$MSNAME-`date+%Y%m%d%H%M`.logROOTPWD=r123d$&*#!REMOTE_HOST=vmuser@10.114.0.15REMOTE_BAKDIR=/data/xtrbackupMYCNF=/etc/my.cnf/usr/bin/innobackupex--defaults-file=$MYCNF--user=root--password=$ROOTPWD--host=127.0.0.1\--lock-wait-threshold=40--lock-wait-query-type=all--lock-wait-timeout=180--kill-long-queries-timeout=20--kill-long-query-type=all\--stream=tar$BAKDIR2>$BAKDIR/$LOGFILE|ssh$REMOTE_HOST"cat->$REMOTE_BAKDIR/$BAKFILE.tar"#checkbackuplogCHECKOK=`tail-1$BAKDIR/$LOGFILE|grep"completedOK\!"|wc-l`if[$CHECKOK-ne1]thenecho"[WARNING]Backupfailed!"exitfi#cleanbackuppiece,delete3daybeforessh$REMOTE_HOST"find$REMOTE_BAKDIR/$MSNAME*-mtime+30-typef-maxdepth1|xargsrm-rf{}"

2、设置定时任务

[root@master~]#crontab-e

#xtrbackup备份,每天夜里凌晨2点02分0202***bash/home/data/backup/xtrbackup_full.sh


3、登陆到远程备份主机上查看备份的文件

[root@backupxtrbackup]#ll/data/xtrbackup/total11279944-rw-rw-r--.1tsingyuntsingyun1643324416Aug1909:36yz-202108190935.tar-rw-rw-r--.1tsingyuntsingyun1643275776Aug1909:38yz-202108190937.tar-rw-rw-r--.1tsingyuntsingyun1643277312Aug1909:39yz-202108190938.tar-rw-rw-r--.1tsingyuntsingyun1644345856Aug2002:02yz-202108200202.tar-rw-rw-r--.1tsingyuntsingyun1645821952Aug2102:02yz-202108210202.tar-rw-rw-r--.1tsingyuntsingyun1665288704Aug2202:02yz-202108220202.tar-rw-rw-r--.1tsingyuntsingyun1665287680Aug2302:02yz-202108230202.tar[root@backupxtrbackup]#du-sh/data/xtrbackup/*1.6G/data/xtrbackup/yz-202108190935.tar1.6G/data/xtrbackup/yz-202108190937.tar1.6G/data/xtrbackup/yz-202108190938.tar1.6G/data/xtrbackup/yz-202108200202.tar1.6G/data/xtrbackup/yz-202108210202.tar1.6G/data/xtrbackup/yz-202108220202.tar1.6G/data/xtrbackup/yz-202108230202.tar

发表评论:

最近发表
网站分类
标签列表