IBM Support

[Db2] 表スペースがフルになった場合の解決方法

Troubleshooting


Problem

データベース内の表に対してアプリケーションからデータの挿入や更新を行った場合に、対象の表が格納されている表スペースがフルになり、トランザクションが継続できなくなることがあります。この文書では、表スペースがフルになった場合の解決方法について記述します。

Symptom

表スペースがフルになった場合、該当表スペースへのデータの書き込みができなくなり、更新トランザクションを継続できなくなることがあります。
(表スペースの空きページ数が 0 になっていても、すでに割り当てられたエクステントやページに空きがあり、データの書き込みができる場合もあります。)

Diagnosing The Problem

Db2 診断ログ (db2diag.log) を開いて ADM6044E または ADM6017E を検索し、フルになった表スペース名を識別してください。
次に以下の SQL で該当の表スペースのタイプを判別してください。
  1. 問題のデータベースにデータベース管理者で接続します。
    db2 connect to <database_name>
  2. TBSP_UTILIZATION 管理ビューを参照し、問題の表スペースのタイプを判別します。
    TBSP_TYPE で SMS か DMS、AS=1 で自動ストレージかどうか、AR=1 で自動リサイズ可能かどうか、TBSP_CONTENT_TYPE で LARGE スペースか REGULAR スペース (ANY) かを判別します。
    DMS タイプで MAX_SIZE が設定されている (-1 でない) 場合は MAX_SIZE も考慮します。
    db2 "SELECT TBSP_ID, SUBSTR(TBSP_NAME,1,20) AS TBSP_NAME, TBSP_TYPE, TBSP_CONTENT_TYPE AS CONTENT_TYPE, TBSP_MAX_SIZE AS MAX_SIZE, TBSP_USING_AUTO_STORAGE AS AS, TBSP_AUTO_RESIZE_ENABLED AS AR, TBSP_TOTAL_SIZE_KB, TBSP_TOTAL_PAGES FROM SYSIBMADM.TBSP_UTILIZATION"
    
    TBSP_ID TBSP_NAME        TYPE  CONTENT_TYPE MAX_SIZE AS AR TBSP_TOTAL_SIZE_KB TBSP_TOTAL_PAGES
    ------- ---------------- ----- ------------ -------- -- -- ------------------ ----------------
          0 SYSCATSPACE      SMS   ANY                 -  0  0         163840            20480
          1 TEMPSPACE1       SMS   SYSTEMP             -  0  0              0                0
          2 USERSPACE1       SMS   ANY                 -  0  0          32768             4096    
          3 AUTOTBSP         DMS   LARGE              -1  1  1         229376            28672
          4 SYSTOOLSPACE     DMS   LARGE              -1  1  1          32768             4096
          5 DMSTBSP          DMS   LARGE              -1  0  1       11665408          1458176
          6 DMSTBSP2         DMS   ANY                -1  1  0       25427968          3178496
    
      7 レコードが選択されました。  

Resolving The Problem

表スペースのタイプによって対応方法が異なります。
フルになった表スペースのタイプに合わせて以下表を参照してください。
表スペースのタイプ
事象発生時の症状
(エラーメッセージ等)
管理通知
メッセージ
対応方法
自動ストレージ表スペース
 
以下のエラーがアプリケーションへ返されます。
SQL0289N 表スペース "xxxx" の新規ページを割り振れません。
ADM6044E 以下のいずれかを実施してください。
  • a-x) 新しいストレージ・パスの追加
    b) ストレージ・パスに指定された領域の拡張
    c) 既存データの削除と表の再編成
    g) LARGE 表スペースへの変換 (REGULAR スペースの場合)
    h) MAXSIZE の緩和または除去
DMS表スペース 以下のエラーがアプリケーションへ返されます。
SQL0289N 表スペース "xxxx" の新規ページを割り振れません。
ADM6044E 以下のいずれかを実施してください。
  • c) 既存データの削除と表の再編成
    d) 新しいコンテナーの追加
    e) 既存コンテナーの EXTEND/RESIZE
    g) LARGE 表スペースへの変換 (REGULAR スペースの場合)
    h) MAXSIZE の緩和または除去
