博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
MySQL物理备份xtrabackup-innobackupex20210304
阅读量:4172 次
发布时间:2019-05-26

本文共 23532 字,大约阅读时间需要 78 分钟。

MySQL物理备份xtrabackup-innobackupex20210304

 

概述

物理备份:二进制文件,不可编辑,数据库变化,数据库的一个副本(逻辑备份是SQL文件,可编辑)。

特点:

1)由数据文件和目录组成,是mysql数据目录的部拷贝/部分拷贝。

2〉速度快,文件复制

3) 备份粒度小

4)除了备份数据以外,还可以备份日志和配置文件

适合场景:最合适大数据量的备份,比如百GB,TB。

物理备份方法:

1) xtrabackup(percona公司开源免费的,早期对应的官方收费版本innobackup)

2) mysql enterprise backup(MEB/mysqlbackup),官方收费

一 xtrabackup工具介绍

目前2018年5月的版本:2.4.11,在2.3.3之前备份会产生死锁,在2.3.3之后就不再死锁了。

支持官方mysql、 Percona、MariaDB,支持在线热备,备份速度快,支持压缩,支持加密,支持自动实现备份验证,恢复速度快,支持在线迁移表,支持创建一个slave从库。支持并行,支持全备/增量备份/部分备份。

XtraBackup产品有两个工具: innobackupex(老) ,xtrbackup(新)

二 xtrabackup安装

首先查看 本操作系统支持的加密协议,在下载对应的软件。

[root@mysqldb ~]# rpm -qa | grep libgcrypt

libgcrypt-1.4.5-12.el6_8.x86_64

老版本2.4.20最合适

 

 

 

tar -zxvf percona-xtrabackup-2.4.20-Linux-x86_64.el6.libgcrypt145.tar.gz

 

/mysql/app/xtrabackup/bin

vim /root/.bash_profile

vim ~/.bash_profile

PATH=$PATH:/mysql/app/mysql/bin:/mysql/app/xtrabackup/bin:$HOME/bin

 

source ~/.bash_profile

 

[root@mysqldb bin]# xtrabackup --version

xtrabackup: recognized server arguments:

xtrabackup version 2.4.20 based on MySQL server 5.7.26 Linux (x86_64) (revision id: c8b4056)

三 xtrabackup的相关参数介绍

3.1 innobackupex相关参数介绍

innobackupex --help:

 

1 备份相关的参数

 

innobackupex [--compress] [--compress-threads=NUMBER-OF-THREADS] [--compress-chunk-size=CHUNK-SIZE]

             [--encrypt=ENCRYPTION-ALGORITHM] [--encrypt-threads=NUMBER-OF-THREADS] [--encrypt-chunk-size=CHUNK-SIZE]

             [--encrypt-key=LITERAL-ENCRYPTION-KEY] | [--encryption-key-file=MY.KEY]

             [--include=REGEXP] [--user=NAME]

             [--password=WORD] [--port=PORT] [--socket=SOCKET]

             [--no-timestamp] [--ibbackup=IBBACKUP-BINARY]

             [--slave-info] [--galera-info] [--stream=tar|xbstream]

             [--defaults-file=MY.CNF] [--defaults-group=GROUP-NAME]

             [--databases=LIST] [--no-lock]

             [--tmpdir=DIRECTORY] [--tables-file=FILE]

             [--history=NAME]

             [--incremental] [--incremental-basedir]

             [--incremental-dir] [--incremental-force-scan] [--incremental-lsn]

             [--incremental-history-name=NAME] [--incremental-history-uuid=UUID]

             [--close-files] [--compact]    

             BACKUP-ROOT-DIR

                     

--compress:该选项表示压缩innodb数据文件的备份。

--compress-threads:该选项表示并行压缩worker线程的数量。

--compress-chunk-size:该选项表示每个压缩线程worker buffer的大小,单位是字节,默认是64K。

--encrypt:该选项表示通过ENCRYPTION_ALGORITHM的算法加密innodb数据文件的备份,目前支持的算法有ASE128,AES192,AES256。

--encrypt-threads:该选项表示并行加密的worker线程数量。

--encrypt-chunk-size:该选项表示每个加密线程worker buffer的大小,单位是字节,默认是64K。

--encrypt-key:该选项使用合适长度加密key,因为会记录到命令行,所以不推荐使用。

--encryption-key-file:该选项表示文件必须是一个简单二进制或者文本文件,加密key可通过以下命令行命令生成:openssl rand -base64 24。

--include:该选项表示使用正则表达式匹配表的名字[db.tb],要求为其指定匹配要备份的表的完整名称,即databasename.tablename。

--user:该选项表示备份账号。

--password:该选项表示备份的密码。

--port:该选项表示备份数据库的端口。

--host:该选项表示备份数据库的地址。

--databases:该选项接受的参数为数据名,如果要指定多个数据库,彼此间需要以空格隔开;如:"xtra_test dba_test",同时,在指定某数据库时,也可以只指定其中的某张表。如:"mydatabase.mytable"。该选项对innodb引擎表无效,还是会备份所有innodb表。此外,此选项也可以接受一个文件为参数,文件中每一行为一个要备份的对象。

--tables-file:该选项表示指定含有表列表的文件,格式为database.table,该选项直接传给--tables-file。

