首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> DB2 資料庫 >> DB2 教學

AIX平台DB2建立大表空間報「檔案系統已滿」?根因是用戶檔案大小限制

     編輯:DB2 教學

錯誤現場還原

環境: 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 用戶資源限制

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

完整修復步驟

步驟 1:以 root 身分調整用戶 fsize 硬限制


# 計算所需區塊數: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`,**需重新登入生效**,建議重啟主機確保所有服務繼承新限制。

步驟 2:重啟主機(或至少重啟 DB2 實例相關服務)


shutdown -Fr   # AIX 重啟指令

步驟 3:驗證限制生效


$ su - db2admin
$ ulimit -a | grep fsize
fsize (blocks)        209715100   # 確認已生效

步驟 4:重新執行建立表空間指令


$ 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.

延伸最佳實務:AIX 上 DB2 實例擁有者標準資源配置

建立 `/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/自動儲存

跨平台對照:Linux/Windows 同類問題

  • Linux: `/etc/security/limits.conf` 設定 `db2admin hard fsize unlimited`,需重登入;`systemd` 服務需 `LimitFSIZE=infinity`
  • Windows: 無用戶級檔案大小限制,但遭遇「磁碟空間不足」時檢查:配額、壓縮、稀疏檔案、防毒軟體鎖定

總結

AIX 平台 DB2 建立大檔案容器報「檔案系統已滿」,**90% 是用戶 `fsize` 限制過低**。以 `root` 執行 `chuser fsize=<足夠區塊數> <實例用戶>` 並重啟主機即可徹底解決。建議將資源限制配置納入 DB2 佈署標準化腳本,避免每次新環境、新實例重複踩坑。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved