| 導購 | 订阅 | 在线投稿
分享
 
 
 

_disable_logging對于歸檔數據庫的影響

來源:互聯網網民  2006-04-20 05:58:32  評論

_disable_logging對于歸檔數據庫的影響

在歸檔數據庫下,如果設置了 _disable_logging=true,那麽數據庫就會將所有的online redo logfile標記爲corrput,從而在歸檔數據庫下不能夠正常的歸檔了,因此,每次需要當數據庫中所有的日志組歸檔狀態都爲“NO”,且STATUS列的值出現n-1個“INACTIVE”和一個“CURRENT”時,即,除了當前日志外,其余所有的日志都是不活動且沒有歸檔的時候,對數據庫的所有操作(只要産生的日志超過current日志的可用大小的時候,也就是需要發生日志切換的時候)就會hang。

上述結論可以很容易的得到證實,首先我們檢查數據庫的狀態,看它是否已經處在歸檔模式了,如果仍然處于非歸檔模式的話,請先將數據庫改爲歸檔方式(具體的方法不是這裏討論的重點,就不贅述了):

sys@TSMISC02> archive log list

Database log mode Archive Mode

Automatic archival Enabled

Archive destination /oracle/oradata/TSMISC02/archive

Oldest online log sequence 1595

Next log sequence to archive 1597

Current log sequence 1597

sys@TSMISC02>

再檢查一下當前的日志文件信息:

sys@TSMISC02> select * from v$log;

GROUP# THREAD# SEQUENCE# BYTES MEMBERS ARC STATUS FIRST_CHANGE# FIRST_TIM

---------- ---------- ---------- ---------- ---------- --- ---------------- ------------- ---------

1 1 1597 2097152 1 NO CURRENT 6913201 11-APR-06

2 1 1595 2097152 1 YES INACTIVE 6889512 11-APR-06

3 1 1596 2097152 1 YES INACTIVE 6901361 11-APR-06

Elapsed: 00:00:00.01

sys@TSMISC02>

sys@TSMISC02> col member for a50

sys@TSMISC02> select * from v$logfile;

GROUP# STATUS TYPE MEMBER

---------- ------- ------- --------------------------------------------------

1 ONLINE /oracle/oradata/TSMISC02/redo01.log

2 ONLINE /oracle/oradata/TSMISC02/redo02.log

3 ONLINE /oracle/oradata/TSMISC02/redo03.log

Elapsed: 00:00:00.00

sys@TSMISC02>

我們看到,當前的日志文件是日志組1(online redo log group 1),日志組2和日志組3都已經成功歸檔,並且狀態是“INACTIVE”,也就是說,這兩個組已經可以被循環使用了。

現在設置"_disable_logging"=true:

sys@TSMISC02> alter system set "_disable_logging"=true scope=both;

System altered.

Elapsed: 00:00:00.00

sys@TSMISC02>

然後,再創建一些大表等等,然後觀察日志的情況:

sys@TSMISC02> select * from v$log;

GROUP# THREAD# SEQUENCE# BYTES MEMBERS ARC STATUS FIRST_CHANGE# FIRST_TIM

---------- ---------- ---------- ---------- ---------- --- ---------------- ------------- ---------

1 1 1597 2097152 1 NO ACTIVE 6913201 11-APR-06

2 1 1598 2097152 1 NO CURRENT 6919313 11-APR-06

3 1 1596 2097152 1 YES INACTIVE 6901361 11-APR-06

Elapsed: 00:00:00.00

sys@TSMISC02> select * from v$logfile;

GROUP# STATUS TYPE MEMBER

---------- ------- ------- --------------------------------------------------

1 ONLINE /oracle/oradata/TSMISC02/redo01.log

2 ONLINE /oracle/oradata/TSMISC02/redo02.log

3 ONLINE /oracle/oradata/TSMISC02/redo03.log

Elapsed: 00:00:00.00

sys@TSMISC02>