--socket:该选项表示mysql.sock所在位置,以便备份进程登录mysql。

--no-timestamp:该选项可以表示不要创建一个时间戳目录来存储备份,指定到自己想要的备份文件夹。

--ibbackup:该选项指定了使用哪个xtrabackup二进制程序。IBBACKUP-BINARY是运行percona xtrabackup的命令。这个选项适用于xtrbackup二进制不在你是搜索和工作目录,如果指定了该选项,innoabackupex自动决定用的二进制程序。

--slave-info:该选项表示对slave进行备份的时候使用,打印出master的名字和binlog pos,同样将这些信息以change master的命令写入xtrabackup_slave_info文件。可以通过基于这份备份启动一个从库。

--safe-slave-backup:该选项表示为保证一致性复制状态,这个选项停止SQL线程并且等到show status中的slave_open_temp_tables为0的时候开始备份,如果没有打开临时表,bakcup会立刻开始,否则SQL线程启动或者关闭知道没有打开的临时表。如果slave_open_temp_tables在--safe-slave-backup-timeount(默认300秒)秒之后不为0,从库sql线程会在备份完成的时候重启。

--rsync:该选项表示通过rsync工具优化本地传输,当指定这个选项,innobackupex使用rsync拷贝非Innodb文件而替换cp,当有很多DB和表的时候会快很多,不能--stream一起使用。

--kill-long-queries-timeout:该选项表示从开始执行FLUSH TABLES WITH READ LOCK到kill掉阻塞它的这些查询之间等待的秒数。默认值为0,不会kill任何查询,使用这个选项xtrabackup需要有Process和super权限。

--kill-long-query-type:该选项表示kill的类型,默认是all,可选select。

--ftwrl-wait-threshold:该选项表示检测到长查询,单位是秒,表示长查询的阈值。

--ftwrl-wait-query-type:该选项表示获得全局锁之前允许那种查询完成,默认是ALL,可选update。

--galera-info:该选项表示生成了包含创建备份时候本地节点状态的文件xtrabackup_galera_info文件,该选项只适用于备份PXC。

--stream:该选项表示流式备份的格式,backup完成之后以指定格式到STDOUT,目前只支持tar和xbstream。

--defaults-file:该选项指定了从哪个文件读取MySQL配置,必须放在命令行第一个选项的位置。

--defaults-extra-file:该选项指定了在标准defaults-file之前从哪个额外的文件读取MySQL配置,必须在命令行的第一个选项的位置。一般用于存备份用户的用户名和密码的配置文件。

----defaults-group:该选项表示从配置文件读取的组,innobakcupex多个实例部署时使用。

--no-lock:该选项表示关闭FTWRL的表锁,只有在所有表都是Innodb表并且不关心backup的binlog pos点,如果有任何DDL语句正在执行或者非InnoDB正在更新时(包括mysql库下的表),都不应该使用这个选项,后果是导致备份数据不一致,如果考虑备份因为获得锁失败,可以考虑--safe-slave-backup立刻停止复制线程。

--tmpdir:该选项表示指定--stream的时候,指定临时文件存在哪里,在streaming和拷贝到远程server之前,事务日志首先存在临时文件里。在 使用参数stream=tar备份的时候,你的xtrabackup_logfile可能会临时放在/tmp目录下,如果你备份的时候并发写入较大的话 xtrabackup_logfile可能会很大(5G+),很可能会撑满你的/tmp目录,可以通过参数--tmpdir指定目录来解决这个问题。

--history:该选项表示percona server 的备份历史记录在percona_schema.xtrabackup_history表。

--incremental:该选项表示创建一个增量备份,需要指定--incremental-basedir。

--incremental-basedir:该选项表示接受了一个字符串参数指定含有full backup的目录为增量备份的base目录,与--incremental同时使用。

--incremental-dir:该选项表示增量备份的目录。

--incremental-force-scan:该选项表示创建一份增量备份时,强制扫描所有增量备份中的数据页。

--incremental-lsn:该选项表示指定增量备份的LSN,与--incremental选项一起使用。

--incremental-history-name:该选项表示存储在PERCONA_SCHEMA.xtrabackup_history基于增量备份的历史记录的名字。Percona Xtrabackup搜索历史表查找最近(innodb_to_lsn)成功备份并且将to_lsn值作为增量备份启动出事lsn.与innobackupex--incremental-history-uuid互斥。如果没有检测到有效的lsn,xtrabackup会返回error。

--incremental-history-uuid:该选项表示存储在percona_schema.xtrabackup_history基于增量备份的特定历史记录的UUID。

--close-files:该选项表示关闭不再访问的文件句柄,当xtrabackup打开表空间通常并不关闭文件句柄目的是正确的处理DDL操作。如果表空间数量巨大,这是一种可以关闭不再访问的文件句柄的方法。使用该选项有风险,会有产生不一致备份的可能。

--compact:该选项表示创建一份没有辅助索引的紧凑的备份。

--throttle:该选项表示每秒IO操作的次数,只作用于bakcup阶段有效。apply-log和--copy-back不生效不要一起用。                   

2准备阶段的参数

                     

innobackupex --apply-log [--use-memory=B]

             [--defaults-file=MY.CNF]

             [--export] [--redo-only] [--ibbackup=IBBACKUP-BINARY]

             BACKUP-DIR             

 

--apply-log:该选项表示同xtrabackup的--prepare参数,一般情况下,在备份完成后,数据尚且不能用于恢复操作,因为备份的数据中可能会包含尚未提交的事务或已经提交但尚未同步至数据文件中的事务。因此,此时数据 文件仍处理不一致状态。--apply-log的作用是通过回滚未提交的事务及同步已经提交的事务至数据文件使数据文件处于一致性状态。

--use-memory:该选项表示和--apply-log选项一起使用,prepare 备份的时候,xtrabackup做crash recovery分配的内存大小,单位字节。也可(1MB,1M,1G,1GB),推荐1G。

--defaults-file:该选项指定了从哪个文件读取MySQL配置,必须放在命令行第一个选项的位置。

--export:这个选项表示开启可导出单独的表之后再导入其他Mysql中。

--redo-only:这个选项在prepare base full backup,往其中merge增量备份(但不包括最后一个)时候使用。

 

 

3还原恢复方面的参数

 

innobackupex --copy-back [--defaults-file=MY.CNF] [--defaults-group=GROUP-NAME] BACKUP-DIR

innobackupex --move-back [--defaults-file=MY.CNF] [--defaults-group=GROUP-NAME] BACKUP-DIR

 

--copy-back:做数据恢复时将备份数据文件拷贝到MySQL服务器的datadir。

--move-back:这个选项与--copy-back相似,唯一的区别是它不拷贝文件,而是移动文件到目的地。这个选项移除backup文件,用时候必须小心。使用场景:没有足够的磁盘空间同事保留数据文件和Backup副本

注意:

1.datadir目录必须为空。除非指定innobackupex --force-non-empty-directorires选项指定,否则--copy-backup选项不会覆盖

2.在restore之前,必须shutdown MySQL实例,你不能将一个运行中的实例restore到datadir目录中

3.由于文件属性会被保留,大部分情况下你需要在启动实例之前将文件的属主改为mysql,这些文件将属于创建备份的用户

chown -R my5711:mysql /data1/dbrestore

以上需要在用户调用Innobackupex之前完成

 

--force-non-empty-directories:指定该参数时候,使得innobackupex --copy-back或--move-back选项转移文件到非空目录,已存在的文件不会被覆盖。如果--copy-back和--move-back文件需要从备份目录拷贝一个在datadir已经存在的文件,会报错失败。

 

 

4解压解密方面的参数

 

innobackupex [--decompress] [--decrypt=ENCRYPTION-ALGORITHM]

             [--encrypt-key=LITERAL-ENCRYPTION-KEY] | [--encryption-key-file=MY.KEY]

             [--parallel=NUMBER-OF-FORKS] BACKUP-DIR

3.2 xtrabackup的相关参数介绍

 

 

                                   

--apply-log-only:prepare备份的时候只执行redo阶段,用于增量备份。这个选项使在准备备份(prepare)时,只执行重做(redo)阶段,这对于增量备份非常重要。

 

--backup:创建备份并且放入--target-dir目录中

--close-files:不保持文件打开状态,xtrabackup打开表空间的时候通常不会关闭文件句柄,目的是为了正确处理DDL操作。如果表空间数量非常巨大并且不适合任何限制,一旦文件不在被访问的时候这个选项可以关闭文件句柄.打开这个选项会产生不一致的备份。

--compact:创建一份没有辅助索引的紧凑备份

--compress:压缩所有输出数据,包括事务日志文件和元数据文件,通过指定的压缩算法,目前唯一支持的算法是quicklz.结果文件是qpress归档格式,每个xtrabackup创建的*.qp文件都可以通过qpress程序提取或者解压缩

--compress-chunk-size=#:压缩线程工作buffer的字节大小,默认是64K

--compress-threads=#:xtrabackup进行并行数据压缩时的worker线程的数量,该选项默认值是1,并行压缩('compress-threads')可以和并行文件拷贝('parallel')一起使用。例如:'--parallel=4 --compress --compress-threads=2'会创建4个IO线程读取数据并通过管道传送给2个压缩线程。

--create-ib-logfile:这个选项目前还没有实现,目前创建Innodb事务日志,你还是需要prepare两次。

--datadir=DIRECTORY:backup的源目录,mysql实例的数据目录。从my.cnf中读取,或者命令行指定。

--defaults-extra-file=[MY.CNF]:在global files文件之后读取,必须在命令行的第一选项位置指定。

--defaults-file=[MY.CNF]:唯一从给定文件读取默认选项,必须是个真实文件,必须在命令行第一个选项位置指定。

--defaults-group=GROUP-NAME:从配置文件读取的组,innobakcupex多个实例部署时使用。

--export:为导出的表创建必要的文件

--extra-lsndir=DIRECTORY:(for --bakcup):在指定目录创建一份xtrabakcup_checkpoints文件的额外的备份。

--incremental-basedir=DIRECTORY:创建一份增量备份时,这个目录是增量别分的一份包含了full bakcup的Base数据集。

--incremental-dir=DIRECTORY:prepare增量备份的时候,增量备份在DIRECTORY结合full backup创建出一份新的full backup。

--incremental-force-scan:创建一份增量备份时,强制扫描所有增在备份中的数据页即使完全改变的page bitmap数据可用。

