2007/09/11

ユーザー・エラーからの復旧方法

【ユーザー・エラーからの復旧方法】
◆まえがき
データベースに対して、操作上あるいはプログラム上の変更が誤って行われた
場合、それが原因でデータが失われたり破損したりすることがあります。
通常、表の削除などのユーザー・エラーでは、失われた変更の再入力(失われ
た変更の記録が存在する場合)、削除したオブジェクトのインポート(エクス
ポート・ファイルが存在する場合)、個々の表領域のリカバリ(表領域の
Point-in-Time リカバリ(TSPITR ))、データベース全体の不完全リカバリの
いずれかの作業が必要になります。
この文書では、その中から”データベース全体の不完全リカバリの手順”につい
てご紹介させて頂きます。
◆ 目次
1. 処理の概要
2. 前提条件
3. 実行手順と実行例
4. 補足
*1.処理の概要*
バックアップから必要なデータファイルのみを開発系にリストアし、かつ該当オブ
ジェクトが存在した時間までリカバリします。その後、EXPORT・IMPORTを行う事に
より本番系のデータベースは最新の状態を保持しつつ、該当オブジェクトを削除前
の状態に戻す事ができます。
*2.前提条件*
1.SYSTEM表領域、ROLLBACK SEGMENT(UNDO SEGMENT)用表領域、失われた
オブジェクトが存在する表領域のバックアップが存在すること。
2.アーカイブ運用であること。
3.同じOS・Oracle環境の開発系データベースがあること。
4.ディスク容量的に余裕があること。 Page 2

Standard Vol.73
Copyright(C) K.K.Ashisuto All right Reserved
2
*3.実行手順と実行例*
以下のような仮定で障害が発生し、一部のバックアップだけを本番系から
開発系にリストアを行い、時間ベースの不完全リカバリを実行します。
・1/1の時点でフルバックアップを取得し、1/10の18:10の時点で誤って
以下のような表を削除してしまいました。
SQL> SELECT owner,segment_name,tablespace_name
2
FROM dba_segments
3
WHERE owner='TESTUSER' AND segment_name='TEST';
OWNER
SEGMENT_NAME TABLESPACE_NAME
--------------- --------------- ---------------
TESTUSER
TEST
USERS
SQL> DROP TABLE test;
表が削除されました。
SQL> SELECT owner,segment_name,tablespace_name
2 FROM dba_segments
3 WHERE owner='TESTUSER' AND segment_name='TEST';
レコードが選択されませんでした。
SQL> SELECT sysdate FROM dual;
SYSDATE
-------------------
2004-01-10 18:10:00Page 3

Standard Vol.73
Copyright(C) K.K.Ashisuto All right Reserved
3
a.取得済みバックアップから必要なデータファイル(失われたオブジェクトが
存在する表領域) を開発系にリストアします。
※SYSTEM表領域やROLLBACK SEGMENT(UNDO SEGMENT)用の 表領域も含みます。
b.制御ファイルをリストアします。
リストアする際は開発系の初期化パラメータファイル
control_filesパラメータと同一の位置にするか必要に応じてパラメータ
を編集して下さい。
開発系でリストアした情報
■開発系構成画面Page 4

Standard Vol.73
Copyright(C) K.K.Ashisuto All right Reserved
4
上記の場合、control_filesパラメータは以下のように設定します。
c.アーカイブログファイルをlog_archive_destで指定したディレクトリに
戻します。
ここで、最新の状態のオンラインREDOログファイルもリストアする必要が
ある場合は本番系にて強制的にログスイッチ(※1)を発生させ、
作成されたアーカイブログファイルを含めて下さい。
(※1)ログスイッチは管理者ユーザにて以下のように実行します。
d. パスワードファイルをご使用の環境でない場合、この手順はSKIPして下さい。
制御ファイルをバックアップしたタイミングでパスワードファイルの
バックアップも取得していれば、そのファイルをリストアしてください。
UNIX : $ORACLE_HOME/dbs下の位置にあるorapw[SID名].ora
Windows: %ORACLE_HOME/database下の位置にあるPWD[SID名].ora
バックアップが存在しない場合、開発系のパスワードファイルを削除(または
RENAME)後、以下のコマンドにて再作成することが可能でございます。
UNIX:
WINDOWS:
control_files=("E:¥Ora901¥oradata¥test901¥control01.ctl")
SQL> ALTER SYSTEM SWITCH LOGFILE;
% cd $ORACLE_HOME/dbs
% ORAPWD FILE=orapw$ORACLE_SID PASSWORD=
PROMPT> cd %ORACLE_HOME%¥database
PROMPT> ORAPWD file=PWD%ORACLE_SID%.ora PASSWORD=Page 5

