Oracle8i アーカイブREDOログからのデータ復旧

Oracleのデータを復旧しなければならなくなったのだが、
やり方がぜんぜん思い出せなかった・・・
以前に何度かやっていたのに・・・

そのため、調べる所から始まってしまった・・・
やり始めて、どんどん思い出していったので、
復旧を開始し始めてからは、早かったが。

また、忘れそうなのでメモ書きです。

LogMinerとは、本来SQLのリビジョンの確認などを行うものなのだったと思いますが、
LogMinerを使うことで、UNDOデータが手に入るので。

下記の設定変更は、Oracle8iまでかpfileを使うようにしていた場合。
spfileを使う場合は、変更方法が違います。

————————————————————————————-

$ORACLE_HOME/admin/orclpfile/init.ora

※$ORACLE_HOMEと書いた場所は、適時ORACLE_HOMEを入れてください。
にディクショナリーファイルを書き込めるディレクトリを追加。

utl_file_dir = /oracle/admin/orcl/dic

など記載。

後は、Oracleを再起動するなりパラメータを有効としてください。

————————————————————————————-

SQL*PlusでSYSDBAで接続。

# sqlplus /nolog
SQL> connect sys/manager as sysdba

ディクショナリーファイルを作成

SQL> EXECUTE DBMS_LOGMNR_D.BUILD(DICTIONARY_FILENAME =>’dictionary.ora’, DICTIONARY_LOCATION => ‘/oracle/admin/orcl/dic’);

次にトラブルがあったと思われる時間のアーカイブログを登録。
事前にファイルを調査しておく必要あり。

SQL> begin
2> DBMS_logmnr.add_logfile(‘/oracle/admin/orcl/arch/arch_1_73778.arc’, DBMS_logmnr.new);
3> DBMS_logmnr.add_logfile(‘/oracle/admin/orcl/arch/arch_1_73778.arc’, DBMS_logmnr.addfile);
4> end;
5> /

全ての登録が完了したら、分析開始。
※1個目のログファイルは、newで、次以降はaddfileで。

SQL> begin
2> DBMS_logmnr.start_logmnr(DictFileName=>’/oracle/admin/orcl/dic/dictionary.ora’);
3> end;
4> /

v$logmnr_contents という形で閲覧できます。
desc v$logmnr_contents
等を行えば、フィールド名も把握できます。

SELECT seg_owner owner,seg_name object,scn,timestamp,upper(SQL_redo) SQL_redo FROM v$logmnr_contents WHERE seg_owner =’Owner‘ AND seg_name IN (‘TableName‘) ORDER by scn;

や、

SELECT count(*) FROM v$logmnr_contents WHERE seg_owner =’Owner‘ AND seg_name IN (‘TableName‘);

等で、中身や数を確認してから、

set heading off
set feedback off
set pagesize 9999
set linesize 5000

spool undo.sql

SELECT SQL_undo FROM v$logmnr_contents WHERE seg_owner =’MS’ Owner‘ AND seg_name IN (‘TableName‘) ORDER BY scn;

spool off

set heading on
set feedback on
set pagesize 80
set linesize 80

で復旧用SQLが出力できるので、後は、中身を確認して実行すればOK。
実行については、下記でできる。

@undo.sql
commit;

ただ、行数が多いと非常に時間がかかりますし、サーバの負荷も大きくなりますので、
注意してください。

No comments yet.

Write a comment: