作者:刘开洋 爱可生交付服务团队北京DBA,对数据库及周边技术有浓厚的学习兴趣,喜欢看书,追求技术。 本文来源:原创投稿 爱可生开源社区出品,原创内容未经授权不得随意使用,转载请联系小编并注明来源。 前段时间在centos8环境上做MySQL的备份恢复测试的时候,遇到一个问题,下面跟大家分享下。 1、讲环境服务器OS数据库版本备份工具Centos8forX86mysql8。0。18xtrabackup8。0。10 小编的问题场景出现在centos8上,验证也使用了centos8版本,不过相信看到最后你会发现这个问题和OS关系不大,我们继续往下看。 2、说问题 从备份到恢复的过程还挺顺利,但是在最后启动数据库时出现了下面的问题,仔细看看,好像数据库的binlog文件名被吃掉了。20210308T16:48:08。51003208:000〔Warning〕〔MY010097〕〔Server〕Insecureconfigurationforsecurefilepriv:Currentvaluedoesnotrestrictlocationofgeneratedfiles。Considersettingittoavalid,nonemptypath。 20210308T16:48:08。51012508:000〔System〕〔MY010116〕〔Server〕usrsbinmysqld(mysqld8。0。18)startingasprocess16556 mysqld:Filevarlibmysql。000003notfound(OSerrno2Nosuchfileordirectory) 20210308T16:48:09。19667308:000〔ERROR〕〔MY010958〕〔Server〕Couldnotopenlogfile。 20210308T16:48:09。19678708:000〔ERROR〕〔MY010041〕〔Server〕Cantinittclog 20210308T16:48:09。19696108:000〔ERROR〕〔MY010119〕〔Server〕Aborting 20210308T16:48:10。63267608:000〔System〕〔MY010910〕〔Server〕usrsbinmysqld:Shutdowncomplete(mysqld8。0。18)MySQLCommunityServerGPL。 不要慌,这个现象可能是binlog的索引文件在数据库恢复的时候修改出错,就会导致数据库启动失败的情况,解决方案很简单,这里MySQL报错输出的是binlog。index文件中的信息,只要将binlog名重写,之后再启动数据库即可恢复。 当然这不是我们这篇文章的重点,重点是讨论下为什么xtrabackup会因为binlog文件名不一致就只delete而不进行insert呢?因为之前的测试由于疏忽,没有确认配置文件是否一致,结果报错后发现备份恢复的两套环境中的binlog文件名不一致,因此猜测是因为binlog文件名问题导致的这次故障发生,以小编既往故障案例的特点,我们还是先进行一个review复现吧。 3、搞测试 大体测试流程如下: (1)准备MySQL8。0。18环境,使用对应的xtrabackup做一个全备〔rootyang〕xtrabackupdefaultsfileetcmy。cnfhost192。168。1。7userrootpassword123port3306backuptargetdirrootbackupfull xtrabackup:recognizedserverarguments:datadirvarlibmysqlserverid1logbinvarlibmysqlmysqlbin xtrabackup:recognizedclientarguments:host192。168。1。7userrootpasswordport3306backup1targetdirrootbackupfull xtrabackupversion8。0。10basedonMySQLserver8。0。18Linux(x8664)(revisionid:94f9645) 21051512:11:55versioncheckConnectingtoMySQLserverwithDSNdbi:mysql:;host192。168。1。7;port3306asroot(usingpassword:YES)。 21051512:11:55versioncheckConnectedtoMySQLserver 21051512:11:55versioncheckExecutingaversioncheckagainsttheserver。。。 Asoftwareupdateisavailable: 21051512:12:00versioncheckDone。 21051512:12:00ConnectingtoMySQLserverhost:192。168。1。7,user:root,password:set,port:3306,socket:notset Usingserverversion8。0。18 xtrabackup:usesposixfadvise。 21051512:12:04completedOK! 备份完成 (2)修改新实例配置文件中的binlog文件名,人为制造我们遇到的故障点〔rootyang〕catetcmy。cnfgreplogbin logbinvarlibmysqlbinlog 〔rootyang〕vimetcmy。cnf 〔rootyang〕catetcmy。cnfgreplogbin logbinvarlibmysqlmysqlbin (3)准备恢复环境〔rootyang〕pkillmysqld 〔rootyang〕rmrfvarlibmysql 〔rootyang〕cdbackupfull 〔rootyangbackupfull〕ls backupmy。cnfibbufferpoolibdata1mysqlbinlog。000004binlog。indexmysql。ibd performanceschemasystestundo001undo002xtrabackupbinloginfoxtrabackupcheckpoints xtrabackupinfoxtrabackuplogfilextrabackuptablespaces 〔rootyangbackupfull〕catbinlog。index varlibmysqlbinlog。000004 (4)xtrabackup的prepare过程,即数据准备阶段〔rootyang〕xtrabackupdefaultsfileetcmy。cnfuserrootpreparetargetdirrootbackupfull 21051512:14:28completedOK! 〔rootyang〕catbackupfullbinlog。index varlibmysqlbinlog。000004 (5)xtrabackup的copyback过程,即最后数据的恢复阶段〔rootyang〕xtrabackupdefaultsfileetcmy。cnfusermysqlcopybacktargetdirrootbackupfull xtrabackup:recognizedserverarguments:datadirvarlibmysqlserverid1logbinvarlibmysqlbinlog xtrabackup:recognizedclientarguments:usermysqlcopyback1targetdirrootbackupfull xtrabackupversion8。0。10basedonMySQLserver8。0。18Linux(x8664)(revisionid:94f9645) 21051512:14:51〔01〕Copyingundo001tovarlibmysqlundo001 21051512:14:51〔01〕Copying。xtrabackupinfotovarlibmysqlxtrabackupinfo 21051512:14:51〔01〕。。。done 21051512:14:51〔01〕Copying。xtrabackupmasterkeyidtovarlibmysqlxtrabackupmasterkeyid 21051512:14:51〔01〕。。。done 21051512:14:51〔01〕Copying。ibtmp1tovarlibmysqlibtmp1 21051512:14:51〔01〕。。。done 21051512:14:51〔01〕Creatingdirectory。innodbtemp 21051512:14:51〔01〕。。。done。 21051512:14:51completedOK! 〔rootyang〕catbackupfullbinlog。index varlibmysqlbinlog。000004 (6)环境复现〔rootyang〕chownRmysql:mysqlvarlibmysql 〔rootyang〕usrsbinmysqlddefaultsfileetcmy。cnfusermysql 〔1〕1545 〔rootyang〕 〔1〕Exit1usrsbinmysqlddefaultsfileetcmy。cnfusermysql 〔rootyang〕tailfvarlogmysqld。log 20210515T12:20:18。51012508:000〔System〕〔MY01016〕〔Server〕usrsbinmysqld(mysqld8。0。18)startingasprocess1545 mysqld:Filevarlibmysql。000004notfound(OSerrno2Nosuchfileordirectory) 20210515T12:20:18。59667308:000〔ERROR〕〔MY010958〕〔Server〕Couldnotopenlogfile。 20210515T12:20:18。59678708:000〔ERROR〕〔MY010041〕〔Server〕Cantinittclog 20210515T12:20:18。59696108:000〔ERROR〕〔MY010119〕〔Server〕Aborting 20210515T12:20:19。13267608:000〔System〕〔MY010910〕〔Server〕usrsbinmysqld:Shutdowncomplete(mysqld8。0。18)MySQLCommunityServerGPL。 〔rootyang〕lsvarlibmysqlgrepbin mysqlbin。000004 mysqlbin。index 〔rootyang〕catvarlibmysqlmysqlbin。index varlibmysql。000004 在以上操作中,每操作一步我们就查看下备份源中的binlog文件是否被篡改,发现并没有,只有最后copyback数据的时候发生了binlog。index文件的更改。 (7)我们做一个猜测,会不会即使binlog名称相同也会导致这种报错吗?来测试一下〔rootyangmysql〕catetcmy。cnfgreplogbin修改配置文件与备份源的binlog文件名相同 logbinvarlibmysqlbinlog 〔rootyang〕rmrfvarlibmysql 〔rootyang〕xtrabackupdefaultsfileetcmy。cnfusermysqlcopybacktargetdirrootbackupfull 〔rootyangmysql〕catvarlibmysqlbinlog。index varlibmysql。000004 有验证的猜测就不是算命了,那么就排除了xtrabackup备份时binlog名称不一致的问题,那么怎么进一步确定xtrabackup的行为呢? (8)再次删除数据恢复数据的过程中进行strace监控,看看xtrabackup到底做了什么在copyback过程中,另开一个会话输出xtrabackup的strace 〔rootyang〕psauxgrepxtrabackupgrepvcolorautoawk{print2}xargsstraceostraceoutputcopywrite。txtTttfys3000etraceallp strace:Process2572attached strace:Process2575attached 4、聊分析 接下来我们看strace的输出分析straceoutputcopywrite。txt,如下所示: 上图的说明将我们指向了xtrabackup的判断逻辑出现了问题,如果继续分析我们可以将xtrabackup打一个源码包,进而使用gdb进行分析源代码中的逻辑判断的方法来继续分析,相关使用步骤这里不做过多说明。有兴趣的同学可以参考社区中的《一问一实验》专栏的第9问、第12问和第32问,以及文末的参考文档。 关于逻辑判断问题大体出在了下图源码中,官方的requests中发现该问题在新版本xtrabackup中已经得到解决,附上链接:https:github。comperconaperconaxtrabackuppull1094。 代码变更: 5、扯总结 本篇文章概括内容有两点: (1)遇到备份时MySQL启动报错binlog名称丢掉的情况可能是binlog。index文件中信息丢失,如果是这种情况只要重写该文件重启即可完成数据库的恢复。 (2)使用xtrabackup版本fromperconaxtrabackup8。0。6toperconaxtrabackup8。0。2316时需要注意binlog文件名如果配置了绝对路径,发生文章中这种报错提前预知,官方已于https:github。comperconaperconaxtrabackupblobperconaxtrabackup8。0。2517storageinnobasextrabackupsrcbackupcopy。cc版本修复。 6、来参考 strace的使用技巧:一问一实验12:Tablecache有什么作用 gdb的使用:一问一实验09MySQL莫名崩溃,如何保留现场 参考MySQL的调试版本编译xtrabackup:一问一实验39:如何编译MySQL的调试版本 xtrabackup编译:https:www。percona。comdocperconaxtrabackup8。0installationcompilingxtrabackup。html(文章中有一个坑,建议cmake不要使用B参数) 源码变更:https:github。comperconaperconaxtrabackupcommitd27028be415b8a1940066d993ca9fa7f1ce1b675 bug修复版本:https:github。comperconaperconaxtrabackupblobperconaxtrabackup8。0。2517storageinnobasextrabackupsrcbackupcopy。cc Linux系统调用函数解释:https:man7。orglinuxmanpagesman2open。2。html ps:问题涉及的故障点很容易处理,本篇主要是跟大家分享一些工具的使用以及问题的分析思路,多多学习MySQL周边,共同进步。 文章推荐: 故障分析记一次MTS并行复制导致的死锁排查 故障分析如何提高MHA的网络容忍能力?(下) 故障分析如何提高MHA的网络容忍能力?(上) 社区近期动态 本文关键字:xtrabackupMySQLbinlog