范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文
国学影视

故障分析xtrabackup吃掉了MySQL的binlog文件名?

  作者:刘开洋
  爱可生交付服务团队北京 DBA,对数据库及周边技术有浓厚的学习兴趣,喜欢看书,追求技术。
  本文来源:原创投稿
  *爱可生开源社区出品,原创内容未经授权不得随意使用,转载请联系小编并注明来源。
  前段时间在 centos 8 环境上做 MySQL 的备份恢复测试的时候,遇到一个问题,下面跟大家分享下。
  1、讲环境服务器OS数据库版本备份工具Centos 8 for X86 mysql 8.0.18 xtrabackup 8.0.10
  小编的问题场景出现在 centos 8 上,验证也使用了 centos 8 版本,不过相信看到最后你会发现这个问题和 OS 关系不大,我们继续往下看。
  2、说问题
  从备份到恢复的过程还挺顺利,但是在最后启动数据库时出现了下面的问题,仔细看看,好像数据库的 binlog 文件名被吃掉了。2021-03-08T16:48:08.510032+08:00 0 [Warning] [MY-010097] [Server] Insecure configuration for --secure-file-priv: Current value does not restrict location of generated files. Consider setting it to a valid, non-empty path.
  2021-03-08T16:48:08.510125+08:00 0 [System] [MY-010116] [Server] /usr/sbin/mysqld (mysqld 8.0.18) starting as process 16556
  mysqld: File "/var/lib/mysql/.000003" not found (OS errno 2 - No such file or directory)
  2021-03-08T16:48:09.196673+08:00 0 [ERROR] [MY-010958] [Server] Could not open log file.
  2021-03-08T16:48:09.196787+08:00 0 [ERROR] [MY-010041] [Server] Can"t init tc log
  2021-03-08T16:48:09.196961+08:00 0 [ERROR] [MY-010119] [Server] Aborting
  2021-03-08T16:48:10.632676+08:00 0 [System] [MY-010910] [Server] /usr/sbin/mysqld: Shutdown complete (mysqld 8.0.18) MySQL Community Server - GPL.
  不要慌,这个现象可能是 binlog 的索引文件在数据库恢复的时候修改出错,就会导致数据库启动失败的情况,解决方案很简单,这里 MySQL 报错输出的是 binlog.index 文件中的信息,只要将 binlog 名重写,之后再启动数据库即可恢复。
  当然这不是我们这篇文章的重点,重点是讨论下为什么 xtrabackup 会因为 binlog 文件名不一致就只 delete 而不进行 insert 呢?因为之前的测试由于疏忽,没有确认配置文件是否一致,结果报错后发现备份恢复的两套环境中的 binlog 文件名不一致,因此猜测是因为binlog 文件名问题导致的这次故障发生,以小编既往故障案例的特点,我们还是先进行一个 review 复现吧。
  3、搞测试
  大体测试流程如下:
  (1) 准备 MySQL 8.0.18 环境,使用对应的 xtrabackup 做一个全备[root@yang ~]# xtrabackup --defaults-file=/etc/my.cnf --host=192.168.1.7 --user=root --password=123 --port=3306 --backup --target-dir=/root/backup-full/
  xtrabackup: recognized server arguments: --datadir=/var/lib/mysql --server-id=1 --log_bin=/var/lib/mysql/mysql-bin
  xtrabackup: recognized client arguments: --host=192.168.1.7 --user=root --password=* --port=3306 --backup=1 --target-dir=/root/backup-full/
  xtrabackup version 8.0.10 based on MySQL server 8.0.18 Linux (x86_64) (revision id: 94f9645)
  210515 12:11:55 version_check Connecting to MySQL server with DSN "dbi:mysql:;mysql_read_default_group=xtrabackup;host=192.168.1.7;port=3306" as "root" (using password: YES).
  210515 12:11:55 version_check Connected to MySQL server
  210515 12:11:55 version_check Executing a version check against the server...
  # A software update is available:
  210515 12:12:00 version_check Done.
  210515 12:12:00 Connecting to MySQL server host: 192.168.1.7, user: root, password: set, port: 3306, socket: not set
  Using server version 8.0.18
  xtrabackup: uses posix_fadvise.
  ······
  210515 12:12:04 completed OK!
  // 备份完成
  (2) 修改新实例配置文件中的 binlog 文件名,人为制造我们遇到的故障点[root@yang ~]# cat /etc/my.cnf | grep log_bin
  log_bin = /var/lib/mysql/binlog
  [root@yang ~]# vim /etc/my.cnf
  [root@yang ~]# cat /etc/my.cnf | grep log_bin
  log_bin = /var/lib/mysql/mysql-bin
  (3) 准备恢复环境[root@yang ~]# pkill mysqld
  [root@yang ~]# rm -rf /var/lib/mysql
  [root@yang ~]# cd backup-full/
  [root@yang backup-full]# ls
  backup-my.cnf ib_buffer_pool ibdata1 mysql binlog.000004 binlog.index mysql.ibd
  performance_schema sys test undo_001 undo_002 xtrabackup_binlog_info xtrabackup_checkpoints
  xtrabackup_info xtrabackup_logfile xtrabackup_tablespaces
  [root@yang backup-full]# cat binlog.index
  /var/lib/mysql/binlog.000004
  (4) xtrabackup 的 prepare 过程,即数据准备阶段[root@yang ~]# xtrabackup --defaults-file=/etc/my.cnf --user=root --prepare --target-dir=/root/backup-full/
  ······
  210515 12:14:28 completed OK!
  [root@yang ~]# cat backup-full/binlog.index
  /var/lib/mysql/binlog.000004
  (5) xtrabackup 的 copy-back 过程,即最后数据的恢复阶段[root@yang ~]# xtrabackup --defaults-file=/etc/my.cnf --user=mysql --copy-back --target-dir=/root/backup-full/
  xtrabackup: recognized server arguments: --datadir=/var/lib/mysql --server-id=1 --log_bin=/var/lib/mysql/binlog
  xtrabackup: recognized client arguments: --user=mysql --copy-back=1 --target-dir=/root/backup-full/
  xtrabackup version 8.0.10 based on MySQL server 8.0.18 Linux (x86_64) (revision id: 94f9645)
  210515 12:14:51 [01] Copying undo_001 to /var/lib/mysql/undo_001
  ······
  210515 12:14:51 [01] Copying ./xtrabackup_info to /var/lib/mysql/xtrabackup_info
  210515 12:14:51 [01] ...done
  210515 12:14:51 [01] Copying ./xtrabackup_master_key_id to /var/lib/mysql/xtrabackup_master_key_id
  210515 12:14:51 [01] ...done
  210515 12:14:51 [01] Copying ./ibtmp1 to /var/lib/mysql/ibtmp1
  210515 12:14:51 [01] ...done
  210515 12:14:51 [01] Creating directory ./#innodb_temp
  210515 12:14:51 [01] ...done.
  210515 12:14:51 completed OK!
  [root@yang ~]# cat backup-full/binlog.index
  /var/lib/mysql/binlog.000004
  (6) 环境复现[root@yang ~]# chown -R mysql:mysql /var/lib/mysql/*
  [root@yang ~]# /usr/sbin/mysqld --defaults-file=/etc/my.cnf --user=mysql &
  [1] 1545
  [root@yang ~]#
  [1]+ Exit 1 /usr/sbin/mysqld --defaults-file=/etc/my.cnf --user=mysql
  [root@yang ~]# tail -f /var/log/mysqld.log
  2021-05-15T12:20:18.510125+08:00 0 [System] [MY-01016] [Server] /usr/sbin/mysqld (mysqld 8.0.18) starting as process 1545
  mysqld: File "/var/lib/mysql/.000004" not found (OS errno 2 - No such file or directory)
  2021-05-15T12:20:18.596673+08:00 0 [ERROR] [MY-010958] [Server] Could not open log file.
  2021-05-15T12:20:18.596787+08:00 0 [ERROR] [MY-010041] [Server] Can"t init tc log
  2021-05-15T12:20:18.596961+08:00 0 [ERROR] [MY-010119] [Server] Aborting
  2021-05-15T12:20:19.132676+08:00 0 [System] [MY-010910] [Server] /usr/sbin/mysqld: Shutdown complete (mysqld 8.0.18) MySQL Community Server - GPL.
  [root@yang ~]# ls /var/lib/mysql |grep bin
  mysql-bin.000004
  mysql-bin.index
  [root@yang ~]# cat /var/lib/mysql/mysql-bin.index
  /var/lib/mysql/.000004
  在以上操作中,每操作一步我们就查看下备份源中的 binlog 文件是否被篡改,发现并没有,只有最后 copy-back 数据的时候发生了 binlog.index 文件的更改。
  (7) 我们做一个猜测,会不会即使 binlog 名称相同也会导致这种报错吗?来测试一下[root@yang mysql]# cat /etc/my.cnf | grep log_bin // 修改配置文件与备份源的binlog文件名相同
  log_bin = /var/lib/mysql/binlog
  [root@yang ~]# rm -rf /var/lib/mysql/*
  [root@yang ~]# xtrabackup --defaults-file=/etc/my.cnf --user=mysql --copy-back --target-dir=/root/backup-full/
  ······
  [root@yang mysql]# cat /var/lib/mysql/binlog.index
  /var/lib/mysql/.000004
  有验证的猜测就不是算命了,那么就排除了 xtrabackup 备份时 binlog 名称不一致的问题,那么怎么进一步确定 xtrabackup 的行为呢?
  (8) 再次删除数据恢复数据的过程中进行 strace 监控,看看 xtrabackup 到底做了什么// 在copy-back过程中,另开一个会话输出xtrabackup 的strace
  [root@yang ~]# ps aux |grep xtrabackup | grep -v "color=auto" | awk "{print $2}" | xargs strace -o strace_output-copy_write.txt -T -tt -f -y -s 3000 -e trace=all -p
  strace: Process 2572 attached
  strace: Process 2575 attached
  4、聊分析
  接下来我们看 strace 的输出分析 strace_output-copy_write.txt ,如下所示:
  上图的说明将我们指向了 xtrabackup 的判断逻辑出现了问题,如果继续分析我们可以将 xtrabackup 打一个源码包,进而使用 gdb 进行分析源代码中的逻辑判断的方法来继续分析,相关使用步骤这里不做过多说明。有兴趣的同学可以参考社区中的《一问一实验》专栏的第9问、第12问和第32问,以及文末的参考文档。
  关于逻辑判断问题大体出在了下图源码中,官方的 requests 中发现该问题在新版本 xtrabackup 中已经得到解决,附上链接:https://github.com/percona/percona-xtrabackup/pull/1094 。
  代码变更:
  5、扯总结
  本篇文章概括内容有两点:
  (1) 遇到备份时 MySQL 启动报错 binlog 名称丢掉的情况可能是 binlog.index 文件中信息丢失,如果是这种情况只要重写该文件重启即可完成数据库的恢复。
  (2) 使用 xtrabackup 版本 from percona-xtrabackup-8.0.6 to percona-xtrabackup-8.0.23-16时需要注意 binlog 文件名如果配置了绝对路径,发生文章中这种报错提前预知,官方已于https://github.com/percona/percona-xtrabackup/blob/percona-xtrabackup-8.0.25-17/storage/innobase/xtrabackup/src/backup_copy.cc 版本修复。
  6、来参考
  strace 的使用技巧:一问一实验/12:Table cache 有什么作用
  gdb 的使用:一问一实验/09 - MySQL 莫名崩溃, 如何保留现场
  参考 MySQL 的调试版本编译 xtrabackup :一问一实验/39:如何编译 MySQL 的调试版本
  xtrabackup 编译:https://www.percona.com/doc/percona-xtrabackup/8.0/installation/compiling_xtrabackup.html (文章中有一个坑,建议 cmake 不要使用-B参数)
  源码变更:https://github.com/percona/percona-xtrabackup/commit/d27028be415b8a1940066d993ca9fa7f1ce1b675
  bug 修复版本:https://github.com/percona/percona-xtrabackup/blob/percona-xtrabackup-8.0.25-17/storage/innobase/xtrabackup/src/backup_copy.cc
  Linux 系统调用函数解释:https://man7.org/linux/man-pages/man2/open.2.html
  ps:问题涉及的故障点很容易处理,本篇主要是跟大家分享一些工具的使用以及问题的分析思路,多多学习 MySQL 周边,共同进步。
  文章推荐:
  故障分析 | 记一次 MTS 并行复制导致的死锁排查
  故障分析 | 如何提高 MHA 的网络容忍能力?(下)
  故障分析 | 如何提高 MHA 的网络容忍能力?(上)
  社区近期动态
  本文关键字:#xtrabackup# #MySQL# #binlog#

