天天看點

Oracle 備份與恢複學習筆記(10)

第十章:Rman 不完全恢複

1、rman 不完全恢複:

   1)基于時間和基于scn: 用于恢複過去某個時間被誤操作的重要table

案例1:

-------恢複過去某個時間點誤操作的table

1)測試環境

01:15:47 SQL> conn scott/tiger                                                                                                          

Connected.

01:16:01 SQL> select * from lx01;                                                                                                       

        ID

----------

         1

         2

         3

01:16:07 SQL> truncate table lx01;                                                                                                      

Table truncated.

01:16:25 SQL> insert into lx01 values (111);                                                                                            

1 row created.

01:16:37 SQL> insert into lx01 values (222);                                                                                            

01:16:40 SQL> insert into lx01 values (333);                                                                                            

01:16:43 SQL> commit;                                                                                                                   

Commit complete.

01:16:44 SQL> select * from lx01;                                                                                                       

       111

       222

       333

01:16:49 SQL>

2)通過logmnr 找出誤操作的時間點

------配置 utl 參數

01:17:55 SQL> show parameter utl                                                                                                        

NAME                                 TYPE        VALUE

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

utl_file_dir                         string      /home/oracle/logmnr

--------建立資料字典分析檔案

01:18:31 SQL> execute dbms_logmnr_d.build('dict.ora','/home/oracle/logmnr',dbms_logmnr_d.store_in_flat_file);                           

PL/SQL procedure successfully completed.

--------添加日志分析

01:19:11 SQL> col member for a50                                                                                                        

01:19:17 SQL>                                                                                                                         

  1* select group#,member from v$logfile

    GROUP# MEMBER

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

         3 /u01/app/oracle/oradata/prod/redo03.log

         2 /u01/app/oracle/oradata/prod/redo02.log

         1 /u01/app/oracle/oradata/prod/redo01.log

01:19:17 SQL> select * from v$log;                                                                                                      

    GROUP#    THREAD#  SEQUENCE#      BYTES    MEMBERS ARC STATUS           FIRST_CHANGE# FIRST_TIM

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

         1          1         17   52428800          1 NO  CURRENT                1424859 18-AUG-11

         2          1         16   52428800          1 YES INACTIVE               1403618 18-AUG-11

         3          1         15   52428800          1 YES INACTIVE               1383274 18-AUG-11

01:19:22 SQL>

01:19:22 SQL> execute dbms_logmnr.add_logfile(logfilename=>'/u01/app/oracle/oradata/prod/redo01.log',options=>dbms_logmnr.new);         

----------執行分析

01:20:17 SQL> execute dbms_logmnr.start_logmnr(dictfilename=>'/home/oracle/logmnr/dict.ora',options=>dbms_logmnr.ddl_dict_tracking);    

-----------檢視分析結果

01:22:17 SQL> select username,scn,timestamp,sql_redo from v$logmnr_contents                                                             

01:22:18   2   where lower(sql_redo) like '%table%' and username='SCOTT';                                                               

USERNAME                              SCN TIMESTAMP           SQL_REDO

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

SCOTT                             1450811 2011-08-19 01:44:41 truncate table lx01;

---------結束logmnr

01:22:59 SQL> execute dbms_logmnr.end_logmnr;                                                                                           

01:23:23 SQL>

---------設定date 格式

01:24:31 SQL> alter system set nls_date_format='yyyy-mm-dd hh24:mi:ss' scope=spfile;                                                    

System altered.

3)恢複

[oracle@work ~]$ rman target  /

Recovery Manager: Release 10.2.0.1.0 - Production on Fri Aug 19 01:49:04 2011

Copyright (c) 1982, 2005, Oracle.  All rights reserved.

connected to target database: PROD (DBID=170319990)

 run {                                                                                                                             

 shutdown immediate;                                                                                                                 

 startup mount;                                                                                                                       

 allocate channel c1 type disk;                                                                                                       

 allocate channel c2 type disk;                                                                                                       

 set until time '2011-08-19 01:44:41';                                                                                                                

 restore database;                                                                                                                    

 recover database;                                                                                                                    

 alter database open resetlogs;                                                                                                       

  }                                                                                                                                  

4)驗證

01:51:54 SQL> select * from scott.lx01;                                                                                                 

01:51:58 SQL>

案例2:基于scn

01:34:32 SQL> select current_scn from v$database;                                                                                       

CURRENT_SCN

-----------

    1450438

--------在實際的生産環境中,scn要通過logmnr找出,這裡隻是實驗

01:34:37 SQL> conn scott/tiger;                                                                                                         

01:34:41 SQL>

01:34:41 SQL> select * from lx01;                                                                                                       

