1+N环境-分布式数据库mysql8系列故障重启问题处理
1、背景
多个业务连接异常,navicat连接数据库不稳定,连接进入数据库后也会出现卡死的,连接失败的报错
2、问题分析
2.1 问题描述:
navicat、服务器中连接数据库均复现业务报告的问题,查看后端mysql库日志,mysql主库在连续地故障重启。数据库使用的是主备模式,mysql切换到备库后,备库也开始连续的故障重启。
2.2 原因分析:
检查mysql日志,存在导致数据库异常重启原因:简单理解是,部分数据存放超出表空间,访问时指针会超出该表的访问地址范围,触发mysql bug,导致重启
[ERROR] [MY-012153] [InnoDB] Trying to access page number 2310 in space 13033, space name saledb_jxyd0/sale_contract_info, which is outside the tablespace bounds. Byte offset 0, len 16384, i/o type read. If you get this error at mysqld startup, please check that your my.cnf matches the ibdata files that you have in the MySQL server
Trying to get some variables.
Some pointers may be invalid and cause the dump to abort.
Query (7f5b400336f0): SELECT p.PROJECT_ID, s.PROJECT_ID AS SUBJECT_ID, p.SALE_OPP_ID, p.APPLY_PERSON, c.CONTRACT_ID, c.END_DATE FROM project s JOIN sale_project p ON s.SALE_OPP_ID = p.SALE_OPP_ID JOIN sale_pro_con_rel r ON r.project_id = s.PROJECT_ID JOIN sale_contract_info c ON c.CONTRACT_SERIAL_NO = r.CON_SERIAL_NO WHERE p.STATUS_CD != '2'
Connection ID (thread ID): 59
Status: NOT_KILLED
日志截图信息:
2.3 处理过程
涉及的表:saledb_jxyd0.sale_contract_info
执行任何该表的操作都会导致数据库重启,官网暂时没有可解决方案,猜测调整数据库innodb 缓存相关参数,依旧无效。与业务协商后,可以删除sale_contract_info表。
操作过程:
1) 注释saledb_jxyd0 该库用户,暂时禁止该用户访问,避免重复触发bug导致数据库重启。
2) 停止主备库双向同步
3) 在备库备份通过备份saledb_jxyd0库时跳过该表的备份,然后恢复到备库,备库无异常后,开启主备库双向同步,恢复数据
4) 备份过程中出现的问题:
sale_project_enter_info、sale_project_addtional_recording 这两张表恢复时报错: Row size too large (> 8126). Changing some columns to TEXT or BLOB or using ROW_FORMAT=DYNAMIC or ROW_FORMAT=COMPRESSED may help. In current row format, BLOB prefix of 768 bytes is stored inline。
innodb 默认ROW_FORMAT 是COMPACT,修改为DYNAMIC既可创建成功。
3、问题总结
本次故障出现的环境:mysql-8.0.30
待讨论部分:本次故障出现之前做了数据库升级,5.7、8.0系列分别升级后,据目前了解,所涉及的商务项目中,5.7系列未出现问题,8.0.23版本升级之前,也从未出现过该问题。
目前为止有两个环境升级到mysql8.0.30出现bug:
Ø 1+N环境 mysql8系列升级之后出现该bug,使用备份恢复方式恢复业务数据
Ø ****升级所有环境mysql,也有两个业务库出现该bug,也使用备份恢复方式恢复业务数据
目前针对数据库本身,暂无该问题有效的预防方案,升级之前检查数据库没有效果
非漏扫问题,不建议直接升级到mysql8.0.30最新版