SMS表スペース 以下のエラーがアプリケーションへ返されます。
SQL0968C ファイル・システムがいっぱいです。
ADM6017E 以下のいずれかを実施してください。
  • c) 既存データの削除と表の再編成
    f) 既存コンテナー (OS の領域) の拡張

a-1) データベースに新しいストレージ・パスの追加 (V9.7 まで)

新しいストレージ・パス用の領域を用意し、ALTER DATABASE ステートメントで新しいストレージ・パスを追加してください。
実行例
db2 connect to <database_name>
db2 get snapshot for database on <database_name>

自動ストレージ・パスの数     = 1
自動ストレージ・パス         = /work/dsidauto
      ノード番号             = 0
      状態                   = 使用

db2 "alter database <database_name> add storage on '/work/dsidauto2'"
db2 get snapshot for database on <database_name>

自動ストレージ・パスの数     = 2
自動ストレージ・パス         = /work/dsidauto
      ノード番号             = 0
      状態                   = 使用中
自動ストレージ・パス         = /work/dsidauto2
      ノード番号             = 0
      状態                   = 使用中
a-2) ストレージ・グループに新しいストレージパスを追加 (V10.1 以降)

新しいストレージ・パス用の領域を用意し、ALTER STOGROUP ステートメントで新しいストレージ・パスを追加してください。
問題の表スペースが、どのストレージ・グループに所属しているかは、以下の SQL で表示できます。
db2 connect to <database_name>
db2 "select t.tbspace, s.sgname from syscat.tablespaces t, syscat.stogroups s where t.sgid=s.sgid"

TBSPACE                        SGNAME
------------------------------ ------------------------------
SYSCATSPACE                    IBMSTOGROUP
TEMPSPACE1                     IBMSTOGROUP
USERSPACE1                     IBMSTOGROUP
該当 DB が持つストレージ・パスは以下の SQL で表示できます。
db2 "select storage_group_name, db_storage_path from table(ADMIN_GET_STORAGE_PATHS('',-1)) as t"

STORAGE_GROUP_NAME             DB_STORAGE_PATH
------------------------------ ------------------------------
IBMSTOGROUP                    /work/dsidauto
ALTER STOGROUP ステートメントで用意した新しいパスを追加します。
db2 "alter stogroup IBMSTOGROUP add /work/dsidauto2"

新しいストレージ・パスを追加した場合の注意点
  • 自動ストレージを使用する既存の REGULAR および LARGE 表スペースは、最初これらの新規パスを使用しません。データベース・マネージャーは、スペース不足状態が発生した場合にのみ、これらのパスに新しい表スペース・コンテナーを作成する可能性があります。
  • 自動ストレージによって管理される既存の TEMPORARY 表スペースが、新しいストレージ・パスを自動的に使用することはありません。これらの表スペース内のコンテナーが 1 つ以上の新しいストレージ・パスを使用するには、データベースを通常どおり停止してから再始動しなければなりません。代わりに、TEMPORARY 表スペースをドロップして再作成することもできます。表スペースを再作成すると、十分なフリー・スペースがあるすべてのストレージ・パスを自動的に使用します。

b) ストレージ・パスに指定された領域の拡張

a-x) と同じ手順で該当の表スペースに割り当てられているストレージ・パスを確認し、その領域 (a の例では /work/dsidauto) を OS 側から拡張してください。

c) 既存データの削除と表の再編成

DELETE 文などを使用して、該当の表スペース上に存在する表の中のデータを削除し、空き領域を確保してください。
その後、REORG コマンドで対象の表を再編成し、不要なエクステントを開放してください。

