Oracle在歸檔模式下恢復

  ===============html

  數據庫的徹底恢復sql

  ===============數據庫

 

在歸檔模式下數據庫徹底恢復時,數據庫所通過的狀態以下:vim

  1.利用備份修復(Restores)損壞或丟失的數據文件,即將備份的文件複製到數據庫中原來的位置oracle

  2. 將從備份到系統崩潰這段時間所提交的數據由歸檔日誌文件和重作日誌文件中還原成數據文件所須要的數據塊,這也叫前滾(Roll Forward)app

  3. 此時數據塊中包含了全部提交的數據,也可能包含沒提交的數據post

  4. 系統利用還原數據塊回滾未提交的數據,這也叫回滾或者事務恢復(Recovery)url

 總結成公式就是: Restore將數據文件帶回到過去(備份時間點)+Recover恢復從備份到數據文件崩潰這段時間所提交的數據  =>數據的徹底恢復spa

 

 數據恢復時的經常使用視圖操作系統

        v$reover_file     --查詢須要恢復的文件,該視圖信息來自控制文件,如控制文件來自備份或重建過則信息會不許

        v$archived_log    --查詢全部歸檔日誌列表

        v$recovery_log    --查詢全部須要用於恢復的日誌

 

配置恢復自動使用歸檔日誌

        在介質恢復前經過設置set autorecovery on來自動應用歸檔日誌實現恢復

        也能夠在輸入歸檔日誌路徑、文件名時輸入auto

        使用recover automatic命令

   

  恢復文件到新路徑

        使用操做系統命令恢復文件到新位置

        使用alter database rename file '<dir>' to '<dir>'

 

 1、Oracle徹底恢復的方法的幾種場景:

A. 數據庫處於打開狀態下,非系統數據文件丟失的恢復

適用情形:

  適用於所須要的數據文件不屬於系統表空間或還原/回滾段表空間

主要步驟:

  1. 將數據文件置於脫機狀態(alter database datafile n offline;)

  2. 還原數據文件(restore)

  3. 恢復數據文件(recover datafile n)

  4. 使數據文件online (alter database datafile n online;)

  4. 確認數據文件是否處於聯機狀態了

實例演示:

SQL> conn dog/dog
已鏈接。

SQL> !rm /u01/app/oracle/oradata/orcl/test.dbf   --刪除數據文件

SQL> select * from v$recover_file;         --數據庫還不知道數據文件須要恢復
SQL> alter system switch logfile; --對日誌進心歸檔
SQL> alter system checkpoint; --執行檢查點進程,將數據緩衝區內容寫入到文件,因test.dbf已丟失,則告警日誌將產生該記錄 SQL> select * from v$recover_file; --發現文件丟失,須要恢復 5 OFFLINE OFFLINE FILE NOT FOUND 0

SQL> alter database datafile 5 offline; SQL> ho cp /u03/backup/hotbak/test.dbf /u01/app/oracle/oradata/orcl/ SQL> recover datafile 5; --恢復數據文件5 完成介質恢復。 SQL> select * from v$recover_file;
SQL
> alter database 5 online; SQL> alter database datafile 5 online; --使數據文件聯機 SQL> select file#,status from v$datafile; --查看狀態 1 SYSTEM 2 ONLINE 3 ONLINE 4 ONLINE 5 ONLINE

 

B. 數據庫處於關閉狀態下的恢復

適用情形:

 包括系統表空間(系統數據文件)、Undo 表空間、整個數據庫

主要步驟:

  • 關閉實例(shutdown immediate或者shutdown abort;)
  • 還原數據文件
  • 使用歸檔日誌更新到最新
  • 打開數據庫

演示:

--刪除數據庫的數據文件

