nologging、force logging、supplemental log的理解
一、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遊標都會失效。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/28974745/viewspace-2214398/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 日誌記錄模式(LOGGING 、FORCE LOGGING 、NOLOGGING)模式
- 2.5.11 指定 FORCE LOGGING 模式模式
- 2.5.11.1 使用 FORCE LOGGING 子句
- 2.5.11.2 FORCE LOGGING 模式需要考慮的效能問題模式
- Oracle設定日誌引數-ALTER DATABASE ADD SUPPLEMENTAL LOG DATA;OracleDatabase
- commons-logging + log4j原始碼分析原始碼
- 案例:DG主庫未設定force logging導致備庫壞塊
- 理解ASP.NET Core - 日誌(Logging)ASP.NET
- Python 日誌庫 logging 的理解和實踐經驗Python
- 深入理解MySQL系列之redo log、undo log和binlogMySql
- commons-logging,log4j,logback,slf4j之間的關係詳解
- Nologging對恢復的影響(一)
- Nologging對恢復的影響(二)
- logging
- J2SE - 關於Commons-Logging、Slf4j、Log4j、Logback的整理
- 常見日誌輸出目標(Logback | Log4j2 | Java Util Logging)Java
- House Of Force
- innodb_flush_log_at_trx_commit引數的直白理解MIT
- 挽救DG中主庫的nologging操作的塊
- alter table nologging /*+APPEND PARALLEL(n)*/APPParallel
- python的logging模組Python
- go - LoggingGo
- ACID(Force & Steal)
- 重新理解RocketMQ Commit Log儲存協議MQMIT協議
- [譯] 使用 `-force` 被認為是有害的;瞭解 Git 的 `-force-with-lease` 命令Git
- 【DATAGUARD】Oracle Dataguard nologging 塊修復Oracle
- python logging日誌的禁用Python
- Python logging模組的使用Python
- Python logging 庫的『完整教程』Python
- MySQL Redo log頁內邏輯怎麼理解MySql
- logging.basicConfig()
- Python Logging 指南Python
- Docker logging driversDocker
- DVWA之Brute Force
- hashlib、logging模組
- MySQL的Redo log 以及Bin logMySql
- Log4j2 Jndi 漏洞原理解析、覆盤
- 一次rman恢復引起的nologging問題模擬