WindowsでOracle DBをバックアップする方法

私は長年データベース管理者として働いてきましたが、常に大企業で働いていました。 この間、彼はLinux、Solaris、HP-UXで働いていました。 しかし、約1年前、私は小さな会社に入り、恐ろしいことに、すべてのWindowsサーバーがバックアップされておらず、エクスポートのみでした。 通常の物理的なバックアップを作成する必要があったので、スクリプトを作成することにしました。自分自身の要件をいくつか特定したためです。
  1. スクリプトは動作するはずです。win2003サーバー以降のOSで動作し、追加のソフトウェアは必要ありません。
  2. このスクリプトは、バージョン9i以降のすべてのOracleで動作し、完全バックアップ、増分バックアップ、およびバックアップアーカイブを実行する必要があります。
  3. スクリプトはできるだけシンプルで、サーバーからサーバーに転送する必要があります(できれば単一ファイルの場合)。
最初の考えは、cygwinまたはperlを配置し、Windowsをunixのように見せることでしたが、他のサーバーへの移植には困難が伴います。 単純なバッチファイルms-dosを作成することにしましたが、私が作成しなかったバッチファイルにcon my_text.txtをコピーすることほど複雑ではありません。 一般的に、段落3の実装は悪夢であることが判明しました。組み込みのドキュメントはありません。
sqlplus "/ as sysdba" << SQL select sysdate from dual; SQL
      
      



