$ db2start
SQL10007N Message "-1393" could not be retrieved. Reason code: "1".
核心含義:DB2 實例啟動過程中發生內部錯誤 (代碼 -1393),但消息文件系統無法加載對應的錯誤文本,導致雙重故障。Reason Code "1" 明確指向:環境變量 DB2INSTANCE 未設置或指向無效實例。
| Code | 含義 | 典型原因 | 排查命令 |
|---|---|---|---|
| 1 | DB2INSTANCE 未設置/無效 | 用戶環境變量缺失、拼寫錯誤、實例未創建、多實例切換失敗 | echo $DB2INSTANCE / set DB2INSTANCE |
| 2 | 消息文件權限拒絕 | sqllib/msg 目錄/文件權限錯誤 (非實例擁有者)、SELinux/AppArmor 限制 | ls -la sqllib/msg/ / sestatus |
| 3 | 消息文件不存在 | 實例目錄損壞、安裝不完整、LANG/LC_ALL 語言環境目錄缺失 | ls sqllib/msg/ / locale |
| 4 | 消息文件版本不匹配 | Fix Pack 升級後未重啟實例/未運行 db2iupdt、手動拷貝舊版消息文件 | db2level vs db2ls |
| 5 | 語言環境不支持 | LC_CTYPE/LANG 設置為 DB2 不支持的 Locale (如 zh_CN.UTF-8 但無對應 msg 目錄) | locale -a | grep -i zh |
| 6 | 系統錯誤 (IPC/內存/內核) | 共享內存段不足、信號量耗盡、內核參數 (kernel.shmmax/sem) 過小 | ipcs -ma / cat /proc/sys/kernel/shmmax |
| 7 | 私有內存分配失敗 | 進程虛擬地址空間耗盡、ulimit -v 限制、32位進程 2GB 限制 | ulimit -a / cat /proc/<pid>/maps |
# Linux/UNIX (實例用戶 .bash_profile/.bashrc)
echo "DB2INSTANCE=$DB2INSTANCE"
echo "HOME=$HOME"
echo "PATH=$PATH"
# 驗證實例存在
db2ilist # 列出所有實例
ls -ld ~${DB2INSTANCE}/sqllib # 實例目錄是否存在
# 修正: 設置正確實例名 (假設實例名為 db2inst1)
export DB2INSTANCE=db2inst1
# 永久生效: echo "export DB2INSTANCE=db2inst1" >> ~/.bash_profile
# 檢查當前 Locale
locale
# LANG=zh_CN.UTF-8
# LC_CTYPE=zh_CN.UTF-8
# DB2 支持的語言目錄
ls -1 ~/sqllib/msg/
# 輸出示例: en_US zh_CN ja_JP ...
# 如果當前 LANG 無對應目錄,強制設置為 C (英文默認)
export LANG=C
export LC_ALL=C
# 或設置為已安裝的語言
export LANG=en_US.UTF-8
# 關鍵目錄/文件存在性
ls -la ~/sqllib/
# 必須存在: bin/ cfg/ cfgcache/ db2dump/ function/ include/ lib/ msg/ security/ tmp/
# 消息文件樣本
ls -la ~/sqllib/msg/en_US/ # 或 zh_CN/
# 必須存在: db2install.cat db2sys.cat db2sql.cat ... 以及 .msg 文件
# 文件擁有者必須為實例用戶
ls -ld ~/sqllib/msg/en_US/
# drwxr-xr-x 2 db2inst1 db2iadm1 4096 Jan 12 10:00 en_US
# SELinux 檢查 (RHEL/CentOS)
sestatus
# 如果 Enforcing,檢查上下文
ls -Z ~/sqllib/msg/
# 修復: restorecon -Rv ~/sqllib/
# 或臨時許可: setenforce 0 (需策略調整)
# AppArmor (Ubuntu/SLES)
aa-status | grep db2
# 檢查實例版本 vs 安裝映像版本
db2level
# DB210500I Version "11.5.8.0" ...
db2ls
# /opt/ibm/db2/V11.5 -> 11.5.8.0 (安裝映像)
# /home/db2inst1/sqllib -> 11.5.6.0 (實例, 舊版本!)
# 修復: 更新實例 (需實例停止)
db2stop
/opt/ibm/db2/V11.5/instance/db2iupdt db2inst1
db2start
# 共享內存段檢查
ipcs -m | grep ^0x
# 段數量、大小是否達到內核限制
# 關鍵內核參數 (RHEL 7/8, SLES 12/15)
cat /proc/sys/kernel/shmmax # 最大單段 (建議: 物理內存 90%, 字節)
cat /proc/sys/kernel/shmall # 總頁數 (建議: shmmax/4096)
cat /proc/sys/kernel/shmmni # 最大段數 (建議: 4096+)
cat /proc/sys/kernel/sem # 信號量: 250 32000 100 1024
# 永久生效: /etc/sysctl.d/99-db2.conf
# kernel.shmmax = 18014398509481984
# kernel.shmall = 4398046511104
# kernel.shmmni = 4096
# kernel.sem = 250 32000 100 1024
# sysctl -p /etc/sysctl.d/99-db2.conf
# 檢查實例用戶主目錄
grep ^${DB2INSTANCE}: /etc/passwd
# db2inst1:x:1001:1001::/home/db2inst1:/bin/bash
# 實際 HOME 環境變量
echo $HOME
# 必須與 passwd 一致,否則 db2start 找不到 ~/sqllib
REM 1. 環境變量 (系統/用戶級)
set DB2INSTANCE
REM 輸出: DB2INSTANCE=DB2
REM 2. 實例服務狀態
sc query DB2-DB2
REM STATE: RUNNING / STOPPED
REM 3. 實例目錄權限
icacls "C:\Program Files\IBM\SQLLIB\DB2" /grant "DB2USERS:(OI)(CI)F"
REM 4. 註冊表實例配置
reg query "HKLM\SOFTWARE\IBM\DB2\GLOBAL_PROFILE" /v DB2INSTANCE
reg query "HKLM\SOFTWARE\IBM\DB2\INSTPROF\DB2" /v DB2PATH
REM 5. db2cmd 環境驗證
db2cmd /c /w /i db2level
#!/bin/bash
# db2_sql10007n_diag.sh - 針對 SQL10007N 自動化診斷
set -e
echo "=== DB2 SQL10007N 診斷報告 $(date) ==="
echo "用戶: $(whoami)"
echo "DB2INSTANCE: ${DB2INSTANCE:-<未設置>}"
echo "HOME: $HOME"
echo "LANG: ${LANG:-<未設置>}"
echo "LC_ALL: ${LC_ALL:-<未設置>}"
echo -e "\n--- 1. 實例列表 ---"
db2ilist 2>/dev/null || echo "db2ilist 不可用或非 root"
echo -e "\n--- 2. 實例目錄 ---"
if [ -n "$DB2INSTANCE" ]; then
INST_HOME=$(eval echo ~${DB2INSTANCE})
echo "實例主目錄: $INST_HOME"
ls -ld "$INST_HOME/sqllib" 2>/dev/null || echo "sqllib 目錄不存在!"
ls -1 "$INST_HOME/sqllib/msg/" 2>/dev/null | head -5
else
echo "DB2INSTANCE 未設置,跳過實例目錄檢查"
fi
echo -e "\n--- 3. 語言環境匹配 ---"
if [ -n "$DB2INSTANCE" ]; then
INST_HOME=$(eval echo ~${DB2INSTANCE})
for lang in "$LANG" "$LC_ALL" "C" "en_US.UTF-8"; do
[ -n "$lang" ] && [ -d "$INST_HOME/sqllib/msg/$lang" ] && echo "✅ 支持語言: $lang" && break
done
fi
echo -e "\n--- 4. 版本一致性 ---"
db2level 2>/dev/null | head -3
db2ls 2>/dev/null
echo -e "\n--- 5. 內核參數 ---"
sysctl kernel.shmmax kernel.shmall kernel.shmmni kernel.sem 2>/dev/null
echo -e "\n=== 診斷完成 ==="
SQL10007N Reason Code 1
│
▼
DB2INSTANCE 設置正確? ──否──▶ 設置 export DB2INSTANCE=正確實例名
│是
▼
實例目錄 ~/sqllib 存在? ──否──▶ db2icrt 重建實例 或 db2iupdt 升級實例
│是
▼
msg/語言目錄存在? ──否──▶ export LANG=C 或安裝對應語言包
│是
▼
文件權限正確? ──否──▶ chown -R 實例用戶:實例組 ~/sqllib; restorecon -R
│是
▼
Fix Pack 後未 db2iupdt? ──是──▶ 執行 db2iupdt 實例名
│否
▼
內核參數/IPC 資源充足? ──否──▶ 調整 /etc/sysctl.conf, 重啟或 sysctl -p
│是
▼
聯系 IBM Support (收集 db2diag.log, db2pd -fod, 內核日志)
SQL10007N Reason Code 1 本質是 「實例上下文建立失敗」。90% 以上案例由 DB2INSTANCE 環境變量缺失/錯誤、Fix Pack 後未 db2iupdt、語言環境不匹配導致。建議:
export DB2INSTANCE=... 寫入實例用戶 ~/.bash_profile 並 source 生效db2iupdt 更新所有實例LANG=en_US.UTF-8 或 C,避免中文 Locale 缺失db2env 環境驗證腳本,納入部署/啟動前檢查清單掌握分級診斷流程,可將故障定位時間從小時級壓縮至分鐘級。