実行例
  • オフライン再編成 (表スペースにデータ削除後の表サイズの空きが必要です。)
     db2 "delete from table1 where col1=10"
     db2 "reorg table table1"
  • オンライン再編成 (表スペースに追加の空きは不要ですが、オフライン再編成より数倍時間が必要です。)
     db2 "delete from table1 where col1=10"
     db2 "reorg table table1 inplace"
  • EXPORT と LOAD REPLACE (表スペースに追加の空きは不要です。オフライン再編成より時間がかかる可能性があります。さらに LOB 列や XML 列および EXPORT 時のコードページの考慮が必要です。)
     db2 "delete from table1 where col1=10"
     db2 "export to table1.ixf of ixf select * from table1"
     db2 "load from table1.ixf of ixf replace into table1"
d) 新しいコンテナーの追加

ALTER TABLESPACE コマンドを用いて新しいコンテナーを追加してください。

実行例
db2 "alter tablespace dmstbsp add (file '/work/dsiddms2' 10M)"
新しいコンテナーを追加した場合の注意点
既存のコンテナーがフルになり新しいコンテナーを追加した状況で、ALTER TABLESPACE ... REBALANCE を実行すると、SQL2094W rc=2 で失敗します。これは、既存のコンテナーに空き領域がないためにリバランスが実行できないことを示しています。
既存のコンテナーに空き領域を確保してからリバランスを実行してください。

e) 既存コンテナーの EXTEND/RESIZE

ALTER TABLESPACE コマンドを用いて既存コンテナーのサイズを変更してください。自動リサイズが有効な場合、この作業は自動実行されますが、コンテナーを格納しているファイル・システムに空きが必要です。コンテナーのパスが不明の場合は db2pd -tablespace -alldbs の Containers から確認してください。
実行例
  • EXTEND: 既存のコンテナーに 15 MB の領域を追加
    db2 "alter tablespace dmstbsp extend (file '/work/dsiddms' 15M)"
  • RESIZE: 既存のコンテナーを 150 MB に拡張
    db2 "alter tablespace dmstbsp resize (file '/work/dsiddms' 150M)"
f) 既存コンテナー (OS の領域) の拡張

データベースへ接続後、以下の SQL を発行し、SMS 表スペースのコンテナーを確認してください。
select substr(a.tbsp_name, 1, 15) as tbsp_name, substr(a.tbsp_id,1,4) as tbsp_id, a.container_name, substr(a.container_id,1,5) as container_id from sysibmadm.snapcontainer a, sysibmadm.tbsp_utilization b where a.tbsp_id = b.tbsp_id and b.tbsp_type = 'SMS'
実行例
db2 connect to <database_name>
db2 "select substr(a.tbsp_name, 1, 15) as tbsp_name, substr(a.tbsp_id,1,4) as tbsp_id, a.container_name, substr(a.container_id,1,5) as container_id from sysibmadm.snapcontainer a, sysibmadm.tbsp_utilization b where a.tbsp_id = b.tbsp_id and b.tbsp_type = 'SMS'"

 TBSP_NAME       TBSP_ID CONTAINER_NAME                              CONTAINER_ID
 --------------- ------- ------------------------------------------- ------------
 SYSCATSPACE     0       /work/dsiddb/NODE0000/SQL00001/SQLT0000.0   0          
 TEMPSPACE1      1       /work/dsiddb/NODE0000/SQL00001/SQLT0001.0   0          
 USERSPACE1      2       /work/dsiddb/NODE0000/SQL00001/SQLT0002.0   0          

   3 レコードが選択されました。
