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



