環境: AIX 7.1 + DB2 11.1,實例擁有者 `db2admin`。
操作: 建立 20GB 正規表空間(DMS 檔案容器):
CREATE REGULAR TABLESPACE HTDC_DATA PAGESIZE 8 K MANAGED BY DATABASE
USING ( FILE '/db2_tag/TABLE_SPACES/HTDC_DATA/HTDC_DATA.dat' 20G )
EXTENTSIZE 16 OVERHEAD 10.67 PREFETCHSIZE 16 TRANSFERRATE 0.04
BUFFERPOOL BPHTDC
DROPPED TABLE RECOVERY OFF;
報錯:
SQLCODE -968C (SQL0968C)
SQLSTATE 57011
**File System is full. (檔案系統已滿)**
現場悖論: `df -g /db2_tag` 顯示可用空間 500GB+,inode 豐富,卻報檔案系統滿。
AIX 為每個用戶設定**軟/硬資源限制**(`ulimit` / `chuser`),預設 `fsize`(單一檔案最大大小)極小(通常 2GB = 4194303 個 512-byte 區塊)。DB2 建立 DMS 檔案容器時,需預先配置 20GB 連續空間,單一檔案大小超過用戶 `fsize` 硬限制,核心拒絕 `write`/`ftruncate` 系統呼叫,DB2 回報「檔案系統已滿」(誤導性訊息)。
驗證指令:
$ su - db2admin
$ ulimit -a | grep fsize
fsize (blocks) 4194303 # = 2GB,遠小於需求 20GB
# 計算所需區塊數:20GB = 20 * 1024 * 1024 * 2 = 41943040 (512-byte blocks)
# 建議給 100GB 預留:209715100
chuser fsize=209715100 db2admin
# 同步調整其他關鍵限制(防止後續踩坑)
chuser data=209715100 db2admin # 最大資料段
chuser stack=209715100 db2admin # 堆疊大小
chuser rss=209715100 db2admin # 駐留集大小
chuser nofiles=65535 db2admin # 開啟檔案描述符
注意: `chuser` 修改 `/etc/security/limits`,**需重新登入生效**,建議重啟主機確保所有服務繼承新限制。
shutdown -Fr # AIX 重啟指令
$ su - db2admin
$ ulimit -a | grep fsize
fsize (blocks) 209715100 # 確認已生效
$ db2start
$ db2 connect to HTDC user db2admin using
$ db2 "CREATE REGULAR TABLESPACE HTDC_DATA PAGESIZE 8 K MANAGED BY DATABASE
USING ( FILE '/db2_tag/TABLE_SPACES/HTDC_DATA/HTDC_DATA.dat' 20G )
EXTENTSIZE 16 OVERHEAD 10.67 PREFETCHSIZE 16 TRANSFERRATE 0.04
BUFFERPOOL BPHTDC
DROPPED TABLE RECOVERY OFF"
DB20000I The SQL command completed successfully.
建立 `/etc/security/limits.d/db2admin.conf`(或編輯 `/etc/security/limits`)統一管理:
db2admin:
fsize = 209715100 # 100GB 檔案大小
data = 209715100 # 資料段
stack = 209715100 # 堆疊
rss = 209715100 # 記憶體
core = 209715100 # Core dump 大小(除錯用)
cpu = -1 # 無 CPU 時間限制
nofiles = 65535 # 開啟檔案數
nproc = 16384 # 進程數
配合 `/etc/environment` 設定環境變數:
DB2LARGEPAGE=1
AIXTHREAD_SCOPE=S
SPINLOOPTIME=1000
YIELDLOOPTIME=1000
| 誤區 | 事實 |
|---|---|
| 以為是檔案系統空間不足 | `df` 顯示充足,實為用戶 `fsize` 限制 |
| 用 `ulimit -f unlimited` 臨時解決 | 僅影響當前 Shell,服務重啟/系統重啟失效,必須 `chuser` 永久生效 |
| 只改 `fsize` 忽略 `data`/`stack` | 大型排序、記憶體堆疊同樣受限,建議同步調大 |
| 用 SMS 表空間繞過 | SMS 也是建立大檔案,同樣受 `fsize` 限制;且 SMS 效能不如 DMS/自動儲存 |
AIX 平台 DB2 建立大檔案容器報「檔案系統已滿」,**90% 是用戶 `fsize` 限制過低**。以 `root` 執行 `chuser fsize=<足夠區塊數> <實例用戶>` 並重啟主機即可徹底解決。建議將資源限制配置納入 DB2 佈署標準化腳本,避免每次新環境、新實例重複踩坑。