私は業務上Oracleサーバを3台使っています。
今回それらを別のサーバへ移行する指示があったのです。
とはいえ、スキーマ1つ1つを手作業で移行するのは、さすがに面倒くさい…。
そしてデータ量も多く(スキーマ1つで10GB前後)大変…。
ということで少しでも省力化できるようWindowsバッチファイルで対応しました。
概要と前提条件
Windowsのファイルは以下画像にある2つで、これでスキーマ1つをバックアップします。
前提条件として、【プログラム開発環境であり、データの中身は重要ではなかった】ことから
中身も必要なテーブルはHOGETBA・HOGETBBの2つだけとして容量を小さくしています。
バッチファイルの内容
それではバッチファイルの内容について、備忘録を以下に記載しておきたいと思います。
変数を宣言
まずは変数を宣言します。
サーバ3台で違うものはここで定義します。
- SET ORA_HOME=D:\ORACLE\product\12.2.0\dbhome_1\bin
- SET WRK_PATH=D:\Temp
- SET DMP_PATH=D:\Temp\dmp
- SET BAK_PATH=\\192.168.1.251\OraDmp\Schema_x
WRK_PATHはバッチファイルが置いてある場所、DMP_PATHはdmpファイル出力場所、
そしてBAK_PATHはdmpファイルをコピーする先を設定しています。
ディレクトリ・オブジェクトを作成
続いてディレクトリ・オブジェクトを作成します。
- MD %DMP_PATH%
- CD %WRK_PATH%
- SQLPLUS SYSTEM/[password] @CreateDirectory.sql Schema_x TEMP_DIR %DMP_PATH%
ディレクトリ・オブジェクトを作成するための CreateDirectry.sql は
以下の内容のファイルをバッチファイルと同じフォルダに置いておくよ
【CreateDirectory.sql】
- DROP DIRECTORY &2;
- CREATE DIRECTORY &2 as '&3';
- GRANT READ, WRITE ON DIRECTORY &2 TO &1;
- EXIT
バッチファイルから引数が
&1→Schema_x &2→TEMP_DIR &3→D:\Temp\dmp
として送られるため、Schema_x に対してディレクトリ・オブジェクト「TEMP_DIR」が
パス D:\Temp\dmp で作成されることになります。
EXPDPを実行
EXPDPを実行します。
- CD %ORA_HOME%
- EXPDP Schema_x/[password] directory=TEMP_DIR dumpfile=x_hoge.dmp logfile=x_hoge.log include=TABLE:\"IN (\'HOGETBA\'\,\'HOGETBB\')\"
- EXPDP Schema_x/[password] directory=TEMP_DIR dumpfile=x_else.dmp logfile=x_else.log content=METADATA_ONLY exclude=PACKAGE TABLE:\"IN (\'HOGETBA\'\,\'HOGETBB\')\"
テーブル定義のみエクスポートしデータは不要(content=METADATA_ONLY)としています。
こうすることで出力されるdmpファイルの容量を小さくするようにしています。
移行先サーバへコピー
移行先サーバへコピーします。
- MD %BAK_PATH%
- COPY %DMP_PATH%\x_hoge.dmp %BAK_PATH%\ /Y
- COPY %DMP_PATH%\x_else.dmp %BAK_PATH%\ /Y
まとめ
EXPDPは少なからずサーバに負荷をかけます。
業務中に実行するのは難しいので、これらは夜間に自動実行するようスケジュールしました。
あとは翌朝に結果を確認しながら移行作業を進めることができました。
可能なら全て自動化する仕組みが理想的なのはわかっています。
とはいえ、日常的に使う仕組みではありませんし、自動化が実現するまで検証の時間もかかります。
そんな時は「少しでも省力化」を念頭に今後も取り組んでいきたいものです。
コメント