利用延時備庫找回被誤刪的資料

skzhuga發表於2018-12-03

很多時候人為誤操作會對Oracle的資料造成影響,比如誤刪資料。當誤操作發生時,通常有四個解決方法:

  1.閃回資料庫或閃回表

 2.備份恢復

 3.logminer挖掘redo

 4.使用延時庫

前三種方法都不是很完美:

  閃回資料庫影響較大,且事先需要開啟庫上的閃回。

 閃回表或閃回版本查詢使用方便,但在繁忙的資料庫中很容易快照過舊。

 備份恢復耗時長、影響大

 logminer挖掘日誌耗時耗力


此時如果事先有搭建延時備庫的話,則可以很容易的從備庫得到誤刪的資料。以下進行演示。


主庫:

SQL> show parameter instance_name


NAME                                 TYPE        VALUE

------------------------------------ ----------- ------------------------------

instance_name                        string      BDDEV2

備庫:

SQL> show parameter instance_name


NAME                                 TYPE        VALUE

------------------------------------ ----------- ------------------------------

instance_name                        string      BDTEST


現有表及資料如下:

SQL> select * from scott.tb_test;

        ID        AGE TM

---------- ---------- -----------------

         1          2 20181203 14:22:14

         2          3 20181203 14:22:14

         3          4 20181203 14:22:14

         4          5 20181203 14:22:14

         5          6 20181203 14:22:14

         6          7 20181203 14:22:14

         7          8 20181203 14:22:14

         8          9 20181203 14:22:14

         9         10 20181203 14:22:14

        10         11 20181203 14:22:14

10 rows selected.


此時備庫是實時應用的:

SQL> SELECT * FROM V$DATAGUARD_STATS;

NAME                           VALUE                          UNIT                                     TIME_COMPUTED                  DATUM_TIME

------------------------------ ------------------------------ ---------------------------------------- ------------------------------ ------------------------------

transport lag                  +00 00:00:00                   day(2) to second(0) interval             12/03/2018 14:23:33            12/03/2018 14:23:33

apply lag                      +00 00:00:00                   day(2) to second(0) interval             12/03/2018 14:23:33            12/03/2018 14:23:33

apply finish time              +00 00:00:00.000               day(2) to second(3) interval             12/03/2018 14:23:33

estimated startup time         7                              second                                   12/03/2018 14:23:33


備庫轉為延時庫,延時60分鐘:

SQL> alter database recover managed standby database cancel;

Database altered.


SQL> alter database recover managed standby database disconnect from session delay 60;

Database altered.


主庫修改記錄:

SQL> update scott.tb_test set age = 100,tm = sysdate where id = 10;

1 row updated.


SQL> commit;

Commit complete.


SQL>  select * from scott.tb_test;

        ID        AGE TM

---------- ---------- -----------------

         1          2 20181203 14:22:14

         2          3 20181203 14:22:14

         3          4 20181203 14:22:14

         4          5 20181203 14:22:14

         5          6 20181203 14:22:14

         6          7 20181203 14:22:14

         7          8 20181203 14:22:14

         8          9 20181203 14:22:14

         9         10 20181203 14:22:14

        10        100 20181203 14:26:50

10 rows selected.

可看到,修改資料的時間為' 20181203 14:26:50 '。


此時刪除表資料:

SQL> select sysdate from dual;

SYSDATE

-----------------

20181203 14:28:18


SQL> truncate table scott.tb_test;

Table truncated.


SQL> alter system switch logfile;

System altered.


此時主庫中資料已經刪除,備庫中資料還停留在主庫修改資料之前:

SQL> select * from scott.tb_test;

        ID        AGE TM

---------- ---------- -----------------

         1          2 20181203 14:22:14

         2          3 20181203 14:22:14

         3          4 20181203 14:22:14

         4          5 20181203 14:22:14

         5          6 20181203 14:22:14

         6          7 20181203 14:22:14

         7          8 20181203 14:22:14

         8          9 20181203 14:22:14

         9         10 20181203 14:22:14

        10         11 20181203 14:22:14


如果我們要恢復資料到update之後、truncate之前,則要手動前滾備庫到指定時間點:

--備庫操作

重啟備庫到mount:

SQL> startup force mount;

ORACLE instance started.


Total System Global Area 2.1379E+10 bytes

Fixed Size                  2262656 bytes

Variable Size            2.0401E+10 bytes

Database Buffers          939524096 bytes

Redo Buffers               36073472 bytes

Database mounted.


手動前滾備庫到指定時間點:

SQL> recover standby database until time '20181203 14:27:00';

ORA-00279: change 108456269 generated at 12/03/2018 14:26:50 needed for thread 1

ORA-00289: suggestion : /opt/app/oracle/archivelog_bdtest/1_248_987097214.dbf

ORA-00280: change 108456269 for thread 1 is in sequence #248


Specify log: {<RET>=suggested | filename | AUTO | CANCEL}

auto

Log applied.

Media recovery complete.


前滾完成,開啟備庫:

SQL> alter database open;

Database altered.


SQL> alter session set nls_date_format='yyyymmdd hh24:mi:ss';

Session altered.


SQL> select * from scott.tb_test;

        ID        AGE TM

---------- ---------- -----------------

         1          2 20181203 14:22:14

         2          3 20181203 14:22:14

         3          4 20181203 14:22:14

         4          5 20181203 14:22:14

         5          6 20181203 14:22:14

         6          7 20181203 14:22:14

         7          8 20181203 14:22:14

         8          9 20181203 14:22:14

         9         10 20181203 14:22:14

        10        100 20181203 14:26:50

10 rows selected.


此時就得到了所需資料,只需把資料重新匯入到主庫中即可。


待處理完成後,重新開啟備庫的redo應用:

SQL> alter database recover managed standby database disconnect from session delay 60;

Database altered.

此時備庫又變為了正常的延時庫。


注意:

 1.備庫DELAY時間指的是當主庫日誌歸檔後,再延時DELAY指定的時間應用日誌,比如:設定DELAY引數為20分鐘,10:00主庫日誌歸檔,則10:20備庫才會應用此歸檔日誌

 2.也可以在LOG_ARCHIVE_DEST_2指定DELAY引數達到同樣的延時目的:

 ALTER SYSTEM SET LOG_ARCHIVE_DEST_2='SERVICE=DEVSTBY LGWR ASYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=DEVSTBY DELAY=60'

 3.備庫不能進行實時應用,因為實時應用會使DELAY引數失效,備庫變為ADG


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31544156/viewspace-2222508/,如需轉載,請註明出處,否則將追究法律責任。

相關文章