Unix/Linux 環境執行:
db2 -td@ -vf <存儲過程腳本>
建立失敗,db2diag.log 記錄:
DIA8402C A disk error has occurred. ZRC=0x860F0004
...
instance owner does not belong to fenced user's primary group
表象為「磁碟錯誤」,實為權限不足。
Unix 平台 DB2 要求:
實例擁有者必須屬於受防護用戶的主群組。
若實例用戶未加入該主群組,存儲過程編譯/初始化時無法存取受防護用戶目錄下的暫存檔(sqllib/function/routine/sqlproc/...),拋出 DIA8402C。
cd ~instance_user/sqllib/admls -l .fenced-r--r--r-- 1 db2fencj db2fgrp2 0 Jul 30 09:57 .fenceddb2fencj = 受防護用戶db2fgrp2 = 受防護用戶的主群組usermod -a -G db2fgrp2 db2inst1groups db2inst1 應包含 db2fgrp2。DIA8402C 真為磁碟故障 → 檢查檔案系統、磁碟控制器、RAID 卡,浪費大量時間。#!/bin/ksh
# 檢查實例用戶是否屬於受防護用戶主群組
INST_HOME=$(eval echo ~$DB2INSTANCE)
FENCED_INFO=$(ls -l $INST_HOME/sqllib/adm/.fenced 2>/dev/null)
if [ $? -ne 0 ]; then
echo "ERROR: .fenced file not found"
exit 1
fi
FENCED_USER=$(echo $FENCED_INFO | awk '{print $3}')
FENCED_PRIMARY_GROUP=$(echo $FENCED_INFO | awk '{print $4}')
INST_GROUPS=$(groups $DB2INSTANCE)
if echo "$INST_GROUPS" | grep -qw "$FENCED_PRIMARY_GROUP"; then
echo "OK: Instance user $DB2INSTANCE belongs to fenced user's primary group $FENCED_PRIMARY_GROUP"
exit 0
else
echo "ERROR: Instance user $DB2INSTANCE does NOT belong to fenced user's primary group $FENCED_PRIMARY_GROUP"
echo "Fix: usermod -a -G $FENCED_PRIMARY_GROUP $DB2INSTANCE"
exit 1
fi
DIA8402C 是 DB2 Unix 安全模型的經典誤導性錯誤。掌握「.fenced 檔案解碼 → 主群組驗證 → usermod 修復」三步驟,可在分鐘級解決此類問題,避免陷入磁碟/檔案系統排查泥沼。