Oracleが表データを誤って削除した後のデータ回復の詳細


Oracleが表データを誤って削除した後の復旧の詳細
 
テスト環境:
SYSTEM:IBM AIX 5 L                         Oracle Version:10 gR 2
 
1.undo_パラメータのクエリーと変更
show parameter undoコマンドを使って現在のデータベースパラメータundoを確認します。セットアップ。
次のように表示します
SQL>show parameter undo
NAME                                 タイプ        VALE
--------------------------------------------
undo_management                      ストリングス      AUTO
undo_retension                       インテグ     900
undo_テーブルスペース                      ストリングス      UNDOTB 2
undo_retension(保持力)は、900単位で15分です。
デフォルトのundo_を修正しますretensionパラメータ設定:
SQL>ALTER SYSTEM SET undo_retension=10800 SCOPE=BOTH;
System altered.
SQL>show parameter undo
NAME                                 タイプ        VALE
--------------------------------------------
undo_management                      ストリングス      AUTO
undo_retension                       インテグ     10800
undo_テーブルスペース                      ストリングス      UNDOTB 2
undo_retection 10800、単位秒、すなわち3時間。
2.oracleが表データを誤って削除した後のクイックリカバリ機能方法
2.1方法の一
oracleによるフラッシュバック機能

exec dbms_flashback.enable_at_time(to_date('2011-04-15 08:21:00','yyyy-mm-dd hh24:mi:ss'));
set serveroutput on
DECLARE r_temp hr.job_history%ROWTYPE;
CURSOR c_temp IS SELECT * FROM hr.job_history;
BEGIN
OPEN c_temp;
dbms_flashback.disable;
LOOP
FETCH c_temp INTO r_temp;
EXIT WHEN c_temp%NOTFOUND;
insert into hr.job_history(EMPLOYEE_ID,JOB_ID,START_DATE,END_DATE) values (r_temp.EMPLOYEE_ID,r_temp.JOB_ID,r_temp.START_DATE,r_temp.END_DATE);
commit;
END LOOP;
CLOSE c_temp;
END;
この方法は、削除されたデータを対応するテーブルに戻すことができ、まず、ユーザがdbms_を実行することを保証する。flashbackバッグのパーミッションです。
2.2方法二
insert into hr.job_history
select*from hr.job_history as of timestamp to_timestamp('2011-04-15 08:20'、'yyy-mm-dd hh 24:mi:ss')
この方法は簡単で、把握しやすいです。機能は上記と同じです。ここの時間は誤操作前の時間となります。誤操作に近いものがいいです。oracleがロールバック保持段に保存されているデータの時間には一定の時間制限があります。この制限はundou uからです。このパラメータ値が決定されます。
FIRST_を確認しますCHANGE莾,NEXT_CHANGE腣、FIRST_TIME
SQL>set pagesize 9999
SQL>col fscn for 99999
SQL>col nscn for 99999
SQL>select name、FIRST_CHANGE莻fscn,NEXT_CHANGE菷nscn、FIRST_TIME from v$archived_ロゴ
現在のSCNは:
SQL>select dbms_flashback.get_system_change_number fscn from dual;
      FCN
--------
   3435958
アプリケーションユーザを使ってフラッシュバックを試みる
SQL>connect username/password
Conneced.
既存のデータ:
SQL>select count(*)from hs_パスポート
  COUNT(*)
--------
    851998
回復テーブルを作成:
SQL>create table hs_パスポート.recov as select*from hs_passport where 1=0
Table created.
SCNを選択して前へ回復します。
SQL>select count(*)from hs_passport as of scn 12929970422;
  COUNT(*)
--------
    861686
複数のSCNを試して、最適値を取得する(具体的な時間を知ることができれば、正確なデータフラッシュバックが得られる)。

SQL> select count(*) from hs_passport as of scn &scn;
Enter value for scn: 12929941968
old  1: select count(*) from hs_passport as of scn &scn
new  1: select count(*) from hs_passport as of scn 12929941968
 COUNT(*)
----------
  861684

SQL> /
Enter value for scn: 12927633776
old  1: select count(*) from hs_passport as of scn &scn
new  1: select count(*) from hs_passport as of scn 12927633776
select count(*) from hs_passport as of scn 12927633776
           *
ERROR at line 1:
ORA-01466: unable to read data - table definition has changed

SQL> /
Enter value for scn: 12929928784
old  1: select count(*) from hs_passport as of scn &scn
new  1: select count(*) from hs_passport as of scn 12929928784

 COUNT(*)
----------
  825110

SQL> /
Enter value for scn: 12928000000
old  1: select count(*) from hs_passport as of scn &scn
new  1: select count(*) from hs_passport as of scn 12928000000
select count(*) from hs_passport as of scn 12928000000
           *
ERROR at line 1:
ORA-01466: unable to read data - table definition has changed

最後に、SCNが12929941968である時点に回復することを選択する。
SQL>insert into hs_パスポート.recov select*from hs_passport as of scn 12929941968;
861684 rows created.
SQL>comit
Comit complettee.
データ回復の簡単な例
過去に、ユーザーがデータを誤魔化す/更新した後、ユーザーとしては直接的な方法がなく、DBAを助けてデータベースの復旧をしなければならない。Oracle 9 iになると、この難局は改善された。Oracle 9 iには新しい技術手段が提供されています。フラッシュバッククエリを使って、ユーザは適時に誤操作前のデータを取得し、エラーに対して相応の回復措置を行うことができます。このすべてはDBA干渉する必要がありません。
3.次は一例を通して、フラッシュバッククエリの使い方を具体的に説明します。

3.1フラッシュバッククエリを使用する前に、次の二つのパラメータを決定しなければなりません。
UNDOMANAGEMENT=AUTO
undo_retection=10800
この時間は自由に設定できます。これはシステムに提出されたUNDO情報を保留する時間を表しています。10800は3時間、180分です。
3.2フラッシュバックで照会する

SQL> conn /as sysdba
Connected.
SQL> drop user lsf cascade;

User dropped.

SQL> create user lsf identified by lsf;

User created.

SQL> grant connect,resource to lsf;

Grant succeeded.

SQL> grant execute on dbms_flashback to lsf;

Grant succeeded.

SQL> conn lsf/lsf
Connected.
SQL> create table T(id int, name varchar2(20));

Table created.

SQL> insert into T values(1,'lsf');

1 row created.

SQL> insert into T values(2,'lsf');

1 row created.

SQL> insert into T values(3,'lsf');

1 row created.

SQL> commit;

Commit complete.

SQL> select * from T;

    ID NAME
---------- ------------------------------------------------------------
     1 lsf
     2 lsf
     3 lsf

SQL> set time on
10:12:50 SQL> delete from T where id=1;

1 row deleted.

10:13:02 SQL> commit;

Commit complete.

10:13:10 SQL> select * from T;

    ID NAME
---------- ------------------------------------------------------------
     2 lsf
     3 lsf

10:13:18 SQL> execute DBMS_FLASHBACK.ENABLE_AT_TIME(to_date('2011-04-15 10:12:50','YYYY-MM-DD HH24:MI:SS'));

PL/SQL procedure successfully completed.

10:13:50 SQL> select * from T;

    ID NAME
---------- ------------------------------------------------------------
     1 lsf
     2 lsf
     3 lsf

10:13:57 SQL> execute DBMS_FLASHBACK.DISABLE;

PL/SQL procedure successfully completed.

10:15:48 SQL> select * from T;

    ID NAME
---------- ------------------------------------------------------------
     2 lsf
     3 lsf

3.3フラッシュバッククエリを使用してデータを復元する

10:16:59 SQL> truncate table T;

Table truncated.

10:18:15 SQL> select * from T;

no rows selected

10:18:22 SQL> insert into T values(1,'lsf');

1 row created.

10:19:42 SQL> insert into T values(2,'lsf');

1 row created.

10:19:48 SQL> insert into T values(3,'lsf');

1 row created.

10:19:55 SQL> insert into T values(4,'lsf');

1 row created.

10:20:07 SQL> insert into T values(5,'lsf');

1 row created.

10:20:15 SQL> insert into T values(6,'lsf');

1 row created.

10:20:21 SQL> commit;

Commit complete.

10:20:26 SQL> select * from T;

    ID NAME
---------- ------------------------------------------------------------
     1 lsf
     2 lsf
     3 lsf
     4 lsf
     5 lsf
     6 lsf

