DB2でまとめて再編成と統計情報更新できるシェルを作る

作りたい物


DB2を利用していて、開発中にDBがパンクしてしまい再編成したいことがあり都度手打ちで再編成をするのがめんどくさい…ということでシェルを1個たたくだけで再編成をしたい…ということでシェルをこさえてみました。
要件的には…

  • DB2を利用
  • 複数データベースがある
  • 複数データベースの再編成を並列実行したい
  • シェルを1個実行するだけで再編成したい

とりあえず、IBMのサイト曰く「データベース表で REORG、RUNSTATS、および REBIND の各機能をこの順番で実行します。」と書いてあるので再編成して統計情報更新をすることにします。

DB2コマンドで全部対象にする

再編成を行うには、テーブル名を指定しないといけないんですがなんとかならんかなーと、海外のサイトからよさそうなのをパクってきました。
これを参考にしますが、これだと再編成が必要ないテーブルまで全部やってしまい、処理時間がかかってしまいます。

  • 全てのテーブルを再編成をする
  • 全てのテーブルに再編成チェックをする
  • 全てのテーブルの統計情報を更新する

必要な分だけ再編成する

なんかいいの無いかなーと思って探してみると、REORGCHKをテーブル化して表示するってのがあるんですね。

REORGCHK_TB_STATS プロシージャーは、再編成が必要かどうかを示す表統計を含む、 結果セットを戻します。

再編成チェックコマンドはいらないってことなのかな…それとも、再編成チェックをしたらここに格納されるのかどっちなんでしょうか…

これで、全テーブル対象にできるみたい。

あとは、普通のSelectコマンドで全部表示することは出来るので…

「DB2コマンドで全部対象にする」の「syscat.tables」を置き換えてやったりSELECT句を適切に買えればOK。

シェルの中身

とりあえず、今回は複数のデータベースを並列に再編成指定ということで、親シェルと子シェルに分けることにしました。
子シェルに渡す際に「&」をいれてバックグラウンドに入れてやります。
子シェルを実行する際に、インスタンスユーザーを指定してやります。
子シェルには引数でデータベース名を渡していますが、ここら辺はシステムの中身にもよりますので処理はサーバーに合わせた感じになりますかね。

子シェル
db2 connect to ${データベース名}
~再編成処理~
~統計情報更新処理~
db2 terminate
親シェル
データベース一覧を頑張って出力
~ループ開始~
su – ${インスタンスユーザー} -c 子シェル データベース名 &
~ループ終了~

wait
exit