日志文件
1、日志文件:在線日志文件和重做日志文件(在線日志文件備份)
sql> archive log list //歸檔日志列表(d:\oracle\ora90\RDBMS)
2、log buffer內(nèi)存區(qū)域中發(fā)生數(shù)據(jù)改變的動(dòng)作都是記錄在日志中;日志記錄的動(dòng)作類型、動(dòng)作發(fā)生時(shí)間和動(dòng)作發(fā)生數(shù)據(jù)改變的新址舊址等等信息記錄在重做日志中,重做日志最終通過(guò)后臺(tái)進(jìn)程LGWR寫到在線日志里。重做日志作用:recovery 機(jī)制(維護(hù)基于介質(zhì)錯(cuò)誤的系統(tǒng)恢復(fù)),維護(hù)數(shù)據(jù)完整性(維持recovery歷史數(shù)據(jù)恢復(fù)過(guò)程)。
重做日志文件被組織為日志組,每個(gè)組可以有多個(gè)日志文件,每個(gè)日志文件叫成員。
Oracle database要求至少2個(gè)日志組,按照有序的循環(huán)使用的方式使用它。
組1寫滿寫組2,組2寫滿寫組3,組3寫滿再回來(lái)寫組1,有序循環(huán)環(huán)路方式使用。當(dāng)組3寫入組1時(shí),做一個(gè)backup備份工作。
重做日志文件多工:容錯(cuò)機(jī)制。當(dāng)組1寫滿想寫組2,但當(dāng)前組2中所有成員壞掉了,這時(shí)系統(tǒng)就會(huì)報(bào)錯(cuò)。在Oracle環(huán)境中假定當(dāng)前組2中還有1個(gè)成員,即便其他成員都?jí)牡袅?,Oracle還可以繼續(xù)跑。
【建議】對(duì)日志文件做多工,而不同的成員放在不同的物理hard disk(D盤中不同區(qū)域),而不是邏輯的分區(qū)。
sql>alter system archive log start; //啟動(dòng)自動(dòng)存檔過(guò)程
sql>alter system switch logfile; //LGWR停止寫舊組轉(zhuǎn)而寫新組的過(guò)程(強(qiáng)制):日志的switch
在發(fā)生日志switch之前,后臺(tái)會(huì)完成一個(gè)Checkpoint操作,用來(lái)實(shí)現(xiàn)數(shù)據(jù)庫(kù)的同步,它會(huì)寫控制文件,同時(shí)還會(huì)寫數(shù)據(jù)文件。
sql>alter system checkpoint; //強(qiáng)制同步
sql>show parameter fast //(也可以設(shè)置FAST_START_MTTR_TARGET參數(shù)可以控制同步的頻率) MTTR:mean time to recovery [MTTR:meantime to recovery],同步頻率越高發(fā)生系統(tǒng)錯(cuò)誤所需要的recovery時(shí)間就越少。除了fast_start_mttr_target外還有一個(gè)參數(shù):fast_start_io_target(8i中使用,9i以后不建議使用)
sql>show parameter log_checkpoint //log_checkpoint_interval、log_checkpoint_timeout
3、添加日志組:(建議每組大小size相同)
Alter database add logfile group 3
('$HOME/ORADATA/u01/log3a.rdo','$HOME/ORADATA/u01/log3b.rdo')
SIZE 1M;
sql>select * from v$log;
sql>alter database add logfile group 6 //增加日志組6
2 'd:\oracle\oradata\fox\redo06.ora' size 10m;
sql>alter database add logfile member //增加組成員
2 'd:\oracle\oradata\fox\redo06a.ora' size 20m;(報(bào)錯(cuò))//不可以帶size參數(shù),Oracle自動(dòng)對(duì)應(yīng)已經(jīng)有的member的大小
sql> c /size 10m/ //取消size 10m參數(shù)
sql> run
【注意】每個(gè)組可以不同大小,但每個(gè)組成員一定是大小一致的。
4、刪除日志文件組:
ALTER DATABASE DROP LOGFILE GROUP 3;
sql>alter database drop logfile group 6;
在刪除的時(shí)候,只是改變控制文件的信息,不會(huì)對(duì)底層的OS文件造成刪除(只能手工去刪除數(shù)據(jù)文件和日志文件:D:\oracle\oradata\fox中的REDO06.ora、REDO06A.ora等)。
【注意】日志組的刪除限制:當(dāng)前日志組不能刪;active 活動(dòng)日志組不能刪;未歸檔的日志組不能刪。
刪除日志組成員: ALTER DATABASE DROP LOGFILE MEMBER '$HOME/ORADATA/u04/log3c.rdo';
【注意】日志組成員的刪除限制:保留最后一個(gè)日志組成員(每組中至少有一個(gè)成員不能刪)。
sql>select * from v$logfile;
sql>alter database drop logfile member 'D:\oracle\oradata\fox\redo04A.ora'
sql>c /redo04a/redo04/ //修改以上語(yǔ)句的參數(shù)
sql>run
提示:無(wú)法刪除最后一個(gè)日志成員
5、日志清空、移動(dòng)和重命名
日志清空:reinit(重新初始化) ALTER DATABASE CLEAR LOGFILE '$HOME/ORADATA/u01/log2a.rdo';
sql>alter database clear logfile group 2; (當(dāng)前日志文件的清空無(wú)法進(jìn)行)
sql>alter database clear unarchived logfile group 5; (可以進(jìn)行未歸檔清空日志,造成日志歷史記錄斷點(diǎn),做完此事一定不要忘記做系統(tǒng)完全備份。)
移動(dòng)或重命名方式:(1)可以通過(guò)添加新成員,刪除舊成員的方式(2)也可以通過(guò)copy OS文件并重命名的方式,然后執(zhí)行:ALTER DATABASE RENAME '舊名' TO '新名'
sql>alter database rename file 'D:\oracle\oradata\fox\redo05.ora' to 'D:\oracle\oradata\fox\redo05a.ora'
6、在線重做日志文件使用OMF方式:
sql> show parameter db_create_log
sql> alter system set db_create_online_log_dest_q='d:\oracle\oralog';
sql> alter database add logfile group 6; //默認(rèn)100m大小的日志文件被生成
sql> alter database drop logfile group 5; //會(huì)刪除包括OS文件在內(nèi)的該日志組的所有文件
sql> alter database clear unarchived logfile group 5;
7、獲取日志組和組成員的信息:v$log ,v$logfile
v$log (查詢?nèi)罩窘Minfo)-> status:current/active/inactive/unused
v$logfile(查詢?nèi)罩窘M成員)-> status:blank(in use 在使用),stale(incomplete不完整),delete(被刪除了)
8、歸檔日志文件[Archived]:備份在線日志的文件
用途:(1)幫助數(shù)據(jù)恢復(fù)Recovery.(2)在線備份(database is open)
默認(rèn)情況下 database 是被運(yùn)行在NoArchivelog (非歸檔)模式,這種模式下相當(dāng)于日志未作歷史備份,不可以借助日志來(lái)進(jìn)行數(shù)據(jù)恢復(fù)。非歸檔模式只能做全備,而且只能做離線備份(冷備),在數(shù)據(jù)恢復(fù)時(shí)只能全恢復(fù)。而歸檔模式可以做部分備份、部分恢復(fù)、在線備份(數(shù)據(jù)庫(kù)不需要關(guān)閉也能恢復(fù),即熱備)
9、如何在歸檔模式和非歸檔模式之間的轉(zhuǎn)換步驟:
(1)關(guān)閉數(shù)據(jù)庫(kù) shutdown immediate
(2)重啟數(shù)據(jù)庫(kù) startup mount
(3) alter database archivelog/noarchivelog 歸檔/非歸檔模式
(4) 打開(kāi)數(shù)據(jù)庫(kù) alter database open
(5) 對(duì)數(shù)據(jù)庫(kù)進(jìn)行全備 alter system archive log all
sql>shutdown immediate
sql>startup pfile=d:\oracle\ora90\database\initfox.ora mount //啟動(dòng)例程
sql>alter database noarchivelog; 或 alter database archivelog
sql>alter databse open
10、自動(dòng)歸檔:archive log start
手工歸檔:alter system archive log all //歸檔所有日志文件
sql> select * from v$archived_log; //查詢歸檔日志文件信息。
【注意】一旦在線日志組被寫滿了,它還沒(méi)有完成歸檔,那么這個(gè)日志組是不能被重寫的,系統(tǒng)會(huì)等待這個(gè)完成歸檔的過(guò)程。因此,DBA要規(guī)劃系統(tǒng)中有多少個(gè)歸檔日志組,每個(gè)組成員有多大,才能滿足系統(tǒng)需求,不至于導(dǎo)致歸檔過(guò)程影響系統(tǒng)操作。歸檔日志文件可以被多工。
sql> show parameter log_archive //顯示歸檔參數(shù)
11、Oracle中實(shí)現(xiàn)日志挖掘logmnr分析(分區(qū)過(guò)程)步驟:
(1)設(shè)定日志分析目錄 set directory utl_file_dir
(2)重啟oracle restartup
(3) 建立目錄文件 create directory file (dbms_logmnr_d.build)
(4) 添加/移除日志文件到目錄文件:(dbms_logmnr.add_logfile/dbms_logmnr.removefile)
(5) 啟動(dòng)日志挖掘分析(logmnr) start logmnr (dbms_logmnr.start_logmnr)
(6) 分析的內(nèi)容進(jìn)行查詢 v$logmnr_content (sqlredo/sqlundo)
sql>desc dbms_logmnr
sql>desc dbms_logmnr_d
sql>update kong.sales set qty=10 where stor_id=6380 //模擬操作1
sql>delete kong.sales where stor_id=7066 //模擬操作2
sql>commit;
sql>select * from v$log; //查詢當(dāng)前日志組編號(hào) 為group 2(即redo02)
sql>execute dbms_logmnr_d.build('foxdict.ora','d:\oracle\admin\fox\cdump'); //建立支點(diǎn)目錄文件,前一個(gè)參數(shù)是文件名,后一個(gè)參數(shù)文件路徑是init中utl_file_dir所指定的路徑。
sql>desc dbms_logmnr
sql>execute dbms_logmnr.add_logfile('d:\oracle\oradata\fox\redo02.log',dbms_logmnr.new); //添加要分析的日志文件加到目錄文件
sql>execute dbms_logmnr.add_logfile('d:\oracle\oradata\fox\redo03.log',dbms_logmnr.new);
sql>execute dbms_logmnr.start_logmnr(dictfilename=>'d:\oracle\admin\fox\cdump\foxdict.ora');END; //啟動(dòng)日志挖掘分析
sql>select * from v$logmnr_content; //查詢分析的內(nèi)容