MySQL Cluster (NDB) 錯誤碼往往直指內核模塊:4009 Cluster Failure、157 Unknown error、851 Fixed column limit、1501 Out of undo space、233 MaxNoOfConcurrentOperations... 每個碼都對應特定內核資源耗盡或協議違規。本文匯總 32 類生產實戰錯誤,按 **錯誤碼 → 現象 → 根因 → 解決 → 預防** 結構化呈現,作為 NDB 運維「速查手冊」。
| 錯誤碼 | SQLSTATE | 典型現象 | 核心根因 | 標準解決 |
|---|---|---|---|---|
| 1296 / 4009 | HY000 | CREATE DATABASE 報警告 "Could not acquire global schema lock" | Schema 分發協議超時,管理節點或數據節點通信擁塞 | 重啟 SQL 節點;檢查管理節點日志 ndb_mgmd.log |
| 1296 / 157 | HY000 | SHOW CREATE TABLE / CREATE TABLE 報 "Unknown error code" | 元數據同步失敗,SQL 節點與數據節點版本不一致或網絡抖動 | 重啟該 SQL 節點 (service mysqld restart) 觸發全量元數據同步 |
| 1296 / 1504 | HY000 | CREATE LOGFILE GROUP 失敗 "Out of logbuffer memory" | RedoBuffer 配置過小,或 UNDO_BUFFER_SIZE 超過 RedoBuffer | 調大 RedoBuffer=64M,確保 UNDO_BUFFER_SIZE <= RedoBuffer |
| 1528 | HY000 | CREATE LOGFILE GROUP 失敗 "Failed to create LOGFILE GROUP" | **每叢集僅允許 1 個 LOGFILE GROUP** (直到 8.0 才支持多個) | 先 DROP LOGFILE GROUP 再建新;或復用現有 LG 增加 UNDOFILE |
| 1114 / 902 | HY000 | INSERT 大量數據 "The table is full" + "Out of memory in Ndb Kernel, ordered index data" | DataMemory 耗盡,或有序索引內存超限 | ALTER TABLESPACE ... ADD DATAFILE 擴容磁盤表;調大 DataMemory 並滾動重啟數據節點 |
| 1297 / 1501 | HY000 | ALTER TABLE / 大事務 "Out of undo space" | UNDO 文件空間不足,或長事務佔用大量 UNDO | 1) ALTER LOGFILE GROUP ... ADD UNDOFILE 2) 增加 DATAFILE 3) 拆分大事務 |
| 1297 / 899 | HY000 | CREATE TABLE / INSERT "Rowid already allocated" | 行 ID 分配器耗盡,或元數據不一致 | 重啟整個叢集 (ndb_mgm -e shutdown → 全啟) 重置分配器 |
| 1005 / 851 | HY000 | 磁盤表建表失敗 "Maximum 8052 bytes of FIXED columns supported" | 磁盤表定長列 (CHAR/VARCHAR 不含 DYNAMIC) 總長超過 8052 字節 | 將大字段改為 VARCHAR 或显式 COLUMN_FORMAT DYNAMIC |
| 1297 / 233 | HY000 | 大批量 INSERT "Out of operation records in transaction coordinator" | 單事務操作記錄超過 MaxNoOfConcurrentOperations | 調大參數 (如 10000000) 並 ndbd --initial 重啟數據節點 |
| 1234 | HY000 | 壓測 "REDO log files overloaded (increase disk hardware)" | Redo 日志寫入速度超過磁盤刷盤能力,FragmentLogFileSize/NoOfFragmentLogFiles 不足 | 調大 FragmentLogFileSize=512M、NoOfFragmentLogFiles=256,需 --initial 生效 |
CREATE DATABASE、CREATE TABLE、ALTER TABLE 返回 Warning 1296 / Error 157。config.ini [API] 節點配置是否足夠 (預留 2-3 個空槽位)。HeartbeatIntervalDbApi=15000 容忍網絡抖動。| 資源 | 控制參數 | 擴容方式 | 是否需 --initial |
|---|---|---|---|
| DataMemory | DataMemory | 修改 config.ini → 滾動重啟數據節點 (無需 --initial) | 否 |
| IndexMemory | IndexMemory | 同上 | 否 |
| Redo Buffer | RedoBuffer | 修改 config.ini → 需 ndbd --initial 重建 Redo 日志文件 | 是 |
| Undo Buffer / 文件 | UndoBufferSize / UNDOFILE | ALTER LOGFILE GROUP ... ADD UNDOFILE 熱加載 | 否 |
| 操作記錄槽 | MaxNoOfConcurrentOperations | 修改 config.ini → 滾動重啟 | 否 |
| 發送緩衝 | SendBufferMemory / TotalSendBufferMemory | 修改 config.ini → 滾動重啟;關閉 Binlog 可大幅降低佔用 | 否 |
VARCHAR(n) 或 COLUMN_FORMAT DYNAMIC 強制動態存儲。MaxNoOfAttributes 過小,每表列數 × 表數超過限制。**解決**:調大至 20000+ 並重啟。TimeBetweenLocalCheckpoints 過大導致檢查點間隔久,Redo 積壓。TimeBetweenLocalCheckpoints=20 (秒)、NoOfFragmentLogFiles=128。FragmentLogFileSize=512M、InitFragmentLogFiles=SPARSE (稀疏文件加速初始化)。HeartbeatIntervalDbDb=5000、HeartbeatIntervalDbApi=10000、確保專用心跳網卡/VLAN、關閉交換機流控。LockPagesInMainMemory 非法值 (只能 0/1/2) → 改為 1 (鎖定內存防 Swap)。MaxNoOfAttributes 過小導致建表失敗 → 根據 SHOW TABLE STATUS 估算總列數 × 1.5 留餘量。鐵律:任何涉及 Redo/Undo、DataMemory、IndexMemory、FragmentLogFileSize 的參數變更,數據節點必須執行
ndbd --initial重啟。
但--initial會**清空節點本地數據文件** (保留 Schema 元數據),重啟後從對端同步數據。**操作步驟**:
STARTED,無單點故障。config.ini,ndb_mgmd -f config.ini --reload 熱加載管理節點。ndb_mgm -e "NODE_ID STOP" → ndbd --initial → 等待 STARTED → 下一個。SELECT COUNT(*) FROM critical_table 對比各 SQL 節點。⚠️ **切記**:同時對多個數據節點執行 --initial 會導致叢集數據丟失 (無副本源)。
[NDBD DEFAULT]
# 內存核心
DataMemory=64G
IndexMemory=8G
# 併發與操作記錄
MaxNoOfConcurrentTransactions=100000
MaxNoOfConcurrentOperations=10000000
MaxNoOfLocalOperations=11000000
# 元數據上限
MaxNoOfAttributes=50000
MaxNoOfTables=10240
MaxNoOfOrderedIndexes=5120
MaxNoOfUniqueHashIndexes=5120
# Redo/Undo 日志 (需 --initial 生效)
RedoBuffer=256M
FragmentLogFileSize=512M
NoOfFragmentLogFiles=256
InitFragmentLogFiles=SPARSE
# Undo
UndoBufferSize=64M
# 通信緩衝
SendBufferMemory=8M
TotalSendBufferMemory=256M
# 心跳容忍 (跨機房/高延遲網絡)
HeartbeatIntervalDbDb=5000
HeartbeatIntervalDbApi=10000
# 磁盤表
DiskPageBufferMemory=4G
# 備份
BackupMemory=256M
# 避免 Swap
LockPagesInMainMemory=1
MySQL Cluster 錯誤碼看似晦澀,實則是內核資源模型的直接投射。**記住核心資源五要素:DataMemory、IndexMemory、RedoBuffer、MaxNoOfConcurrentOperations、Undo 空間**。運維本質是「資源預算管理」:監控使用率、預留 20% 紅線、變更走滾動升級、壓測驗證極限。將本文錯誤表做成 Wiki 頁面,接入告警自動匹配根因建議,才能從「救火隊員」進化為「架構師」。