Zabbix 數據庫 history_uint 表損壞修復
問題現象
使用CentOS 9部署Zabbix 7.0使用一段時間后,查詢歷史數據時出現報錯,Zabbix圖形歷史數據顯示異常。并且Zabbix對接了Grafana,在Grafana歷史圖形中出現圖像數據不連續的現象。
Zabbix前端Top hosts by CPU untilization顯示紅色告警框,告警內容如下:
Error in query [SELECT * FROM history_uint h WHERE h.itemid='42253' AND h.clock>1739060872 ORDER BY h.clock DESC,h.ns DESC LIMIT 1] [Index for table 'history_uint' is corrupt; try to repair it] [zabbix.php:17 → require_once() → ZBase->run() → ZBase->processRequest() → CController->run() → Widgets\TopHosts\Actions\WidgetView->doAction() → Widgets\TopHosts\Actions\WidgetView->getData() → Widgets\TopHosts\Actions\WidgetView->getitemValues() → CHistoryManager->getLastValues() → CHistoryManager->getLastValuesFromSqlWithPk() → DBselect() → trigger_error() in include/db.inc.php:243]
進入數據庫檢查表狀態,表空間損壞丟失。
MariaDB [(none)]> use zabbix; MariaDB [zabbix]> check table history_uint; +---------------------+-------+----------+------------------------------------------------------------------------------+ | Table | Op | Msg_type | Msg_text | +---------------------+-------+----------+------------------------------------------------------------------------------+ | zabbix.history_uint | check | Error | Got error 194 "Tablespace is missing for a table" from storage engine InnoDB | | zabbix.history_uint | check | error | Corrupt | +---------------------+-------+----------+------------------------------------------------------------------------------+ 2 rows in set (0.000 sec)
修復方法
可以通過啟用innodb_force_recovery臨時模式啟動數據庫,刪除損壞表并重建表結構即可修復history_uint表損壞問題。
1、停止Zabbix服務
[root@localhost ~]# systemctl stop zabbix-server
2、啟用InnoDB強制恢復模式
編輯MySQL主配置文件/etc/my.cnf
[root@localhost ~]# vim /etc/my.cnf
在主配置文件中添加以下內容:
[mysqld]
innodb_force_recovery=1
3、重啟數據庫服務
[root@localhost ~]# systemctl stop mariadb.service
[root@localhost ~]# systemctl start mariadb.service
4、刪除并重建history_uint表
進入數據庫:
[root@localhost ~]# mysql -uroot -p
執行以下SQL語句:
USE zabbix;
DROP TABLE history_uint;
CREATE TABLE `history_uint` (
`itemid` bigint(20) unsigned NOT NULL,
`clock` int(11) NOT NULL DEFAULT 0,
`value` bigint(20) unsigned NOT NULL DEFAULT 0,
`ns` int(11) NOT NULL DEFAULT 0,
PRIMARY KEY (`itemid`,`clock`,`ns`)
) ENGINE=InnoDB
DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;
5、關閉恢復模式并重啟數據庫
刪除/etc/my.cnf配置文件中新增的以下內容:
[mysqld]
innodb_force_recovery=1
重啟數據庫服務:
[root@localhost ~]# systemctl stop mariadb.service
[root@localhost ~]# systemctl start mariadb.service
6、啟動Zabbix服務
[root@localhost ~]# systemctl start zabbix-server
至此,即可完成history_uint表損壞導致歷史數據查詢異常的問題。
腳本修復
1、創建一個名為zabbix_db_tools.sh的文件
vim zabbix_db_tools.sh
2、將以下內容復制到文件中,按下Esc鍵,然后按下Shift+:鍵,輸入wq!保存
#!/bin/bash # =============================================== # Zabbix 數據庫修復腳本 (history_uint 表損壞修復) # 使用前請確認運行用戶有root權限 # =============================================== MYSQL_CONF="/etc/my.cnf" MYSQL_CMD="/usr/bin/mariadb -uroot" ZABBIX_DB="zabbix" echo "===============================" echo "開始執行 Zabbix 數據庫修復流程..." echo "===============================" # Step 1: 停止 Zabbix 服務 echo "[1/10] 停止 Zabbix 服務..." systemctl stop zabbix-server 2>/dev/null systemctl stop zabbix-agent 2>/dev/null # Step 2: 啟用 innodb_force_recovery echo "[2/10] 啟用 innodb_force_recovery=1 ..." if grep -q "innodb_force_recovery" "$MYSQL_CONF"; then sed -i 's/^#\?\s*innodb_force_recovery=.*/innodb_force_recovery=1/' "$MYSQL_CONF" else sed -i '/^\[mysqld\]/a innodb_force_recovery=1' "$MYSQL_CONF" fi # Step 3: 停止數據庫服務 echo "[3/10] 停止 MariaDB 數據庫..." systemctl stop mariadb.service # Step 4: 啟動數據庫(恢復模式) echo "[4/10] 啟動 MariaDB (恢復模式)..." systemctl start mariadb.service sleep 3 # Step 5-6: 刪除并重建表 echo "[5/10] 連接數據庫并修復表..." $MYSQL_CMD <<EOF USE $ZABBIX_DB; DROP TABLE IF EXISTS history_uint; CREATE TABLE \`history_uint\` ( \`itemid\` bigint(20) unsigned NOT NULL, \`clock\` int(11) NOT NULL DEFAULT 0, \`value\` bigint(20) unsigned NOT NULL DEFAULT 0, \`ns\` int(11) NOT NULL DEFAULT 0, PRIMARY KEY (\`itemid\`,\`clock\`,\`ns\`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin; EOF # Step 7: 禁用 innodb_force_recovery echo "[6/10] 禁用 innodb_force_recovery..." sed -i 's/^innodb_force_recovery/#innodb_force_recovery/' "$MYSQL_CONF" # Step 8-9: 重啟數據庫 echo "[7/10] 重啟 MariaDB..." systemctl stop mariadb.service sleep 2 systemctl start mariadb.service sleep 3 # Step 10: 啟動 Zabbix 服務 echo "[8/10] 啟動 Zabbix 服務..." systemctl start zabbix-server systemctl start zabbix-agent echo "===============================" echo "數據庫修復完成!" echo "請登錄 Zabbix 檢查數據是否正常。" echo "==============================="
4、執行腳本進行修復
在腳本所在目錄,執行腳本即可修復history_uint表損壞的問題。
sudo ./zabbix_db_tools.sh

浙公網安備 33010602011771號