熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Oracle >> 正文

數據庫備份與恢復測試(7)

2022-06-13   來源: Oracle 

  ###############################################################################################
#                             []熱備份期間的數據庫崩墤(rman和常規恢復)                        #
###############################################################################################

  SQL> alter tablespace users begin backup;

  表空間已更改

  SQL> host copy D:\oracle\oradata\USERSDBF D:\oracle\oradata\oracle\USERSDBF
已復制         個文件

  SQL> conn scott/tiger
已連接
SQL> create table empcopy as select * from emp;

  表已創建

  SQL> commit;

  提交完成

  SQL> alter system switch logfile;
alter system switch logfile
*
ERROR 位於第 行:
ORA: 權限不足

  SQL> conn sys/oracle as sysdba;
已連接
SQL> alter system switch logfile;

  系統已更改

  SQL> shutdown abort
ORACLE 例程已經關閉
SQL> startup mount
ORACLE 例程已經啟動

  Total System Global Area  bytes
Fixed Size                   bytes
Variable Size             bytes
Database Buffers           bytes
Redo Buffers                 bytes
數據庫裝載完畢
SQL> alter database open;
alter database open
*
ERROR 位於第 行:
ORA: 文件 需要介質恢復
ORA: 數據文件 : D:\ORACLE\ORADATA\USERSDBF

  SQL> alter database datafile D:\ORACLE\ORADATA\USERSDBF end backup;
alter database datafile D:\ORACLE\ORADATA\USERSDBF end backup
                        *
ERROR 位於第 行:
ORA: 無效的文件名

  SQL> alter database datafile D:\ORACLE\ORADATA\USERSDBF end backup;

  數據庫已更改

  SQL> alter database open;

  數據庫已更改

  #################################################################################
#                            [] resetlogs 恢復測試                             #
#################################################################################

  參見控制文件恢復部分

  #################################################################################
#                            [] rman Recovering Datablocks 恢復測試            #
#################################################################################

  ~~~~~~~~~~~
官方文檔:
~~~~~~~~~~~

  Recovering Individual Data Blocks
You can use RMAN to recover one or more corrupted data blocks Typically the corruption is reported in alert logs
trace files or results of SQL queries For example:

  BLOCKRECOVER DATAFILE BLOCK DATAFILE BLOCK ;

  You can also use BLOCKRECOVER to repair all corrupted blocks listed in V$BACKUP_CORRUPTION and V$COPY_CORRUPTION
These views are filled whenever RMAN performs a complete scan of a file for a backup Run this command to repair blocks
listed in the views:

  BLOCKRECOVER CORRUPTION LIST;
~~~~~~~~~~~
場景
~~~~~~~~~~~
 

  SQL> create table empblock tablespace users as select * from emp;

  表已創建

  SQL> insert into empblock select * from empblock;
  
已創建
   
SQL> select ownersegment_nametablespace_nameextent_idfile_idblock_idblocks from dba_extents
   where segment_name=EMPBLOCK order by block_id;

  做一次數據的全庫備份
RMAN> backup database;

  手工地用ultraedit破壞datafile 文件

  SQL> select count(*) from empblock;
select count(*) from empblock
                     *
