Oracle 版本:9i、10g
1、 進(jìn)行熱備份的要求?
熱備份是一種數(shù)據(jù)庫的處于打開時(shí)的物理備份,因?yàn)閿?shù)據(jù)庫在不斷發(fā)生改變,因此備份的文件必然是不一致的,這就要求數(shù)據(jù)庫必須處于歸檔日志模式。
2、 熱備份的一般流程?
? 查看數(shù)據(jù)庫是否處于歸檔日志模式,若不是將數(shù)據(jù)庫置為歸檔日志模式。
Rem check the archived mode
Archive log list;
Rem if not archivelog mode issue the following statements
Shutdown immediate;
Startup mount;
Alter database archivelog;
Alter database open;
? 查看當(dāng)前的歸檔日志情況確認(rèn)已歸檔
Archive log list;
? 將表空間置為熱備份模式(以users 表空間為例)
Alter tablespace users begin backup;
? 物理拷貝數(shù)據(jù)文件
Rem for windows
Sql> host copy c:\oracle\ora92\user01.dbf d:\oracle\hotbackup;
Rem for linux/unix
Sql>host cp /oracle/ora92/user01.dbf /oracle/oracle92/user01.dbf
? 結(jié)束表空間的熱備份模式
Alter tablespace users end backup;
? 相同方法備份其他表空間(read only 和 offline 表空間不能置為熱備份模式)
? 備份二進(jìn)制的控制文件
Alter system backup control file to ‘d:\oracle\hotback\controlfile.ctl’ reuse;
Rem reuse 表示當(dāng)文件存在時(shí)覆蓋。
3、 開始熱備份時(shí)發(fā)生什么?
? 執(zhí)行一個(gè)checkpoint 將所有dirty data 寫入文件(保證熱備份開始前文件是一致的)
? 鎖定文件頭的checkpoint scn,但是數(shù)據(jù)庫的改變可以正常進(jìn)行。
? 在alert文件中增加一條記錄
4、 熱備份時(shí)相關(guān)SCN 如何處理?
在 開始進(jìn)行熱備份時(shí),數(shù)據(jù)文件頭的checkpoint scn 和控制文件中該文件的scn lock住,但是數(shù)據(jù)文件的dml操作可以正常進(jìn)行,也就意味著block 的scn 是正常增加的,數(shù)據(jù)文件并沒有鎖定。為什么要Lock 文件的checkpoint scn(實(shí)際上對應(yīng)了恢復(fù)時(shí)的rba) 主要是為了標(biāo)示進(jìn)行恢復(fù)操作時(shí)需要的redo log, 這樣就可以保證數(shù)據(jù)文件內(nèi)所有的塊都能得到恢復(fù),因?yàn)樵谶M(jìn)行數(shù)據(jù)文件拷貝時(shí)無法保證數(shù)據(jù)文件頭是最先拷貝完成的。如果先拷貝的是數(shù)據(jù)文件的其他部分然后才 去拷貝的數(shù)據(jù)文件頭,這時(shí)候很有可能數(shù)據(jù)文件頭的checkpoint scn已經(jīng)改變了而恢復(fù)時(shí)應(yīng)用redo log的范圍是由數(shù)據(jù)文件頭的rba決定的。
當(dāng)熱備份結(jié)束時(shí),在備份結(jié)束的時(shí)候,oracle會(huì)把數(shù)據(jù)文件頭和control文件中關(guān)于這個(gè)數(shù)據(jù)文件的SCN號更新為數(shù)據(jù)庫的SCN號。
5、 為什么熱備份時(shí)產(chǎn)生的redo大量增加?
首 先說下造成大量增加的直接原因吧,因?yàn)閿?shù)據(jù)文件在進(jìn)行熱備份時(shí),該數(shù)據(jù)文件中的處于data buffer中數(shù)據(jù)塊在首次發(fā)生改變時(shí)oracle會(huì)把整塊的block image 寫入redo log。注意該處首次改變是對處于buffer中的數(shù)據(jù)塊而言的,而不是文件中的block,例如對于datafile1 的第20個(gè)塊:
File ---data buffer 從文件中讀入db buffer
Data buffer-----change 產(chǎn)生block image to redo log
Data buffer ------change 不產(chǎn)生blcok image 而是正常的change vector
Data buffer ----file 從db buffer 寫入文件
File ----data buffer 又從文件中讀入db buffer
Data buffer-----change 再次產(chǎn)生block image to redo log
Data buffer ------change 不產(chǎn)生blcok image 而是正常的change vector
之 所以要存儲block image主要是為了處理由于oracle 的block size 和操作系統(tǒng)的block size 不一致而可能造成的split block(指數(shù)據(jù)塊不一致)。熱備份中我們用的是操作系統(tǒng)命令copy or cp 來拷貝數(shù)據(jù)文件,這些命令操作的塊大小都是由操作系統(tǒng)決定的而操作系統(tǒng)塊和數(shù)據(jù)庫塊大小一般不相同。如果當(dāng)數(shù)據(jù)庫塊在改變的同時(shí)在進(jìn)行拷貝,就很有可能造 成拷貝的數(shù)據(jù)塊不一致(其中一部份改變前拷貝的一部分是改變后拷貝的)。Oracle 在恢復(fù)時(shí)將split block 當(dāng)成是currption block,這時(shí)就需要redo log中的block image覆蓋現(xiàn)有塊來進(jìn)行恢復(fù)
6、 Rman備份為什么不用鎖文件頭scn,不增加redo?
鎖文件頭scn只是為了可以正確標(biāo)示恢復(fù)時(shí)的rba,熱備份方式中這個(gè)rba需要從備份的數(shù)據(jù)文件本身獲取,而rman方式將其寫入了controlfile 或catalog,所以不用鎖文件頭。
Rman 在備份時(shí)需要使用兩個(gè)緩沖區(qū)一個(gè)輸入緩沖區(qū),一個(gè)輸出緩沖區(qū)。數(shù)據(jù)塊在從輸入緩沖區(qū)傳送到輸出緩沖區(qū)時(shí)會(huì)進(jìn)行一致性校驗(yàn),不一致時(shí)會(huì)重新讀取直到一致。所以rman備份的文件數(shù)據(jù)塊級都是一致的,不需要block image。
(兩個(gè)緩沖區(qū)默認(rèn)在pga中如果設(shè)置了io_slave 會(huì)在larger pool 中。)
7、 熱備份過程中發(fā)生crash如何恢復(fù)?(以users 表空間 user01.dbf file# 9 為例)
如果在熱備份的過程中發(fā)生crash在startup時(shí)會(huì)報(bào):ORA-01113文件9需要恢復(fù)。
有兩種方式可以解決這個(gè)問題:
1、 alter tablespace users end backup;
2、 recover datafile 9;
因?yàn)檫@時(shí)報(bào)的錯(cuò)誤和restore了一個(gè)文件后需要恢復(fù)時(shí)一樣的,所以在確定是沒有end backup時(shí)用第一種方法否則應(yīng)該用第二種。
8、 熱備份恢復(fù)相關(guān)視圖?
v$recover_file:需要恢復(fù)的文件
v$recover_log:需要應(yīng)用的歸檔日志
x$kcvfh :可以查看各個(gè)文件的rba
9、 熱備份相關(guān)腳本?(備份腳本)
set linesize 800 verify off pagesize 0 feedback off
define dir='c:\oracle\admin\hotback\2008-10-26'
define log='c:\oracle\admin\hotback\2008-10-26\bklog.txt'
define fil='c:\oracle\admin\sqlsheet\bkdatafile.sql'
set serveroutput on
spool &fil
prompt spool &log
prompt archive log list;;
prompt alter system switch logfile;;
declare
cursor c_tbs is select tablespace_name tbsname from dba_tablespaces where status='ONLINE';
cursor c_datafile(tn varchar2) is select file_name from dba_data_files where tablespace_name=tn;
begin
for row_tbs in c_tbs loop
dbms_output.put_line('alter tablespace '||row_tbs.tbsname||' begin backup;');
for row_file in c_datafile(row_tbs.tbsname) loop
dbms_output.put_line('host copy '||row_file.file_name||' &dir;');
end loop;
dbms_output.put_line('alter tablespace '||row_tbs.tbsname||' end backup;');
end loop;
end;
/
prompt alter system switch logfile;;
prompt alter database backup controlfile to '&dir\controfile.ctl';;
prompt archive log list;;
prompt spool off;;
spool off;
@&fil
10、 當(dāng)歸檔日志文件不在默認(rèn)位置時(shí)如何處理?
我們在進(jìn)行熱備份恢復(fù)時(shí)需要的歸檔日志文件很有可能從默認(rèn)的歸檔位置移走了,在恢復(fù)時(shí)要一個(gè)一個(gè)指定歸檔日志位置很麻煩,可以使用以下方式解決。
? Recover from ‘new_dir’ datafile 9; -- 該方法我試了下不行,好像已被oracle廢除
? Set logsource ‘new_dir’ --注意沒有“=”
Recover datafile 9;
1、 進(jìn)行熱備份的要求?
熱備份是一種數(shù)據(jù)庫的處于打開時(shí)的物理備份,因?yàn)閿?shù)據(jù)庫在不斷發(fā)生改變,因此備份的文件必然是不一致的,這就要求數(shù)據(jù)庫必須處于歸檔日志模式。
2、 熱備份的一般流程?
? 查看數(shù)據(jù)庫是否處于歸檔日志模式,若不是將數(shù)據(jù)庫置為歸檔日志模式。
Rem check the archived mode
Archive log list;
Rem if not archivelog mode issue the following statements
Shutdown immediate;
Startup mount;
Alter database archivelog;
Alter database open;
? 查看當(dāng)前的歸檔日志情況確認(rèn)已歸檔
Archive log list;
? 將表空間置為熱備份模式(以users 表空間為例)
Alter tablespace users begin backup;
? 物理拷貝數(shù)據(jù)文件
Rem for windows
Sql> host copy c:\oracle\ora92\user01.dbf d:\oracle\hotbackup;
Rem for linux/unix
Sql>host cp /oracle/ora92/user01.dbf /oracle/oracle92/user01.dbf
? 結(jié)束表空間的熱備份模式
Alter tablespace users end backup;
? 相同方法備份其他表空間(read only 和 offline 表空間不能置為熱備份模式)
? 備份二進(jìn)制的控制文件
Alter system backup control file to ‘d:\oracle\hotback\controlfile.ctl’ reuse;
Rem reuse 表示當(dāng)文件存在時(shí)覆蓋。
3、 開始熱備份時(shí)發(fā)生什么?
? 執(zhí)行一個(gè)checkpoint 將所有dirty data 寫入文件(保證熱備份開始前文件是一致的)
? 鎖定文件頭的checkpoint scn,但是數(shù)據(jù)庫的改變可以正常進(jìn)行。
? 在alert文件中增加一條記錄
4、 熱備份時(shí)相關(guān)SCN 如何處理?
在 開始進(jìn)行熱備份時(shí),數(shù)據(jù)文件頭的checkpoint scn 和控制文件中該文件的scn lock住,但是數(shù)據(jù)文件的dml操作可以正常進(jìn)行,也就意味著block 的scn 是正常增加的,數(shù)據(jù)文件并沒有鎖定。為什么要Lock 文件的checkpoint scn(實(shí)際上對應(yīng)了恢復(fù)時(shí)的rba) 主要是為了標(biāo)示進(jìn)行恢復(fù)操作時(shí)需要的redo log, 這樣就可以保證數(shù)據(jù)文件內(nèi)所有的塊都能得到恢復(fù),因?yàn)樵谶M(jìn)行數(shù)據(jù)文件拷貝時(shí)無法保證數(shù)據(jù)文件頭是最先拷貝完成的。如果先拷貝的是數(shù)據(jù)文件的其他部分然后才 去拷貝的數(shù)據(jù)文件頭,這時(shí)候很有可能數(shù)據(jù)文件頭的checkpoint scn已經(jīng)改變了而恢復(fù)時(shí)應(yīng)用redo log的范圍是由數(shù)據(jù)文件頭的rba決定的。
當(dāng)熱備份結(jié)束時(shí),在備份結(jié)束的時(shí)候,oracle會(huì)把數(shù)據(jù)文件頭和control文件中關(guān)于這個(gè)數(shù)據(jù)文件的SCN號更新為數(shù)據(jù)庫的SCN號。
5、 為什么熱備份時(shí)產(chǎn)生的redo大量增加?
首 先說下造成大量增加的直接原因吧,因?yàn)閿?shù)據(jù)文件在進(jìn)行熱備份時(shí),該數(shù)據(jù)文件中的處于data buffer中數(shù)據(jù)塊在首次發(fā)生改變時(shí)oracle會(huì)把整塊的block image 寫入redo log。注意該處首次改變是對處于buffer中的數(shù)據(jù)塊而言的,而不是文件中的block,例如對于datafile1 的第20個(gè)塊:
File ---data buffer 從文件中讀入db buffer
Data buffer-----change 產(chǎn)生block image to redo log
Data buffer ------change 不產(chǎn)生blcok image 而是正常的change vector
Data buffer ----file 從db buffer 寫入文件
File ----data buffer 又從文件中讀入db buffer
Data buffer-----change 再次產(chǎn)生block image to redo log
Data buffer ------change 不產(chǎn)生blcok image 而是正常的change vector
之 所以要存儲block image主要是為了處理由于oracle 的block size 和操作系統(tǒng)的block size 不一致而可能造成的split block(指數(shù)據(jù)塊不一致)。熱備份中我們用的是操作系統(tǒng)命令copy or cp 來拷貝數(shù)據(jù)文件,這些命令操作的塊大小都是由操作系統(tǒng)決定的而操作系統(tǒng)塊和數(shù)據(jù)庫塊大小一般不相同。如果當(dāng)數(shù)據(jù)庫塊在改變的同時(shí)在進(jìn)行拷貝,就很有可能造 成拷貝的數(shù)據(jù)塊不一致(其中一部份改變前拷貝的一部分是改變后拷貝的)。Oracle 在恢復(fù)時(shí)將split block 當(dāng)成是currption block,這時(shí)就需要redo log中的block image覆蓋現(xiàn)有塊來進(jìn)行恢復(fù)
6、 Rman備份為什么不用鎖文件頭scn,不增加redo?
鎖文件頭scn只是為了可以正確標(biāo)示恢復(fù)時(shí)的rba,熱備份方式中這個(gè)rba需要從備份的數(shù)據(jù)文件本身獲取,而rman方式將其寫入了controlfile 或catalog,所以不用鎖文件頭。
Rman 在備份時(shí)需要使用兩個(gè)緩沖區(qū)一個(gè)輸入緩沖區(qū),一個(gè)輸出緩沖區(qū)。數(shù)據(jù)塊在從輸入緩沖區(qū)傳送到輸出緩沖區(qū)時(shí)會(huì)進(jìn)行一致性校驗(yàn),不一致時(shí)會(huì)重新讀取直到一致。所以rman備份的文件數(shù)據(jù)塊級都是一致的,不需要block image。
(兩個(gè)緩沖區(qū)默認(rèn)在pga中如果設(shè)置了io_slave 會(huì)在larger pool 中。)
7、 熱備份過程中發(fā)生crash如何恢復(fù)?(以users 表空間 user01.dbf file# 9 為例)
如果在熱備份的過程中發(fā)生crash在startup時(shí)會(huì)報(bào):ORA-01113文件9需要恢復(fù)。
有兩種方式可以解決這個(gè)問題:
1、 alter tablespace users end backup;
2、 recover datafile 9;
因?yàn)檫@時(shí)報(bào)的錯(cuò)誤和restore了一個(gè)文件后需要恢復(fù)時(shí)一樣的,所以在確定是沒有end backup時(shí)用第一種方法否則應(yīng)該用第二種。
8、 熱備份恢復(fù)相關(guān)視圖?
v$recover_file:需要恢復(fù)的文件
v$recover_log:需要應(yīng)用的歸檔日志
x$kcvfh :可以查看各個(gè)文件的rba
9、 熱備份相關(guān)腳本?(備份腳本)
set linesize 800 verify off pagesize 0 feedback off
define dir='c:\oracle\admin\hotback\2008-10-26'
define log='c:\oracle\admin\hotback\2008-10-26\bklog.txt'
define fil='c:\oracle\admin\sqlsheet\bkdatafile.sql'
set serveroutput on
spool &fil
prompt spool &log
prompt archive log list;;
prompt alter system switch logfile;;
declare
cursor c_tbs is select tablespace_name tbsname from dba_tablespaces where status='ONLINE';
cursor c_datafile(tn varchar2) is select file_name from dba_data_files where tablespace_name=tn;
begin
for row_tbs in c_tbs loop
dbms_output.put_line('alter tablespace '||row_tbs.tbsname||' begin backup;');
for row_file in c_datafile(row_tbs.tbsname) loop
dbms_output.put_line('host copy '||row_file.file_name||' &dir;');
end loop;
dbms_output.put_line('alter tablespace '||row_tbs.tbsname||' end backup;');
end loop;
end;
/
prompt alter system switch logfile;;
prompt alter database backup controlfile to '&dir\controfile.ctl';;
prompt archive log list;;
prompt spool off;;
spool off;
@&fil
10、 當(dāng)歸檔日志文件不在默認(rèn)位置時(shí)如何處理?
我們在進(jìn)行熱備份恢復(fù)時(shí)需要的歸檔日志文件很有可能從默認(rèn)的歸檔位置移走了,在恢復(fù)時(shí)要一個(gè)一個(gè)指定歸檔日志位置很麻煩,可以使用以下方式解決。
? Recover from ‘new_dir’ datafile 9; -- 該方法我試了下不行,好像已被oracle廢除
? Set logsource ‘new_dir’ --注意沒有“=”
Recover datafile 9;