Troubleshooting
Problem
データベース内の表に対してアプリケーションからデータの挿入や更新を行った場合に、対象の表が格納されている表スペースがフルになり、トランザクションが継続できなくなることがあります。この文書では、表スペースがフルになった場合の解決方法について記述します。
Symptom
表スペースがフルになった場合、該当表スペースへのデータの書き込みができなくなり、更新トランザクションを継続できなくなることがあります。
(表スペースの空きページ数が 0 になっていても、すでに割り当てられたエクステントやページに空きがあり、データの書き込みができる場合もあります。)
(表スペースの空きページ数が 0 になっていても、すでに割り当てられたエクステントやページに空きがあり、データの書き込みができる場合もあります。)
Diagnosing The Problem
Db2 診断ログ (db2diag.log) を開いて ADM6044E または ADM6017E を検索し、フルになった表スペース名を識別してください。
次に以下の SQL で該当の表スペースのタイプを判別してください。
- 問題のデータベースにデータベース管理者で接続します。
db2 connect to <database_name>
- 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
表スペースのタイプによって対応方法が異なります。
フルになった表スペースのタイプに合わせて以下表を参照してください。
a-1) データベースに新しいストレージ・パスの追加 (V9.7 まで)
新しいストレージ・パス用の領域を用意し、ALTER DATABASE ステートメントで新しいストレージ・パスを追加してください。
実行例
新しいストレージ・パス用の領域を用意し、ALTER STOGROUP ステートメントで新しいストレージ・パスを追加してください。
問題の表スペースが、どのストレージ・グループに所属しているかは、以下の SQL で表示できます。
新しいストレージ・パスを追加した場合の注意点
b) ストレージ・パスに指定された領域の拡張
a-x) と同じ手順で該当の表スペースに割り当てられているストレージ・パスを確認し、その領域 (a の例では /work/dsidauto) を OS 側から拡張してください。
c) 既存データの削除と表の再編成
DELETE 文などを使用して、該当の表スペース上に存在する表の中のデータを削除し、空き領域を確保してください。
その後、REORG コマンドで対象の表を再編成し、不要なエクステントを開放してください。
実行例
ALTER TABLESPACE コマンドを用いて新しいコンテナーを追加してください。
実行例
フルになった表スペースのタイプに合わせて以下表を参照してください。
表スペースのタイプ
|
事象発生時の症状
(エラーメッセージ等) |
管理通知
メッセージ |
対応方法
|
自動ストレージ表スペース |
以下のエラーがアプリケーションへ返されます。 SQL0289N 表スペース "xxxx" の新規ページを割り振れません。 |
ADM6044E | 以下のいずれかを実施してください。
|
DMS表スペース | 以下のエラーがアプリケーションへ返されます。 SQL0289N 表スペース "xxxx" の新規ページを割り振れません。 |
ADM6044E | 以下のいずれかを実施してください。
|
SMS表スペース | 以下のエラーがアプリケーションへ返されます。 SQL0968C ファイル・システムがいっぱいです。 |
ADM6017E | 以下のいずれかを実施してください。
|
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 から確認してください。
既存のコンテナーがフルになり新しいコンテナーを追加した状況で、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 表スペースのコンテナーを確認してください。
データベースへ接続後、以下の 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 表スペースへ変換してください。
c) では十分な空きが作成できず、表スペース・コンテナーのファイルシステムに空きがある場合、LARGE 表スペースへ変換してください。
実行例
db2 alter tablespace dmstbsp2 convert to large
LARGE 表スペースへの変換を行うと、該当表スペースに格納された表の索引はすべて再作成する必要があります。
以下のような SQL で表名を確認し、REORG INDEXES コマンドで索引を再作成してください。
以下のような 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"}]
Was this topic helpful?
Document Information
Modified date:
03 November 2023
UID
swg21504142