Oracle 10g數據庫備份與恢復操作手冊


Oracle 10g數據庫備份與恢復操作手冊

 

目錄

Oracle 10g數據庫備份與恢復操作手冊... 1

前言... 5

文檔目的... 5

文檔范圍... 5

目標讀者... 5

其他說明... 5

1          冷備份... 6

1.1          冷備份概述... 6

1.2          備份步驟... 6

1.3          恢復測試... 6

1.4          結論... 7

2          熱備份... 7

2.1          熱備份特點... 7

2.2          備份操作... 7

2.2.1        數據文件備份... 8

2.2.2        在線備份控制文件... 9

3          熱備份下的完全恢復... 9

3.1          非 system表空間數據文件受損... 9

3.2     system表空間數據文件或大量數據文件受損... 10

3.3          回滾數據文件損壞恢復... 11

3.4          臨時表空間文件損壞的恢復... 11

3.5          控制文件損壞的恢復... 12

3.5.1        單個控制文件被破壞... 12

3.5.2        所有控制文件被破壞... 12

3.6          日志文件損壞的恢復... 13

3.6.1        正常關機情況下非當前聯機日志文件被破壞... 13

3.6.2        正常關機情況下當前聯機日志損壞... 14

3.6.3        數據庫運行時或非正常關機情況下已歸檔日志   active日志文件被破壞... 15

3.6.4        有備份的情況下數據庫運行時或非正常關機情況下未歸檔active或  current日志文件被破壞     17

3.6.5        無備份的情況下數據庫運行時或非正常關機情況下未歸檔active或  current日志文件被破壞     19

4          恢復不完全恢復... 20

4.1          時間的恢復... 20

4.1.1        概述... 20

4.1.2        操作步驟... 21

4.2          基於SCN的恢復... 22

4.2.1        概述... 22

4.2.1        操作步驟... 22

5     RMAN備份與恢復... 23

5.1     RMAN概述... 23

5.2     RMAN服務器和目標服務器的配置... 24

5.3     RMAN配置... 25

5.4          備份集操作... 26

5.5     RMAN備份與恢復... 26

5.5.1        全庫備份與恢復... 26

5.5.2        表空間備份與恢復... 27

5.5.3        表空間備份與恢復... 28

5.5.4        控制文件備份與恢復... 28

5.5.5        歸檔文件備份與恢復... 29

5.5.6        RMAN腳本... 29

5.5.7        RMAN增量備份與恢復... 30

6          邏輯備份(export/import)... 31

6.1          概述... 31

6.2          簡單導出、導入數據... 31

6.2.1        簡單導出... 31

6.2.2        簡單導入... 32

6.3          增量導出導入... 32

6.3.1        增量導出... 32

6.3.2        導入... 33

7     Flashback. 33

7.1          概述... 33

7.2     Flashback配置步驟... 33

7.3         行級閃回操作步驟... 35

7.4         表級閃回操作步驟... 36

7.5         庫級閃回操作步驟... 38

8     LogMiner.. 39

8.1          概述... 39

8.2          系統配置... 39

8.3          操作步驟... 40
目錄

 

 

前言

文檔目的

  備份與恢復是數據庫管理中最重要的方面之一。如果數據庫崩潰卻沒有辦法恢復它,那么對企業造成的毀滅性結果可能會是數據丟失、收入減少、客戶不滿等。不管公司是使用單個數據庫還是多個數據庫來存儲數百  GB或    TB的數據,它們都有一個共同點,即需要制訂一個備份與恢復方案來備份重要數據並使自身免於災難。要制定一個適合自己公司情況的合理的備份與恢復方案,就必須熟悉備份與恢復的方法和操作。

  為了給 Oracle DBA和相關技術人員提供一個參考和學習資料特編寫此文檔。

文檔范圍

本文檔共包括 7章。

第一章,對冷備份進行簡單介紹並以實際例子對冷備份與恢復的操作步驟做了描述。

第二章,熱備份,對熱備進行了簡單介紹,並詳細說明了熱備份的備份步驟。

第三章,熱備份下的完全恢復,這是本文檔的重點和基礎內容,詳細介紹了  Oracle

數據庫在各種可能發生的數據文件損壞的情況下的完全恢復操作。

第四章,不完全恢復,對基於時間和 SCN號的不完全恢復操作進行舉例說明。

第五章,RMAN備份與恢復,對  RMAN這個備份工作的一些基本常用操作做了一些

舉例說明。

第六章,邏輯備份,介紹對邏輯備份(import/export)的常用操作。

第七章,其他備份和恢復,對 flashback和  logminer這兩個工具的常用操作進行舉例說明。

目標讀者

  本文的主要讀者為信息技術部門領導及下屬技術人員與工程技術人員,Oracle數據庫DBA和具有一定  Oracle數據庫基礎知識的學習者。

環境介紹

  本文中所有操作內容均在以下環境中完成:

操作系統:RedHat Enterprise 5.4

Oracle數據庫:Oracle  10.2.0.1.0

Oracle相關環境變量:

ORACLE_SID=ora10(catalog數據庫  SID為  rman)

ORACLE_BASE=/u01

ORACLE_HOME=/u01/db_1

其他說明

  “#”后的文字為當前命令的注釋和說明。

1         冷備份

1.1   冷備份概述

  冷備份是當數據庫的所有可讀寫的數據庫物理文件具有相同的系統改變號(SCN)時進行的備份,使數據庫處於一致狀態的唯一方法是數據庫正常關閉。故只有在數據庫正常關閉的情況下的備份才是一致性備份。

  冷備份既適用於 archivelog模式,也適用於  noarchivelog模式。

  • 優點:

  快速且簡單的備份方法。

  容易恢復到某個時間點上。

  低維護,高安全

  • 缺點:

  單獨使用時,只能提供到“某一時間點上”的恢復。

  在冷備份過程中,數據庫必須處於關閉狀態。

備份步驟

1.2   備份步驟

1).查看數據庫文件位置:

SQL>select file#,status,name from v$datafile;

SQL>select name from v$controlfile;

SQL>show parameter spfile;

2).執行備份:

SQL>shutdown immediate;

  拷貝文件數據文件到備份目錄。

  Tips: 對於只讀文件,在下次修改前備份一次就夠

1.3   恢復測試

1).創建測試表並插入數據:

SQL> create table test1(a int);

SQL> insert into test1 values(1);

SQL> commit;

2).冷備份步驟備份。

3).再插入幾條數據:

SQL> insert into test1 values(2);

SQL> commit;

4).正常關閉數據庫:

SQL>Shutdown immediate;

5).刪除數據文件,模擬故障:

SQL> ! rm /u01/oradata/ora10/*

6).啟動數據庫,結果報錯,無法啟動。

7).還原備份的文件。

8).打開數據庫:

SQL>alter database open;

9).驗證數據是否丟失:

SQL>Select * from test1;

1.4   結論

  冷備份恢復數據庫后是無法用歸檔文件重演到故障時間點的,因為冷備份的數據文件和控制文件的 SCN是一致的。

2         熱備份

2.1   熱備份特點

  是當數據庫的可讀寫的數據文件和控制文件的系統更改號(SCN)在不一致條件下的備份。對於 7*24數據庫只能進行熱備份。

熱備份僅適用於 archive log狀態。

  • 優點:

可在表空間或數據庫文件級別備份,備份時間短。

備份時數據庫仍可以使用。

可達到秒級恢復。

  • 缺點:

不能出錯,否則備份不可用。

備份方法復雜,難於維護。

2.2   備份操作

  備份前先確認數據庫處於歸檔模式:

SQL>archive log list;

Database log mode                 Archive Mode

Automatic archival                  Enabled

Archive destination                 /u01/db_1/dbs/arch

Oldest online log sequence           5

Next log sequence                   7

Current log sequence                7

  若處於非歸檔模式,開啟歸檔模式:

SQL> startup mount;

SQL> alter database archivelog;

SQL> alter database open;

2.2.1數據文件備份

1).對當前重做日志文件進行歸檔:

SQL> alter system archive log current;

2).查看表空間對應的數據文件:

SQL> select file_name,tablespace_name from dba_data_files;

FILE_NAME                                     TABLESPACE_NAME

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

/u01/oradata/ora10/users01.dbf                     USERS

/u01/oradata/ora10/sysaux01.dbf                    SYSAUX

/u01/oradata/ora10/undotbs01.dbf                   UNDOTBS1

/u01/oradata/ora10/system01.dbf                    SYSTEM

3).將表空間置於備份狀態:

SQL> alter tablespace system begin backup;

Tablespace altered.

4).拷貝文件:

      注意: linux 環境中SQLPLUS 執行操作系統命令復制文件,需要加" ! cp ";

                          windos 環境中SQLPLUS 執行操作系統命令復制文件,需要加" host  copy ".

SQL> ! cp /u01/oradata/ora10/system01.dbf  /bak/;

5).結束表空間備份狀態:

SQL>alter tablespace system end backup;

Tablespace altered

6).按上述步驟備份其他表空間數據文件。

注意:

  在表空間處於備份狀態時,該表空間 SCN將被凍結。在  end  backup前,該表空間上所有的改變和操作所產生的結果將不會寫入該表空間對應的數據文件,而是寫入 online redo  log file。另外,也可以同時將整個數據庫同時置於 begin backup狀態:alter database begin backup,但不建議這樣操作,因為這樣會使產生大量的redo記錄,導致  redo log切換頻繁使歸檔文件數量迅速增加。

2.2.2在線備份控制文件

1).在線備份控制文件

SQL>alter database backup controlfile to '/bak/controlfile.bak';

Database altered

2).在線備份生成控制文件腳本

SQL>alter database backup controlfile to trace;

Database altered

3).查看 udump下最新生成的.trc文件,里面有生成控制文件的腳本內容。為方便辨認,建議修改文件名或另存為其他文檔。

4).最后對當前日志進行歸檔。

SQL> alter system archive log current;

3         熱備份下的完全恢復

3.1   非 system表空間數據文件受損

1).建立測試表:

SQL> create table test2(a int) tablespace users;

SQL> insert into test2 values(1);

SQL> commit;

2).進行熱備份。

3).向測試表插入數據后關閉數據庫:

SQL> insert into test2 values(2);

SQL> commit;

SQL> alter system switch logfile; #切換redo logfile,防止當前redo log受損

SQL> shutdown immediate;

4).刪除一個或多個數據文件,模擬故障:

SQL> !   rm  /u01/oradata/ora10/users01.dbf

SQL> startup

ORACLE instance started.

....................

ORA-01157:cannot identify /lock data file 4  - see DBWR trace file

ORA-01110: data file 4: '/u01/oradata/ora10/users01.dbf'

5).查看需要恢復的文件號:

SQL> select * from v$recover_file;

     FILE#   ONLINE   ONLINE    ERROR           CHANGE#    TIME   

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

         4   ONLINE   ONLINE    FILE NOT FOUND           0

 

SQL> alter database datafile 4 offline drop; #將損壞或丟失的文件脫機並刪除

SQL> ! cp /bak/users01.dbf  /u01/oradata/ora10

SQL> recover datafile 4

Media recovery complete.

SQL> alter database datafile 4 online;

Database altered.

SQL> alter database open;

Database altered.

SQL> select * from test2;

Tips:

  也可在將受損文件 offline之后,打開數據庫,在  open狀態下將其恢復。但   system表空間受損不可以用此方法恢復。

3.2   system表空間數據文件或大量數據文件受損

1).熱備數據庫,之后關閉數據庫。

2).刪除 system.dbf模擬故障。

SQL> ! rm /u01/oradata/ora10/system01.dbf

 

3).恢復

SQL> startup

ORACLE instance started.

ORA-01157:cannot identify/lock data file 1 – see DBWR trace file

ORA-01110:data file 1:/'u01/oradata/ora10/system01.dbf'

 

SQL> ! cp /bak/system01.dbf  /u01/oradata/ora10/

SQL> recover database

SQL> alter database open;

3.3   回滾數據文件損壞恢復

SQL> show parameter undo

SQL> ! rm /u01/oradata/ora10/undotbs01.dbf

SQL> startup

ORA-01157:cannot identify/lock data file 2  - see DBWR trace file

ORA-01110:data file 2: '/u01/oradata/ora10/undotbs01.dbf'

 

SQL> alter system set undo_management=manual scope=spfile;

SQL> shutdown immediat;

SQL> startup mount

SQL> alter database datafile 2 offline drop;

SQL> alter database open;

SQL> drop tablespace undotbs1;

SQL> create undo tablespace undotbs1 datafile '/u01/oradata/ora10/undotbs1.dbf' size 50m autoextend on next 1m maxsize

1024m;

SQL> alter system set undo_management=auto scope=spfile;

SQL> shutdown immediate

SQL> startup

 

3.4   臨時表空間文件損壞的恢復

  Oracle10在刪掉  temp01.dbf后,啟動時會自動創建該文件。

  若報錯可通過以下方法恢復:

SQL> alter database datafile '/u01/oradata/ora10/temp01.dbf' offline drop;

SQL> alter database open;

SQL> drop tablespace temp;

SQL> create temporary tablespace temp tempfile '/u01/oradata/ora10/temp01.dbf' size 10m autoextend off;

3.5   控制文件損壞的恢復

3.5.1單個控制文件被破壞

1).刪除單個控制文件,模擬故障:

$ rm /u01/oradata/ora10/control01.ctl 

SQL> startup

ORA-00205: error in identifying control file, check alert log for more info

2).恢復:

SQL> ! cp /u01/oradata/ora10/control02.ctl /u01/oradata/ora10/control01.ctl

$ exit

SQL> alter database mount;

SQL> alter database open;

3.5.2所有控制文件被破壞

1).刪除控制文件,模擬故障:

$ rm /u01/oradata/ora10/control0*

2).啟動數據庫,報錯:

SQL> startup

ORA-00205: error in identifying control file, check alert log for more info

3).恢復:

  如果有備份控制文件的話,直接拷貝控制備份鏡像到指定文件名。如果沒有備份鏡像可通過以下方法恢復:

  備份數據文件和日志文件,以免重建控制文件失敗時數據文件和日志文件也被潛在的破壞。

$ cp /u01/oradata/ora10/* /bak/

  如果有備份過生成控制文件的腳本,可直接用其腳本生成新控制文件。如果沒有備份腳本,則須收集數據文件和日志文件所在路徑的信息。運行如下腳本恢復控制文件:

CREATE CONTROLFILE REUSE DATABASE "ORA10" NORESETLOGS  ARCHIVELOG

LOGFILE

  GROUP 1 '/u01/oradata/ora10/redo01.log'  SIZE 50M,

  GROUP 2 '/u01/oradata/ora10/redo02.log'  SIZE 50M,

  GROUP 3 '/u01/oradata/ora10/redo03.log'  SIZE 50M

DATAFILE

  '/u01/oradata/ora10/system01.dbf',

  '/u01/oradata/ora10/undotbs01.dbf',

  '/u01/oradata/ora10/sysaux01.dbf',

  '/u01/oradata/ora10/users01.dbf'

CHARACTER SET ZHS16GBK

;

SQL> alter database open;

3.6   日志文件損壞的恢復

3.6.1正常關機情況下非當前聯機日志文件被破壞

1).建立測試表,並正常關閉數據庫:

SQL> create table test(a int) tablespace users;

Table created.

SQL> insert into test values(12345);

1 row created.

SQL> commit;

Commit complete.

SQL> shutdown immediate;

Database closed.

Database dismounted.

ORACLE instance shut down.

2).刪除日志文件,模擬故障:

$ rm /u01/oradata/ora10/redo01.log

3).啟動后報錯,查看損壞文件是非當前聯機日志文件且已歸檔:

SQL> startup

ORACLE instance started.

......

ORA-00313:open failed for members of log group 1 of thread 1

ORA-00312:online log 1 thread 1: '/u01/oradata/ora10/redo01.log'

 

SQL> select group#,sequence#,archived,status from v$log;

     GROUP#     SEQUENCE#      ARC      STATUS

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

        1              13           YES       INACTIVE

        3              14           NO        CURRENT

        2              12           YES       INACTIVE

4).恢復:

SQL> alter database clear logfile group 1;

  若損壞的日志沒有歸檔,則運行下面命令:

SQL> alter database clear unarchived logfile group 1;

  注意:

  如果受損的日志沒有歸檔,恢復后應做一次全備。因為這樣恢復后歸檔日志會產生斷點。

5).驗證:

SQL> alter database open;

SQL> select * from test;

3.6.2正常關機情況下當前聯機日志損壞

1).向測試表中插入新的數據:

SQL> insert into test values(54321);

SQL> commit;

 

2).刪除日志文件,模擬故障,並正常關閉數據庫:

$ rm /u01/oradata/ora10/redo02.log

SQL> shutdown immediate

3).啟動數據庫報錯,當前聯機日志文件受損。

SQL> startup

ORACLE instance started.

......

ORA-00313:open failed for members of log group 2 of thread 1

ORA-00312:online log 2 thread 1: '/u01/oradata/ora10/redo02.log'

 

SQL> select group#,sequence#,archived,status from v$log;

     GROUP#     SEQUENCE#      ARC      STATUS

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

        1              5           YES       INACTIVE

        3              4           YES       INACTIVE

        2              6           NO        CURRENT

4).恢復:

SQL> recover database until cancel;

 

SQL> alter database open resetlogs;

Database altered.

SQL> select group#,sequence#,archived,status from v$log;

     GROUP#     SEQUENCE#      ARC      STATUS

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

        1              2           NO        CURRENT

        2              1           YES       INACTIVE

        3              0           YES       UNUSED

  注意:

  使用 resetlogs參數會將日志文件序號重置,這時日志(包括歸檔日志和聯機日志文件)文件將存在斷點。在 10g版本之前,這個斷點在恢復數據庫時時無法穿  越的。所以這種情況下數據庫恢復后須全備數據庫。10g版本后,雖然可以穿越斷點,也建議全備數據庫。

5).驗證:

SQL> select * from test;

3.6.3數據庫運行時或非正常關機情況下已歸檔日志   active日志文件被破壞

1).建立測試環境:

SQL> insert  into  test values(11111);

1 row created.

SQL> commit;

Commit complete.

SQL> select * from test;

---------------A

      12345

      54321

      11111

SQL> select group#,sequence#,archived,status from v$log;

     GROUP#     SEQUENCE#      ARC      STATUS

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

        1              5           YES       INACTIVE

        2              6           NO        CURRENT

        3              4           YES       INACTIVE

SQL> alter system switch logfile;

System altered.

SQL> select group#,sequence#,archived,status from v$log;

     GROUP#     SEQUENCE#      ARC      STATUS

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

        1              5           YES       INACTIVE

        2              6           YES       ACTIVE

        3              7           NO        CURRENT

 

SQL> shutdown abort

ORACLE instance shut down.

2).刪除日志文件,模擬故障:

$ rm /u01/oradata/ora10/redo02.log

3).啟動數據庫,報錯:

SQL> startup

ORACLE instance started.

......

ORA-00313:open failed for members of log group 2 of thread 1

ORA-00312:online log 2 thread 1: '/u01/oradata/ora10/redo02.log'

ORA-27037:unable to obtain file status

Linux Error:2 No such file or directory.

4).恢復:

  查看歸檔文件對應的日志序號,恢復時輸入對應序號的日志文件,最后打開數據(建議做一次全備份):

SQL> select name,sequence# from v$archived_log where sequence#>=5;

NAME                                                      SEQUENCE#

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

/u01/oradata/arch/1_5_736716731.dbf                                       5

/u01/oradata/arch/1_6_736716731.dbf                                       6

SQL> recover database until cancel;

ORA-00279:change 457803 generated at 12/02/2010 19:34:38 needed for thread 1

ORA-00289:suggestion:/u01/oradata/arch/1_6_736716731.dbf

ORA-00280:change 457803 for thread 1 is in sequence #6

 

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

/u01/oradata/arch/1_6_736716731.dbf

ORA-00279:change 457844 generated at 12/02/2010 19:36:31 needed for thread 1

ORA-00289:suggestion:/u01/oradata/arch/1_6_736716731.dbf

ORA-00280:change 457844 for thread 1 is in sequence #7

ORA-00280:log file '/u01/oradata/arch/1_6_736716731.dbf' no longer needed for this recovery

 

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

/u01/oradata/ora10/redo03.log

Log applied.

Media recovery complete.

SQL> alter database open;

alter database open

 *

ERROR at line 1:

ORA-01599:must use RESETLOGS or NORSETLOGS option for database open

SQL>alter database open resetlogs;

Database altered.

5).檢查數據是否丟失:

SQL>select * from test;

3.6.4有備份的情況下數據庫運行時或非正常關機情況下未歸檔active或  current日志文件被破壞

1).全備份數據庫:

2).向測試表中插入新的數據,並終止數據庫運行:

SQL>select * from test;

               A

           12345

           54321

           11111

           22222

3).刪除日志文件,模擬故障:

$ rm /u01/oradata/ora10/redo01.log

4).啟動數據庫,報錯,當前日志文件被損壞:

SQL> startup

ORACLE instance started.

......

ORA-00313:open failed for members of log group 1 of thread 1

ORA-00312:online log 1 thread 1: '/u01/oradata/ora10/redo01.log'

ORA-27037:unable to obtain file status

Linux Error:2 No such file or directory.

Additional information:3

SQL> select group#,sequence#,archived,status from v$log;

     GROUP#     SEQUENCE#      ARC      STATUS

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

        1              7           NO        CURRENT

        2              6           YES       ACTIVE

        3              5           YES       INACTIVE

5).恢復:

  先還原全備份,從全備份開始重做:

SQL> recover database until cancel;

ORA-00279:change 457882 generated at 12/03/2010 16:22:37 needed for thread 1

ORA-00289:suggestion:/u01/oradata/arch/1_1_736791757.dbf

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

 

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

Auto

  選擇 auto。若最后提示輸入最后一個日志序號文件的文件名時,輸入 cancel。若自動返回 sqlplus提示符則直接打開數據庫。

ORA-00279:change 482068 generated at 12/03/2010 16:26:27 needed for thread 1

ORA-00289:suggestion:/u01/oradata/arch/1_7_736791757.dbf

ORA-00280:change 482068 for thread 1 is in sequence #7

ORA-00280:log file '/u01/oradata/arch/1_7_736791757.dbf ' no longer needed for this recovery

 

ORA-00308:cannot open archived log '/u01/oradata/arch/1_7_736791757.dbf'

ORA-27037:unable to obtain file status

Linux Error:2 No such file or directory.

Additional information:3

 

SQL> alter database open resetlogs;

Database altered.

SQL> select * from test;

              A

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

            12345

            54321

            11111

6).結果:數據有丟失。

3.6.5無備份的情況下數據庫運行時或非正常關機情況下未歸檔active或  current日志文件被破壞

1).向測試表中插入新的數據,並終止數據庫運行:

SQL> shutdown abort;

2).刪除日志文件,模擬故障:

$ rm /u01/oradata/ora10/redo03.log

3). 啟動數據庫,報錯,當前日志受損:

SQL> startup

ORACLE instance started.

.........

Database mounted.

ORA-00313:open failed for members of log group 3 of thread 1

ORA-00312:online log 3 thread 1: '/u01/oradata/ora10/redo03.log'

ORA-27037:unable to obtain file status

Linux Error:2 No such file or directory.

Additional information:3

SQL> select group#,sequence#,archived,status from v$log;

     GROUP#     SEQUENCE#      ARC      STATUS

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

        1              4           YES       INACTIVE

        3              6           NO        CURRENT

        2              5           YES       INACTIVE

4).無備份可還原。按以下步驟恢復:

SQL> shutdown

SQL> create pfile from spfile;

$ vi initora10.ora

#添加下面這一行

_allow_resetlogs_corruption=true     #隱含參數,允許數據庫在不一致狀態下打開

SQL> startup pfile='/u01/db_1/dbs/initora10.ora';

SQL> recover database until cancel;

 

SQL> recover database until cancel;

ORA-00279:change 482619 generated at 12/03/2010 17:04:13 needed for thread 1

ORA-00289:suggestion:/u01/oradata/arch/1_6_736793254.dbf

ORA-00280:change 482619 for thread 1 is in sequence #6

 

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

Auto

 

SQL> alter database open resetlogs;

5).檢查數據是否有丟失:

SQL> select * from test;

  有數據丟失。

  注意: 在這種情況下恢復的數據庫是處於不一致狀態的,這種狀態下運行的數據庫是不穩定的。所以,恢復數據庫后第一件事是導出數據,重建數據庫。

4         恢復不完全恢復

4.1   時間的恢復

4.1.1概述

  基於時間的恢復可以將數據庫不完全恢復到過去某一時間點,常用於在誤操作刪除數據后,在備機上將數據庫恢復到刪除時間按之前,然后再把該表導出到正式環境,從而挽回丟失的數據。

4.1.2操作步驟

1).不完全恢復需要用到數據庫的全備。所以在測試前先對數據庫做除臨時表空間外的全備份。

  以下代碼為window環境的示例:

alter tablespace USERS  begin  backup;
host copy D:\ORACLE\PRODUCT\ 10.2. 0\ORADATA\ORCL\USERS01.DBF  E:\oraclebak;
alter tablespace USERS  end  backup;

alter tablespace TEST   begin  backup;
host copy D:\ORACLE\PRODUCT\ 10.2. 0\ORADATA\ORCL\TEST01.DBF  E:\oraclebak;
host copy D:\ORACLE\PRODUCT\ 10.2. 0\ORADATA\ORCL\TEST02.DBF  E:\oraclebak;
alter tablespace TEST   end  backup;

alter tablespace UNDOTBS1  begin  backup;
host copy D:\ORACLE\PRODUCT\ 10.2. 0\ORADATA\ORCL\UNDOTBS01.DBF  E:\oraclebak;
alter tablespace UNDOTBS1  end  backup;

alter tablespace SYSAUX  begin  backup;
host copy D:\ORACLE\PRODUCT\ 10.2. 0\ORADATA\ORCL\SYSAUX01.DBF  E:\oraclebak;
alter tablespace SYSAUX  end  backup;

alter tablespace SYSTEM  begin  backup;
host copy D:\ORACLE\PRODUCT\ 10.2. 0\ORADATA\ORCL\SYSTEM01.DBF  E:\oraclebak;
alter tablespace SYSTEM  end  backup;
View Code

 

2).建立測試環境:

SQL> select * from test;

               A

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

               1

               2

SQL> alter system switch logfile;

System altered.

SQL> select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss') from dual;

TO_CHAR(SYSDATE,'YYYY-MM-DD HH24:MI;SS')

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

2010-12-05 16:18:50

SQL> drop table test purge;

Table dropped.

 

SQL> shutdown immediate

Database closed.

Database dismounted.

ORACLE instance shut down.

SQL> startup mount;

3).還原全備:

  以下代碼為window環境的示例:

host copy E:\oraclebak\ *.DBF D:\ORACLE\PRODUCT\ 10.2. 0\ORADATA\ORCL\;
View Code

 

4).恢復至故障點:

SQL> recover database until time '2010-12-05 16:18;50';

Media recover complete.

Database altered.

SQL> select * from test;

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

               1

               2

4.2   基於SCN的恢復

4.2.1概述

  基於 SCN(system change  number)的恢復可以將數據庫不完全恢復到過去的某一個SCN改變點,也常用語在誤操作刪除數據后,在備份機上將數據庫恢復到刪除時間之前,然后再導出到正式環境,從而挽回丟失的數據。

4.2.1操作步驟

1).不完全恢復需要用到數據庫的全備。所以在測試前先對數據庫做除臨時表空間外的全備份。

2).建立測試環境:

SQL> select * from test;

               A

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

               3

               1

               2

SQL> select  curent_scn from v$database;

CURRENT_SCN

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

         459219

SQL> delete test where a=3;

1 row deleted.

 

SQL> commit;

Commit complete.

SQL> select * from test;

               A

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

               1

               2

3).還原全備份。

4).恢復:

SQL> recover database until change 456219;

ORA-00279:change 455755 generated at 12/05/2010 16:12:47 needed for thread 1

ORA-00289:suggestion:

/u01/flash_recovery_area/ORA10/archivelog/2010_12_05/o1_mf_1_2_%u_.arc

ORA-00280:change 455755 for thread 1 is in sequence #2

 

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

Auto

ORA-00279:change 455908 generated at 12/05/2010 16:18:14 needed for thread 1

ORA-00289:suggestion:

/u01/flash_recovery_area/ORA10/archivelog/2010_12_05/o1_mf_1_3_%u_.arc

ORA-00280:change 455908 for thread 1 is in sequence #3

/u01/flash_recovery_area/ORA10/archivelog/2010_12_05/o1_mf_1_2+6hplp652_.arc'

no longer needed for this recover

 

Log applied.

Media recovery complete.

SQL> alter database open resetlogs.

Database altered.

SQL> select * from test;

               A

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

               3

               1

               2

5         RMAN備份與恢復

5.1   RMAN概述

  RMAN自動維護備份和恢復所需的各種信息,可保存在數據庫的控制文件中,但控制文件損壞將導致 RMAN失敗,故推薦在一個單獨的服務器上,將  RMAN管理的所有信息全部存放到一個 catalog數據庫中,一個  catalog數據庫來保存遠程目標數據庫信息。該 catalog數據庫可和被備份的目標數據庫位於同一主機,也可單獨放在另一台主機上(確保最大的可恢復性)。

  Catalog包含了所有備份信息,故該數據庫本身也需要通過某種方法進行備份,因為該數據庫很小(100M內),故可對其進行冷備份或邏輯備份。

  RMAN每次備份生成一個備份集,每個集中包含的備份文件稱為備份片或備份段。

  RMAN應運行於歸檔模式下。

5.2   RMAN服務器和目標服務器的配置

1).配置 RMAN CATALOG數據庫(在  catalog服務器上)

SQL> create tablespace rmantbs datafile '/u01/oradata/rman/rmantbs.dbf' size 20M;

Tablespace created.

SQL> create user rman identified by rman123 default tablespace rmantbs temporary tablespace temp;

SQL> grant resource,connect,recovery_catalog_owner to rman;

Grant succeeded.

 

$ rman catalog rman/rman123@ora10    #測試登錄

RMAN> create catalog tablespace rmantbs; #創建catalog對象

2).配置針對目標服務器的遠程數據庫鏈路(在 catalog服務器上)

ORA10 =

  (DESCRIPTION =

    (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.72.20)(PORT = 1521))

    (CONNECT_DATA =

      (SERVER = DEDICATED)

      (SERVICE_NAME = ora10)

    )

  )

3).配置目標數據庫監聽(在目標數據庫上)

SID_LIST_LISTENER =

  (SID_LIST =

    (SID_DESC =

      (GLOBAL_DBNAME = ora10)

      (ORACLE_HOME = /u01/db_1)

      (SID_NAME = ora10)

    )

  )

LISTENER =

  (DESCRIPTION =

(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.72.10)(PORT = 1521))

$ lsnrctl stop

$ lsnrctl start

4).啟用 RMAN連接目標數據庫

$ rman target sys/oracle@ora10 catalog rman/rman123

RMAN> register database;    #注冊目標數據庫

5).目標數據庫的同步與注銷

  • 由於redo log和archive log的信息不回自動更新到恢復目錄,所以需要定期同步到恢復目錄,使用下面命令重新同步:

RMAN> resync catalog;

  • 注銷已注冊的數據庫:

(1)   先查詢要注銷的數據庫的 DB_ID,查詢方法有兩種:

  第一種是用 rman連接目標數據庫時會顯示,如:

RMAN> connect target sys/oracle@ora10       

connected to target database: ORA10 (DBID=719569885)

 

  第二種是在目標數據庫中執行以下指令可以查詢到:

SQL> select dbid from v$database;

DBID

----------

 719569885

(2)   在 catalog數據庫上以  rman用戶登錄,注銷目標數據庫:

SQL> select db_key,dbid from db where db_id=719569885;

DY_KEY        DBID

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

1            719569885

SQL> execute dbms_rcvcat.unregisterdatabase(1,719569885);

 

  注意:

  一旦注銷了該目標數據庫,就不可以使用恢復目錄中含有的備份集來恢復數

據庫了。

5.3   RMAN配置

RMAN> show all;

CONFIGURE RETENTION POLICY TO REDUNDANCY 1; 

#基於備份數量的備份保存策略,除最新3份外的其他備份都置為obsolete狀態。

CONFIGURE RETENTION POLICY TO RECOVERY WINDOW OF 7 DAYS;

#基於時間的備份保存策略,7天前的備份都被置為obsolete狀態。

CONFIGURE DEFAULT DEVICE TYPE TO DISK; 

#設置默認的備份設備為磁盤。磁帶設備則應指定為to sbt。

CONFIGURE CONTROLFILE AUTOBACKUP ON;

#指定進行任何備份操作時,都對控制文件和參數文件同時進行備份(默認為off)。

CONFIGURE  CONTROLFILE  AUTOBACKUP   FORMAT  FOR  DEVICE   TYPE  DISK  TO

'/u01/bak/cs_%F';

#指定備份的控制文件和參數文件格式。

CONFIGURE CHANNEL DEVICE TYPE DISK FORMAT   '/u01/bak/%U_%d';

#設置備份文件的路徑及文件名格式,只適用於磁盤設備。

5.4   備份集操作

RMAN> list backup;

#列出所有備份機信息

RMAN> delete backupset 70;  #刪除指定備份集

RMAN> report obsolete;

#檢查是否有過期備份集(過期狀態由保存策略決定)

RMAN> delete obsolete;  #刪除過期備份集

RMAN> crosscheck backup; #校驗catalog的記錄的備份信息是否在介質上真是存在,不一致

則置為expired過期狀態

RMAN> delete expired backup;   #刪除expired備份集

RMAN> validate backupset 147;  #根據backupset號驗證備份有效性

5.5   RMAN備份與恢復

5.5.1全庫備份與恢復

 

 

recover和restore的區別: restore just copy the physical file, recover will consistent the database. restore 是還原,文件級的恢復。就是物理文件還原。 recover 是恢復,數據級的恢復。邏輯上恢復,比如應用歸檔日志、重做日志,全部同步,保持一致。 用我自己的土話講就是,用restore先把備份文件拷貝到數據庫目錄下進行替換,再用recover經過一些處理,數據庫就恢復正常了。 1、restore 命令:用於還原已經備份的數據文件。   (1)、restore database 還原所有的數據文件。   (2)、restore tablespace 還原特定表空間的數據文件。   (3)、restore datafile 還原特定的數據文件。   (4)、restore controlfile  還原控制文件。   (5)、restore archivelog  還原歸檔日志文件。 2、recover 命令:當數據庫需要應用歸檔日志文件恢復數據文件時,使用recover命令。使用該命令數據庫系統會自動應用歸檔的日志文件。   (1)、recover database 恢復所有的數據文件。   (2)、recover tablespace 恢復特定表空間的數據文件。   (3)、recover datafile 恢復特定的數據文件。 restore 只是用備份來還原,recover是用archivelog或者online log   舉例說明: 假設我時間點A,做了個備份,時間點B數據庫掛了 restore database ;// 這個操作利用時間點A做的備份來還原,返回到時間點A recover database ;//這個操作利用archivelog and online log做recover,從時間點A,推進到時間點B restore 是轉儲也是還原被損壞文件(RMAN經常用) recover 是恢復 通過redo log & archive log恢復 restore 是還原,文件級的恢復 recovery是恢復,數據級的恢復 
View Code

 

  • 全庫備份

RMAN> sql 'alter system archive log current';

RMAN> backup format='/u01/bak/f_%U' tag='full' database;

RMAN> list backupset of database;

RMAN> list backupset of controlfile;

RMAN> list backupset of spfile;    #列出指定內容的備份集

  • 全庫恢復(也可用於異機恢復)

 

$rm  /u01/oradata/*

$rm /u01/db_1/dbs/spfileora10.ora

#模擬故障

$ rman

RMAN> connect target sys/oracle@ora10

RMAN> connect catalog rman/rman123;

RMAN> set dbid 719569885    #這一步可選,非必須。

RMAN> startup nomount;

RMAN> restore spfile from autobackup 或'/u01/bak/F_02PV661P_1_1';

RMAN> startup nomount force;   #以恢復的spfile文件將數據庫加載到

nomount狀態。

RMAN> restore controlfile from autobackup或'/01/bak/F_01PV6602_1_1';

RMAN> alter database mount;

RMAN> restore database;

RMAN> recover database;

#忽略報錯。

RMAN> alter database open resetlogs;

5.5.2表空間備份與恢復

  • 表空間備份

RMAN> backup tablespace users;

RMAN> list backup of tablespace users;

  • 表空間恢復

RMAN> shutdown immediate

RMAN> startup mount;

RMAN> restore tablespace users;

RMAN> recover tablespace users;

RMAN> alter database open;

5.5.3表空間備份與恢復

  • 數據文件備份

RMAN> backup datafile 3;

RMAN> list backup of datafile 3;

  • 數據文件恢復

RMAN> shutdown immediate

RMAN> startup mount;

RMAN> restore datafile 3;

RMAN> recover datafile 3;

RMAN> alter database open;

5.5.4控制文件備份與恢復

  • 控制文件備份

  因為控制文件常需和數據文件一起同時進行恢復,故不常單獨對控制文件進行備份,而一般在對數據文件進行備份時利用 autobackup參數對控制文件進行同步備份,以保證數據文件和控制文件的一致性。

RMAN>CONFIGURE CONTROLFILE AUTOBACKUP ON; 

RMAN> backup current controlfile;

RMAN> list backup of controlfile;

#單獨備份控制文件。

#查看控制文件備份信息。

RMAN> backup database include current controlfile;    #備庫同時備份控制文件。

  • 控制文件恢復

RMAN> startup nomount;

RMAN> restore controlfile from autobackup;

RMAN> alter database mount;

RMAN> recover database;

RMAN> alter database open resetlogs;

  最后重建臨時表空間(對於 10gR2以后版本不需重建):

SQL> create temporary tablespace temp tempfile

  2  '/u01/oradata/ora10/temp01.dbf' reuse

3   autoextend off;

5.5.5歸檔文件備份與恢復

  • 歸檔文件的備份

  不常單獨對歸檔文件進行備份,而一般僅在對全庫進行備份時對歸檔文件進行手工備份,以保證歸檔文件的一致性。

RMAN> backup archivelog all;

#備份歸檔文件。

RMAN> list backup of archivelog all;

#查看歸檔文件備份信息。

RMAN> backup database plus archivelog;    #備份數據庫同時備份歸檔文件。這條命令

在備份歸檔日志文件前會自動執行一次

alter system archive log current。

RMAN> backup archivelog all delete all input; #備份歸檔文件完成后,刪除目標數據

庫上的歸檔文件。

  • 歸檔文件的還原

RMAN> restore archivelog all;

#還原所有歸檔日志文件。

RMAN> restore archivelog from scn/sequence/time; #按條件還原歸檔日志文件。

5.5.6RMAN腳本

  舉例:

run{

allocate channel d1 device type disk;

backup as compressed backupset

incremental level=0

format='/u01/bak/inc0_%d_%U'

tag='inc0'

channel=d1

database;

sql "alter system switch logfile";

backup as compressed backupset

format='/u01/bak/arch_%d_%U'

tag='arch'

channel=d1

archivelog all delete input;

backup as compressed backupset

format='/u01/bak/sctl.ctl'

tag='ctl'

channel=d1

current controlfile;

release channel d1;}

  操作系統調用 RMAN腳本:

rman target sys/oracle@primary catalog rman/rman123\

 msglog /home/oracle/rman.log\

#指定日志記錄文件位置

#指定腳本文件位置

 cmdfile=/home/oracle/rman.sh

5.5.7 RMAN增量備份與恢復

  • 差異備份:

  差異備份對更低級及同級備份之后所有變化的數據備份。

  差異備份所需備份時間短,恢復時間長。

RMAN> backup incremental level 0 database;

  • 累積增量備份:

  累積備份只對更低級備份之后所有變化的數據備份。

  累積備份所需時間長,恢復時間短。

RMAN> backup incremental level 1 cumulative database;

  • 還原:

RMAN> restore database;

6         邏輯備份(export/import

6.1   概述

  邏輯備份是將數據庫中所有或指定對象導出數據庫成為備份文件,或將備份文件數據導入數據庫。

  Oracle支持三種類型的輸出:

表方式(T方式),將指定表的數據導出。

用戶方式(U方式),將指定用戶的所有對象及數據導出。

全庫方式(Full方式),將數據庫中的所有對象導出。

6.2   簡單導出、導入數據

6.2.1簡單導出

$ exp lty/lty123

Enter array fetch buffer size: 4096 >     #選擇緩沖區大小

Export file: expdat.dmp > lty.test.dmp    #導出文件名

(2)U(sers), or (3)T(ables): (2)U > t

Export table data (yes/no): yes >  

#選擇導出類型

#是否導出表數據,若為no則只導出表結

Compress extents (yes/no): yes > 

#是否壓縮

Table(T) or Partition(T:P) to be exported: (RETURN to quit) > test

#要導出的表名或表分區

. . exporting table                           TEST         10 rows exported

Table(T) or Partition(T:P) to be exported: (RETURN to quit) >        

#是否繼續導出,退出則按回車

如果要導出全庫或 system表空間則須以  sys用戶登錄,登錄方式如下:

 

$ exp \'sys/oracle as sysdba\'

6.2.2簡單導入

$ imp scott/tiger

Import file: expdat.dmp > lty.test.dmp    #選擇要導入的文件名

Enter insert buffer size (minimum is 8192) 30720> 

#選擇緩沖區大小

List contents of import file only (yes/no): no > 

#是否只列出導入數據文件的內容

Ignore create error due to object existence (yes/no): no >        

#是否忽略在對象創建時由於對象存在而發生的錯誤,若yes則導入數據到對象(無論對象是否存在,

若存在則繼續在對象中添加數據,比如:如果表存在並且已有數據,則繼續向表中插入導入的數據(約

束仍然起作用);若不存在,則先創建對象后再往里導入數據);若 no則對象存在就會跳過該對象的

導入。

Import grants (yes/no): yes > 

#是否導入權限。

Import table data (yes/no): yes >  

#是否導入表數據。

Import entire export file (yes/no): no > yes #是否導入整個文件的數據。

6.3   增量導出導入

  增量導入導出是一種常用的數據備份方法,他只能對整個數據庫來實施,並且必須以system用戶來導出。在進行此種導出時,系統不要求回答任何問題。導出文件名缺省為 export.dmp,如果不用缺省文件名則須在命令行中指出。

6.3.1增量導出

  包括三種類型:

  • “完全”增量導出(complete):導出整個數據庫:

$ exp system/oracle inctype=complete file=full_101205.dmp

  • “增量型”增量導出:導出上一次備份后改變的數據:

$ exp system/manager inctype=incremental file=inc_101205.dmp

  • “累計型”增量導出:累積型到粗是導出自上次“完全”導出之后數據庫中變化的數據:

$ exp system/manager inctype=cumulative file=cum_101205.dmp

6.3.2導入

$ imp system/oracle inctype=restore full=y file=full_101205.dmp

$ imp system/oracle inctype=restore full=y file=cum_101205.dmp

$ imp system/oracle inctype=restore full=y file=inc_101205.dmp

7         Flashback

7.1   概述

  Flashback是指將數據庫恢復到過去某個時間點或  SCN點的狀態,包括行級閃回,表級閃回和庫級閃回。

  表級閃回是利用回收站機(recyclebin)制。當一張表被 drop掉時,默認情況下並沒有真正被清除,而是被放入 recyclebin里;行級閃回和庫級閃回原理實際上是對數據庫執行的操作做一個反操作,如:向表里插入一條數據,閃回時則刪除這一條數據。如果是行級或表級閃回,這些反操作依據的是 undo表空間里未被覆蓋的原始數據,如果是庫級閃回,則依據的是flashback日志。

7.2   Flashback配置步驟

1).系統配置

SQL> alter system set undo_management='auto' scope=spfile;

#重啟生效。

SQL> alter system set undo_retention=9000;    #配置閃回可回溯時間,默認900秒。

SQL> show parameter undo

NAME

     TYPE   VALUE

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

undo_management    string  AUTO

undo_retention       integer  9000

undo_tablespace    string  UNDOTBS1

  以下是庫級閃回必須的配置(若不需要用到庫級閃回則為可選配置):

SQL> show parameter db_recover

NAME                         TYPE                   VALUE

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

db_recovery_file_dest          string          /u01/flash_recovery_area

db_recovery_file_dest_size     big integer      2G

  db_recovery_file_dest:該參數定義flashback日志文件存放目錄。

  db_recovery_file_dest_size:該參數定義了flashback日志文件目錄最大大小,默認  2G。

SQL> show parameter flash

SQL> show parameter db_flash

NAME                      TYPE      VALUE

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

db_flashback_retention_target  integer    1440  #定義閃回數據保存時間,

單位分鍾,默認1天。

  啟用歸檔模式和庫級閃回功能:

SQL> startup mount

SQL> alter database archivelog;

SQL> alter database flashback on;

SQL> select name,log_mode,flashback_on from v$database;

NAME       LOG_MODE     FLASHBACK_ON

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

ORA10       ARCHIVELOG    YES

 

$ps  -ef | grep rvwr 

#rvwr進程定期將已變化的數據塊寫入flashback日志文件

$ls –l /u01/flash_recovery_area/ORA10/flashback #查看生成的flashback日志文件

2).授權給用戶允許其進行閃回查詢

SQL> grant connect,resource to lty; 

SQL> grant execute on dbms_flashback to lty;

SQL> grant select any transaction to lty;

7.3    行級閃回操作步驟

1).創建測試表

SQL> connect lty/lty123

#sys用戶不支持行級閃回。

SQL> create table test(id int);

SQL> insert into test values (111);

SQL> commit;

SQL> insert into test values (222);

SQL> commit;

SQL> insert into test values (333);

SQL> commit;

SQL> update test set id=444 where id=333;

SQL> commit;

SQL> delete from test where id=222;

SQL> commit;

2).閃回查詢對 test表所做的所有更改所對應的  SCN點

SQL> select  versions_startscn, versions_endscn, versions_xid, versions_operation  from  test versions between  timestamp  minvalue  and maxvalue;

  或者:

SQL>select versions_startscn,versions_endscn,versions_xid,versions_operation from test versions between scn 602840 and 602880;

  也可查詢指定閃回交易號所對應的閃回 SQL語句:

SQL>select undo_sql from flashback_transaction_query where xid='0400090003010000'

3).test表進行  row movement

SQL> alter table test enable row movement;

  所有表中插入一行即被分配一永久 rowid,閃回時需對已刪除行進行重插入處理,即需為被刪行分配新的 rowid,故需允許進行 row movement。

4).閃回到指定 SCN號或時間點的狀態

  • 閃回到指定SCN號:

SQL>flashback table test to scn 602857;

Flashback complete.

SQL>select * from test;

             ID

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

            111

            222

            333

SQL>rollback;

Rollbak complete.

SQL>select * from test;

             ID

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

            111

            222

            333

  • 閃回到指定時間點:

SQL> select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss') from dual;

SQL> flashback  table test to timestamp to_date('2010-12-20

16:55:30','yyyy-mm-dd hh24-mi:ss');

7.4    表級閃回操作步驟

1).建立測試表

SQL> create table test1(a int) tablespace users;

SQL> insert into test1 values(1);

SQL> insert into test1 values(2);

SQL> insert into test1 values(3);

SQL> commit;

SQL> select * from test1;

2).刪除測試表並閃回

SQL> drop table test1;

SQL> show recyclebin;

SQL> flashback table test1 to before drop;

SQL> select * from test1;

3).其他操作

  • 其他常用操作:

SQL> drop table test1 purge; #永久刪除一個表(不放入回收站)

SQL> purge table test1; #清除回收站中指定表,如果回收站中有同名表,則清除先被drop掉的表。

SQL> purge recyclebin; #清空回收站

  • 閃回回收站里同名的表:

  默認情況下回收站的同名表是先閃回后 drop掉的表:

SQL> show recyclebin;

SQL> flashback table test to before drop;

SQL> show recyclebin;

  若要閃回指定的表,可如下操作:

SQL> show recyclebin;

SQL> flashback table "BIN$l9GDQZr46nngQKjACkgNhw==$0" to before drop;

SQL> show recyclebin;

  要清除回收站中指定的表,操作類似:

SQL> purge table "BIN$l9GDQZr46nngQKjACkgNhw==$0";

  • 閃回回收站中與系統中同名的表:

SQL> show recyclebin;

...............

SQL> flashback table test to before drop;

Flashback table test to before drop

*

ERROR at line 1:

ORA-38312:oraginal name is used by an existing object

SQL> flashback table test to before drop rname to test2;

注意:

  System表空間中的表不支持行級閃回,因為  system表空間有自己獨立的 undo segment

且是 manul管理方式。Sys用戶也無法使用行級閃回功能。

  如果表空間空間不足時,對應表空間的回收站中的對象則按 FIFO規則自動被清除。

7.5    庫級閃回操作步驟

1)    按前面提到的庫級閃回配置,配置系統

2)    查詢可閃回的最早時間和SCN號

SQL> alter session set nls_date_format='yyyy-mm-dd hh24:mi:ss';

SQL> select oldest_flashback_scn,oldest_flashback_time from v$flashback_database_log;

3)    庫級閃回到指定時間點或 SCN號狀態

  • 庫級閃回到指定時間點:

SQL> select * from test;

          B

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

          1

SQL> select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss') from dual;

TO_CHAR(SYSDATE,'YYYY-MM-DD HH24:MI;SS')

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

2010-12-21 09:54:41

SQL> drop table test purge;

 

SQL> shutdown immediate

SQL> startup mount;

Database mounted.

SQL>flashback database to timetamp to_date('2010-12-21 09:54:41

',''yyyy-mm-dd hh24:mi:ss'');

 

Flashback complete.

SQL> alter database open open resetlogs;

Database altered.

SQL> select * from test;

          B

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

          1

  • 庫級閃回到指定SCN號狀態:

SQL> select * from test;

          B

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

          1

SQL> select current_scn from v$database;

CURRENT_SCN

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

           642820

SQL> truncate table test;

Table truncated.

SQL> select * from test;

no rows selected

SQL> shutdown immediate

SQL> startup mount;

SQL> flashback database to scn 642820;

Flashback complete.

SQL> alter database open resetlogs;

Database altered.

SQL> slect * from test;

          B

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

          1

8         LogMiner

8.1   概述

  Logminer是用於分析二進制重做日志文件和歸檔日志文件的工具。可從中分析出誤操作執行的具體時間或 SCN號,以便恢復或進行操作審計、分析。

8.2   系統配置

SQL> alter database add supplemental log data;

Database altered.

SQL> select SUPPLEMENTAL_LOG_DATA_MIN from v$database;

SUPPLEME

--------

YES

SQL>execute

dbms_logmnr_d.build(options=>dbms_logmnr_d.store_in_redo_logs);

  若無法執行以上語句,可先運行以下兩個腳本:

SQL> @?/rdbms/admin/dbmslmd.sql 

SQL> @?/rdbms/admin/dbmslm.sql

  建議使用非 system表空間來存放  logminer信息:

SQL> execute dbms_logmnr_d.set_tablespace('users');

8.3   操作步驟

1)    將待分析的日志文件加入日志分析列表

  添加當前日志文件:

SQL>execute dbms_logmnr.add_logfile(logfilename=>'/u01/oradata/ora10/redo02.log',options=>dbms_logmnr.new);

 

SQL>select group#,sequence#,status from v$log;

GROUP#         SEQUENCE#           STATUS

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

             1                     2                  ACTIVE

             2                     4                  CURRENT

             3                     3                  ACTIVE

SQL>execute dbms_logmnr.add_logfile(logfilename=>'/u01/oradata/ora10/redo01.dbf');

  繼續向日志分析列表中添加一個歸檔日志文件:

SQL>execute

dbms_logmnr.add_logfile(logfilename=>'/u01/oradata/ora10/arch/ora10_1_2.a

rc',options=>dbms_logmnr.addfile);

  從日志分析列表中刪除一個日志文件:

SQL>execute

dbms_logmnr.add_logfile(logfilename=>'/u01/oradata/ora10/arch/ora10_1_2.a

rc',options=>dbms_logmnr.removefile);

2)    啟動logminer 開始分析

SQL>execute

dbms_logmnr.start_logmnr(options=>dbms_logmnr.dict_from_online_catalog);

  也可以指定開始和結束時間:

SQL>execute

dbms_logmnr.start_logmnr(options=>dbms_logmnr.dict_from_online_catalog,starttime=>to_timestamp('2010-12-21 11:00:00','yyyy-mm-dd hh24:mi:ss'),endtime=>to_timestamp('2010-12-21 11:00:30','yyyy-mm-ddhh24:mi:ss'));

3)    查看分析結果

SQL> select username,to_char(timestamp,'yyyy-mm-dd hh24:mi:ss'),sql_redo from v$logmnr_contents where table_name='TEST';

4)    結束 logminer分析

SQL> execute dbms_logmnr.end_logmnr;


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM