【Oracle】スキーマ名を指定してダンプを取得するバッチファイル


定期的に取っておくと何かと役立つOralceダンプファイルですが、Windowsのタスクスケジューラや手動で手軽にダンプを取得するためのバッチファイルを作成しました。

ダンプはDataPump形式で取得します。

データベース側の事前準備

SYSユーザーでダンプ取得用のユーザーを作成

バッチでSYSは使いたくないので、どのスキーマでもインポート/エクスポートできる専用ユーザーを切る。

CREATE USER "DATAPUMP_USER"
   IDENTIFIED BY "PASSWORD"
   DEFAULT TABLESPACE "USERS"
   TEMPORARY TABLESPACE "TEMP"
;

-- ロールと権限
GRANT CONNECT TO "DATAPUMP_USER";
GRANT CREATE ANY DIRECTORY TO "DATAPUMP_USER";
GRANT DATAPUMP_IMP_FULL_DATABASE TO "DATAPUMP_USER";
GRANT DATAPUMP_EXP_FULL_DATABASE TO "DATAPUMP_USER";
GRANT UNLIMITED TABLESPACE TO "DATAPUMP_USER";

ディレクトリオブジェクトの作成

インポート/エクスポート用ユーザ用ユーザーでログインし、ディレクトリオブジェクトを作成する。

CREATE OR REPLACE DIRECTORY DATAPUMP_DIR AS 'D:\datapump';

DataPumpはディレクトリオブジェクトを指定しなければ実行できない。

バッチ

ディレクトリオブジェクトのパスに配置する。
引数%1にスキーマ名を渡す

datapump_export.bat
@echo off
cd /d %~dp0

set DumpFile=%1.dump
set LogFile=%1.log

:: エクスポート
expdp DATAPUMP_USER/PASSWORD@localhost/orclpdb directory=DATAPUMP_DIR schemas=%1 dumpfile=%DumpFile% logfile=%LogFile%

:: タイムスタンプの取得
call :getTimeStamp

:: ダンプ・ログのリネームと古いダンプ・ログを削除(更新日7日以上前)
move "%DumpFile%" "%DumpFile%_%TimeStamp%"
move "%LogFile%" "%LogFile%_%TimeStamp%"
forfiles /D -7 /M "%DumpFile%*" /c "cmd /c del @path"
forfiles /D -7 /M "%LogFile%*" /c "cmd /c del @path"

exit /b

:getTimeStamp
    setlocal

    set YYYY=%DATE:~0,-6%
    set MM=%DATE:~5,-3%
    set DD=%DATE:~-2%
    set /a H=%TIME:~0,-9%
    set M=%TIME:~3,-6%
    set S=%TIME:~6,-3%
    if %H% lss 10 (
        set H=0%H%
    )
    endlocal & set TimeStamp=%YYYY%%MM%%DD%-%H%%M%%S%
exit /b

実行するときはこんな感じ。

>datapump_export.bat HOGE_SCHEMA

これで取った日時のダンプが出来上がります。

インポート

取ったダンプを別スキーマにインポートするときはこんな感じ。

impdp DATAPUMP_USER/PASSWORD@localhost/orclpdb directory=DATAPUMP_DIR dumpfile=HOGE_SCHEMA.dump remap_schema=HOGE_SCHEMA:FUGA_SCHEMA

調整して便利につかって頂ければ何よりです。