SQL> !rm /u01/app/oracle/oradata/orcl/*dbf 

SQL> !ls /u01/app/oracle/oradata/orcl/
control01.ctl  redo01.log  redo02.log  redo03.log

--關閉數據庫

SQL> conn / as sysdba
已鏈接。
SQL>  shutdown immediate; 
ORA-00604: 遞歸 SQL 級別 1 出現錯誤
ORA-01116: 打開數據庫文件 1 時出錯
ORA-01110: 數據文件 1: '/u01/app/oracle/oradata/orcl/system01.dbf'
ORA-27041: 沒法打開文件
Linux-x86_64 Error: 2: No such file or directory
Additional information: 3
SQL> shutdown abort;
ORACLE 例程已經關閉。

--啓動數據庫

SQL> startup
ORACLE 例程已經啓動。
Total System Global Area  805875712 bytes
Fixed Size            2217672 bytes
Variable Size          528484664 bytes
Database Buffers      268435456 bytes
Redo Buffers            6737920 bytes
數據庫裝載完畢。
ORA-01157: 沒法標識/鎖定數據文件 1 - 請參閱 DBWR 跟蹤文件 ORA-01110:
數據文件 1: '/u01/app/oracle/oradata/orcl/system01.dbf'

--還原數據文件

SQL> select * from v$recover_file;
     1 ONLINE  ONLINE  FILE NOT FOUND                            
     2 ONLINE  ONLINE  FILE NOT FOUND                            
     3 ONLINE  ONLINE  FILE NOT FOUND                            
     4 ONLINE  ONLINE  FILE NOT FOUND                            
     5 ONLINE  ONLINE  FILE NOT FOUND                            
SQL> ho cp /u03/backup/hotbak/*.dbf $ORACLE_BASE/oradata/orcl/

--恢復數據文件,這裏是自動尋取所須要的歸檔文件

SQL> recover datafile 1,2;
完成介質恢復。
SQL> select * from v$recover_file;
     3 ONLINE  ONLINE                                    2-16 19:11:28
     4 ONLINE  ONLINE                                    2-16 19:11:35
     5 ONLINE  ONLINE                                    2-16 19:11:20
SQL> recover database;
完成介質恢復。
SQL> select * from v$recover_file;

--打開數據庫

SQL> alter database open;

 

C.數據初始狀態處於關閉狀態下因爲硬件故障,且須要在打開狀態下的恢復(非系統數據文件)

        啓動到mount狀態

        將受損的數據文件offline

        打開數據庫

        還原受損的數據文件(restore)

        恢復受損的數據文件(recover)

        將受損的數據文件online

       

        此場景相似於A場景僅僅是須要先啓動到mount狀態,而後再將受損的數據文件脫機,並打開數據庫,使之能提供服務.所以該演示省略.

 

D.數據文件無備份狀況下的恢復

適用場景:

  所須要恢復的數據文件屬於非系統表空間

  控制文件未被從新建立或恢復到之前的版本(丟失數據文件的描述信息應在數據字典和控制文件中)

       該數據文件從文件開始到丟失期間的全部日誌必須存在

若是那個公司使用了這種方法,說明該公司的數據庫管理維護很混亂。

 

步驟:-->先將丟失數據文件脫機-->重建數據文件-->應用歸檔日誌-->聯機恢復的數據文件

 

Oracle提供以下兩個方法重建這個數據文件的結構命令:

    alter database create datafile 'filename';

            alter database create datafile 'filename' as 'new file name'; --能夠放置到不一樣目錄,通常用於原文件所在的目錄已經損壞了

 

實例演示:

SQL> create table tb_bk2(id int,name varchar2(10)) tablespace bk2;
SQL> insert into tb_bk2 values(1,'Dand');
SQL> commit;
SQL> alter system checkpoint;
SQL> alter system switch logfile;
SQL> ho rm $ORACLE_BASE/oradata/orcl/bk02.dbf    --模擬數據文件被損壞

SQL> insert into tb_bk2 values(2,'Luck');
SQL> commit;

SQL> alter database datafile 6 offline;   --使數據文件離線
SQL> select * from v$recover_file;
     6 OFFLINE OFFLINE FILE NOT FOUND                                0
SQL> alter database create datafile 6;    --重建數據文件

SQL> recover datafile 6;
完成介質恢復。
SQL> alter database datafile 6 online;
SQL> select * from tb_bk2;
     1 Dand
     2 Luck

 

2、數據庫的不徹底恢復

不徹底恢復的幾種經常使用方法:

        recover database until cancel;                       --SQLPlus使用

        recover database until time '2009-10-09:14:20:45'    --SQLPlus與RMAN都支持

        recover database unitl time '2009-10-09:14:20:45' using backup controlfile

        recover database until change 329102      --SQLPlus使用

        recover database until scn 329102         --RMAN使用

        recover database until sequence  10       --RMAN使用

其實,這種不徹底恢復不少均可用閃回技術進行恢復。

 

演示基於until time的恢復

先作一次冷備  腳本在:Oracle冷備份及其恢復

 
SQL> @coolbak.sql

 

在一個表裏插入數據,並記錄下時間

SQL> conn dog/dog
已鏈接。


SQL> create table users(id int,name varchar(20));

表已建立。


SQL> insert into users values(1,'Scott');

已建立 1 行。

SQL> commit;

提交完成。

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

TO_CHAR(SYSDATE,'YY
-------------------
2016-12-17 02:35:24

SQL> insert into users values(2,'Keven');

已建立 1 行。

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

TO_CHAR(SYSDATE,'YY
-------------------
2016-12-17 02:36:17

SQL> commit;

提交完成。

關閉數據庫,刪除掉數據文件並從冷備中恢復過來

SQL> conn / as sysdba
已鏈接。
SQL> shutdown abort;
ORACLE 例程已經關閉。
SQL> ho rm $ORACLE_BASE/oradata/orcl/*.dbf

SQL>  ho cp /u03/backup/coolbak/*.dbf $ORACLE_BASE/oradata/orcl/

查看控制文件中記錄的檢查點和備份的數據文件頭記錄的檢查點,並恢復到指定時間點

SQL> startup mount;
ORACLE 例程已經啓動。

Total System Global Area  805875712 bytes
Fixed Size            2217672 bytes
Variable Size          549456184 bytes
Database Buffers      247463936 bytes
Redo Buffers            6737920 bytes
數據庫裝載完畢。
SQL> select file#,checkpoint_change# from v$datafile;

     FILE# CHECKPOINT_CHANGE#
---------- ------------------
     1          1094320
     2          1094320
     3          1094320
     4          1094320
     5          1094320
     6          1094320

已選擇6行。

SQL> select file#,checkpoint_change# from v$datafile_header;

     FILE# CHECKPOINT_CHANGE#
---------- ------------------
     1          1073554
     2          1073554
     3          1073554
     4          1073554
     5          1073554
     6          1073554

已選擇6行。

SQL> recover database until time '2016-12-17 02:35:24';
完成介質恢復。

--使用resetlogs方式打開數據庫,並查看錶中的數據是否恢復到了指定的時間點

SQL> alter database open resetlogs;

數據庫已更改。
SQL> conn dog/dog
已鏈接。
SQL> select * from users;

    ID NAME
---------- --------------------
     1 Scott

能夠看出確實恢復到了指定的時間點

--再次查看文件頭,是否也已經一致了。

SQL> select file#,checkpoint_change# from v$datafile;

     FILE# CHECKPOINT_CHANGE#
---------- ------------------
     1          1094761
     2          1094761
     3          1094761
     4          1094761
     5          1094761
     6          1094761

已選擇6行。

SQL> select file#,checkpoint_change# from v$datafile_header;

     FILE# CHECKPOINT_CHANGE#
---------- ------------------
     1          1094761
     2          1094761
     3          1094761
     4          1094761
     5          1094761
     6          1094761

已選擇6行。

 

基於Until Cancel的不徹底恢復

作好冷備

SQL> start /u03/backup/coolbak.sql

 

QL> conn dog/dog
Connected.
SQL> select * from person;

    ID NAME
---------- --------------------
     1 Keven

SQL> insert into person values(2,'Scott');

1 row created.

SQL> commit;

Commit complete.

SQL> alter system switch logfile;       --將日誌寫進歸檔

System altered.

SQL> host strings /u03/ARCHLOG/1_2_930793088.dbf|grep Scott    --歸檔中已經存在Scott記錄
Scott

SQL> host strings $ORACLE_BASE/oradata/orcl/test.dbf|grep Scott   --未執行檢查點時,數據文件中不存在Scott記錄

SQL> alter system checkpoint;                      --執行檢查點進程
System altered.

SQL> host strings $ORACLE_BASE/oradata/orcl/test.dbf|grep Scott  --執行後,數據文件中存在Scott記錄
Scott  

SQL> insert into person values(3,'Jack');                --將Jack這條數據寫進數據文件中,可是沒有寫到歸檔日誌文件中    

1 row created.

SQL> commit;

Commit complete.

SQL> alter system checkpoint;

System altered.

SQL> host strings $ORACLE_BASE/oradata/orcl/test.dbf|grep Jack
Jack,

SQL> alter database backup controlfile to trace as '/tmp/control.sql';    --備份控制文件

Database altered.

SQL> ho rm -f $ORACLE_BASE/oradata/orcl/*                  -- 數據文件,控制文件,日誌文件將所有丟失

SQL> conn / as sysdba
Connected.
SQL> shutdown abort                               --強制關機
ORACLE instance shut down.

SQL> host cp /u03/backup/coolbak/*.dbf /$ORACLE_BASE/oradata/orcl/    --僅對數據文件進行還原

--修改前面備份的控制文件以下,手動來建立控制文件

vim /tmp/control.sql

STARTUP NOMOUNT
CREATE CONTROLFILE REUSE DATABASE "ORCL" RESETLOGS  ARCHIVELOG
    MAXLOGFILES 16
    MAXLOGMEMBERS 3
    MAXDATAFILES 100
    MAXINSTANCES 8
    MAXLOGHISTORY 292
LOGFILE
  GROUP 1 '/u01/app/oracle/oradata/orcl/redo01.log'  SIZE 50M BLOCKSIZE 512,
  GROUP 2 '/u01/app/oracle/oradata/orcl/redo02.log'  SIZE 50M BLOCKSIZE 512,
  GROUP 3 '/u01/app/oracle/oradata/orcl/redo03.log'  SIZE 50M BLOCKSIZE 512
-- STANDBY LOGFILE
DATAFILE
  '/u01/app/oracle/oradata/orcl/system01.dbf',
  '/u01/app/oracle/oradata/orcl/sysaux01.dbf',
  '/u01/app/oracle/oradata/orcl/undotbs01.dbf',
  '/u01/app/oracle/oradata/orcl/users01.dbf',
  '/u01/app/oracle/oradata/orcl/test.dbf',
  '/u01/app/oracle/oradata/orcl/bk02.dbf'
CHARACTER SET AL32UTF8
;

--執行重建控制文件的腳本

SQL> shutdown abort
ORACLE instance shut down.
SQL> start /tmp/control.sql
ORACLE instance started.

Total System Global Area  805875712 bytes
Fixed Size            2217672 bytes
Variable Size          595593528 bytes
Database Buffers      201326592 bytes
Redo Buffers            6737920 bytes

Control file created.

 --恢復文件

SQL> recover database using backup controlfile until cancel;
ORA-00279: change 1075471 generated at 12/20/2016 19:59:42 needed for thread 1
ORA-00289: suggestion : /u03/ARCHLOG/1_1_931117309.dbf
ORA-00280: change 1075471 for thread 1 is in sequence #1


Specify log: {<RET>=suggested | filename | AUTO | CANCEL}    --1_1_931117309.dbf不存在,尚未生成歸檔,而是在聯機日誌文件中,聯機日誌丟失,輸入cancel 
cancel
Media recovery cancelled.
SQL
> alter database open resetlogs;

Database altered.
SQL
> alter tablespace temp add tempfile '/u01/app/oracle/oradata/orcl/temp01.dbf' 2 size 31457280 reuse autoextend on; Tablespace altered.
相關文章
相關標籤/搜索