1.日志記錄模式(LOGGING 、FORCE LOGGING 、NOLOGGING)
1.1三者的含義
LOGGING:當創建一個數據庫對象時將記錄日志信息到聯機重做日志文件。LOGGING實際上是對象的一個屬性,用來表示在創建對象時是否記錄REDO日志,包括在做DML時是否記錄REDO日志。一般表上不建議使用NOLOGGING,在創建索引或做大量數據導入時,可以使用NOLOGGING
FORCE LOGGING:簡言之,強制記錄日志,即對數據庫中的所有操作都產生日志信息,並將該信息寫入到聯機重做日志文件。
NOLOGGING:正好與LOGGING、FORCE LOGGING 相反,盡可能的記錄最少日志信息到聯機日志文件。
FORCE LOGGING可以在數據庫級別、表空間級別進行設定、而LOGGING與NOLOGGING可以在數據對象級別設定。
在使用DATA GUARD 時,要求使用強制記錄日志模式。注:FORCE LOGGING並不比一般的LOGGING記錄的日志多,數據庫在FORCE LOGGING狀態下,NOLOGGING選項將無效,因為NOLOGGING將破壞DATAGUARD的可恢復性.FORCE LOGGING強制數據庫在任何狀態下必須記錄日志。
1.2與歸檔模式及非歸檔模式之間的關系
關於歸檔及非歸檔請參考一下鏈接:
http://www.55linux.com/oracle/DBA/473.html
日志記錄模式與歸檔模式之間並不能等同,歸檔模式是指對系統產生的日志是否進行歸檔或不歸檔。歸檔模式下,將日志記錄到日志文件,並進行歸檔。非歸檔模式下,同樣將日志記錄到日志文件,只不過不歸檔而已,容易丟失日志。日志的記錄模式則不論是否處於歸檔或非歸檔,可以對日志進行記錄,強制記錄,或少記錄日志。歸檔模式中的LOGGING或FORCE LOGGING 支持介質恢復,而NOLOGGING 模式不支持介質恢復。基於NOLOGGING模式操作所產生的日志遠小於LOGGING模式產生的日志,即NOLOGGING模式最小化日志記錄。
1.3優先級別
當數據庫使用FORCE LOGGING時,具有最高優先級別,其次是表空間級別的FORCE LOGGING。即是當一個對象指定NOLOGGING時,而表空間或數據庫級別的日志模式為FORCE LOGGING,則該選項不起作用,直到表空間或數據庫級別的FORCE LOGGING解除。
一般建議將整個數據庫設置為FORCE LOGGING或基於表空間級別設定FORCE LOGGING,而不建議兩者都設置為FORCE LOGGING。
當數據庫或表空間使用非強制日志模式時,則記錄優先級別由低到高為:數據庫、表空間、數據對象
2.三者的使用情況
2.1LOGGING模式
這是日志記錄的缺省模式,無論數據庫是否處於歸檔模式,這並不改變表空間與對象級別上的缺省的日志記錄模式。對於臨時表空間將不記錄日志到聯機重做日志文件。
2.2NOLOGGING模式
此模式不是不記錄日志,而是最小化日志產生的數量,通常在下列情況下使用NOLOGGING
1
2
3
4
5
6
|
SQL*Loader indirect mode
INSERT
/*+APPEND*/...
CTAS
ALTERTABLEstatements (
move
/
add
/split/merge partitions)
CREATEINDEX
ALTERINDEXstatements (
move
/
add
/split/merge partitions)
|
NOLOGGING與表模式,插入模式,數據庫運行模式(archived/unarchived)的關系:下面僅說明使用append方式插入數據時日志產生的情況,如使用下面的方式進行插入
1
|
insert
/*+append+*/intotb_name
select
colnam1,colname2from table_name;
|
數據庫處於歸檔模式:
當表模式為logging狀態時,無論是否使用append模式,都會生成redo.當表模式為nologging狀態時,只有append模式,不會生成redo
2.3FORCE LOGGING模式
設定數據庫為Force Logging模式后,數據庫將會記錄除臨時表空間或臨時回滾段外所有的操作,而忽略類似NOLOGGING之類的指定參數。
通過下面的操作來修改
1
2
|
ALTERDATABASEFORCE LOGGING;
ALTERTABLESPACE tablespace_name
FORCE
LOGGING;
|
取消FORCE LOGGING模式
1
2
|
ALTERDATABASENOFORCE LOGGING;
ALTERTABLESPACE tablespace_name NOFORCE LOGGING;
|
2.4查看不同級別的日志模式
查看數據庫級別日志的歸檔模式、記錄模式
1
2
3
4
5
|
sys@ORCL>
select
log_mode,force_logging
from
v$
database
;
LOG_MODE
FOR
------------ ---
NOARCHIVELOG
NO
|
查看表空間級別的日志記錄模式
1
2
3
4
5
6
7
8
9
10
11
12
13
|
sys@ORCL>
select
tablespace_name,logging,force_logging
from
dba_tablespaces;
TABLESPACE_NAME LOGGING
FOR
------------------------------ --------- ---
SYSTEM LOGGING
NO
UNDOTBS1 LOGGING
NO
SYSAUX LOGGING
NO
TEMP
NOLOGGING
NO
USERS LOGGING
NO
LINUX LOGGING
NO
ASK1 LOGGING
NO
ASK2 LOGGING
NO
ASK3 LOGGING
NO
|
查看對象級別的日志記錄模式
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
scott@ORCL>
select
table_name,logging
from
user_tables;
TABLE_NAME LOG
------------------------------ ---
DEPT YES
EMP YES
BONUS YES
SALGRADE YES
EMPLOYEE YES
EMP_HIST YES
DUMMY_EMP YES
ASKORACLE_RANGE_LIST
ASKORACLE_RANGE_HASH1
ASKORACLE_RANGE_HASH
ASKORACLE_LIST
TABLE_NAME LOG
------------------------------ ---
ASKORACLE_HASH
ASKORACLE
EMP_TEST YES
|
2.5日志模式記錄轉換
1
2
3
4
5
6
7
8
9
10
11
|
a.數據庫從非強制日志模式切換到強制日志模式
sys@ORCL>alterdatabaseforce logging;
b.數據庫從強制日志模式切換到非強制日志模式
sys@ORCL>alterdatabasenoforce logging;
c.表空間級別從強制日志模式切換到非強制日志模式
sys@ORCL>alterdatabasenoforce logging;
d.表空間級別從非強制日志模式切換到強制日志模式
sys@ORCL>alterdatabasenoforce logging;
e.對象級別日志記錄模式
sys@ORCL>altertabletb_a nologging;
--不記錄日志模式
sys@ORCL>altertabletb_a logging;
--采用日志記錄模式
|
3.LOB段上有關NOLOGGING與LOGGING的情況
3.1計算所有LOB的大小:
1
2
|
SELECT
SUM
(BYTES)/1024/1024/1024
as
LOB_Size
FROM
user_segments
WHERE
segment_type=
'LOBSEGMENT'
;
|
3.2計算所有nologging的大小
1
2
3
4
|
SELECT
SUM
(s.BYTES)/1024/1024/1024
as
Nologging_size
FROM
user_segments s,user_lobs l
WHERE
s.segment_type=
'LOBSEGMENT'
AND
l.LOGGING=
'NO'
AND
l.SEGMENT_NAME=s.SEGMENT_NAME;
|
3.3列出所有nologging/logging 的lobs和對應的表空間及其大小:
1
2
3
4
5
6
7
8
9
|
SELECT
s.segment_name,s.bytes,s.TABLESPACE_NAME
FROM
user_segments s,user_lobs l
WHERE
s.segment_type=
'LOBSEGMENT'
AND
l.LOGGING=
'NO'
AND
l.SEGMENT_NAME=s.SEGMENT_NAME;
SELECT
s.segment_name,s.bytes,s.TABLESPACE_NAME
FROM
user_segments s,user_lobs l
WHERE
s.segment_type=
'LOBSEGMENT'
AND
l.LOGGING=
'YES'
AND
l.SEGMENT_NAME=s.SEGMENT_NAME;
|
3.4計算LOB段上nologging/logging的數量
1
2
|
SELECT
COUNT
(*)
FROM
user_lobs
WHERE
logging=
'NO'
;
SELECT
COUNT
(*)
FROM
user_lobs
WHERE
logging=
'YES'
;
|
關於LOGGING在Oracle 10g考試中的題如下:
Which two statements regarding the LOGGING clause of the CREATE TABLESPACE. .. statement are
correct? (Choose two.)
A. This clause is not valid for a temporary or undo tablespace.
B. If the tablespace is in the NOLOGGING mode, no operation on the tablespace will generate redo.
C. The tablespace will be in the NOLOGGING mode by default, if not specified while creating a tablespace.
D. The tablespacelevel logging attribute can be overridden by logging specifications at the table, index,materialized view, materialized view log, and partition levels.
Answer: AD