--incremetal-lsn=LSN:创建增量备份的时候指定lsn。

--innodb-log-arch-dir:指定包含归档日志的目录。只能和xtrabackup --prepare选项一起使用。

--innodb-miscellaneous:从My.cnf文件读取的一组Innodb选项。以便xtrabackup以同样的配置启动内置的Innodb。通常不需要显示指定。

--log-copy-interval=#:这个选项指定了log拷贝线程check的时间间隔(默认1秒)。

--log-stream:xtrabakcup不拷贝数据文件,将事务日志内容重定向到标准输出直到--suspend-at-end文件被删除。这个选项自动开启--suspend-at-end。

--no-defaults:不从任何选项文件中读取任何默认选项,必须在命令行第一个选项。

 

--databases=#:指定了需要备份的数据库和表。,格式为:--database="db1[.tb1] db2[.tb2]" 多个库之间以空格隔开,如果此选项不被指定,将会备份所有的数据库。

 

--database-file=#:指定包含数据库和表的文件格式为databasename1.tablename1为一个元素,一个元素一行。

--parallel=#:指定备份时拷贝多个数据文件并发的进程数,默认值为1。

--prepare:xtrabackup在一份通过--backup生成的备份执行还原操作,以便准备使用。

--print-default:打印程序参数列表并退出,必须放在命令行首位。

--print-param:使xtrabackup打印参数用来将数据文件拷贝到datadir并还原它们。

--rebuild_indexes:在apply事务日志之后重建innodb辅助索引,只有和--prepare一起才生效。

--rebuild_threads=#:在紧凑备份重建辅助索引的线程数,只有和--prepare和rebuild-index一起才生效。

--stats:xtrabakcup扫描指定数据文件并打印出索引统计。

--stream=name:将所有备份文件以指定格式流向标准输出,目前支持的格式有xbstream和tar。

--suspend-at-end:使xtrabackup在--target-dir目录中生成xtrabakcup_suspended文件。在拷贝数据文件之后xtrabackup不是退出而是继续拷贝日志文件并且等待知道xtrabakcup_suspended文件被删除。这项可以使xtrabackup和其他程序协同工作。

--tables=name:正则表达式匹配database.tablename。备份匹配的表。

--tables-file=name:指定文件,一个表名一行。

--target-dir=DIRECTORY:指定backup的目的地,如果目录不存在,xtrabakcup会创建。如果目录存在且为空则成功。不会覆盖已存在的文件。

--throttle=#:指定每秒操作读写对的数量。

--tmpdir=name:当使用--print-param指定的时候打印出正确的tmpdir参数。

--to-archived-lsn=LSN:指定prepare备份时apply事务日志的LSN,只能和xtarbackup --prepare选项一起用。

--user-memory = #:通过--prepare prepare备份时候分配多大内存,目的像innodb_buffer_pool_size。默认值100M如果你有足够大的内存。1-2G是推荐值,支持各种单位(1MB,1M,1GB,1G)。

--version:打印xtrabackup版本并退出。

--xbstream:支持同时压缩和流式化。需要客服传统归档tar,cpio和其他不允许动态streaming生成的文件的限制,例如动态压缩文件,xbstream超越其他传统流式/归档格式的的优点是,并发stream多个文件并且更紧凑的数据存储(所以可以和--parallel选项选项一起使用xbstream格式进行streaming)。                                

                                   

              

1.xtrabackup常用参数

 

基本命令:

--defaults-file:指明服务器的配置文件,此参数必须作为innobackupex的第一个参数,否则报错

--host:指明主机

--user:指明备份的用户名

--password:指明备份用户名的密码

--backup:指明为备份,此参数可以忽略

/tmp/backup:备份的目录

--backup:指明为备份

--apply-log:指明为重做日志,//应用 BACKUP-DIR 中的 xtrabackup_logfile 事务日志文件。一般情况下,在备份完成后,数据尚且不能用于恢复操作,因为备份的数据中可能会包含尚未提交的事务或已经提交但尚未同步至数据文件中的事务。因此,此时数据文件仍处于不一致状态。“准备”的主要作用正是通过回滚未提交的事务及同步已经提交的事务至数据文件使得数据文件处于一致性状态。

 

--copy-back:指明为恢复,//拷贝先前备份所有文件到它们的原始路径。但原路径下不能有任何文件或目录,除非指定 --force-non-empty-directories 选项。

 

--slave-info:备份从库的show slave status信息,仅用于在备份从库时使用

--no-lock:不锁表,仅适用于存储引擎为innodb,并且不在乎备份位置点时使用

 

增量备份:

--incremental://这个选项告诉 xtrabackup 创建一个增量备份,而不是完全备份。它传递到 xtrabackup 子进程。当指定这个选项,可以设置 --incremental-lsn 或 --incremental-basedir。如果这2个选项都没有被指定,--incremental-basedir 传递给 xtrabackup 默认值,默认值为:基础备份目录的第一个时间戳备份目录。

 

--incremental-basedir:指明此次的增量备份是基于之前的哪一次备份,增量备份仅适用于innodb和xtradb引擎

 

--redo-only    //在“准备基本完整备份” 和 “合并所有的增量备份(除了最后一个增备)”时使用此选项。它直接传递给xtrabackup的 xtrabackup --apply-log-only 选项,使xtrabackup跳过"undo"阶段,只做"redo"操作。如果后面还有增量备份应用到这个全备,这是必要的。有关详细信息,请参阅xtrabackup文档。

 