Standard Vol.73
Copyright(C) K.K.Ashisuto All right Reserved
5
d.STARTUP MOUNTで起動します。
e.不要なデータファイルをOFFLINE DROPする
V$DATAFILEを検索すると、本番系のデータファイル構成となっており
開発系にリストアしていないファイルも含めてすべて表示されます。
リストアの対象とならないデータファイルをすべてOFFLINE DROPします。
(例)
SQL> SELECT name,status FROM v$datafile;
NAME
STATUS
---------------------------------------- -------
C:¥V901¥ORADATA¥TEST901¥SYSTEM01.DBF
SYSTEM
C:¥V901¥ORADATA¥TEST901¥UNDOTBS01.DBF
ONLINE
C:¥V901¥ORADATA¥TEST901¥INDX01.DBF
ONLINE
C:¥V901¥ORADATA¥TEST901¥TOOLS01.DBF
ONLINE
C:¥V901¥ORADATA¥TEST901¥USERS01.DBF
ONLINE
SQL> ALTER DATABASE DATAFILE 'C:¥V901¥ORADATA¥TEST901¥INDX01.DBF'
OFFLINE DROP;
データベースが変更されました。
SQL> ALTER DATABASE DATAFILE 'C:¥V901¥ORADATA¥TEST901¥TOOLS01.DBF'
OFFLINE DROP;
データベースが変更されました。
SQL> STARTUP MOUNTPage 6

Standard Vol.73
Copyright(C) K.K.Ashisuto All right Reserved
6
f.本番系とは異なるPATHにファイルをリストアしたい場合は、以下の操作を
行います。 PATHが同じ場合、この手順はSKIPして下さい。
V$DATAFILEを検索すると、リストアしたファイルが本番系のPATHのまま
表示されますので、 それらのデータファイルをRENAMEします。また、
データファイルだけでなくオンラインREDOログファイルについても PATHが
替わる場合は 同様にRENAMEします。
例)
■開発系構成画面より
≪データファイルの場合≫
SQL> ALTER DATABASE RENAME FILE 'c:¥v901¥oradata¥test901¥system01.dbf'
TO 'e:¥ora901¥oradata¥test901¥system01.dbf';
データベースが変更されました。
SQL> ALTER DATABASE RENAME FILE 'c:¥v901¥oradata¥test901¥undotbs01.dbf'
TO 'e:¥ora901¥oradata¥test901¥undotbs01.dbf';
データベースが変更されました。
SQL> ALTER DATABASE RENAME FILE 'c:¥v901¥oradata¥test901¥users01.dbf'
TO 'e:¥ora901¥oradata¥test901¥users01.dbf';
データベースが変更されました。 Page 7

Standard Vol.73
Copyright(C) K.K.Ashisuto All right Reserved
7
≪ オンラインREDOログファイルの場合≫
上記コマンド実行後、以下のように開発系のファイルのPATHが変更されて
いることが確認できます。
(※f)手順eでOFFLINE DROPしたものはSTATUS列は
"RECOVER"となり、ファイルのPATHは本番系のままとなって
おりますが問題ございません。
SQL> ALTER DATABASE RENAME FILE 'c:¥v901¥oradata¥test901¥redo01.log'
TO 'e:¥ora901¥oradata¥test901¥redo01.log';
データベースが変更されました。
SQL> ALTER DATABASE RENAME FILE 'c:¥v901¥oradata¥test901¥redo02.log'
TO 'e:¥ora901¥oradata¥test901¥redo02.log';
データベースが変更されました。
SQL> ALTER DATABASE RENAME FILE 'c:¥v901¥oradata¥test901¥redo03.log'
TO 'e:¥ora901¥oradata¥test901¥redo03.log';
データベースが変更されました。
SQL> SELECT name,status FROM v$datafile;
NAME
STATUS
---------------------------------------- -------
E:¥ORA901¥ORADATA¥TEST901¥SYSTEM01.DBF SYSTEM
E:¥ORA901¥ORADATA¥TEST901¥UNDOTBS01.DBF ONLINE
C:¥V901¥ORADATA¥TEST901¥INDX01.DBF
RECOVER(※f)
C:¥V901¥ORADATA¥TEST901¥TOOLS01.DBF
RECOVER(※f)
E:¥ORA901¥ORADATA¥TEST901¥USERS01.DBF ONLINE Page 8