我們觀察到,系統已經發生了日志切換,當前系統正在使用的日志組已經是group 2了,而剛才的那個group 1是沒有完成歸檔的狀態,即,沒有歸檔且狀態爲active。

這時候,實際上數據庫已經出現問題了,但是由于還有其他可用的日志組可以繼續使用,因此在前台sqlplus的使用界面上並沒有報錯,但是如果你檢查alert.log,就會發現系統已經開始不斷的報類似下面的錯誤信息了:

Tue Apr 11 13:50:07 2006

ALTER SYSTEM SET _disable_logging=TRUE SCOPE=BOTH;

Tue Apr 11 14:09:35 2006

ARC0: Evaluating archive log 1 thread 1 sequence 1597

ARC0: Beginning to archive log 1 thread 1 sequence 1597

Creating archive destination LOG_ARCHIVE_DEST_1: '/oracle/oradata/TSMISC02/archive/1_1597.dbf'

Tue Apr 11 14:09:35 2006

Thread 1 advanced to log sequence 1598

Current log# 2 seq# 1598 mem# 0: /oracle/oradata/TSMISC02/redo02.log

Tue Apr 11 14:09:35 2006

ARC0: Log corruption near block 3740 change 0 time ?

ARC0: All Archive destinations made inactive due to error 354

Tue Apr 11 14:09:35 2006

Errors in file /oracle/admin/TSMISC02/bdump/tsmisc02_arc0_9459.trc:

ORA-00354: corrupt redo log block header

ORA-00353: log corruption near block 3740 change 0 time 04/11/2006 13:49:56

ORA-00312: online log 1 thread 1: '/oracle/oradata/TSMISC02/redo01.log'

ARC0: Archiving not possible: error count exceeded

ARC0: Failed to archive log 1 thread 1 sequence 1597

ARCH: Archival stopped, error occurred. Will continue retrying

。。。。。。。

並且系統會不斷的嘗試將redo01.log日志文件歸檔,但是由于這個文件總是不能被成功歸檔,所以數據庫就不斷的循環和重複上面的錯誤信息。

此時,如果你是用dbv來檢查一下redo01.log日志文件的話,你會發現類似下面的信息:

DBVERIFY - Verification complete

Total Pages Examined : 4096

Total Pages Processed (Data) : 0

Total Pages Failing (Data) : 0

Total Pages Processed (Index): 0

Total Pages Failing (Index): 0

Total Pages Processed (Other): 4

Total Pages Processed (Seg) : 0

Total Pages Failing (Seg) : 0

Total Pages Empty : 0

Total Pages Marked Corrupt : 4096

Total Pages Influx : 2

Highest block SCN : 1 (0.1)

這裏我們發現,整個日志文件中所有的塊都被標記爲損壞狀態了!

由此我們可以看到_disable_logging=true對于歸檔數據庫的一個破壞作用之一就是將整個數據庫的redo log file都標記爲損壞。

那麽現在我們應該怎麽辦呢?首先我們需要使用alert system命令將_disable_logging參數設置爲false,然後,依次對所有沒有歸檔的日志做清理未歸檔日志的工作:

alter database clear unarchived logfile '/oracle/oradata/TSMISC02/redo01.log';

alter database clear unarchived logfile '/oracle/oradata/TSMISC02/redo02.log';

......

注意:

初始化日志文件的語法:

ALTER DATABASE [database]

CLEAR [UNARCHIVED] LOGFILE

{GROUP integer|('filename'[, 'filename']...)}

[,{GROUP integer|('filename'[, 'filename']...)}]...

無論聯機重做日志文件是否歸檔,都可以清除它。

但是,在其沒有歸檔時,必須包含關鍵字UNARCHIVED。

由于篇幅關系,這裏進對部分操作說明一下:

sys@TSMISC02> alter system set "_disable_logging"=false scope=both;

System altered.

Elapsed: 00:00:00.01

sys@TSMISC02>

sys@TSMISC02> alter database clear unarchived logfile '/oracle/oradata/TSMISC02/redo02.log';

Database altered.

Elapsed: 00:00:00.18

sys@TSMISC02> alter database clear unarchived logfile '/oracle/oradata/TSMISC02/redo03.log';

Database altered.

Elapsed: 00:00:00.17

sys@TSMISC02>

sys@TSMISC02> select * from v$log;

GROUP# THREAD# SEQUENCE# BYTES MEMBERS ARC STATUS FIRST_CHANGE# FIRST_TIM

---------- ---------- ---------- ---------- ---------- --- ---------------- ------------- ---------

1 1 1600 2097152 1 NO CURRENT 6950639 12-APR-06

2 1 0 2097152 1 YES UNUSED 6919313 11-APR-06

3 1 0 2097152 1 YES UNUSED 6922631 11-APR-06

Elapsed: 00:00:00.00

sys@TSMISC02>

其實,需要清理哪些日志,你可以根據alert.log的報錯來做,比如這裏,當你清理了日志組1,alert中就開始報關于group 2不能歸檔的信息;當你清理了日志組2,alert中就開始報關于group 3不能歸檔的信息。。。,以此類推,所有的日志組都被初始化後,數據庫就恢複正常了。當然這時後你需要做一個數據庫的全備,因爲之前的數據庫備份已經無效了。

注意:如果對當前的日志(狀態未“CURRENT”的日志組做clear unarchived logfile的操作會有類似下面的報錯:

sys@TSMISC02>alter database clear unarchived logfile '/oracle/oradata/TSMISC02/redo01.log';

alter database clear unarchived logfile '/oracle/oradata/TSMISC02/redo01.log'

*

ERROR at line 1:

ORA-01624: log 1 needed for crash recovery of thread 1

ORA-00312: online log 1 thread 1: '/oracle/oradata/TSMISC02/redo01.log'

Elapsed: 00:00:00.05

sys@TSMISC02>

你只需要使用alter system switch logfile,然後再做clear unarchived logfile的操作就可以了。

綜上,我們已經驗證了本章界最初的結論。

 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
 
_disable_logging對于歸檔數據庫的影響 在歸檔數據庫下,如果設置了 _disable_logging=true,那麽數據庫就會將所有的online redo logfile標記爲corrput,從而在歸檔數據庫下不能夠正常的歸檔了,因此,每次需要當數據庫中所有的日志組歸檔狀態都爲“NO”,且STATUS列的值出現n-1個“INACTIVE”和一個“CURRENT”時,即,除了當前日志外,其余所有的日志都是不活動且沒有歸檔的時候,對數據庫的所有操作(只要産生的日志超過current日志的可用大小的時候,也就是需要發生日志切換的時候)就會hang。 上述結論可以很容易的得到證實,首先我們檢查數據庫的狀態,看它是否已經處在歸檔模式了,如果仍然處于非歸檔模式的話,請先將數據庫改爲歸檔方式(具體的方法不是這裏討論的重點,就不贅述了): sys@TSMISC02> archive log list Database log mode Archive Mode Automatic archival Enabled Archive destination /oracle/oradata/TSMISC02/archive Oldest online log sequence 1595 Next log sequence to archive 1597 Current log sequence 1597 sys@TSMISC02> 再檢查一下當前的日志文件信息: sys@TSMISC02> select * from v$log; GROUP# THREAD# SEQUENCE# BYTES MEMBERS ARC STATUS FIRST_CHANGE# FIRST_TIM ---------- ---------- ---------- ---------- ---------- --- ---------------- ------------- --------- 1 1 1597 2097152 1 NO CURRENT 6913201 11-APR-06 2 1 1595 2097152 1 YES INACTIVE 6889512 11-APR-06 3 1 1596 2097152 1 YES INACTIVE 6901361 11-APR-06 Elapsed: 00:00:00.01 sys@TSMISC02> sys@TSMISC02> col member for a50 sys@TSMISC02> select * from v$logfile; GROUP# STATUS TYPE MEMBER ---------- ------- ------- -------------------------------------------------- 1 ONLINE /oracle/oradata/TSMISC02/redo01.log 2 ONLINE /oracle/oradata/TSMISC02/redo02.log 3 ONLINE /oracle/oradata/TSMISC02/redo03.log Elapsed: 00:00:00.00 sys@TSMISC02> 我們看到,當前的日志文件是日志組1(online redo log group 1),日志組2和日志組3都已經成功歸檔,並且狀態是“INACTIVE”,也就是說,這兩個組已經可以被循環使用了。 現在設置"_disable_logging"=true: sys@TSMISC02> alter system set "_disable_logging"=true scope=both; System altered. Elapsed: 00:00:00.00 sys@TSMISC02> 然後,再創建一些大表等等,然後觀察日志的情況: sys@TSMISC02> select * from v$log; GROUP# THREAD# SEQUENCE# BYTES MEMBERS ARC STATUS FIRST_CHANGE# FIRST_TIM ---------- ---------- ---------- ---------- ---------- --- ---------------- ------------- --------- 1 1 1597 2097152 1 NO ACTIVE 6913201 11-APR-06 2 1 1598 2097152 1 NO CURRENT 6919313 11-APR-06 3 1 1596 2097152 1 YES INACTIVE 6901361 11-APR-06 Elapsed: 00:00:00.00 sys@TSMISC02> select * from v$logfile; GROUP# STATUS TYPE MEMBER ---------- ------- ------- -------------------------------------------------- 1 ONLINE /oracle/oradata/TSMISC02/redo01.log 2 ONLINE /oracle/oradata/TSMISC02/redo02.log 3 ONLINE /oracle/oradata/TSMISC02/redo03.log Elapsed: 00:00:00.00 sys@TSMISC02> 我們觀察到,系統已經發生了日志切換,當前系統正在使用的日志組已經是group 2了,而剛才的那個group 1是沒有完成歸檔的狀態,即,沒有歸檔且狀態爲active。 這時候,實際上數據庫已經出現問題了,但是由于還有其他可用的日志組可以繼續使用,因此在前台sqlplus的使用界面上並沒有報錯,但是如果你檢查alert.log,就會發現系統已經開始不斷的報類似下面的錯誤信息了: Tue Apr 11 13:50:07 2006 ALTER SYSTEM SET _disable_logging=TRUE SCOPE=BOTH; Tue Apr 11 14:09:35 2006 ARC0: Evaluating archive log 1 thread 1 sequence 1597 ARC0: Beginning to archive log 1 thread 1 sequence 1597 Creating archive destination LOG_ARCHIVE_DEST_1: '/oracle/oradata/TSMISC02/archive/1_1597.dbf' Tue Apr 11 14:09:35 2006 Thread 1 advanced to log sequence 1598 Current log# 2 seq# 1598 mem# 0: /oracle/oradata/TSMISC02/redo02.log Tue Apr 11 14:09:35 2006 ARC0: Log corruption near block 3740 change 0 time ? ARC0: All Archive destinations made inactive due to error 354 Tue Apr 11 14:09:35 2006 Errors in file /oracle/admin/TSMISC02/bdump/tsmisc02_arc0_9459.trc: ORA-00354: corrupt redo log block header ORA-00353: log corruption near block 3740 change 0 time 04/11/2006 13:49:56 ORA-00312: online log 1 thread 1: '/oracle/oradata/TSMISC02/redo01.log' ARC0: Archiving not possible: error count exceeded ARC0: Failed to archive log 1 thread 1 sequence 1597 ARCH: Archival stopped, error occurred. Will continue retrying 。。。。。。。 並且系統會不斷的嘗試將redo01.log日志文件歸檔,但是由于這個文件總是不能被成功歸檔,所以數據庫就不斷的循環和重複上面的錯誤信息。 此時,如果你是用dbv來檢查一下redo01.log日志文件的話,你會發現類似下面的信息: DBVERIFY - Verification complete Total Pages Examined : 4096 Total Pages Processed (Data) : 0 Total Pages Failing (Data) : 0 Total Pages Processed (Index): 0 Total Pages Failing (Index): 0 Total Pages Processed (Other): 4 Total Pages Processed (Seg) : 0 Total Pages Failing (Seg) : 0 Total Pages Empty : 0 Total Pages Marked Corrupt : 4096 Total Pages Influx : 2 Highest block SCN : 1 (0.1) 這裏我們發現,整個日志文件中所有的塊都被標記爲損壞狀態了! 由此我們可以看到_disable_logging=true對于歸檔數據庫的一個破壞作用之一就是將整個數據庫的redo log file都標記爲損壞。 那麽現在我們應該怎麽辦呢?首先我們需要使用alert system命令將_disable_logging參數設置爲false,然後,依次對所有沒有歸檔的日志做清理未歸檔日志的工作: alter database clear unarchived logfile '/oracle/oradata/TSMISC02/redo01.log'; alter database clear unarchived logfile '/oracle/oradata/TSMISC02/redo02.log'; ...... 注意: 初始化日志文件的語法: ALTER DATABASE [database] CLEAR [UNARCHIVED] LOGFILE {GROUP integer|('filename'[, 'filename']...)} [,{GROUP integer|('filename'[, 'filename']...)}]... 無論聯機重做日志文件是否歸檔,都可以清除它。 但是,在其沒有歸檔時,必須包含關鍵字UNARCHIVED。 由于篇幅關系,這裏進對部分操作說明一下: sys@TSMISC02> alter system set "_disable_logging"=false scope=both; System altered. Elapsed: 00:00:00.01 sys@TSMISC02> sys@TSMISC02> alter database clear unarchived logfile '/oracle/oradata/TSMISC02/redo02.log'; Database altered. Elapsed: 00:00:00.18 sys@TSMISC02> alter database clear unarchived logfile '/oracle/oradata/TSMISC02/redo03.log'; Database altered. Elapsed: 00:00:00.17 sys@TSMISC02> sys@TSMISC02> select * from v$log; GROUP# THREAD# SEQUENCE# BYTES MEMBERS ARC STATUS FIRST_CHANGE# FIRST_TIM ---------- ---------- ---------- ---------- ---------- --- ---------------- ------------- --------- 1 1 1600 2097152 1 NO CURRENT 6950639 12-APR-06 2 1 0 2097152 1 YES UNUSED 6919313 11-APR-06 3 1 0 2097152 1 YES UNUSED 6922631 11-APR-06 Elapsed: 00:00:00.00 sys@TSMISC02> 其實,需要清理哪些日志,你可以根據alert.log的報錯來做,比如這裏,當你清理了日志組1,alert中就開始報關于group 2不能歸檔的信息;當你清理了日志組2,alert中就開始報關于group 3不能歸檔的信息。。。,以此類推,所有的日志組都被初始化後,數據庫就恢複正常了。當然這時後你需要做一個數據庫的全備,因爲之前的數據庫備份已經無效了。 注意:如果對當前的日志(狀態未“CURRENT”的日志組做clear unarchived logfile的操作會有類似下面的報錯: sys@TSMISC02>alter database clear unarchived logfile '/oracle/oradata/TSMISC02/redo01.log'; alter database clear unarchived logfile '/oracle/oradata/TSMISC02/redo01.log' * ERROR at line 1: ORA-01624: log 1 needed for crash recovery of thread 1 ORA-00312: online log 1 thread 1: '/oracle/oradata/TSMISC02/redo01.log' Elapsed: 00:00:00.05 sys@TSMISC02> 你只需要使用alter system switch logfile,然後再做clear unarchived logfile的操作就可以了。 綜上,我們已經驗證了本章界最初的結論。
󰈣󰈤
王朝萬家燈火計劃
期待原創作者加盟
 
 
 
>>返回首頁<<
 
 
 
 
 
 熱帖排行
 
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有