--incremental-dir:恢复增量备份时,指明增量备份的目录

 

部分备份:

--include:使用正则表达式备份匹配到的内容;例:备份mysql库中的user表,--include='^mysql[.]user'

--table-files:如果要备份多个表,可以把多个表以”数据库名.表名“的方式写到文件中,备份时指定此文件

--databases:可以备份整个库,也可以备份库中的某个表,备份表时用”库名.表名“的方式

--export:使用部分备份恢复时用此选项,这和完整备份和增量备份有所区别

 

高级命令:

xtrabackup在执行备份时,会等待获得全局锁,对于长时间执行的语句,会引发锁争用的问题!

--lock-wait-timeout:指明执行flush tables with read lock前的等待时间,0表示不等待直接执行锁表命令,单位是s,若超过此参数设置的时间后还存在长时间执行的查询,则xtrabackup终止运行

--lock-wait-query-type:可以为all和update;若设置为all,表示等待所有类型的语句执行完成后再执行flush tables with read lock; 若设置update,则表示等待除了select之外sql语句执行完成,再执行锁表操作

--kill-long-queries-timeout:执行flush tables with read lock后等待的秒数

--kill-long-query-type:可以为all和select; 若为all,表示超过等待的秒数,强制终止所有的查询;若为select,表示强制终止select类型的查询

 

四 XtraBackup备份恢复的流程与原理

xtrabackup支持innodb表,实际工作中是用innobackupex,这个命令下个版本就被废掉了。

innobackupex脚本用来备份非innodb的,

xtrabackup脚本备份innodb表

 

早期xtrabackup工具是由perl和c同时写的两个进程,导致两个之间通信不好,在2011年时候用C重写了,innobackupex功能全部集成到xtrabackup,为了兼容性innobackupex还保存。

如果用innobackupex来备份,如果有innodb的表,innobackupex就会自动调用xtrabackup脚本来备份。

后期innobackupex会取消,全部使用xtrabackup。

4.1 xtrabackup 完全备份流程

1.start xtrabackup_log:

innobackupex开启xtrabackuplog监控线程,实时监测redo log文件的变化,将新备份过程中新写入到事务日志中的日志)

拷贝到innobackup_log ( xtnabackup_log文件中;同时开启xtrabackup拷贝线程﹐开始拷贝innodb文件。

2.copy .ibd ,ibdata1/2/3:开始拷贝innodb 文件

3.在复制innodb文件结束后,进行flush tables with read lock;

4.拷贝非innodb文件,copy .frm;myd;myi,misc files等非innodb类型的文件。

5.记录当前的bihlog log position

6.表解锁;  unlock tables;

7.停正xtrabackup_log监控线程。

4.2 xtrabackup 恢复流程

-- oracle:先 restore还原文件,再recover数据一致性。

-- mysql:先 prepare(recover)数据一致性,再copy(restore)还原文件。

1 预准备阶段

对全备份文件进行xtrabackup_log日志回放,并对提交的事务进行重做(apply redo logrecored),同时回滚未提交的事务(undo space)。

这个过程叫prepare阶段(类似于Oracle 的 recover过程),xtrabackup会执行crash恢复。

--在prepare过程中,恢复备份集的日志,会启动一个mysqld的服务进程,来做恢复实现一致性。

--这个过程只针对innodb表,非innodb (myisam)数据不是恢复的。所以建议大家以后不要再用myisam

2)将全备文件复制到mysql下的data目录中。(所有的)

4.3 xtrabackup增量备份的流程(用得少)

1.start xtrabackup_log:

innobackupex开启 xtrabackup_log监控线程,实时监测redo log文件的变化,将新备份过程中新写入到事务日志中的日志

拷贝到innobackup_log (xtrabackup_log)文件中,同时开启xtrabackup拷贝线程﹐开始拷贝innodb 文件。

⒉.开始拷贝自上次 innodb备份后变化的数据页,条件是;当前的lsn >上次全备/增量xtrabackup_checkpoints 中的lsn

3.copy .ibd ,ibdata1/2/3:开始拷贝innodb文件

4.在复制innodb文件结束后,进行flush tables with read lock;

5.拷贝非innodb文件,copySfrm;myd;myi,misc files等非innodb类型的文件。

6.记录当前的binlog log position

7.表解锁: unlock tabLes;

8.停止xtrabackup_log监控线程。

4.4 xtrabackup增量恢复的流程

1.恢复全备(prepare)

2恢复增量,对未提交的事务进行回滚

3.对全备与增量备份合并后的文件进行apply_log

4.将备份文件拷贝到mysql data目录下。

五 innobackupex备份与恢复

备份目录里面的相关文件介绍:

backup-my.cnf:备份命令用到的配置选项信息

xtrabackup_binlog_info:记录当前最新的log position,(备份开始这一刻)

xtrabackup_checkpoints:存放备份的起始位置,beginlsn和结束位置的endlsn,增量备份需要这个

lsnxtrabackup_info:备份的一些信息

xtrabackup_logfile:备份的重做日志文件

5.1 innobackupex备份与恢复-所有库

1 建立备份用户

