MySQL库很大,如何进行数据备份与恢复
上一篇介绍了逻辑备份工具mysqldump,本文将通过应用更为普遍的物理备份工具xtrabackup来演示数据备份及恢复的第二篇内容。1。xtrabackup工具的安装1。1安装依赖包xtrabackup的使用需要安装相关的依赖包否则使用过程中会报相关错误yuminstallyrsyncperllperlDigestMD5perlperldevellibaiolibaiodevelperlTimeHiResperlDBDMySQL1。2下载及安装
去percona官网下载对应版本的安装包https:www。percona。comdownloads,因为每个版本对应的数据库版本不同,因此需要根据数据库的版本选择对应的xtrabackup的安装包。
当前测试使用的数据库为MySQL5。7因此下载2。4版本https:www。percona。comdownloadsPerconaXtraBackup2。4LATEST
另外,2。4。10及以后版本中,对libgcrypt进行了区分,因此也需要查询自己服务器的libgcrypt版本,然后选择对应的安装包
查看libgcrypt方法:〔roottestdb〕yumlistinstalledgreplibgcryptlibgcrypt。x86641。5。314。el7anaconda
然后下载对应包二进制包wgethttps:www。percona。comdownloadsPerconaXtraBackup2。4PerconaXtraBackup2。4。18binarytarballperconaxtrabackup2。4。18Linuxx8664。libgcrypt153。tar。gzrpm包wgethttps:www。percona。comdownloadsPerconaXtraBackup2。4PerconaXtraBackup2。4。18binaryredhat7x8664PerconaXtraBackup2。4。18r29b4ca5el7x8664bundle。tar
二进制包解压后即可使用,rpm包下载解压后rpmivh安装即可。操作均很简单,此处略过
xtrabackup通常使用innobackupex命令,可以使用innobackupexhelp命令查看参数及说明。
其中常用参数及说明如下:
defaultsfile待备份mysql实例的配置文件userUSER备份用户,默认为当前系统用户,建议使用备份专用账号passwordPASSWD备份用户密码portPORT数据库端口,默认3306hostHOST需备份数据库的IPapplylog前滚、回滚ahrefhttps:www。bs178。comrizhitargetblankclassinfotextkey日志a,恢复前用database指定需要备份的数据库,多个数据库之间以空格分开copyback将备份数据复制到目标路径incremental增量备份,后面接的参数值为指定的增量备份的路径incrementalbasedirDIRECTORY增量备份时使用指向上一次的增量备份所在的目录incrementaldirDIRECTORY增量备份还原的时候用来合并增量备份到全量,用来指定全备路径redoonly对增量备份进行合并rsync加快本地文件传输,适用于nonInnoDB数据库引擎。不与stream共用notimestamp生成的备份文件不以时间戳为目录
1。3创建备份账号
备份的账号建议单独创建,并授予相关权限
mysqlCREATEUSERbackuplocalhostIDENTIFIEDBYBackup123。com;mysqlGRANTSUPER,RELOAD,LOCKTABLES,PROCESS,REPLICATIONCLIENTON。TObackuplocalhost;mysqlFLUSHPRIVILEGES;
2。全量备份2。1本地全量备份,不压缩
后续会以此为基础进行增量备份创建备份结果的目录,此步骤也可以省略mkdirallbackup开始全量备份rootxtrabackupbininnobackupexdefaultsfileappdatamysql3306etcmy。cnfsocketappdatamysql3306tmpmysql。sockport3306userbackuppasswordBackup123。comnotimestampallbackup
备份的结果存放在指定的目录allbackup里,内容如下:
注:如果没有添加阻塞DDL操作的参数,备份过程中如有DDL操作,备份将终止。因此建议日常备份放在从库中进行。2。2本地tar方式压缩备份
有时为了考虑磁盘空间问题,会在备份的时候直接压缩用以节约磁盘空间或解决磁盘空间不足以存放全量非压缩文件的问题。gzip方式压缩rootxtrabackupbininnobackupexdefaultsfileappdatamysql3306etcmy。cnfsockettmpmysql。sockport3306userbackuppasswordBackup123。comstreamtartmpgzipallbackup。tar。gz
中间过程省略
备份后的结果是一个压缩文件,经过对比,压缩后数据约为非压缩情况下的20,压缩比还是比较高的。
不过,压缩备份的方式速度相对较慢,且消耗CPU,该影响因素需要大家考虑到,视情况选择是否压缩。
注意:如果有单表过大而tmp路径空间不足的情况备份过程中可能会报错,因此可以指定其他空间较大的目录2。3本地xbstream方式压缩备份
gzip的压缩方式备份可能会有bug(案例可以自行寻找),出现如下错误:xtrabackup:error:Thetransactionlogfileiscorrupted。xtrabackup:error:ThelogwasnotappliedtotheintendedLSN!
因此可以采用xbstream方式进行备份,备份命令如下:rootxtrabackupbininnobackupexdefaultsfileappdatamysql3306etcmy。cnfsockettmpmysql。sockport3306userbackuppasswordBackup123。comappbackuptmpdirappbackupstreamxbstreamgzipallbackup。xbstream。gz
xbstream压缩备份的过程和tar一致,就不再解释了。2。4远程备份到其他机器
远程备份与本地备份的相比需要额外的配置远程主机的免密登录权限在备份所在用户的主机下配置连接目标主机的免密sshkeygensshcopyidiusertargetip
之后就可以将类似于本地备份的模式将备份结果发送到远程机器rootxtrabackupbininnobackupexdefaultsfileappdatamysql3306etcmy。cnfsockettmpmysql。sockport3306userbackuppasswordBackup123。comstreamtartmpnotimestampsshusertargetipcatappbackupremotebackup。tar
备份过程中可以在目标机器看到对应的备份文件,完成后如下
注:远程备份的目录需要有写入权限另外,和备份备份一样,如果存在大表或超大事务运行时不建议使用tmp目录3。增量备份3。1第一次增量备份
可以先根据2。1的本地全备的基础上进行增量备份,首次增量备份脚本如下:rootxtrabackupbininnobackupexdefaultsfileappdatamysql3306etcmy。cnfsockettmpmysql。sockport3306userbackuppasswordBackup123。comincrementalappbackupincrementalbasedirappbackupallbackup
此时,备份的结果放在appbackup目录下,由于没指定notimestamp参数,备份的结果存在在已三期时间命名的目录下:
备份的过程和全量备份很相似,但是备份结果是不一样的
结果如下
注:增量备份仅能应用于InnoDB或XtraDB表等事务表,对于MyISAM表而言,执行增量备份时依旧进行全量备份3。2第二次增量备份
第二次增量备份是在第一次增量备份的基础上进行,因此incrementalbasedir参数内容指定为上一次增量备份的目录即可rootxtrabackupbininnobackupexdefaultsfileappdatamysql3306etcmy。cnfsockettmpmysql。sockport3306userbackuppasswordBackup123。comincrementalappbackupincrementalbasedirappbackup20200325144737
完成后生成一个新的目录
4。恢复4。1基于全量备份的恢复4。1。1回放日志
备份后的文件不能直接用作恢复,还需要先使用applylog做前滚和回滚rootxtrabackupbininnobackupexdefaultsfile。backupmy。cnfapplylogappbackupallbackup
注:回放日志的时候defaultsfile选择备份目录里的即可4。2。2恢复至目标实例
本次恢复至一个新实例中(如果恢复至现有的实例需要先关闭目标实例,删除数据目录及相关日志存储的目录。不建议直接恢复至现有实例,除非实际需要)
创建新实例的相关目录mkdirpappdatamysql3307{data,logs,tmp,etc}生产配置文件,本次直接拷贝其他实例的配置文件修改对应端口等cpappdatamysql3306etcmy。cnfappdatamysql3307etcsedis33063307gmy。cnf创建错误ahrefhttps:www。bs178。comrizhitargetblankclassinfotextkey日志atouchappdatamysql3307logsmysqld。log
然后拷贝至新实例中rootxtrabackupbininnobackupexdefaultsfileappdatamysql3307etcmy。cnfcopybackappbackupallbackup
修改目标实例相关目录的权限chownRmysql:mysqlappdatamysql3307
启动新实例即可usrlocalmysql5。7binmysqldsafedefaultsfileappdatamysql3307etcmy。cnf
恢复完毕4。2基于增量备份的恢复
如果是基于第一次增量备份的恢复,操作如下使用合并增量备份的方式进行回放ahrefhttps:www。bs178。comrizhitargetblankclassinfotextkey日志a,先进行全量备份的合并rootxtrabackupbininnobackupexapplylogredoonlyappbackupallbackup再合并第一次增量备份rootxtrabackupbininnobackupexapplylogredoonlyappbackupallbackupincrementaldirappbackup20200325144737
如果基于多次增量备份的恢复,则在全量备份及第一次增量备份的基础上继续合并后续的备份即可基于第二次增量备份的合并rootxtrabackupbininnobackupexapplylogredoonlyappbackupallbackupincrementaldirappbackup20200325150628
之后的操作和全量备份的恢复一样即可。
5。小结
基于xtrabackup2。4版本备份MySQL5。7数据库的主要方法及过程常用情况均已演示,结尾处再总结一下xtrabackup的主要优点:物理备份,备份速度快热备份、无需停机恢复速度快自动会对备份文件进行验证
本文只介绍了常用操作,还是有很多情况未做介绍,比如rds上的数据备份及还原等,请各位小伙伴自行探索,也可以与我讨论。关注我的公众号数据库干货铺及时解锁新文章,感谢。