共計 3989 個字符,預計需要花費 10 分鐘才能閱讀完成。
本篇內容介紹了“怎么理解 nologging、force logging、supplemental log 日記”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓丸趣 TV 小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!
一、nologging
nologging 對寫日志的影響與數據庫運行模式、表模式、插入模式三者都有關。
表的插入模式是指是否采用了 append 的 hint 提示:
insert /*+append*/ into t1 values(1, First
當數據庫在非歸檔模式下:
無論表是否使用了 nologging 或是 logging,當表使用 append 做插入時,都不會生成 redo,而不使用 append 時都會生成 redo。
當數據庫在歸檔模式下:
如果表使用了 nologging 模式,且使用了 append 做插入,則不會生成 redo,如果未使用 append,則仍然會生成 redo。
如果表使用了 logging 模式,則無論插入時是否使用了 append,redo 都會生成。
總結一句話就是:對于非歸檔模式,插入語句只要使用了 append 就不會生成 redo,而對于歸檔模式,除非表使用了 nologging,否則 append 仍然會產生 redo。
查看表的日志模式是否為 logging 狀態,默認建表時的狀態是 logging 的:
select table_name,logging from dba_tables where owner= SCOTT and table_name= EMP
TABLE_NAME LOG
—————————— —
EMP YES
Oracle 有個內部參數_disable_logging,默認為 false,如果該參數更改為 true,則 Oracle 在更改表時會完全不記錄日志,但該參數應慎用。
二、force logging
通過使用強制日志使 Oracle 無論什么操作都進行 redo 的寫入:
alter database force logging;
查看數據庫是否為 force logging 狀態,默認為 NO:
select force_logging from v$database;
FOR
—
NO
三、supplemental log
補充日志,主要是針對 update 命令的,是對重做日志記錄中變更矢量塊的補充記錄。日志挖掘器(LogMiner)、閃回事務及其查詢等都需要補充日志的支持。補充的目的是高度還原 update 命令,避免因為 update 命令造成的行遷移和行移動影響對日志的分析,讓 LogMiner 通過分析重做日志識別 update 命令不是由 insert 和 delete 完成的。如果未啟用補充日志,重做日志只將 update 命令更改的字段的舊值保存在撤銷數據塊的變更矢量中。而在數據塊中的變更矢量中記載被修改后的字段的新值,同行中的未被修改的字段不會記載。如果啟用了補充日志,重做日志中的撤銷數據塊的變更矢量中不僅會記錄被修改字段前的值和修改后的值,而且還會記錄修改字段的那個條件的值。
補充日志分為數據庫級補充日志、表級補充日志。
數據庫級補充日志又分為最小補充日志、標識關鍵字段補充日志。
最小補充日志:
是最基本的一種數據庫級補充日志,而 LogMiner 正是依賴最小補充日志來工作的。其他補充日志都是基于數據庫級最小補充日志之上的,如果未啟用數據庫級最小補充日志,在啟用或使用其他補充日志時,會自動啟用數據庫的最小補充日志 (Implicit)。
啟用最小補充日志:alter database add supplemental log data;
關閉最小補充日志:alter database drop supplemental log data;
標識關鍵字段補充日志:
分為主鍵、外鍵、唯一索引、全體字段補充日志 4 種。
1)主鍵補充日志:
在 update 命令的重做記錄中添加被修改行的主鍵字段的舊值,無論是否被修改,都記錄。
如果表沒有主鍵,則由長度最小的唯一索引字段代替,若連唯一索引也沒有,則記錄該行所有字段。
alter database add supplemental log data(Primary key) columns;
2)唯一索引補充日志:
唯一索引主要是為復合索引(唯一)服務的。只有唯一索引的字段被 update 時,才會記錄該字段被修改前的值。
alter database add supplemental log data(unique) columns;
3)外鍵補充日志:
同唯一索引補充日志一樣,只有外鍵字段被 update 時,才會記錄被修改前的舊值,即也是為復合外鍵服務的。
alter database add supplemental log data(foreign key) columns;
4)全體字段補充日志:
顧名思義就是所有字段的值不論是否被修改都記錄(LOB、LONG 字段除外)。會導致磁盤快速增長,LGWR 進程繁忙,不建議使用。
alter database add supplemental log data(all) columns;
這 4 種補充日志可以并行使用,效果累加。
表級補充日志:
分為主鍵、唯一索引、外鍵、全體字段、用戶自定義字段 5 種。
前 4 種同數據庫級標識關鍵字段補充日志效果用法一樣。只不過是在特定表上啟用補充日志。
1)alter table t1 add supplemental log data(primary key) columns;
2)alter?table t1 add supplemental log data (unique) columns;
3)alter table t1 add supplemental log data(foreign key) columns;
4)alter table t1 add supplemental log data(all) columns;
5)alter table t1 add supplemental log group group_name(col01,col02,col05,col09) always;?
自定義字段的表級補充日志可以讓用戶任意指定哪些字段的舊值需要被補充日志記錄,可以分為有條件日至組和無條件日至組:
有條件日志組:只要補充日志組中描述的列有一個被修改 (update),那么就要記錄該日志組所有描述列的前鏡像(舊值)。
無條件日志組:當表被修改時要記錄日志組中所有描述列的前鏡像(舊值),無論改變是否對日志組中任一描述列造成了影響。需使用 always 關鍵字。
表級補充日志的情況可通過查詢數據字典視圖 dba_log_groups 和 dba_log_group_columns 獲得。
col owner for a10
col log_group_name for a20
col table_name for a20
select * from dba_log_groups where owner = SCOTT
OWNER LOG_GROUP_NAME TABLE_NAME LOG_GROUP_TYPE ALWAYS GENERATED
———- ——————– ——————– —————————- ———– ————–
SCOTT SYS_C0014349 T1 ALL COLUMN LOGGING ALWAYS GENERATED NAME
SCOTT SYS_C0014350 T1 PRIMARY KEY LOGGING ALWAYS GENERATED NAME
SCOTT SYS_C0014351 T1 UNIQUE KEY LOGGING CONDITIONAL GENERATED NAME
SCOTT SYS_C0014352 T1 FOREIGN KEY LOGGING CONDITIONAL GENERATED NAME
col owner for a10
col table_name for a20
col column_name for a20
select * from dba_log_group_columns where owner = HR
OWNER LOG_GROUP_NAME TABLE_NAME COLUMN_NAME POSITION LOGGIN
———- —————————— ——————– ——————– ———- ——
HR GGS_92582 EMPLOYEES1 EMPLOYEE_ID 1 LOG
HR GGS_91276 COUNTRIES COUNTRY_ID 1 LOG
HR GGS_91281 DEPARTMENTS DEPARTMENT_ID 1 LOG
HR GGS_91286 EMPLOYEES EMPLOYEE_ID 1 LOG
HR GGS_91284 JOBS JOB_ID 1 LOG
HR GGS_91290 JOB_HISTORY EMPLOYEE_ID 1 LOG
HR GGS_91290 JOB_HISTORY START_DATE 2 LOG
HR GGS_91278 LOCATIONS LOCATION_ID 1 LOG
HR GGS_91274 REGIONS REGION_ID 1 LOG
因為 insert 會記錄所有修改后字段,delete 會記錄所有修改前字段,所以補充日志只對 update 產生影響,開啟補充日志時共享池中的 SQL 游標都會失效。
“怎么理解 nologging、force logging、supplemental log 日記”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注丸趣 TV 網站,丸趣 TV 小編將為大家輸出更多高質量的實用文章!