作りたい物
DB2を利用していて、開発中にDBがパンクしてしまい再編成したいことがあり都度手打ちで再編成をするのがめんどくさい…ということでシェルを1個たたくだけで再編成をしたい…ということでシェルをこさえてみました。
要件的には…
- DB2を利用
- 複数データベースがある
- 複数データベースの再編成を並列実行したい
- シェルを1個実行するだけで再編成したい
とりあえず、IBMのサイト曰く「データベース表で REORG、RUNSTATS、および REBIND の各機能をこの順番で実行します。」と書いてあるので再編成して統計情報更新をすることにします。
DB2コマンドで全部対象にする
再編成を行うには、テーブル名を指定しないといけないんですがなんとかならんかなーと、海外のサイトからよさそうなのをパクってきました。
これを参考にしますが、これだと再編成が必要ないテーブルまで全部やってしまい、処理時間がかかってしまいます。
- 全てのテーブルを再編成をする
1 2 |
db2 -x "select 'reorg table',substr(rtrim(tabschema)||'.'||rtrim(tabname),1,50),';'from syscat.tables where type = 'T' " > reorg.out db2 -tvf reorg.out |
- 全てのテーブルに再編成チェックをする
1 2 3 |
db2 -x "select 'reorgchk update statistics on table',substr(rtrim(tabschema)||'.'||rtrim(tabname),1,50),';' from \ syscat.tables where type = 'T' " > reorgchk.out db2 -tvf reorgchk.ou |
- 全てのテーブルの統計情報を更新する
1 2 3 |
db2 -x "select 'runstats on table',substr(rtrim(tabschema)||'.'||rtrim(tabname),1,50),' and indexes all;'from \syscat.tables where type = 'T' " > runstats.out db2 -tvf runstats.out |
必要な分だけ再編成する
なんかいいの無いかなーと思って探してみると、REORGCHKをテーブル化して表示するってのがあるんですね。
再編成チェックコマンドはいらないってことなのかな…それとも、再編成チェックをしたらここに格納されるのかどっちなんでしょうか…
これで、全テーブル対象にできるみたい。
1 |
db2 -x "call SYSPROC.REORGCHK_TB_STATS('T','ALL')" |
あとは、普通のSelectコマンドで全部表示することは出来るので…
1 |
db2 "select * from SESSION.TB_STATS" |
「DB2コマンドで全部対象にする」の「syscat.tables」を置き換えてやったりSELECT句を適切に買えればOK。
シェルの中身
とりあえず、今回は複数のデータベースを並列に再編成指定ということで、親シェルと子シェルに分けることにしました。
子シェルに渡す際に「&」をいれてバックグラウンドに入れてやります。
子シェルを実行する際に、インスタンスユーザーを指定してやります。
子シェルには引数でデータベース名を渡していますが、ここら辺はシステムの中身にもよりますので処理はサーバーに合わせた感じになりますかね。
~再編成処理~
~統計情報更新処理~
db2 terminate
~ループ開始~
su – ${インスタンスユーザー} -c 子シェル データベース名 &
~ループ終了~
wait
exit
日々くだらないことを追い求め、黒歴史をまとめておくための自由なブログ。
あんまり役立つことは書きませんが主に日記・ゲームや買ったものについての記事を気まぐれで好き勝手書いています。