create user 'backup '@'localhost' identified by 'backup';

grant reload,lock tables,process,replication client on *.* to 'backup'@'localhost';

flush privileges;

2 简单备份命令

innobackupex  --defaults-file=/mysql/data/3306/my.cnf --user=backup --password=backup /mysql/backup/

会生产日期的文件夹备份

3 制定文件夹名-并行CPU个数-2

innobackupex  --defaults-file=/mysql/data/3306/my.cnf --user=backup --password=backup --no-timestamp --parallel=6 /mysql/backup/ALLDB202103071652

xtrabackup: Transaction log of lsn (114892920) to (114892929) was copied.

210307 16:53:56 completed OK!

4 准备perpare完全数据库(--apply-log)

用--apply-log的作用是使数据文件处理一致状态。

执行后,xtrabackup_checkpoints文件backup_type = full-backuped 变为 full-prepare

cat /mysql/backup/alldb202103071652/xtrabackup_checkpoints

backup_type = full-backuped

 

innobackupex --apply-log --user-memory=3G --parallel=6 /mysql/backup/alldb202103071652/

执行完会增加了两个文件,就是在下一步COPY以前全部准备好。

内存就是机器的内用可用*90%。

多了重做日志文件

-rw-r----- 1 root root 209715200 3月   7 18:07 ib_logfile0

-rw-r----- 1 root root 209715200 3月   7 18:07 ib_logfile1

cat /mysql/backup/alldb202103071652/xtrabackup_checkpoints

backup_type = full-prepared

5 执行数据文件还原,需要原来的数据文件为空

--force-non-empty-directories

 

[root@mysqldb alldb202103071652]#  innobackupex --defaults-file=/mysql/data/3306/my.cnf --copy-back  --parallel=6  /mysql/backup/alldb202103071652

210307 20:34:45 completed OK!

[root@mysqldb 3306]# ll

总用量 12

drwxr-x--- 7 root  root  4096 3月   7 20:34 data

chown -R mysql:mysql data

 

5.2 innobackupex备份与恢复部分库

CREATE DATABASE /*!32312 IF NOT EXISTS*/ `syjdb` /*!40100 DEFAULT CHARACTER SET utf8 */

1备份多个数据库

innobackupex  --defaults-file=/mysql/data/3306/my.cnf --user=backup --password=backup --databases='syj syjdb' --parallel=6  /mysql/backup/syj-syjdb

2准备perpar(--apply-log)

用--apply-log的作用是使数据文件处理一致状态。

执行后,xtrabackup_checkpoints文件backup_type = full-backuped 变为 full-prepare

innobackupex --apply-log --user-memory=3G --parallel=6 /mysql/backup/alldb202103071652/

210307 22:01:30 completed OK!

3 执行数据文件还原-手工处理

rm -rf /mysql/data/3306/data/syjdb/

copy阶段,部分备份和恢复,不能直接用--copy-back,只能手工复制相应的数据库+ibdata数据字典。

cp -r /mysql/backup/syj-syjdb/2021-03-07_21-32-37/syjdb /mysql/data/3306/data

 

 

cp -r /mysql/backup/syj-syjdb/2021-03-07_21-32-37/ibdata* /mysql/data/3306/data

cp:是否覆盖"/mysql/data/3306/data/ibdata1"? y

cp:是否覆盖"/mysql/data/3306/data/ibdata2"? y

cp:是否覆盖"/mysql/data/3306/data/ibdata3"? y

chown -R mysql:mysql /mysql/data/3306/data/syjdb

5.3 innobackupex备份与恢复-表

1 备份不通数据库下的不同表

innobackupex  --defaults-file=/mysql/data/3306/my.cnf --user=backup --password=backup --databases=' syj.gw syjdb.gwdb' --parallel=6  /mysql/backup/syj-syjdb-gw

2同一个数据库下的不同表

innobackupex  --defaults-file=/mysql/data/3306/my.cnf --user=backup --password=backup --include=' syj.m1,syj.m5' --parallel=6  /mysql/backup/syj-m

3 指定备份文件里面的表

innobackupex  --defaults-file=/mysql/data/3306/my.cnf --user=backup --password=backup --tables-file=/mysql/backup/tname.txt --parallel=6  /mysql/backup/syj-file

210307 22:41:03 completed OK!

 

cat /mysql/backup/tname.txt

syj.sales

syjdb.gwdb

syjdb.m1db

(文件最后不能多行,不能空格,否则全备)

 

4准备perpar(--apply-log)

用--apply-log的作用是使数据文件处理一致状态。

执行后,xtrabackup_checkpoints文件backup_type = full-backuped 变为 full-prepare

innobackupex --apply-log --user-memory=3G --parallel=6 /mysql/backup/syj-file/2021-03-07_22-43-00/

210307 22:48:19 completed OK!

3 执行数据文件还原-手工处理

rm -rf /mysql/data/3306/data/syj/sales.*

rm -rf /mysql/data/3306/data/syjdb/m1db.*

select * from syj.sales;

> 1146 - Table 'syj.sales' doesn't exist

select * from syjdb.m1db;

> 1146 - Table 'syjdb.m1db' doesn't exist

copy阶段,部分备份和恢复,不能直接用--copy-back,只能手工复制相应的数据库+ibdata数据字典。

