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文件就行
> 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腳本的形式來備份
> alter database backup controlfle to trace as '/tmp/control.sql' ;
這個不是備份控制文件,而是記錄把這個空間文件重新建立所需要的操作,重新在建立的時候可以修改一些原本固定的參數
這裡面的語句分為noresetlogs和resetlogs,在可以使用no的時候盡量使用no
使用no的前提:僅僅是控制文件丟失了,但是在線日志文件仍舊存在
4.參數文件和密碼文件,都是可以備份,可以不備份,直接CP就行
四、恢復
盡量做完全恢復,對數據庫的影響小
完全恢復:
1.在歸檔模式下
2.需要備份文件+歸檔日志+在線日志
不完全恢復:在線日志文件丟失了或者歸檔日志文件有斷層(不全)或者控制文件完全損壞
對於不完全恢復,啟動的時候不能直接啟動,而是需要加參數resetlogs
resetlogs會進行把日志序列重置,重建在線日志文件等操作,加這個選項必須是在不完全恢復的前提下
不完全恢復的種類:
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;
(清空buffer cache)
> alter system checkpoint;
(清空所有髒塊)
> 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
這個時候所有的文件都不一致了,原來是靠在線日志文件把控制文件拉到最新
冷備份,來保證控制文件和在線日志文件保持一次
在物理上將控制文件和在線日志文件全部刪除
$ 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;
這個只能恢復到歸檔的最新狀態
場景:在數據庫結構變化後,沒有備份控制文件,這個時候控制文件丟失了,在老的控制文件裡面是沒有新的表空間,但事實中確實存在新的表空間,使用舊的控制文件來恢復
新建一個表空間
在物理上刪除控制文件
> 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;