すべての追加スクリプトを一時ファイルに書き込み、プログラム出力を変数に書き込むことにしました。 突然、変数が設定されていない場合、別の問題がクロールされました。Echo%AAA%は%AAA%を表示します。変数にスペースを割り当てる必要がありました。 9iの場合、アーカイブログはそのままコピーされます。カタログコマンドがないため、複数のバックアップから復元する場合、制御ファイルを復元する必要があります。 完全バックアップでは、DESTディレクトリの内容全体がOLDに転送されます。 そして、ここに私が終わったものがあります:
 echo off REM version 1.4 REM  "rman_Backup_DB.cmd [t|a|d|0-1]" REM 0-1    (0 - ) REM a     REM t   ,   sqlplus,rman,   DEST REM d   ,    ,      REM -------------------  --------------------------------- REM   set DEST=\\SMB_server\share REM     set OLD=%DEST%\OLD set ORACLE_SID=ORCL set ORACLE_HOME=C:\APP\orabase\product\11.2.0\dbhome_1 set NLS_LANG=AMERICAN_AMERICA.CL8MSWIN1251 set NLS_DATE_FORMAT=YYYY.MM.DD HH24.MI.SS REM COMPRESS=  9i   ( ) REM  10   =as compressed backupset set COMPRESS=as compressed backupset REM   Rman   set CONSTRING=target / REM   sqlplus set CONSQL="/ as sysdba" REM  Rman set RMAN=%ORACLE_HOME%\bin\rman REM  SQLPLUS set SQLPL=%ORACLE_HOME%\bin\sqlplus REM   set TFILE=%TEMP%\backup_%ORACLE_SID%.tmp REM --------------------------------------------- set ERR=0 set EXEC=%0 %1 if "%EXEC%"=="%0 " goto prov if %1==t goto prov if %1==a goto backarc if %1==d goto delarc echo alter system archive log current; > %TFILE% echo select upper ('posled '),(max (SEQUENCE#)-5) from v$archived_log where DELETED='NO'; >> %TFILE% echo exit >> %TFILE% for /F "tokens=1,2 usebackq " %%1 in (`%SQLPL% %CONSQL% @%TFILE%`) do if %%1==POSLED set SEQN=%%2 IF %1==0 ( move /Y %DEST%\*.BK? %OLD% goto backdb ) IF %1==1 goto backdb :prov echo 1.Testing sqlplus connection echo select 'POSLED ','Test_SQLPLUS_OK' from dual; > %TFILE% echo exit >> %TFILE% for /F "tokens=1,2 usebackq " %%1 in (`%SQLPL% %CONSQL% @%TFILE%`) do if %%1==POSLED set SEQN=%%2 echo Test Complete echo 2.Testing write to destination dir echo 2. Test write on destination dir OK > %DEST%\test_file.txt if ERRORLEVEL 1 ( echo Write Error goto eof ) echo Test Complete echo 3.Testing rman conection echo backup format '%DEST%\test_backup.bak' spfile; > %TFILE% %RMAN% %CONSTRING% @%TFILE% echo Test Complete echo Results: echo 1. %SEQN% type %DEST%\test_file.txt del /q /f %DEST%\test_file.txt if EXIST %DEST%\test_backup.bak ( echo 3. Testing rman OK del /q /f %DEST%\test_backup.bak ) ELSE ( echo 3. Test RMAN failed ) goto eof :delarc echo crosscheck archivelog all; > %TFILE% echo delete FORCE NOPROMPT archivelog all; >> %TFILE% %RMAN% %CONSTRING% @%TFILE% echo *********************************************************** echo *** Do not forget to do FULL BACKUP OF THE DATABASE !!! *** echo *********************************************************** goto eof :backdb echo run { > %TFILE% echo sql 'alter system archive log current'; >> %TFILE% echo sql 'alter system checkpoint'; >> %TFILE% echo allocate channel d1 type disk; >> %TFILE% echo set limit channel d1 kbytes 4000000; >> %TFILE% echo backup %COMPRESS% incremental level %1 skip inaccessible filesperset 1 format '%DEST%\%%d_%%T_%%U.bkd' database include current controlfile; >> %TFILE% echo sql 'alter system checkpoint'; >> %TFILE% echo sql 'alter system archive log current'; >> %TFILE% echo backup %COMPRESS% filesperset 40 format '%DEST%\%%d_%%T_%%U.bka' archivelog from sequence %SEQN% ; >> %TFILE% echo backup format '%DEST%\%%d_%%T_%%U.bkc' current controlfile; >> %TFILE% echo backup format '%DEST%\%%d_%%T_%%U.bks' spfile; >> %TFILE% echo } >> %TFILE% %RMAN% %CONSTRING% @%TFILE% set /a ERR=%ERR%+%ERRORLEVEL% :backarc echo %COMPRESS%|findstr compressed if ERRORLEVEL 1 ( echo alter system archive log current; > %TFILE% echo set feedback off pagesize 0 heading off verify off linesize 200 trimspool off >> %TFILE% echo spool %TFILE%.bat >> %TFILE% echo select 'move /Y '^|^|name^|^|' %DEST%' from v$archived_log where DEST_ID=1 and STATUS='A'; >> %TFILE% echo spool off >> %TFILE% echo exit >> %TFILE% %SQLPL% %CONSQL% @%TFILE% call %TFILE%.bat set /a ERR=%ERR%+%ERRORLEVEL% echo crosscheck backup; > %TFILE% echo crosscheck archivelog all; >> %TFILE% echo DELETE FORCE NOPROMPT EXPIRED backup; >> %TFILE% %RMAN% %CONSTRING% @%TFILE% ) else ( echo crosscheck backup; > %TFILE% echo crosscheck archivelog all; >> %TFILE% echo DELETE FORCE NOPROMPT EXPIRED backup; >> %TFILE% echo sql 'alter system checkpoint'; >> %TFILE% echo sql 'alter system archive log current'; >> %TFILE% echo backup %COMPRESS% filesperset 40 format '%DEST%\%%d_%%T_%%U_all.bka' archivelog all delete input; >> %TFILE% echo backup format '%DEST%\%%d_%%T_%%U.bkc' current controlfile; >> %TFILE% %RMAN% %CONSTRING% @%TFILE% ) set /a ERR=%ERR%+%ERRORLEVEL% :eof exit /b %ERR%
      
      



ご清聴ありがとうございました。 スクリプトリンク



All Articles