Oracleからオペレーティングシステムスクリプトを実行する方法、またはバックアップを削除する非常に伝統的な方法ではない

しばらく前に、データベースをRACにバックアップする必要がありました。 実際、タスクはほんの少しではありませんが、非常に些細なことです:顧客はセキュリティについての妄想を持っています(驚くことなく、理解できることではありません)、顧客は自分のDBAを持っていません(まあ、起こった)そして、私はデータベースのあるサーバーコンソールにしかアクセスできませんデータ。 したがって、美しく便利なEnterprise Managerの使用を放棄し、通常のコンソールスクリプトを作成する必要がありました。 そして、思わぬ障害がありました。



標準ソリューション:バックアップスクリプトを記述し、cronを構成します。これにより、スケジュールに従ってスクリプトが呼び出され、データベースが落ちるまで落ち着きます。 しかし、いくつかのノードのクラスターを扱っているため、どのノードでバックアップをプルするかという疑問が生じました。 まったく-どういうわけか少し多すぎる。 一方では-そして、それが転倒するのが彼女であり、残りのすべてがサービスに残っている場合はどうなりますか? 順番に-そして、それがバックアップの順番がちょうど到着したものとまったく同じ場合はどうなりますか? 一部の3番目のサーバー-追加のデータベース用の余分な鉄はありません。



それから、バージョン11.2に登場した興味深いものを思い出しました。 つまり、インクルードファイルを前処理できる外部テーブル。



発明された解決策が好奇心feature盛な機能の不適切な使用であることは明らかです。 しかし、それは面白いことが判明しました。



まず-スクリプト(RMANスクリプトは何でもかまいません。たとえば、これを許可します)。



 /u01/app/oracle/rman_backup/backup.rmn 
      

RUN { BACKUP SPFILE FORMAT '+FRA/racdb/backupset/spfile_%d_%s_%T' DATABASE INCLUDE CURRENT CONTROLFILE FORMAT '+FRA/racdb/backupset/data_%d_%s_%T' ARCHIVELOG ALL FORMAT '+FRA/racdb/backupset/arc_%d_%s_%T'; BACKUP DEVICE TYPE DISK FORMAT '/backup/data_%d_%s_%T_%U' BACKUPSET COMPLETED AFTER 'SYSDATE - 1/24'; CROSSCHECK BACKUP; CROSSCHECK BACKUPSET; CROSSCHECK ARCHIVELOG ALL; DELETE NOPROMPT EXPIRED ARCHIVELOG ALL; DELETE NOPROMPT EXPIRED BACKUP; DELETE NOPROMPT OBSOLETE; }






 /u01/app/oracle/rman_backup/run_backup.sh #!/bin/bash /u01/app/oracle/product/11.2.0/dbhome_1/bin/rman target / cmdfile=$*
      
      





バックアップスクリプト(run_backup.shおよびbackup.rmn)は、同じパス(この例では-u01 / app / oracle / rman_backup /)で利用可能なすべてのクラスターノードに追加する必要があります。 また、 rman



ユーティリティへのパスを完全に指定する必要があります。



その後、興味深いことが始まります。



バックアップスクリプトが存在するディレクトリへのアクセスをデータベースに提供します。

 $ sqlplus / as sysdba SQL> create or replace directory bkp_dir as '/u01/app/oracle/rman_backup/';
      
      





バックアップスクリプトをプルし、必要な特権を提供するユーザーを作成します。

 $ sqlplus / as sysdba SQL> create user bkp identified by rmanbkp; SQL> grant connect to bkp; SQL> grant create table to bkp; SQL> grant create procedure to bkp; SQL> grant create type to bkp; SQL> grant create job to bkp; SQL> grant read, write, execute on directory bkp_dir to bkp;
      
      





外部テーブルを作成しますが、その主な目的はバックアップを実行することです。

 SQL> connect bkp/rmanbkp SQL> create table bkp ( 2 line varchar2(255) 3 ) 4 organization external ( 5 type oracle_loader 6 default directory BKP_DIR 7 access parameters ( 8 records delimited by newline 9 preprocessor BKP_DIR:'run_backup.sh' 10 fields terminated by ';' ldrtrim 11 reject rows with all null fields 12 ) 13 location ('backup.rmn') 14 ) 15 reject limit unlimited;
      
      





それから-スケジュールに従ってひっくり返るストレージ(2番目の部分では、成功がチェックされ、DBAに結果が通知されます。たとえば、目的のアドレスにメッセージを送信できますが、これは少し異なります)。

 SQL> create or replace procedure run_backup is 2 arrBackupLog backup_log; 3 4 cursor curBackupErrorsExist is 5 select 1 from dual 6 where exists ( 7 select 1 from table (arrBackupLog) 8 where column_value like 'RMAN-%' 9 ); 10 11 nDummy number(1); 12 bErrorsFound boolean; 13 begin 14 -- run weekly rman backup script 15 select line 16 bulk collect into arrBackupLog 17 from bkp; 18 -- report backup 19 open curBackupErrorsExist; 20 fetch curBackupErrorsExist into nDummy; 21 bErrorsFound := curBackupErrorsExist%found; 22 close curBackupErrorsExist; 23 24 if bErrorsFound then 25 dbms_output.put_line ('BACKUP FAILED'); 26 else 27 dbms_output.put_line ('BACKUP SUCCEEDED'); 28 end if; 29 end run_backup; 30 /
      
      





そして、最後に、私たちのカストディアンを引っ張る仕事。

 SQL> begin 2 dbms_scheduler.create_job ( 3 job_name => 'DAILY_BACKUP' 4 , job_type => 'STORED_PROCEDURE' 5 , job_action => 'run_backup' 6 , start_date => systimestamp 7 , repeat_interval => 'FREQ=DAILY;BYHOUR=04;BYMINUTE=0;BYSECOND=0' 8 , comments => 'Run daily RMAN backup' 9 , enabled => true 10 ); 11 end; 12 /
      
      





そんなこと。 Oracleは、すでにその方法を知っています。



ソース。

Oracle®Database Utilities、11gリリース2(11.2)

外部テーブルの前処理、Arup Nanda

Oracle Database 11gリリース2の外部表でのプリプロセッサ機能の使用



All Articles