vlambda博客
学习文章列表

变更引发 Zabbix 的 Mysql 故障

大家好,我是小弗。

俗话说,90% 的故障都是由于变更引起的。小弗也亲身经历过无数次这种事了。那不做变更,行不行?答案是肯定不行!实际网络使用过程中,网络设备的过保替换、版本升级、漏洞修复、网络优化等,都是日常运维中一定会出现的情况,这些内容也都要通过变更来完成。既然无法避免做变更,那么只能通过减少变更次数、优化变更流程来尽量避免引发故障。

这不,有位读者来稿,最近做 Zabbix 虚拟机迁移,引发 mysql 数据库故障。

Zabbix的Mysql故障处理

最开始故障发生是由于Zabbix服务器做了虚拟机迁移,迁移后mysql数据库故障。

页面报错提示:

Error in query [SELECT itemid FROM history WHERE itemid IN (640747,640748,640749) AND clock>1645424779 GROUP BY itemid] [Got error 194 "Tablespace is missing for a table" from storage engine InnoDB]

然后检查空间,空间没有问题:

变更引发 Zabbix 的 Mysql 故障

查看 mysql 的错误日志:

my.cnf 配置文件也有路径

./var/lib/selinux/targeted/active/modules/100/mysql
./var/lib/mysql
./var/lib/mysql/mysql
./usr/bin/mysql
./usr/lib64/perl5/vendor_perl/auto/DBD/mysql
./usr/lib64/perl5/vendor_perl/DBD/mysql
./usr/share/doc/zabbix-sql-scripts/mysql
./usr/share/bash-completion/completions/mysql
./usr/share/selinux/targeted/default/active/modules/100/mysql
[centos@localhost /]$

[centos@localhost /]$ ls /etc/my.cnf.d
auth_gssapi.cnf client.cnf enable_encryption.preset mariadb-server.cnf mysql-clients.cnf

log-error=/var/log/mariadb/mariadb.log
[centos@localhost /]$ sudo ls /var/log/mariadb/
mariadb.log mariadb.log-20220218.gz mariadb.log-20220219.gz mariadb.log-20220222.gz

zcat db1-20220221.sql.gz 查看压缩包文件,查看确实history表报错。

2022-02-21 17:54:06 16 [ERROR] InnoDB: Failed to find tablespace for table `zabbix`.`history` in the cache. Attempting to load the

进入mysql查看表数据结构,history 表损坏。

变更引发 Zabbix 的 Mysql 故障

Tablespace is missing for a table


尝试清空数据命令失败

truncate table history;

变更引发 Zabbix 的 Mysql 故障

发现 /var/lib/mysql/zabbix/ 里面有history.frm文件,丢失history.ibd文件。有个 history_uint.ibd 文件XXg,history_uint表格式正常显示。

使用history_uint表内容和格式复制一份创建history。

MySQL根据.frm和.ibd文件恢复表结构和数据 - JavaShuo

完成后history表格式正常显示。

最后报错恢复正常。

故障反思

故障处理完成后,其实还没有结束。我们还要进行故障复盘,目的是为了防止出现再次出现同样的问题。复盘的过程中,会分析故障的根本原因、变更操作流程、风险识别不全原因,以及预防措施,避免下次再次出现这类故障。