Standard Vol.73
Copyright(C) K.K.Ashisuto All right Reserved
8
g.時間ベースの不完全リカバリを実行します。
該当オブジェクトを削除する前の時間を指定してください。
(時間について不明な場合はLogMinerを使用して解析・特定して
いただければと存じます。LogMinerの使用方法につきましては
本文書では割愛させて頂きます。)
SQL> SELECT * FROM v$logfile;
GROUP#
STATUS TYPE MEMBER
---------- ------- ------- --------------------------------------
3
ONLINE E:¥ORA901¥ORADATA¥TEST901¥REDO03.LOG
2
ONLINE E:¥ORA901¥ORADATA¥TEST901¥REDO02.LOG
1
ONLINE E:¥ORA901¥ORADATA¥TEST901¥REDO01.LOGPage 9

Standard Vol.73
Copyright(C) K.K.Ashisuto All right Reserved
9
(例)
SQL> SET AUTORECOVERY ON
SQL> RECOVER DATABASE USING BACKUP CONTROLFILE UNTIL TIME '2004-01-1018:00:00'
ORA-00279: 変更279764(03/16/2004 06:51:37で生成)にはスレッド1が必要です
ORA-00289: 検討すべきログ・ファイル:E:¥ORA901¥ORADATA¥TEST901¥ARCHIVE¥1_4.ARC
ORA-00280: 変更279764(スレッド1)は順序番号4に存在します。
ORA-00279: 変更279790(03/16/2004 07:00:46で生成)にはスレッド1が必要です
ORA-00289: 検討すべきログ・ファイル:E:¥ORA901¥ORADATA¥TEST901¥ARCHIVE¥1_5.ARC
ORA-00280: 変更279790(スレッド1)は順序番号5に存在します。
ORA-00278:
ログ・ファイル'E:¥ORA901¥ORADATA¥TEST901¥ARCHIVE¥1_4.ARC'はこのリカバリでは必要
なくなりました
・・・・(中略)指定された時間までのアーカイブログが自動的に適用されます。
ORA-00279: 変更279798(03/16/2004 07:01:18で生成)にはスレッド1が必要です
ORA-00289: 検討すべきログ・ファイル:E:¥ORA901¥ORADATA¥TEST901¥ARCHIVE¥1_10.ARC
ORA-00280: 変更279798(スレッド1)は順序番号10に存在します。
ORA-00278:
ログ・ファイル'E:¥ORA901¥ORADATA¥TEST901¥ARCHIVE¥1_9.ARC'はこのリカバリでは必要
なくなりました
ログが適用されました。
メディア・リカバリが完了しました。Page 10

Standard Vol.73
Copyright(C) K.K.Ashisuto All right Reserved
10
h. 不完全回復の後にはログ順序番号をリセットするため
RESETLOGS による起動が必要となります。以下のコマンドで
OPENしてください。
ログ順序番号がリセットされたことにより、今まで取得された
バックアップは無効となりますので、再度データベースのコールド
バックアップの取得を行ってください。
i. 以上の作業により、 削除してしまったオブジェクトが存在する状態の
データベースが作成されますので、該当オブジェクトに対しEXPORTを
実行し、IMPORTにより本番環境に戻して下さい。
開発系にて
本番系にて
j.本番系にて以下のSQL文を実行することと、削除された表がリカバリできている
ことが確認できます。
SQL> ALTER DATABASE OPEN RESETLOGS;
% EXP testuser/testuser FILE=testtable.dmp TABLES=test LOG=testtable_exp.log
% IMP testuser/testuser FILE=testtable.dmp TABLES=test LOG=testtable_imp.log
SQL> SELECT owner,segment_name,tablespace_name
2 FROM dba_segments
3 WHERE owner='TESTUSER' AND segment_name='TEST';
OWNER
SEGMENT_NAME TABLESPACE_NAME
--------------- --------------- ---------------
TESTUSER
TEST
USERS Page 11

Standard Vol.73
Copyright(C) K.K.Ashisuto All right Reserved
11
*5.補足*
権限を正しく管理することで、ユーザーが運用に与える被害を減らすことができ
ます。さらに、事前に効果的なリカバリ方法を計画するとユーザー・エラーのリ
カバリ作業を軽減できます。

No comments: