Oracle 備份恢復詳

jopen 9年前發布 | 17K 次閱讀 Oracle 數據庫服務器


一、備份方式:
1、在非歸檔模式下,只能做冷備份
2、在歸檔模式,可以使用熱備份,也可以做冷備份。(數據文件 控制文件 臨時文件 在線日志文件)

二、冷備份
(每周做一次)
1、首先得關閉數據庫
2、然后將所有文件拷貝到備份的文件夾中。
臨時文件和在線日志文件可以不拷貝。但是在線日志文件拷貝和不拷貝的差別是很大的,使用冷備份的時候只是備份的一個時間點的內容,在還原的時候就只還原到當前狀態。在只有數據文件和控制文件的時候數據一致性是可以保證的。但是數據庫是不能立馬開啟的,需要把在線日志文件修復
3、修復在線日志文件
在mount模式下
>  recover database until cancel/scn;  (基于用戶干涉/SCN號)
在控制文件和數據文件的頭部都有一個SCN號  這兩個一致的時候就不需要進行修復
4、開啟數據庫
>alter database open resetlogs;


三、熱備份
1.必要條件:數據庫必須出于歸檔模式
查看是否出于歸檔模式
> archive log list;

2.熱備份:做熱備一般會對數據庫做熱備份
基于表空間的熱備份
>  alter tablespace tablespace_name begin backup;
然后去物理上進行拷貝,只要拷貝dbf文件就行
</span>

>  alter tablespace tablespace_name end backup;


PS:begin和end之間的時間越短,產生的日志量越少,所以建議使用一個數據庫一個數據庫的備份。如果在begin和end之間數據庫掛了,則會進行報錯,這個時候就需要進行介質恢復


相關指令:查看有哪些表空間
>  desc dba_tablespaces
>  select tablespace_name from dba_tablespaces



3.控制文件備份
不需要進行關閉數據庫,在數據庫結構變化的時候需要備份
比如增加表空間了,增加用戶組等等,只要是數據結構變化了就需要備份。

可以使用二進制文件的形式備份
>  alter database backup controlfile to '/tmp/control.bak';

還可以使用sql腳本的形式來備份
</span>

>  alter database backup controlfle to trace as '/tmp/control.sql' ;


這個不是備份控制文件,而是記錄把這個空間文件重新建立所需要的操作,重新在建立的時候可以修改一些原本固定的參數
這里面的語句分為noresetlogs和resetlogs,在可以使用no的時候盡量使用no
使用no的前提:僅僅是控制文件丟失了,但是在線日志文件仍舊存在


4.參數文件和密碼文件,都是可以備份,可以不備份,直接CP就行


四、恢復
盡量做完全恢復,對數據庫的影響小
</span>

完全恢復:

1.在歸檔模式下

2.需要備份文件+歸檔日志+在線日志


不完全恢復:在線日志文件丟失了或者歸檔日志文件有斷層(不全)或者控制文件完全損壞
      對于不完全恢復,啟動的時候不能直接啟動,而是需要加參數resetlogs
      resetlogs會進行把日志序列重置,重建在線日志文件等操作,加這個選項必須是在不完全恢復的前提下

</span>

不完全恢復的種類:

1、基于用戶干涉   可能歸檔文件和在線日志是全的,而用戶要求到這一點停止

2、基于時間的   還原到誤刪除的狀態
3、SCN   在數據庫中有函數可以把SCN和時間之間進行轉換
dbms_flshback:里面有將SCN和時間進行轉換的函數

實例恢復:實例恢復是oracle會自行進行的,是邏輯錯誤

介質恢復:需要DBA介入進行恢復,是文件損壞,會報如下錯誤
ORA-01113:FILE 7 NEED MEDIA RECOVERY  顯示的是7號文件出錯
如果是在對system表空間進行備份的時候關閉 則是報1號文件錯誤
>  shutdown abort;
>  desc v$backup;
>  selecct * from v$backup;
>  startup mount;
>  alter tablespace test2 end backup;
>  alter database open;


恢復數據庫
system01.dbf被刪除的的時候
>  recover datafile 1;
>  alter database open;



非系統表空間歸檔模式下的完全恢復
一、在數據庫開啟的情況下
1.1:場景模擬
>  alter database archivelog;  
>  create tablespace test datafile '/u01/app/oracle/oradata/dodo/test01.dbf' size 10M;
>  create user test identified by test defult tablespace test;
>  grant connect,resource to test;
>  conn test/test;
>  create table t;
>  commit;
>  conn / as sysdba
>  alter tablespace test begin backup;

物理上拷貝相關文件
>  alter tablespace test end backup;
然后在物理上進行刪除

在這個時候查詢還是能查出來,因為是從buffer cache中查詢的,

  有時候清空buffer cache還是不夠,因而需要清空所有臟塊
>  alter system flush buffer_cache; </span>(清空buffer cache)
>  alter system checkpoint;         (清空所有臟塊)
</span>

>  select * from v$recover_file; (如果是正常的這里面應該是沒有任何的文件的,但是我們刪除了dbf文件,所以這里會顯現7號文件OFFLINE)