哺乳期能和不能?一次性说清很多妈妈来询问,现在是哺乳期,这个可以吗?那个可以吗?今天小编就妈妈们询问最多的问题做个解答,可以收藏备用起来啦!Q哺乳期能不能化妆?A能。需要出门的时候,可以化一点简单的淡妆,并父母们,不要对孩子说这种话其实大部分成长过程中,父母多多少少都说过这样杀伤力极强的五句话1。我什么时候答应过你2。我养你有什么用3。你再这样,爸妈就不要你了4。早就告诉过你了,你非不听5。我们都是为了你好其315收好这份消费指南生活中,每个人都是消费者关于315大家了解多少?和我们有什么关系?如何维护自己的合法权益?国际消费者权益日是每年的3月15日,由国际消费者联盟组织于1983年确定。目的在于扩大消费贾静雯女儿被查出先天弱视孩子视力怎么保护?2月1日,贾静雯微博发长文透露女儿咘咘在体检时发现患有弱视,两眼有高度视差600度,医生说这是先天的,从出生就这样,她自己也没有感觉。贾静雯感叹好在发现及时没有错过黄金治疗期,现在上海白领体检异常率99!宝宝体检如何做?前两天,上海白领体检异常率99话题被推上微博热搜。除此之外,近一个月关于猝死新闻也是频频出现,一度引起热议。工作压力生活快节奏,让猝死成为很多人的健康焦虑。不少网友吐槽自己小时候不睡整夜的宝宝,夜里需要换纸尿裤吗?首先我们要从两个方面看这个问题,第一,是宝宝的月龄有多大,第二,是使用的尿不湿吸收量如何。我们先说月龄。通常情况下,不管是母乳喂养还是奶粉喂养,03个月月龄的宝宝不太会睡整觉(整觉每年有近17万儿童受到生命伤害,竟是源于这个抽烟。我在吸烟区抽烟,不影响其他人。事实果真如此吗?烟霾中有毒的铅致癌的甲醛放射性物质钋等等物质,绝对不会因为写着吸烟区的标牌,就停止扩散,就能避免进入孩子们的体内。也就是说,我们惊!郑爽被爆疑似代孕?你不知道的黑色产业链背后娱乐圈,又翻天了前男友张恒突出出来发文,爆料自己在美国有2个孩子。更有媒体曝出疑似张恒的朋友圈,朋友圈里曝出的图片中,张恒回应了大家的疑问,承认孩子属于自己的,并说明孩子的年龄是一亲宝宝嘴巴捏宝宝脸颊原来这么危险家里的小宝宝刚出生,新手爸妈手忙脚乱,晕头转向,也难免会出现一些小错误。但有些小错误可能会影响到宝宝的生长发育,所以尽量避免。1。给新生儿洗澡过于频繁宝宝出生后因为身上还有一些皮脂大头娃娃事件调查后续婴幼儿怎么护肤才安全?前段时间,大头娃娃面霜事件在社会引起不小的热议。微博热搜截图出厂价4元,母婴店拿货价28元,售价69元一瓶,高额利润让益芙灵抑菌霜成为不少母婴店的明星推荐产品,一抹就好的疗效,更让春天开启,粉尘柳絮好烦恼,宝宝怎么办?春天来了,万物复苏,很多麻麻却开始担心起来。她们担心什么?春天是柳絮飘飞的季节,漫天飞舞的柳絮粉尘让人防不胜防,宝宝一言不合就过敏!柳絮其实是柳树种子和种子上附生的绒毛,本身对人群
教研员应该如何听课评课听课评课这一项教研员的常规工作影响重大,它集管理诊断评估指导研究沟通交流鼓励多项功能于一体,在很大程度上影响着教师课堂教学的规范和改革,影响着教师的专业化发展。听课评课虽然不像上课教研员如何提高评课水平?导读听课评课是教研员的基本工作,是衡量教研员业务水准的一个最鲜明的尺度。随着新课程改革的深入,教师间的听课评课已经成为校本教研的基本形式。作为教研员,如何有高人一筹的听课评课本领,课堂教学的导入与收尾技巧课堂教学的导入技巧1。故事导入讲传说听故事是初中学生大都喜闻乐道的。上课伊始,一个动人的故事,一则美丽的传说,会使他们很快安静下来,教师就可以把握住这有利时机,把学生的无意注意及时这样说课才完美随着新课改理念的发展,说课的内容基本上分8个方面,即说教材说学情说模式说设计说板书说评价说开发说得失,下面分别进行解读。一说教材说课首先要说明自己对教材的理解。说教材的目的有两个一好课的四个标准有人有料有趣有变课堂要有人1你的课堂上,有生命的成长吗?有人的第一层含义,当然是有学生。作为一位教师,应该努力从教育的本源来认识我们的课堂,教育是面对人,帮助人的生命生长的,着眼生命生长的课堂,必学前班将成为历史,还带来一个坏消息,小学生直呼伤不起文樱花谈教育(原创文章,欢迎转载分享)从幼儿园到小学有一个过渡班型学前班,让孩子超前学习小学课程,便于孩子幼升小后更好地适应小学阶段的学习。但是,超前教育的形式不只此一种,还有社会小学生锋芒字体走红,卷面乱七八糟很扎眼,老师想给分都难文樱花谈教育(原创文章,欢迎转载分享)从孩子上小学开始,老师就会提出书写的规范要求,比如坐姿握姿要正确,一笔一划要认真,字体工整规范,书面干净整洁。但总有一些不走寻常路的孩子,写出大学生花样晒被子走红,如果雕像会说话,开口就是祈雨歌文樱花谈教育(原创文章,欢迎转载分享)根据教育部发布的最新数据来看,目前我国在校的大学生已经高达260多万。这个数据表明我国高校教育事业在近几年迅猛发展,大学生也成为了社会关注的的学生写出锋芒字体,一撇一捺显张扬,比容嬷嬷的针还扎手文樱花谈教育(原创文章,欢迎转载分享)在电脑打字取代人工书写的现代高科技迅猛发展之下,写字教学的推行在中学生课堂中已遇到了一定的阻力。特别是在面对日益繁重的学业面前,学生们学习完知有时候,单纯的放手,就可以让孩子收获成长有时候,单纯的放手,就可以让孩子收获成长。其实,放手也是一种信任与尊重,给孩子带来体验与成长,而与之相反的不肯放手对孩子的成长却是一种干扰和阻碍。在一个科技馆里,有一个关于时间的展提高孩子的自主能力提高孩子的自主能力(五要五不要)1。要教育子女养成自己想办法的习惯2。要把选择权给子女,让子女成为自己的主人3。要培养子女的责任心,多指导,少批评4。培养孩子的好奇心,不要什么都教