6 rows selected.

10:20:56 SQL> delete T;

6 rows deleted.

10:21:27 SQL> commit;

Commit complete.

10:21:40 SQL> declare
10:22:29  2 cursor flash_recover is
10:22:43  3 select * from T;
10:22:50  4 t_recode T%rowtype;
10:23:11  5 begin
10:23:14  6 DBMS_FLASHBACK.ENABLE_AT_TIME(to_date('2011-04-15 10:20:56','YYYY-MM-DD HH24:MI:SS'));
10:24:22  7 open flash_recover;
10:24:39  8 DBMS_FLASHBACK.DISABLE;
10:24:59  9 loop
10:25:05 10 FETCH flash_recover into t_recode;
10:25:24 11 EXIT WHEN flash_recover%NOTFOUND;
10:25:45 12 insert into T values(t_recode.id,t_recode.name);
10:26:35 13 end loop;
10:26:39 14 CLOSE FLASH_RECOVER;
10:26:50 15 commit;
10:26:56 16 end;
10:26:58 17 /

PL/SQL procedure successfully completed.

10:27:00 SQL> select * from T;

    ID NAME
---------- ------------------------------------------------------------
     1 lsf
     2 lsf
     3 lsf
     4 lsf
     5 lsf
     6 lsf

6 rows selected.

私たちはすでに6つの記録を回復しましたが、フラッシュバックの制限のため、すべての6つの記録を回復できない可能性があります。その理由は以下の通りです。
4.限界性
4.1フラッシュバッククエリはSCNに基づいています。
DBMS_FLASHBACK.ENABLE_ATTIMEdate('2011-04-15 10:20:56'、'YYY-M-DD HH 24:MI:SS')
しかし、Oracleは正確なこの時点ではなく、ROUND DOWNから最近のSCNまでであり、その後、このSCNから回復する。Oracle 9 iは5分ごとにSCNを記録し、SCNと対応時間のマッピングを記録します。
だからDBMS_を使えばFLASHBACK.ENABLE_ATタイムは回復します。回復失敗を避けるために、5分待ってから回復します。
DBMS_を使うFLASHBACK.ENABLE_ATTIMEが回復するにはもう一つの欠点があります。Oracle 9 iの中でSCNと対応時間のマッピング情報は5日間しか残していないので、DBMS_を通すことができません。FLASHBACK.ENABLE_ATTIMEは5日前のデータを復元します。フラッシュバッククエリを使って5日前のデータを回復したいなら、自分で回復するSCNを確認してDBMS_を使用しなければなりません。FLASHBACK.ENABLE_ATSYSTEM_CHANGE_NUMBER(SCN_NUMBER)回復時点を測りに来ました。次は使い方です。

10:27:27 SQL> VARIABLE SCN_SAVE NUMBER;
10:32:47 SQL> EXECUTE :SCN_SAVE := DBMS_FLASHBACK.GET_SYSTEM_CHANGE_NUMBER;

PL/SQL procedure successfully completed.

10:33:24 SQL> print SCN_SAVE;

 SCN_SAVE
----------
  3438420

10:33:41 SQL> execute DBMS_FLASHBACK.ENABLE_AT_SYSTEM_CHANGE_NUMBER(:SCN_SAVE);

PL/SQL procedure successfully completed.

10:34:31 SQL> select * from T;

    ID NAME
---------- ------------------------------------------------------------
     1 lsf
     2 lsf
     3 lsf
     4 lsf
     5 lsf
     6 lsf

6 rows selected.
また、DBMS_を使用しています。FLASHBACK.ENABLE_ATTIMEの前に、あなたのNLS_を設定してください。DATE_FOREMATの正確さはOracleがデフォルトでは正確に天に到達します。もし設定しないなら、上のような例は予想される結果を得られません。
4.2 sysdateとDBMS_を使えばFLASHBACK.GET_SYSTEM_CHANGE_NUMBERは、時間点またはSCN値を取得するために、それらの取得は現在の時点およびSCN値であることに注意しなければならない。
4.3業務開始時にフラッシュバッククエリモードに入ることができます。もし前にDLL操作があったら、COMMITが必要です。
4.4フラッシュバッククエリは、テーブル構造が変更される前に、クエリに使用されている現在のデータ辞書に戻ります。