ERROR 位於第 行:
ORA: ORACLE 數據塊損壞(文件號塊號
ORA: 數據文件 : D:\ORACLE\ORADATA\USERSDBF

  恢復壞塊 

  RMAN> BLOCKRECOVER DATAFILE BLOCK ;

  啟動 blockrecover 於 ::
使用通道 ORA_DISK_

  通道 ORA_DISK_: 正在恢復塊
通道 ORA_DISK_: 正在指定要從備份集恢復的塊
正在恢復數據文件 的塊
通道 ORA_DISK_: 已從備份段 恢復塊
段 handle=D:\ORACLE\ORA\DATABASE\GEFH__ tag=TAGT params=NULL
通道 ORA_DISK_: 塊恢復已完成

  正在開始介質的恢復
完成介質的恢復

  完成 blockrecover 於 ::

  SQL> select count(*) from empblock;

  COUNT(*)

   
   

  #########################################################
#  [測試]
#########################################################
SQL> startup
ORACLE 例程已經啟動

  Total System Global Area  bytes
Fixed Size                   bytes
Variable Size              bytes
Database Buffers           bytes
Redo Buffers                 bytes
ORA: ???????C:\oracle\ora\DATABASE\PWDtestdbORA

  SQL> alter database open;

  數據庫已更改

  SQL> create table arch (status varchar()) tablespace users;

  表已創建

  SQL> alter system switch logfile;

  系統已更改

  SQL> insert into arch select ok from dba_objects;

  已創建

  SQL> commit;

  提交完成

  SQL> insert into arch select * from arch;

  已創建

  SQL> /

  已創建

  SQL> /

  已創建

  SQL> /

  已創建

  SQL> commit;

  提交完成

  SQL> alter system switch logfile;

  系統已更改

  SQL> insert into arch select no from dba_objects;

  已創建

  SQL> commit;

  提交完成

  SQL> select GROUP#SEQUENCE#archived STATUS from v$log;

  GROUP#  SEQUENCE# ARC STATUS

                   NO  CURRENT
                   YES ACTIVE
                   YES ACTIVE

  SQL> shutdown
數據庫已經關閉
已經卸載數據庫
ORACLE 例程已經關閉
SQL> exit
從Oraclei Enterprise Edition Release Production
With the Partitioning OLAP and Oracle Data Mining options
JServer Release Production中斷開

  C:\Documents and Settings\lifengfang>oradim delete sid testdb

  C:\Documents and Settings\lifengfang>oradim new sid testdb intpwd sunsdl   

  RMAN> backup format c:\BLOCKRECOVER_%s%pBAK database;

  啟動 backup 於
分配的通道: ORA_DISK_
通道 ORA_DISK_: sid= devtype=DISK
通道 ORA_DISK_: 正在啟動 full 數據文件備份集
通道 ORA_DISK_: 正在指定備份集中的數據文件
在備份集中包含當前的 SPFILE
備份集中包括當前控制文件
輸入數據文件 fno= name=C:\ORACLE\ORADATA\TESTDB\SYSTEMDBF
輸入數據文件 fno= name=C:\ORACLE\ORADATA\TESTDB\UNDOTBSDBF
輸入數據文件 fno= name=C:\ORACLE\ORADATA\TESTDB\INDXDBF
輸入數據文件 fno= name=C:\ORACLE\ORADATA\TESTDB\USERSDBF
輸入數據文件 fno= name=C:\ORACLE\ORADATA\TESTDB\TOOLSDBF
通道 ORA_DISK_: 正在啟動段
通道 ORA_DISK_: 已完成段
段 handle=C:\BLOCKRECOVER_BAK comment=NONE
通道 ORA_DISK_: 備份集已完成 經過時間:::
完成 backup 於

  SQL> insert into arch select * from arch;

  已創建

  SQL> select count(*)status from arch group by status;

  COUNT(*) ST

     no
    ok

  SQL> select SEGMENT_NAMEHEADER_BLOCK from dba_segments where SEGMENT_NAME = ARCH;
                                                    
SEGMENT_NAME                          HEADER_BLOCK   
              
ARCH                                       

  
SQL> select to_char(**xxxxxx) from dual;

  TO_CHAR

 
 
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
我現在用ultraedit修改arch表的頭塊
在地址上進行破壞
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

  SQL> INSERT INTO ARCH SELECT * FROM ARCH;
INSERT INTO ARCH SELECT * FROM ARCH
                                *
ERROR 位於第 行:
ORA: ORACLE 數據塊損壞(文件號塊號
ORA: 數據文件 : C:\ORACLE\ORADATA\TESTDB\USERSDBF 

  RMAN> BLOCKRECOVER DATAFILE BLOCK ;

  啟動 blockrecover 於
分配的通道: ORA_DISK_
通道 ORA_DISK_: sid= devtype=DISK

  通道 ORA_DISK_: 正在恢復塊
通道 ORA_DISK_: 正在指定要從備份集恢復的塊
正在恢復數據文件 的塊
通道 ORA_DISK_: 已從備份段 恢復塊
段 handle=C:\BLOCKRECOVER_BAK tag=TAGT params=NULL
通道 ORA_DISK_: 塊恢復已完成

  正在開始介質的恢復
完成介質的恢復

  完成 blockrecover 於
 
SQL> select count(*)status from arch group by status;

  COUNT(*) ST

     no
    ok
   
         
#################################################################################
#                  []rman Restoring Datafile Copies to a New Host             #
#################################################################################

  #################################################################################
#                            []表空間的恢復(rman和常規恢復)                   #
#################################################################################
####################################################
#  [] 非正常關機的情況下用rman恢復單個數據文件 
####################################################

  做一次全庫備份
  
     RMAN> backup database;
    
     RMAN> report schema;

  數據庫方案報表
     文件 KB    表空間           RB segs 數據文件名稱
    
             SYSTEM               YES     D:\ORACLE\ORADATA\ORACLE\SYSTEMDBF
             UNDOTBS             YES     D:\ORACLE\ORADATA\ORACLE\UNDOTBSDBF
              CWMLITE              NO      D:\ORACLE\ORADATA\ORACLE\CWMLITEDBF
              DRSYS                NO      D:\ORACLE\ORADATA\ORACLE\DRSYSDBF
             EXAMPLE              NO      D:\ORACLE\ORADATA\ORACLE\EXAMPLEDBF
              INDX                 NO      D:\ORACLE\ORADATA\ORACLE\INDXDBF
              ODM                  NO      D:\ORACLE\ORADATA\ORACLE\ODMDBF
              TOOLS                NO      D:\ORACLE\ORADATA\ORACLE\TOOLSDBF
              USERS                NO      D:\ORACLE\ORADATA\ORACLE\USERSDBF
             XDB                  NO      D:\ORACLE\ORADATA\ORACLE\XDBDBF
            SINO                 NO      D:\ORACLE\ORADATA\ORACLE\SINODBF
            RCVCAT               NO      D:\ORACLE\ORADATA\ORACLE\RCVCATDBF
            PERFSTAT             NO      D:\ORACLE\ORADATA\ORACLE\PERFSTATDBF
  
   顯示一下系統時間
  
     SQL> select sysdate from dual;

  SYSDATE
    
     ::
  
   創建一個table
  
     SQL>create table empcopy (id numbername varchar()salary number) tablespace users;
    
   切換日志
  
     SQL>alter system switch logfile;
    
   重啟機器至mount狀態
  
     SQL>startup mount
    
   模擬刪除USERSDBF文件進行完全恢復
  
     RMAN> run {
     > restore datafile ;
     > recover datafile ;
     > alter database open;
     > }
   

  ####################################################
#  [] 非正常關機情況下非RMAN方式用備份的數據文件進行恢復              
####################################################

  
   恢復前數據庫狀態
  
   SQL> select * from swap_p;

  ID NAME                                               HIRE_DATE               SALARY
  
         zhang namo                                         ::      
  
  
   SQL> insert into swap_p select * from test;
  
   已創建
  
   SQL> commit;
  
   提交完成
  
   SQL> conn sys/oracle as sysdba
   已連接
   SQL> alter system switch logfile;
  
   系統已更改
  
   SQL> shutdown abort
   ORACLE 例程已經關閉
   SQL> startup mount
   ORACLE 例程已經啟動
  
   Total System Global Area  bytes
   Fixed Size                   bytes
   Variable Size             bytes
   Database Buffers           bytes
   Redo Buffers                 bytes
   數據庫裝載完畢
  
   將舊的備份數據文件拷貝到當前的數據文件位置
  
   恢復數據庫
  
   SQL> recover database ;
   完成介質恢復

  SQL> alter database open;
  
   數據庫已更改
  
   SQL> conn scott/tiger
   已連接
   SQL> select * from swap_p;
  
           ID NAME                                               HIRE_DATE               SALARY
  
         zhang namo                                         ::      
         zhang xiao                                         ::      
         zhang namo                                         ::      
         zhang namo                                         ::      
         zhang namo                                         ::      
         zhang namo                                         ::      
         zhang namo                                         ::      
         zhang namo                                         ::      
  
   已選擇

  
####################################################
#  [] 非正常關機情況下恢復單獨表空間            
####################################################

  
   恢復前數據庫狀態
    
   SQL> conn scott/tiger
   已連接
   SQL> select * from swap_p;
  
   未選定行
  
   SQL> insert into swap_p select * from test;
  
   已創建
  
   SQL> commit;
  
   提交完成
  
   SQL> conn sys/oracle as sysdba
   已連接
   SQL> shutdown abort
   ORACLE 例程已經關閉
  
   將舊的備份數據文件拷貝到當前的數據文件位置
  
   恢復數據文件
   
   SQL> startup mount
   ORACLE 例程已經啟動
  
   Total System Global Area  bytes
   Fixed Size                   bytes
   Variable Size             bytes
   Database Buffers           bytes
   Redo Buffers                 bytes
   數據庫裝載完畢
   SQL> alter database datafile offline;
  
   數據庫已更改
  
   SQL> alter database open;
  
   數據庫已更改
  
   SQL> recover tablespace test;
   完成介質恢復
   SQL> alter tablespace test online;
  
   數據庫已更改
  
   SQL> conn scott/tiger
   已連接
   SQL> select * from swap_p;
  
           ID NAME                                               HIRE_DATE               SALARY
  
         zhang xiao                                         ::      
         zhang namo                                         ::      
         zhang namo                                         ::      
         zhang namo                                         ::      
         zhang namo                                         ::      
         zhang namo                                         ::      
         zhang namo                                         ::      
  
   已選擇
####################################################
#  [] 丟失數據文件用rman從備份中還原數據文件並恢復tablespace
####################################################
 
      RMAN> backup database;
    
     RMAN> report schema;
    
     數據庫方案報表
     文件        KB    表空間             RB segs   數據文件名稱
    
             SYSTEM               ***     D:\ORACLE\ORADATA\SYSTEMDBF
             UNDOTBS             ***     D:\ORACLE\ORADATA\UNDOTBSDBF
              CWMLITE              ***     D:\ORACLE\ORADATA\CWMLITEDBF
              DRSYS                ***     D:\ORACLE\ORADATA\DRSYSDBF
             EXAMPLE              ***     D:\ORACLE\ORADATA\EXAMPLEDBF
              INDX                 ***     D:\ORACLE\ORADATA\INDXDBF
              ODM                  ***     D:\ORACLE\ORADATA\ODMDBF
              TOOLS                ***     D:\ORACLE\ORADATA\TOOLSDBF
              USERS                ***     D:\ORACLE\ORADATA\USERSDBF
             XDB                  ***     D:\ORACLE\ORADATA\XDBDBF
            SINO                 ***     D:\ORACLE\ORADATA\SINODBF
            RCVCAT               ***     D:\ORACLE\ORADATA\RCVCATDBF
            PERFSTAT             ***     D:\ORACLE\ORADATA\PERFSTATDBF
             TEST                ***     D:\ORACLE\ORADATA\TESTDBF
             TEST                ***     D:\ORACLE\ORADATA\TESTDBF
             TEST                ***     D:\ORACLE\ORADATA\TESTDBF
             TEST                ***     D:\ORACLE\ORADATA\TESTDBF
 
 
   關閉數據庫刪除D:\ORACLE\ORADATA\TESTDBF文件
  
   啟動數據庫到mount 狀態
  
   啟動rman
      D:\>rman target sys/oracle nocatalog  
     
   恢復tablespace test
      從copy的備份中恢復
     
   RMAN> run {
   > allocate channel c type disk;
   > restore datafile from datafilecopy;
   > recover tablespace  test;
   > alter database open;
   > release channel c; }  

  ####################################################  
# [] 重建controlfile文件時丟失所有在線日志語句少寫了表空間的datafile
####################################################

  ~~~~~~~~~
~~ 場景
~~~~~~~~~
RMAN> report schema;

  數據庫方案報表
文件 KB    表空間           RB segs 數據文件名稱

             SYSTEM               ***     D:\ORACLE\ORADATA\SYSTEMDBF
        UNDOTBS             ***     D:\ORACLE\ORADATA\UNDOTBSDBF
         CWMLITE              ***     D:\ORACLE\ORADATA\CWMLITEDBF
         DRSYS                ***     D:\ORACLE\ORADATA\DRSYSDBF
        EXAMPLE              ***     D:\ORACLE\ORADATA\EXAMPLEDBF
         INDX                 ***     D:\ORACLE\ORADATA\INDXDBF
         ODM                  ***     D:\ORACLE\ORADATA\ODMDBF
         TOOLS                ***     D:\ORACLE\ORADATA\TOOLSDBF
         USERS                ***     D:\ORACLE\ORADATA\USERSDBF
        XDB                  ***     D:\ORACLE\ORADATA\XDBDBF
       SINO                 ***     D:\ORACLE\ORADATA\SINODBF
       RCVCAT               ***     D:\ORACLE\ORADATA\RCVCATDBF
       PERFSTAT             ***     D:\ORACLE\ORADATA\PERFSTATDBF
            TEST                ***     D:\ORACLE\ORA\DATABASE\MISSING
            TEST                ***     D:\ORACLE\ORA\DATABASE\MISSING
            TEST                ***     D:\ORACLE\ORA\DATABASE\MISSING
            TEST                ***     D:\ORACLE\ORA\DATABASE\MISSING

  由於redo文件損壞致使數據庫無法正常啟動DBA用重建control文件的方法使數據庫重啟但是沒有把datafile文件的名子寫在control
文件中這樣啟動數據庫後出現上面的結果在用rman備份數據庫文件時出現錯誤

  RMAN> backup database;

  啟動 backup 於 ::
RMAN: ===========================================================
RMAN: =============== ERROR MESSAGE STACK FOLLOWS ===============
RMAN: ===========================================================
RMAN: failure of backup command at // ::
RMAN: ORACLE error from recovery catalog database: RMAN: target database incarnation not found in recovery catalog

  ~~~~~~~~~
~~ 恢復數據文件
~~~~~~~~~

  重命名數據文件
      SQL> ALTER DATABASE OPEN RESETLOGS;
          
      SQL> alter database rename file D:\ORACLE\ORA\DATABASE\MISSING to d:\oracle\oradata\testdbf;

  數據庫已更改
     
      SQL> alter database rename file D:\ORACLE\ORA\DATABASE\MISSING to d:\oracle\oradata\testdbf;
     
      數據庫已更改
     
      SQL> alter database rename file D:\ORACLE\ORA\DATABASE\MISSING to d:\oracle\oradata\testdbf;
     
      數據庫已更改
     
      SQL> alter database rename file D:\ORACLE\ORA\DATABASE\MISSING to d:\oracle\oradata\testdbf;
     
      數據庫已更改
     

  用rman備份數據庫
  
      RMAN> reset database;

  在恢復目錄中注冊的數據庫的新實體化
      正在啟動全部恢復目錄的 resync
      完成全部 resync
     
      MAN> backup database;
     

  

  ####################################################
#  [] 用rman從備份中恢復system表空間
####################################################

  方法一:
   做一次全庫備份
  
   恢復system表空間
     STARTUP MOUNT
     RMAN> run {
     > restore datafile ;
     > recover datafile ;
     > alter database open;
     > }
    
    
  方法二:
   做一次全庫備份
  
   恢復system表空間
  
     RMAN> run {
     > restore tablespace system;
     > recover tablespace system;
     > alter database open;
     > }
    
####################################################
#  [] 用戶表空間損壞
####################################################
一)用戶表空間
錯誤:
在啟動數據庫時出現ORAORA或操作系統級錯誤例如ORA
在關閉數據庫(使用shutdown normal或shutdown immediate) 時將導致錯誤ORA
ORA以及操作系統級錯誤ORA
解決:
以下有兩種解決方案:
用戶的表空間可以被輕易地重建
即最近導出的對象是可用的或表空間中的對象可以被輕易地重建等
這種情況下最簡單的方法是offline並刪除該數據文件刪除表空間並
重建表空間以及所有的對象
svrmgrl> startup mount
svrmgrl> alter database datafile filename offline drop;
svrmgrl> alter database open;
svrmgrl> drop tablespace tablespace_name including contents;
重建表空間及所有對象
用戶的表空間不能夠被輕易地重建
在大多數情況下重建表空間是不可能及太辛苦的工作方法是倒備份及做介
質恢復如果您的系統運行在NOARCHIVELOG模式下則只有丟失的數據
在online redo log中方可被恢復
步驟如下:
)Restore the lost datafile from a backup
)svrmgrl> startup mount
)svrmgrl> select vgroup#membersequence#first_change#
>from v$log vv$logfile v where vgroup#=vgroup#;
)如果數據庫運行在NOARCHIVELOG模式下則:
svrmgrl> select file#change# from v$recover_file;
如果 CHANGE# 大於最小的FIRST_CHANGE#則數據文件可以被恢復
如果 CHANGE# 小於最小的FIRST_CHANGE#則數據文件不可恢復 恢復最近一
次的全備份或采用方案一
)svrmgrl> recover datafile filename;
)確認恢復成功
)svrmgrl> alter database open resetlogs;
只讀表空間無需做介質恢復只要將備份恢復即可唯一的例外是:
表空間在最後一次備份後被改為readwrite 模式
表空間在最後一次備份後被改為readonly 模式
在這種情況下均需進行介質恢復

  二)臨時表空間
臨時表空間並不包含真正的數據恢復的方法是刪除臨時表空間並重建即可

  三)系統表空間
如果備份不可用則只能采用重建數據庫的方法


From:http://tw.wingwit.com/Article/program/Oracle/201311/16608.html
    推薦文章
    Copyright © 2005-2022 電腦知識網 Computer Knowledge   All rights reserved.