その後、CONTAINER_NAME の領域がフルになっていないかを OS の df コマンドなどで確認し、フルになっている領域を拡張してください。
g) LARGE 表スペースへの変換
REGULAR 表スペースに割り当て可能なページ数の制限 16777216 に抵触している場合、利用可能な対応方法は c) と g) のみです。
c) では十分な空きが作成できず、表スペース・コンテナーのファイルシステムに空きがある場合、LARGE 表スペースへ変換してください。
実行例
db2 alter tablespace dmstbsp2 convert to large
LARGE 表スペースへの変換を行うと、該当表スペースに格納された表の索引はすべて再作成する必要があります。
以下のような SQL で表名を確認し、REORG INDEXES コマンドで索引を再作成してください。
db2 "select tabschema, tabname from syscat.tables where tbspace = '<表スペース名>' and TYPE=’T’”
db2 reorg indexes all for <表スキーマ>.<表名>
以下の SQL で、対象の索引再作成を自動化するスクリプト(reorg_index.db2)を生成できます。
db2 -x "SELECT 'REORG INDEXES ALL FOR TABLE '||TRIM(TABSCHEMA)||'.'||TRIM(TABNAME)||';' from SYSCAT.TABLES where TBSPACE='<表スペース名>' and TYPE='T'" > reorg_index.db2
h) 表スペースの MAXSIZE の変更
 
TBSP_UTILIZATION 管理ビューの TBSP_MAX_SIZE または db2pd の MaxSize で表スペースの MAXSIZE 設定を確認します。
db2pd -db [database name] -tablespaces
以下は SAMPLE データベースの表スペース設定を表示する例です。
[db2inst1@db2-prod root]$ db2pd -db sample -tablespaces

Database Member 0 -- Database SAMPLE -- Active -- Up 4 days 23:58:32 -- Date 2021-12-29-13.57.38.177504

Tablespace Configuration:
Address            Id    Type Content PageSz ExtentSz Auto Prefetch BufID BufIDDisk FSC NumCntrs MaxStripe  LastConsecPg RSE  Name
0x00007F5F72109F40 0     DMS  Regular 4096   4        Yes  4        1     1         Def 1        0          3            Yes  SYSCATSPACE
0x00007F610AC30080 1     SMS  SysTmp  4096   32       Yes  32       1     1         On  1        0          31           No   TEMPSPACE1
0x00007F610AC3D440 2     DMS  Large   4096   32       Yes  32       1     1         Def 1        0          31           Yes  USERSPACE1  
....

Tablespace Statistics:
Address            Id    TotalPgs   UsablePgs  UsedPgs    PndFreePgs FreePgs    HWM        Max HWM    State      MinRecTime NQuiescers PathsDropped TrackmodState
0x00007F5F72109F40 0     73728      73724      65824      0          7900       65824      65824      0x00000000 0          0          No           n/a
0x00007F610AC30080 1     1          1          1          0          0          -          -          0x00000000 0          0          No           n/a
0x00007F610AC3D440 2     26214400   26214368   12288      0          26202080   12288      12288      0x00000000 0          0          No           n/a
...

Tablespace Autoresize Statistics:
Address            Id    AS  AR  InitSize             IncSize              IIP MaxSize              LastResize                 LRF
0x00007F5F72109F40 0     Yes Yes 33554432             -1                   No  None                 12/24/2021 16:04:06.204452 No
0x00007F610AC30080 1     Yes No  0                    0                    No  0                    None                       No
0x00007F610AC3D440 2     Yes Yes 33554432             -1                   No  107374182400         None                       No
MaxSize を適切な値に増やすか NONE (制限なし) に設定します。
db2 "alter tablespace [Tablespace] MAXSIZE [Size]
例:USERSPACE 表スペースの MAXSIZE を NONE に設定
db2 "alter tablespace USERSPACE1 MAXSIZE None"

[{"Type":"MASTER","Line of Business":{"code":"LOB10","label":"Data and AI"},"Business Unit":{"code":"BU058","label":"IBM Infrastructure w\/TPS"},"Product":{"code":"SSEPGG","label":"Db2 for Linux, UNIX and Windows"},"ARM Category":[{"code":"a8m500000008PlZAAU","label":"Database Objects-\u003ETablespaces"}],"ARM Case Number":"","Platform":[{"code":"PF025","label":"Platform Independent"}],"Version":"All Versions"}]

Document Information

Modified date:
03 November 2023

UID

swg21504142