cp -r /mysql/backup/syj-file/2021-03-07_22-43-00/syjdb/m1db.* /mysql/data/3306/data/syjdb/

cp -r /mysql/backup/syj-file/2021-03-07_22-43-00/syj/sales.* /mysql/data/3306/data/syj/

 

 

cp -r /mysql/backup/syj-file/2021-03-07_22-43-00/ibdata* /mysql/data/3306/data/

cp:是否覆盖"/mysql/data/3306/data/ibdata1"? y

cp:是否覆盖"/mysql/data/3306/data/ibdata2"? y

cp:是否覆盖"/mysql/data/3306/data/ibdata3"? y

chown -R mysql:mysql /mysql/data/3306/data/syjdb

chown -R mysql:mysql *

service mysql restart

Shutting down MySQL..                                      [确定]

Starting MySQL.                                            [确定]

 

 

5.4 innobackupex备份与恢复-增量

1 全备+业务变化

innobackupex  --defaults-file=/mysql/data/3306/my.cnf --user=backup --password=backup --no-timestamp --parallel=6 /mysql/backup/alldb20210308

 

210308 21:38:29 completed OK!

select now()

2021-03-08 21:41:49

 

CREATE DATABASE /*!32312 IF NOT EXISTS*/ `syjdb` /*!40100 DEFAULT CHARACTER SET utf8 */

CREATE table syjdb.gwdb select * from syj.gw;

2 增量备份1

innobackupex  --defaults-file=/mysql/data/3306/my.cnf --user=backup --password=backup --no-timestamp  --parallel=6  --incremental /mysql/backup/indata2145 --incremental-basedir=/mysql/backup/alldb20210308

3 业务操作2

CREATE table syjdb.m1db select * from syj.m1;

select now()

2021-03-08 21:47:41

4 增量备份2

特别恶心,不是累积增量,特别恶心,追加增量。

innobackupex  --defaults-file=/mysql/data/3306/my.cnf --user=backup --password=backup --no-timestamp  --parallel=6  --incremental /mysql/backup/indata2149 --incremental-basedir=/mysql/backup/indata2145

 

5 增量恢复1-恢复全备

删除数据库目录

--注意:--redo-only,只做redo,不做undo,只有最后一次--redo-only不需要这个参数

innobackupex --apply-log --redo-only /mysql/backup/alldb20210308/

210309 00:07:20 completed OK!

 

6 增量恢复2-恢复增量至全备

innobackupex --apply-log --redo-only /mysql/backup/alldb20210308 --incremental-dir=/mysql/backup/indata2145

 

 

7 增量恢复3-对最后的全备进行恢复

最后一次--redo-only不需要这个参数

innobackupex --apply-log  /mysql/backup/alldb20210308 --incremental-dir=/mysql/backup/indata2149

8 数据一致性

innobackupex --apply-log  /mysql/backup/alldb20210308

9 COPY数据文件还原

--rsync是用来加速恢复的,最小化flush tables with read lock的阻塞时间,用rsync来拷贝非innodb的文件

--rsync如果有myisam的业务表,建议加上。

mkdir -p /mysql/data/3306/data

chown -R mysql:mysql /mysql/data/3306/data

innobackupex --defaults-file=/mysql/data/3306/my.cnf --copy-back --rsync --parallel=6 /mysql/backup/alldb20210308/

 

chown -R mysql:mysql /mysql/data/3306/data

select count(*) from syjdb.m1db;

10000 OK

5.5 增量备份其他类型

 

个别数据库增量备份与恢复

区别:备份的时候上面是针对全库,如果是个别数据库,需要用下面的参数:--databases="itpuxdb1 itpuxdb2"

表的增量备份与恢复

区别:备份的时候上面是针对表,最后一步需要手工拷文件增量上只不过袭的参数如下:

--databases="itpuxdb1.itpuxbak11"

--tables-file=”mysql/backup/tbname.txt"

--include=’kitpuxdb1.itpuxbak11,itpuxdb1.itpuxbak12'

5.6 innobackupex备份与恢复-压缩-14倍

安装前提条件:将压缩的备份先解压安装qpress包:

tar xvf qpress-11-linux-x64.tar

cp qpress /usr/bin

压缩率在14倍

innobackupex  --defaults-file=/mysql/data/3306/my.cnf --user=backup --password=backup --no-timestamp --parallel=6  --compress --compress-threads=2 /mysql/backup/alldbcom

 

service mysql stop

rm -rf /mysql/data/3306/data_bak

mv /mysql/data/3306/data /mysql/data/3306/data_bak

mkdir /mysql/data/3306/data

chown -R mysql:mysql /mysql/data/3306/data

 

innobackupex --decompress --user-memory=2G /mysql/backup/alldbcom/

 

innobackupex --apply-log --user-memory=2G /mysql/backup/alldbcom/

innobackupex  --defaults-file=/mysql/data/3306/my.cnf --copy-back --parallel=6  /mysql/backup/alldbcom/

210309 13:18:18 completed OK!

chown -R mysql:mysql /mysql/data/3306/data

 

innobackupex --apply-log --user-memory=2G  /mysql/backup/dbc/

innobackupex  --defaults-file=/mysql/data/3306/my.cnf --copy-back --parallel=6  /mysql/backup/dbc/

chown -R mysql:mysql /mysql/data/3306/data

 

 

