面试官:MySQL权限表损坏导致无法启动怎么办?

如题所述

面对MySQL权限表损坏导致无法启动的问题,首先回顾了在升级MySQL Server版本(从5.7.26到5.7.31)后,测试同学发现创建用户后集群启动失败的情况。这引发疑问:为何相同测试场景下,不同版本的MySQL Server会有不同表现。随后,详细描述了问题复现步骤,包括在特定环境下创建用户、关闭mysqld和重启mysqld,以及查看启动失败的error日志。报错信息指向MySQL权限系统表损坏,指出MyISAM引擎不支持事务特性,导致在mysqld异常崩溃时表损坏。

接下来解析了MySQL中MyISAM存储引擎恢复模式的参数设置。官方文档解释了不同参数值对于表恢复模式的影响,包括OFF、DEFAULT、BACKUP、FORCE或QUICK等选项。通过此参数,mysqld在每次打开MyISAM表时检查表是否标记为崩溃或未正确关闭,并尝试修复损坏的表。同时,服务器会将修复注释写入错误日志,以便用户检查表损坏原因。

针对MySQL用户表损耗的问题,介绍了多种解决方式,其中一种是通过修改my.cnf配置文件中的参数skip_grant_tables,在启动时跳过加载系统字典。重启mysqld后,使用特定命令修复mysql schema下的所有表。最后,注释或删除skip_grant_tables参数,再次重启mysqld,确保其能够正常启动。

在深入排查过程中,发现以上解决方式虽然能暂时解决启动问题,但不适用于产品化环境。为了寻找根本原因,团队决定通过MySQL源代码进行调试。首先,下载MySQL 5.7.31版本源代码,并搭建调试环境。通过搜索关键字和调试代码,定位到与启动失败相关的关键代码行。

经过多次调试,确认了acl_init函数初始化权限检查结构时出现问题,导致权限初始化失败。进一步的调试显示,在lock_table_names函数的Phase 3阶段,发现与read_only参数相关的代码变动,这与MySQL 5.7.26版本有所区别。代码变更解决了BUG#28438114,即在SET READ_ONLY=1时避免了并发DDL操作的阻塞问题。检查my.cnf配置文件,发现使用了read_only参数。通过注释该参数,再次启动mysqld,发现MyISAM表能够自动修复并正常启动。

为了解决实际产品环境中的问题,团队建议在启动mysqld时先关闭read_only参数,启动完成后再开启此参数。这样避免了在mysqld启动后选主逻辑未完成时的保护措施,同时确保了在选主完成后,自动对master执行set global read_only=0操作,以优化系统性能。

总结整个问题解决过程,从问题复现到深入排查,再到解决方案的实施,强调了MySQL体系结构、innodb存储引擎工作原理、备份恢复、复制、数据迁移等技术的重要性。该案例展示了在面对复杂数据库问题时,通过代码调试、深入分析和合理配置,能够有效解决问题并优化系统性能。
温馨提示:内容为网友见解,仅供参考
无其他回答

面试官:MySQL权限表损坏导致无法启动怎么办?
针对MySQL用户表损耗的问题,介绍了多种解决方式,其中一种是通过修改my.cnf配置文件中的参数skip_grant_tables,在启动时跳过加载系统字典。重启mysqld后,使用特定命令修复mysql schema下的所有表。最后,注释或删除skip_grant_tables参数,再次重启mysqld,确保其能够正常启动。在深入排查过程中,发现以上解...

面试官:MySQL权限表损坏导致无法启动怎么办?
由于docker一些限制,我们在mysqld启动会涉及两次;所以解决该问题的方式为:第一次mysqld的启动时先关闭read_only参数,第二次启动时开启read_only参数。之所以选择默认开启read_only参数, 是为了避免在mysqld启动后,选主逻辑未完成时的保护措施;当然选主完成后,会自动对master执行 set global read_onl...

面试官:MySQL是如何执行一条查询语句的?
第二个是表里面任何一条数据发生变化的时候,这张表所有缓存都会失效,所以对于有大量数据更新的应用,也不适合。 所以缓存还是交给ORM框架(比如MyBatis默认开启了一级缓存),或者独立的缓存服务,比如Redis来处理更合适。 在MySQL8.0中,查询缓存已经被移除了。语法解析和预处理 为什么一条SQL语句能够被识别呢?假如随便执行...

面试官:说说Mysql索引失效的几种可能原因
重新挖掘mysql优化知识,聚焦于索引,弥补遗忘。解释索引失效现象,列举常见原因:1. 条件中使用or,索引无法生效。为确保or条件下的索引可用,应为每个列添加索引。2. 多列索引中非首列条件,索引失效。只要包含首列,无论顺序如何,索引通常可用。3. 使用like查询以%开头,索引不被利用。4. 索引列数据...

面试官:MySQL为什么推荐表字段NOT NULL?
尽管在优化文章和书籍中,常强调字段应尽量使用NOT NULL,但往往缺乏详细解释。其实,原因在于NULL字段需要额外空间存储值是否存在,对于MyISAM表,每个多余的NULL字段会占用一个字节。此外,MySQL在处理引用可空列的查询时会遇到困难,索引、统计和值处理会变得复杂,可能导致索引变大,影响查询性能。《高...

面试官:Mysql千万级大表如何进行深度分页优化
首先,分析LIMIT offset, count查询过程,它会先在二级索引中查找大量记录ID,再回表聚集索引获取数据,这在offset+count数值大时会导致全表扫描,索引效率降低。解决方案包括使用子查询,通过获取create_time获取第offset+1条记录,减少回表数据量;利用INNER JOIN,创建包含必要信息的临时表,仅回表少量数据...

美团面试题:如何设计负载均衡架构支撑千万级用户的高并发访问?
1.8.4 启动keepalived服务 1.8.5 在web服务器上进行配置 注意:web服务器上的配置为临时生效,可以将其写入rc.local文件,注意文件的执行权限。 使用curl命令进行测试 至此keepalived+lvs配置完毕 1.9 常见LVS负载均衡高可用解决方案 Ø 开发类似keepalived的脚本,早期的办法,现在不推荐使用。 Ø heartbeat+lv...

相似回答
大家正在搜