01:34:58 SQL> truncate table lx01;                                                                                                      

01:35:04 SQL> insert into lx01 values(1);                                                                                               

01:35:21 SQL> insert into lx01 values(2);                                                                                               

01:35:24 SQL> insert into lx01 values(4);                                                                                               

01:35:25 SQL> commit;                                                                                                                   

01:35:27 SQL> select * from lx01;                                                                                                       

         4

01:35:31 SQL>

2)通過rman恢複 ,lx01 被truncate 之前的data

run {                                                                                                                             

 set until scn 1450438;                                                                                                               

10>  }                                                                                                                                  

database closed

database dismounted

Oracle instance shut down

connected to target database (not started)

Oracle instance started

database mounted

Total System Global Area     314572800 bytes

Fixed Size                     1219184 bytes

Variable Size                 96470416 bytes

Database Buffers             213909504 bytes

Redo Buffers                   2973696 bytes

allocated channel: c1

channel c1: sid=157 devtype=DISK

allocated channel: c2

channel c2: sid=154 devtype=DISK

executing command: SET until clause

Starting restore at 19-AUG-11

channel c1: starting datafile backupset restore

channel c1: specifying datafile(s) to restore from backup set

restoring datafile 00001 to /u01/app/oracle/oradata/prod/system01.dbf

restoring datafile 00002 to /u01/app/oracle/oradata/prod/users01.dbf

restoring datafile 00003 to /u01/app/oracle/oradata/prod/sysaux01.dbf

restoring datafile 00004 to /u01/app/oracle/oradata/prod/index01.dbf

restoring datafile 00005 to /u01/app/oracle/oradata/prod/example01.dbf

restoring datafile 00006 to /u01/app/oracle/oradata/prod/test01.dbf

restoring datafile 00007 to /u01/app/oracle/oradata/prod/undo_tbs01.dbf

restoring datafile 00008 to /u01/app/oracle/oradata/prod/test02.dbf

restoring datafile 00009 to /u01/app/oracle/oradata/prod/cuug01.dbf

restoring datafile 00010 to /u01/app/oracle/oradata/prod/lx01.dbf

restoring datafile 00011 to /u01/app/oracle/oradata/prod/perfstat01.dbf

channel c1: reading from backup piece /disk1/rman/prod/PROD_54.bak

channel c1: restored backup piece 1

piece handle=/disk1/rman/prod/PROD_54.bak tag=TAG20110819T013156

channel c1: restore complete, elapsed time: 00:01:07

Finished restore at 19-AUG-11

Starting recover at 19-AUG-11

starting media recovery

media recovery complete, elapsed time: 00:00:04

Finished recover at 19-AUG-11

database opened

released channel: c1

released channel: c2

RMAN>

告警日志資訊:

Completed: alter database mount

Fri Aug 19 01:38:47 2011

Full restore complete of datafile 6 /u01/app/oracle/oradata/prod/test01.dbf.  Elapsed time: 0:00:01

  checkpoint is 1450186

Full restore complete of datafile 8 /u01/app/oracle/oradata/prod/test02.dbf.  Elapsed time: 0:00:02

Full restore complete of datafile 9 /u01/app/oracle/oradata/prod/cuug01.dbf.  Elapsed time: 0:00:02

Full restore complete of datafile 10 /u01/app/oracle/oradata/prod/lx01.dbf.  Elapsed time: 0:00:01

Fri Aug 19 01:39:10 2011

Full restore complete of datafile 2 /u01/app/oracle/oradata/prod/users01.dbf.  Elapsed time: 0:00:23

Full restore complete of datafile 4 /u01/app/oracle/oradata/prod/index01.dbf.  Elapsed time: 0:00:27

Full restore complete of datafile 5 /u01/app/oracle/oradata/prod/example01.dbf.  Elapsed time: 0:00:29

Full restore complete of datafile 7 /u01/app/oracle/oradata/prod/undo_tbs01.dbf.  Elapsed time: 0:00:30

Fri Aug 19 01:39:24 2011

Full restore complete of datafile 11 /u01/app/oracle/oradata/prod/perfstat01.dbf.  Elapsed time: 0:00:38

Fri Aug 19 01:39:36 2011

Full restore complete of datafile 3 /u01/app/oracle/oradata/prod/sysaux01.dbf.  Elapsed time: 0:00:51

Fri Aug 19 01:39:49 2011

Full restore complete of datafile 1 /u01/app/oracle/oradata/prod/system01.dbf.  Elapsed time: 0:01:03

Fri Aug 19 01:39:52 2011

alter database recover datafile list clear

Completed: alter database recover datafile list clear

alter database recover datafile list

 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 , 11

Completed: alter database recover datafile list

alter database recover if needed

 start until change 1450438

