变更引发 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]
然后检查空间,空间没有问题:
查看 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 表损坏。
Tablespace is missing for a table
尝试清空数据命令失败
truncate table history;
发现 /var/lib/mysql/zabbix/ 里面有history.frm文件,丢失history.ibd文件。有个 history_uint.ibd 文件XXg,history_uint表格式正常显示。
使用history_uint表内容和格式复制一份创建history。
MySQL根据.frm和.ibd文件恢复表结构和数据 - JavaShuo
完成后history表格式正常显示。
最后报错恢复正常。
故障反思
故障处理完成后,其实还没有结束。我们还要进行故障复盘,目的是为了防止出现再次出现同样的问题。复盘的过程中,会分析故障的根本原因、变更操作流程、风险识别不全原因,以及预防措施,避免下次再次出现这类故障。