db2で全テーブルをselect countする
投稿者:しんさん 2017/03/08

db2で全テーブルをselect countする
障害時の無影響確認などのために、対象データベースの全テーブルに対してselect countなどのSQLを実行して、正常性を確認したい場合などがあると思います。
そういった場合DB2では、syscat.tablesカタログビューを使用して下記のような形でselect count用のSQLをいったんファイル出力し、それをdb2 -tvfで読みこませて実行する方法が有効です。
実行例
#データベースにコネクトした状態で実施する
[user@testsv ~]$ db2 -x "select 'select count (*) from ',substr(rtrim(tabschema)||'.'||rtrim(tabname),1,50) ,';' from syscat.tables where type = 'T' " > /tmp/count.sql
[user@testsv ~]$ db2 -tvf /tmp/count.sql > /tmp/count.out
[user@testsv ~]$ view /tmp/count.out
他のシーンへの応用
この手法を応用すれば他にも
- 全テーブルに対してrunstatsやreorgchkを実行したい
- 特定のスキーマ配下の全テーブルに対して特定のSQLを発行したい
といった形でいろいろと応用するできます。
応用例:全テーブルに対してrunstatsを実行
全テーブルに対してrunstatsを実行する例です。
runstatsのオプションについては環境に合わせて適宜変更してください。
#データベースにコネクトした状態で実施する
[user@testsv ~]$ db2 -x "SELECT 'RUNSTATS ON TABLE ' || rtrim(tabschema) || '.'
|| char(tabname,40) ||
' WITH DISTRIBUTION ON ALL COLUMNS AND DETAILED INDEXES ALL ALLOW WRITE ACCESS;'
FROM syscat.tables
WHERE type = 'T'
ORDER BY tabschema, tabname " > /tmp/runstats.sql
[user@testsv ~]$ db2 -tvf /tmp/runstats.sql > /tmp/runstats.out
[user@testsv ~]$ view /tmp/runstats.out
応用例:全テーブルに対してreorgchkを実行
全テーブルに対してreorgchkを実行する例です。
#データベースにコネクトした状態で実施する
[user@testsv ~]$ db2 -x "select 'REORGCHK ',substr(rtrim(tabschema)||'.'||rtrim(tabname),1,50) ,';' from syscat.tables where type = 'T' " > /tmp/reorgchk.sql
[user@testsv ~]$ db2 -tvf /tmp/reorgchk.sql > /tmp/reorgchk.out
[user@testsv ~]$ view /tmp/reorgchk.out
まとめ
これらのTIPSはデータベースサーバーの実運用のシーンで活用できます。
- 障害対応で暫定対応として、とにかく速く全テーブルに対して同一のSQLやDB2ユーティリティを実行しなければならない。
- テスト環境に対して一回限りのメンテナンス処理を全てのテーブルに対してなるべく手早く実施したい
など、いろいろな活用シーンが考えられますのでぜひ応用してみてください。
注意点としては、あせって誤ったアクションをデータベースに対して実施しないことです。
テストせずに全テーブルに対して処理を実行することはせず、
- まず一行取り出してテスト環境で検証する
- 過去に実績のあるコマンドを使用する
といったステップを踏むことが大事です。
それは障害対応などの時間に追われている場面でも省いては行けないステップです。(二重災害にならないように)