5.7 innobackupex备份与恢复-打包-22倍

innobackupex  --defaults-file=/mysql/data/3306/my.cnf --user=backup --password=backup --no-timestamp --parallel=6 --stream=tar /mysql/backup/alldbtar 1>/mysql/backup/alldb.tar 

打包未压缩

innobackupex  --defaults-file=/mysql/data/3306/my.cnf --user=backup --password=backup --no-timestamp --parallel=6 --stream=tar /mysql/backup/alldbtar | gzip >/mysql/backup/alldb.tar.gz 

包打开

tar ixvf /mysql/backup/alldb.tar -C /mysql/backup/noc

tar izxvf /mysql/backup/alldb.tar.gz -C /mysql/backup/dbc

 

5.8 innobackupex备份与恢复-加密解密

1 生产KEY

openssl rand -base64 24

KjbHO+Dsm9DsX5SMS29JQXNO7kAWDhtc

 

echo -n "KjbHO+Dsm9DsX5SMS29JQXNO7kAWDhtc" >/mysql/script/20210310dbbfkeyfile

echo -n "KjbHO+Dsm9DsX5SMS29JQXNO7kAWDhtc" >/mysql/app/20210310dbbfkeyfile

 2 加密备份

innobackupex  --defaults-file=/mysql/data/3306/my.cnf --user=backup --password=backup --no-timestamp  --encrypt=AES256 --encrypt-key-file=/mysql/script/20210310dbbfkeyfile --encrypt-threads=2 --parallel=6 /mysql/backup/allendb20210310

210310 11:11:59 completed OK!

3 官方解密

xtrabackup  --decrypt=AES256 --encrypt-key="KjbHO+Dsm9DsX5SMS29JQXNO7kAWDhtc" --target-dir=/mysql/backup/allendb20210310 --remove-original

--remove-original 溢出密码

210310 11:28:39 [01] decrypting ./itpuxdb/itpux12.frm.xbcrypt

210310 11:28:39 [01] removing ./itpuxdb/itpux12.frm.xbcrypt

210310 11:28:39 completed OK!

 

 

 

4 手工解密-不推荐

cd /mysql/backup/allendb20210310/

 

for i in 'find . -iname "*\.xbcrypt"';

do

 

xbcrypt -d

--encrypt-key-file=/mysql/script/20210310dbbfkeyfile --encrypt-algo=AES256  < $i > $(dirname $i)/$(basename $i .

xbcrypt) && rm -f $i;

done

 

5 恢复

service mysql stop

rm -rf /mysql/data/3306/data_bak

mv /mysql/data/3306/data /mysql/data/3306/data_bak

mkdir /mysql/data/3306/data

chown -R mysql:mysql /mysql/data/3306/data

innobackupex --apply-log --user-memory=3G /mysql/backup/allendb20210310/

InnoDB: Shutdown completed; log sequence number 181871656

210310 11:34:36 completed OK!

 

innobackupex --defaults-file=/mysql/data/3306/my.cnf --copy-back --parallel=6 /mysql/backup/allendb20210310/

210310 11:38:02 completed OK!

 

chown -R mysql:mysql /mysql/data/3306/data

service mysql restart

 

 

六 关于xtrabackup恢复过程实现细节

1.文件权限

xtrabackup以rw模式打开innodb的数据文件,用内置的innodb库来打开文件

2.复制数据文件

xtrabackup每次读写1M的数据,1M/16K=64个page;如果是redo ,每次512K

3.备份安全的问题

限制每次的IO操作数据

限制每次的IO操作数据--throttle

值为数字,1,10,20,单位不是M。10可能是15M/S

4.主从环境下如何备份

主从模式:主提供服务,从提供备份。

--slave-info --safe-slave-backup 会记录GTID和binlog changer信息>-xtrabackup_slave_info

 

 

转载地址:http://tabai.baihongyu.com/

你可能感兴趣的文章
除了负载均衡,Nginx 能做的真是太强大了!
查看>>
微博千万级规模高性能高并发的网络架构设计
查看>>
为什么Java后端开发没有大规模采用Kotlin?
查看>>
皮皮爆肝 32 道高频 JVM 面试题(附答案)
查看>>
详解nacos注册中心服务注册流程
查看>>
不懂 Zookeeper?没关系,看这篇就够了
查看>>
Spring Cloud 中 Zuul 网关原理及其配置,看它就够了!
查看>>
1.2W 字的 SQL 语法速成手册
查看>>
19 张图概览 Spring Cloud
查看>>
高并发、高可用、高可靠微服务架构7大顶级设计思维模型
查看>>
初探InnoDB存储引擎的架构设计
查看>>
今日头条技术架构分析
查看>>
Java工程师的进阶之路 Kafka篇
查看>>
巧用二进制,让性能提升100倍,让存储空间减少100倍
查看>>
Java单例模式实现,一次性学完整,面试加分项
查看>>
大型分布式网站架构总结
查看>>
死磕18个Java8日期处理,工作必用!收藏起来~
查看>>
【建议收藏】Spring Boot注解全梳理!
查看>>
卧槽!牛皮了,头一次见有大佬把TCP三次握手四次挥手解释的这么明白
查看>>
面试 Redis 没底?这 40 道面试题让你不再慌(附答案)
查看>>