1.2:恢復
>  alter database datafile 7 offline ;         (針對某一個文件)
>  restore datafile 7;
然后把備份的文件拷貝過來
>  recover datafile 7;
>  select * from v$recover_file; (這里應該顯示no rows selected)
>  alter database datafile 7 online


實際步驟:
(1)將相應的表空間或者文件offline  
(2)進行restore
(3)拷貝文件
(4)進行recover
(5)最后online


二、在數據庫關閉后發現出錯的情況下
前提:!!在沒有備份的情況下進行完全恢復
條件:不能是系統表空間,所有的歸檔文件都在,控制文件是最新的
1.場景
創建好了不去做備,直接刪除
同時要注意,必須是在revocer_file里面能夠查到才能進行
下面兩條指令是在sysdba中進行的
>  alter system checkpoint;
>  select * from v$recover_file;
>  alter database create datafile '/u01/app/oracle/oradata/dodo/test01.dbf';

>  recover datafile 6;
>  alter database datafile 6 online;
這個時候就可以了


控制文件丟失
1、如果控制文件沒有完全丟失,則可以在其他控制文件復制一下就行
2、控制文件的完全丟失在實際意義上都是完全丟失

當備份成二進制文件時
>  alter database backup controlfile to '/u01/control.bak'; (首先先備份控制文件)
物理上刪除控制文件
>  shutdown abort;   (這個時候理論上正常關機是關閉不了的)
物理上拷貝控制文件
$  cp control.bak /u01/app/oracle/oradata/dodo/control01.ctl
$  cp control.bak /u01/app/oracle/oradata/dodo/control02.ctl
$  cp control.bak /u01/app/oracle/oradata/dodo/control03.ctl
$  sqlplus / as sysdba
>  startup mount
>  recover database using backup controlfile;          
(告訴數據庫現在的的控制文件是舊的)
如果歸檔之前配置過,則可以選擇AUTO就行
/u01/app/oracle/oradata/dodo/redo02.log
Log applied.
Media recovery complete.

可能會報錯:則可能是損壞后時間太短,還沒有來得及切換日志組;也有可能是控制文件舊的,找不到目前的組
這個時候就需要選擇filename  一個一個的去試用redo01.log redo02.log  redo03.log
>  alter database open resetlogs;


當備份成腳本時
>  alter database backup controlfile to trace as '/u01/control.sql';  (備份控制文件)
把腳本里面的內容拷貝過來  
$  rm -rf *.ctl
>  shutdown abort
>  startup nomount
>  @createctl

這個時候創建的控制文件是最新的,并且數據庫會自動切換到mount狀態
但是這個時候臨時文件是不可用的,需要把腳本里面和臨時文件有關的也要拷貝上或者運行一次
>  desc V$database;
>  select open_mode from v$database;
>  recover database;
>  alter database open;

控制文件和在線文件都丟失,resetlogs    
這個時候所有的文件都不一致了,原來是靠在線日志文件把控制文件拉到最新
</span>




冷備份,來保證控制文件和在線日志文件保持一次
在物理上將控制文件和在線日志文件全部刪除
$  rm -rf *ctl
$  rm -rf *log
>  shutdown abort
>  startup nomount
$  rm -rf *dbf

把數據文件刪除,然后再把冷備份的數據文件拷貝進去(因為在冷備份里面是一致性的)
$  cp *dbf /u01/app/oracle/oradata/dodo/
>  @createctl
(運行腳本將控制文件恢復)
>  recover database using backup controlfile until cancel;
然后接下來選擇 auto  然后在運行一次 cancel
>  alter database open resetlogs;

這個只能恢復到歸檔的最新狀態

</span>



場景:在數據庫結構變化后,沒有備份控制文件,這個時候控制文件丟失了,在老的控制文件里面是沒有新的表空間,但事實中確實存在新的表空間,使用舊的控制文件來恢復
</span>


新建一個表空間

在物理上刪除控制文件
>  shutdown abort
然后在物理上把三個都拷貝進去
>  startup mount
>  recover database using backup controlfile
先auto   找不到再找redo
>  desc v$datafile;
>  select name from v$datafile;
會發現一個不正常的文件
>  alter database rename file '/home/oracle......' to '/home/xinming';
>  recover database using backup controlfile;

然后就會顯示complete
>  alter database open resetlogs;


不完全恢復
基于時間,基于用戶干涉,基于SCN
基于時間的:會丟數據,在迫不得已的情況下才進行
比如刪除了某個用戶之類的,alter是有一個表格,可以在里面進行查找時間
$ cd admin/xinming/bdump/
> select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss')from dual;

冷備和熱備份不能跨多個生命周期,如果有resetlogs等操作需要重新備份
>  drop user qq cascade;
>  shutdown immediate;

在物理上將現在的數據文件全部刪除
從冷備中將數據文件拷貝回來
>  recover database until time '2015-03-04 11:46:00';

這個是不完全恢復
>  alter database open resetlogs;</span> </div>

來自:http://blog.csdn.net/doiido/article/details/44058905

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!