Media Recovery Start

Recovery of Online Redo Log: Thread 1 Group 3 Seq 18 Reading mem 0

  Mem# 0 errs 0: /u01/app/oracle/oradata/prod/redo03.log

Fri Aug 19 01:39:53 2011

Incomplete Recovery applied until change 1450439

Media Recovery Complete (prod)

Completed: alter database recover if needed

Fri Aug 19 01:39:56 2011

alter database open resetlogs

3)驗證:

01:42:00 SQL> select * from scott.lx01;                                                                                                 

案例3:

-----------在做完全恢複時,歸檔日志或current redo log 不完整,不能實作完全恢複

----------基于redo log的sequence  (相當于手工恢複:基于cancel)

01:55:05 SQL> select * from scott.lx01;                                                                                                 

01:55:22 SQL> insert into scott.lx01 values (4);                                                                                        

01:55:31 SQL> commit;                                                                                                                   

01:55:32 SQL> alter system archive log current;                                                                                         

01:55:40 SQL> insert into scott.lx01 values (5);                                                                                        

01:55:41 SQL> commit;                                                                                                                   

01:55:44 SQL> insert into scott.lx01 values (6);                                                                                        

01:55:47 SQL> commit;                                                                                                                   

01:55:51 SQL> alter system archive log current;                                                                                         

01:55:54 SQL> insert into scott.lx01 values (7);                                                                                        

01:56:00 SQL> commit;                                                                                                                   

01:56:02 SQL> alter system archive log current;                                                                                         

01:56:07 SQL> insert into scott.lx01 values (8);                                                                                        

01:56:10 SQL> commit;                                                                                                                   

01:56:11 SQL> alter system archive log current;                                                                                         

01:56:16 SQL> insert into scott.lx01 values (9);                                                                                        

01:56:18 SQL> commit;                                                                                                                   

01:56:20 SQL> select name from v$archived_log;

NAME

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

/disk1/arch/prod/arch_2_1_759549082.log

/disk1/arch/prod/arch_3_1_759549082.log

/disk1/arch/prod/arch_4_1_759549082.log

/disk1/arch/prod/arch_5_1_759549082.log

/disk1/arch/prod/arch_6_1_759549082.log

01:57:19 SQL> shutdown abort;                                                                                                           

ORACLE instance shut down.

01:57:28 SQL> !                                                                                                                         

[oracle@work ~]$ exit

exit

01:57:32 SQL> !                                                                                                                         

[oracle@work ~]$ rm /u01/app/oracle/oradata/prod/lx01.dbf

[oracle@work ~]$ mv /disk1/arch/prod/arch_5_1_759549082.log /disk1/arch/prod/arch_5_1_759549082.log.bak

2)啟動database

01:58:23 SQL> startup                                                                                                                   

ORACLE instance started.

Total System Global Area  314572800 bytes

Fixed Size                  1219184 bytes

Variable Size              79693200 bytes

Database Buffers          230686720 bytes

Redo Buffers                2973696 bytes

Database mounted.

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

ORA-01110: data file 10: '/u01/app/oracle/oradata/prod/lx01.dbf'

01:58:39 SQL> select file#,error from v$recover_file;                                                                                   

     FILE# ERROR

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

        10 FILE NOT FOUND

3)對datafile 做完全恢複

RMAN> run {                                                                                                                             

2> restore datafile 10;                                                                                                                 

3> recover datafile 10;                                                                                                                 

4> alter database open;                                                                                                                 

5> }                                                                                                                                    

using target database control file instead of recovery catalog

allocated channel: ORA_DISK_1

channel ORA_DISK_1: sid=154 devtype=DISK

channel ORA_DISK_1: starting datafile backupset restore

channel ORA_DISK_1: specifying datafile(s) to restore from backup set

channel ORA_DISK_1: reading from backup piece /disk1/rman/prod/PROD_54.bak

channel ORA_DISK_1: restored backup piece 1

channel ORA_DISK_1: restore complete, elapsed time: 00:00:08

using channel ORA_DISK_1

archive log thread 1 sequence 18 is already on disk as file /disk1/arch/prod/arch_18_1_759396736.log

archive log thread 1 sequence 1 is already on disk as file /disk1/arch/prod/arch_1_1_759548396.log

archive log thread 1 sequence 2 is already on disk as file /disk1/arch/prod/arch_2_1_759548396.log

archive log thread 1 sequence 3 is already on disk as file /disk1/arch/prod/arch_3_1_759548396.log

archive log thread 1 sequence 1 is already on disk as file /disk1/arch/prod/arch_1_1_759549082.log

archive log thread 1 sequence 2 is already on disk as file /disk1/arch/prod/arch_2_1_759549082.log

archive log thread 1 sequence 3 is already on disk as file /disk1/arch/prod/arch_3_1_759549082.log

archive log thread 1 sequence 4 is already on disk as file /disk1/arch/prod/arch_4_1_759549082.log

archive log thread 1 sequence 6 is already on disk as file /disk1/arch/prod/arch_6_1_759549082.log

RMAN-00571: ===========================================================

RMAN-00569: =============== ERROR MESSAGE STACK FOLLOWS ===============

RMAN-03002: failure of recover command at 08/19/2011 01:59:56

RMAN-06053: unable to perform media recovery because of missing log

RMAN-06025: no backup of log thread 1 seq 5 lowscn 1451172 found to restore

---------恢複失敗,因為 ‘log thread 1 seq 5’ 丢失

4)執行不完全恢複

2> startup force mount;                                                                                                                 

3> set until sequence 5;                                                                                                                

4> restore database;                                                                                                                    

5> recover database;                                                                                                                    

6> alter database open resetlogs;                                                                                                       

7> }                                                                                                                                    

5)驗證

02:04:04 SQL>

02:04:04 SQL> select * from scott.lx01;                                                                                                 

         5

         6

6 rows selected.

案例4:

-------------誤删除表空間(已備份),通過備份的控制檔案進行恢複

---------基于 backup controlfile

02:21:27 SQL> select * from scott.lx01;                                                                                                 

-------備份目前控制檔案

RMAN> backup current controlfile format '/disk1/rman/prod/control.bak';  

02:21:50 SQL> insert into scott.lx01 values (7);                                                                                        

02:23:24 SQL> insert into scott.lx01 values (8);                                                                                        

02:23:26 SQL> insert into scott.lx01 values (9);                                                                                        

02:23:27 SQL> commit;                                                                                                                   

02:23:29 SQL> select * from scott.lx01;                                                                                                 

         7

         8

         9

9 rows selected.

----------表空間被誤删除

02:23:35 SQL> drop tablespace lx including contents and datafiles;                                                                      

Tablespace dropped.

02:24:05 SQL> select file_id,file_name,tablespace_name from dba_data_files;                                                             

   FILE_ID FILE_NAME                                          TABLESPACE_NAME

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

         8 /u01/app/oracle/oradata/prod/test02.dbf            TESTS

         3 /u01/app/oracle/oradata/prod/sysaux01.dbf          SYSAUX

         2 /u01/app/oracle/oradata/prod/users01.dbf           USERS

         1 /u01/app/oracle/oradata/prod/system01.dbf          SYSTEM

         5 /u01/app/oracle/oradata/prod/example01.dbf         EXAMPLE

         6 /u01/app/oracle/oradata/prod/test01.dbf            TESTS

         7 /u01/app/oracle/oradata/prod/undo_tbs01.dbf        UNDO_TBS

         4 /u01/app/oracle/oradata/prod/index01.dbf           INDEXES

         9 /u01/app/oracle/oradata/prod/cuug01.dbf            CUUG

        11 /u01/app/oracle/oradata/prod/perfstat01.dbf        PERFSTAT

10 rows selected.

檢視告警日志,找到drop tablespace的時間點:

Fri Aug 19 02:24:01 2011

drop tablespace lx including contents and datafiles

2)恢複

02:25:32 SQL> select dbid from v$database;                                                                                              

      DBID

 170319990

 ---------恢複備份控制檔案

 RMAN> shutdown immediate                                                                                                                

RMAN> startup nomount                                                                                                                   

Variable Size                 83887504 bytes

Database Buffers             226492416 bytes

RMAN> set dbid=170319990;                                                                                                               

executing command: SET DBID

RMAN> restore controlfile from  '/disk1/rman/prod/control.bak';                                                                         

channel ORA_DISK_1: sid=155 devtype=DISK

channel ORA_DISK_1: restoring control file

channel ORA_DISK_1: restore complete, elapsed time: 00:00:02

output filename=/u01/app/oracle/oradata/prod/control01.ctl

output filename=/u01/app/oracle/oradata/prod/control02.ctl

output filename=/u01/app/oracle/oradata/prod/control03.ctl

-----------基于時間點的恢複

run {                                                                                                                                                                                                                                                     

 startup force mount;                                                                                                                       

 set until time '2011-08-19 02:24:01';                   //删除tablespace的時間點                                                                                                            

9>  }     

3)驗證

02:34:03 SQL> col file_name for a50                                                                                                     

02:34:10 SQL> select file_id,file_name,tablespace_name from dba_data_files;                                                             

        10 /u01/app/oracle/oradata/prod/lx01.dbf              LX

11 rows selected.

02:34:22 SQL> select * from scott.lx01;