備庫中ORA-00600錯誤的簡單修復
最近偶爾會接到一條簡訊,提示某個備庫中出現了ORA-00600的錯誤。對於這個問題還真不能心存僥倖,自己帶著疑問檢視了一下,
這是一個一主兩備的庫,主庫和其中的一個備庫沒有任何的ORA-00600的錯誤,只有這一個備庫中偶爾會出現ORA-00600的錯誤。
這個問題如果放大還是很嚴重的,比如主庫出現問題了,如果切換到這個備庫,那麼ORA-00600的錯誤就會直接轉移過來,這個時候這兒備庫就有點雞肋的味道了。所以這個問題一種思路就是重新搭建備庫,另外一種就是手工修復。我還是更希望透過手工修復的方式來先來看看能不能解決掉這個問題。
報錯的備庫資料庫日誌如下:
Media Recovery Waiting for thread 1 sequence 654 (in transit)
Recovery of Online Redo Log: Thread 1 Group 7 Seq 654 Reading mem 0
Mem# 0: /U01/app/oracle/fast_recovery_area/TESTSOB0/onlinelog/o1_mf_7_9lo8zrpc_.log
Mon Sep 21 08:36:02 2015
Archived Log entry 650 added for thread 1 sequence 653 ID 0xfe9af939 dest 1:
Mon Sep 21 12:18:09 2015
Errors in file /U01/app/oracle/diag/rdbms/testb0/testob0/trace/ordermob0_ora_26830.trc (incident=403849):
ORA-00600: 鍐呴儴閿欒?浠g爜, 鍙傛暟: [kdsgrp1], [], [], [], [], [], [], [], [], [], [], []
Incident details in: /U01/app/oracle/diag/rdbms/testob0/testob0/incident/incdir_403849/testob0_ora_26830_i403849.trc
Use ADRCI or Support Workbench to package the incident.
See Note 411.1 at My Oracle Support for error and packaging details.
Mon Sep 21 12:18:11 2015
Sweep [inc][403849]: completed
Sweep [inc2][403849]: completed
Mon Sep 21 12:18:11 2015
Dumping diagnostic data in directory=[cdmp_20150921121811], requested by (instance=1, osid=26830), summary=[incident=403849].
Mon Sep 21 12:37:06 2015
Errors in file /U01/app/oracle/diag/rdbms/testob0/testob0/trace/testob0_ora_26766.trc (incident=403918):
ORA-00600: 鍐呴儴閿欒?浠g爜, 鍙傛暟: [kdsgrp1], [], [], [], [], [], [], [], [], [], [], []
Incident details in: /U01/app/oracle/diag/rdbms/testob0/ordermob0/incident/incdir_403918/testob0_ora_26766_i403918.trc
Use ADRCI or Support Workbench to package the incident.
See Note 411.1 at My Oracle Support for error and packaging details.
Mon Sep 21 12:37:08 2015
Sweep [inc][403918]: completed
Sweep [inc2][403918]: completed
Mon Sep 21 12:37:08 2015
Dumping diagnostic data
這是一個一主兩備的庫,主庫和其中的一個備庫沒有任何的ORA-00600的錯誤,只有這一個備庫中偶爾會出現ORA-00600的錯誤。
這個問題如果放大還是很嚴重的,比如主庫出現問題了,如果切換到這個備庫,那麼ORA-00600的錯誤就會直接轉移過來,這個時候這兒備庫就有點雞肋的味道了。所以這個問題一種思路就是重新搭建備庫,另外一種就是手工修復。我還是更希望透過手工修復的方式來先來看看能不能解決掉這個問題。
報錯的備庫資料庫日誌如下:
Media Recovery Waiting for thread 1 sequence 654 (in transit)
Recovery of Online Redo Log: Thread 1 Group 7 Seq 654 Reading mem 0
Mem# 0: /U01/app/oracle/fast_recovery_area/TESTSOB0/onlinelog/o1_mf_7_9lo8zrpc_.log
Mon Sep 21 08:36:02 2015
Archived Log entry 650 added for thread 1 sequence 653 ID 0xfe9af939 dest 1:
Mon Sep 21 12:18:09 2015
Errors in file /U01/app/oracle/diag/rdbms/testb0/testob0/trace/ordermob0_ora_26830.trc (incident=403849):
ORA-00600: 鍐呴儴閿欒?浠g爜, 鍙傛暟: [kdsgrp1], [], [], [], [], [], [], [], [], [], [], []
Incident details in: /U01/app/oracle/diag/rdbms/testob0/testob0/incident/incdir_403849/testob0_ora_26830_i403849.trc
Use ADRCI or Support Workbench to package the incident.
See Note 411.1 at My Oracle Support for error and packaging details.
Mon Sep 21 12:18:11 2015
Sweep [inc][403849]: completed
Sweep [inc2][403849]: completed
Mon Sep 21 12:18:11 2015
Dumping diagnostic data in directory=[cdmp_20150921121811], requested by (instance=1, osid=26830), summary=[incident=403849].
Mon Sep 21 12:37:06 2015
Errors in file /U01/app/oracle/diag/rdbms/testob0/testob0/trace/testob0_ora_26766.trc (incident=403918):
ORA-00600: 鍐呴儴閿欒?浠g爜, 鍙傛暟: [kdsgrp1], [], [], [], [], [], [], [], [], [], [], []
Incident details in: /U01/app/oracle/diag/rdbms/testob0/ordermob0/incident/incdir_403918/testob0_ora_26766_i403918.trc
Use ADRCI or Support Workbench to package the incident.
See Note 411.1 at My Oracle Support for error and packaging details.
Mon Sep 21 12:37:08 2015
Sweep [inc][403918]: completed
Sweep [inc2][403918]: completed
Mon Sep 21 12:37:08 2015
Dumping diagnostic data
而對於日誌中提到的trace檔案,得到的內容如下:
/U01/app/oracle/diag/rdbms/testob0/testob0/trace/testob0_ora_26766.trc
*** 2015-09-21 12:37:04.930
*** SESSION ID:(1898.8357) 2015-09-21 12:37:04.930
*** CLIENT ID:() 2015-09-21 12:37:04.930
*** SERVICE NAME:(SYS$USERS) 2015-09-21 12:37:04.930
*** MODULE NAME:(JDBC Thin Client) 2015-09-21 12:37:04.930
*** ACTION NAME:() 2015-09-21 12:37:04.930
* kdsgrp1-1: *************************************************
row 0x01c55b6f.1f continuation at
0x01c55b6f.1f file# 7 block# 351087 slot 31 not found
KDSTABN_GET: 0 ..... ntab: 1
curSlot: 31 ..... nrows: 32
kdsgrp - dump CR block dba=0x01c55b6f
Block header dump: 0x01c55b6f
Object id on Block? Y
seg/obj: 0x12739 csc: 0x00.10bfb352 itc: 2 flg: E typ: 1 - DATA
brn: 0 bdba: 0x1c55481 ver: 0x01 opc: 0
inc: 0 exflg: 0
/U01/app/oracle/diag/rdbms/testob0/testob0/trace/testob0_ora_26766.trc
*** 2015-09-21 12:37:04.930
*** SESSION ID:(1898.8357) 2015-09-21 12:37:04.930
*** CLIENT ID:() 2015-09-21 12:37:04.930
*** SERVICE NAME:(SYS$USERS) 2015-09-21 12:37:04.930
*** MODULE NAME:(JDBC Thin Client) 2015-09-21 12:37:04.930
*** ACTION NAME:() 2015-09-21 12:37:04.930
* kdsgrp1-1: *************************************************
row 0x01c55b6f.1f continuation at
0x01c55b6f.1f file# 7 block# 351087 slot 31 not found
KDSTABN_GET: 0 ..... ntab: 1
curSlot: 31 ..... nrows: 32
kdsgrp - dump CR block dba=0x01c55b6f
Block header dump: 0x01c55b6f
Object id on Block? Y
seg/obj: 0x12739 csc: 0x00.10bfb352 itc: 2 flg: E typ: 1 - DATA
brn: 0 bdba: 0x1c55481 ver: 0x01 opc: 0
inc: 0 exflg: 0
而第一次丟擲ORA-00600的錯誤,可以追溯到2014年了,所以還是一個遺留問題。
這個錯誤代表的含義是對應的索引ROWID,在資料表中找不到記錄,還是有資料不一致的情況。
從trace檔案裡也可以看到,其實是在執行一條sql語句的時候丟擲來的錯誤。
SELECT nvl(count(distinct USER_ID),0) as userCount,nvl(SUM(goods_price),0) as total FROM TEST_ORDER WHERE (IS_SANDBOX = 0 or IS_SANDBOX is null) and (order_status = 2 or order_status = 4) and UPDATE_DATE >=to_date(:1,'yyyy-mm-dd') and UPDATE_DATE <to_date(:2,'yyyy-mm-dd')+1 and (substr(MEDIA_CHANNEL_ID,0,2)='10' or substr(MEDIA_CHANNEL_ID,0,2)='20') AND app_id = :3
至於問題怎麼定位,trace中的內容值得好好琢磨一下。
* kdsgrp1-1: *************************************************
row 0x01c55b6f.1f continuation at
0x01c55b6f.1f file# 7 block# 351087 slot 31 not found
這個就代表錯誤出現在7號資料檔案,351087號資料塊上。
可以透過下面的語句來定位錯誤是否在TEST_ORDER這個表上
SQL> select owner,segment_name,segment_type from dba_extents where file_id=7 and block_id<=351087 and (block_id+blocks)>=351087;
OWNER SEGMENT_NAME SEGMENT_TYPE
-------------------- -------------------- ------------------------------------------------------
TESTOB TEST_ORDER TABLE
#1 alter system dump datafile 7 block 351087;
另外一種是直接宣告跳過那些壞塊,可以直接使用dbms_repair來修復。
execute dbms_repair.skip_corrupt_blocks('TESTOB','TEST_ORDER');
但是因為問題發生在備庫所以還是無法執行這個包的。
SQL> execute dbms_repair.skip_corrupt_blocks('TESTOB','TEST_ORDER');
BEGIN dbms_repair.skip_corrupt_blocks('TESTOB','TEST_ORDER'); END;
*
ERROR at line 1:
ORA-00604: error occurred at recursive SQL level 1
ORA-16000: database open for read-only access
ORA-00604: error occurred at recursive SQL level 1
ORA-16000: database open for read-only access
ORA-06512: at "SYS.DBMS_REPAIR", line 419
ORA-06512: at line 1
所以還是需要在主庫來執行,儘管主庫中還是沒有這個錯誤的。
SQL> execute dbms_repair.skip_corrupt_blocks('TESTOB','TEST_ORDER');
PL/SQL procedure successfully completed.
執行過程很快,修復後自己也在觀察是否還收到過ORA的錯誤警告,按照目前的情況來看,這個問題應該還是順利解決了,因為已經過去了快兩週,之前每一兩天就會拋個錯誤。
這個錯誤代表的含義是對應的索引ROWID,在資料表中找不到記錄,還是有資料不一致的情況。
從trace檔案裡也可以看到,其實是在執行一條sql語句的時候丟擲來的錯誤。
SELECT nvl(count(distinct USER_ID),0) as userCount,nvl(SUM(goods_price),0) as total FROM TEST_ORDER WHERE (IS_SANDBOX = 0 or IS_SANDBOX is null) and (order_status = 2 or order_status = 4) and UPDATE_DATE >=to_date(:1,'yyyy-mm-dd') and UPDATE_DATE <to_date(:2,'yyyy-mm-dd')+1 and (substr(MEDIA_CHANNEL_ID,0,2)='10' or substr(MEDIA_CHANNEL_ID,0,2)='20') AND app_id = :3
至於問題怎麼定位,trace中的內容值得好好琢磨一下。
* kdsgrp1-1: *************************************************
row 0x01c55b6f.1f continuation at
0x01c55b6f.1f file# 7 block# 351087 slot 31 not found
這個就代表錯誤出現在7號資料檔案,351087號資料塊上。
可以透過下面的語句來定位錯誤是否在TEST_ORDER這個表上
SQL> select owner,segment_name,segment_type from dba_extents where file_id=7 and block_id<=351087 and (block_id+blocks)>=351087;
OWNER SEGMENT_NAME SEGMENT_TYPE
-------------------- -------------------- ------------------------------------------------------
TESTOB TEST_ORDER TABLE
對於這個問題,MOS中已經提供了完整的解決方法。
ORA-600 [kdsgrp1] During Table/Index Full Scans (文件 ID 468883.1)
一種是透過dump出來資料,然後設定對應的事件,重建修復ORA-600 [kdsgrp1] During Table/Index Full Scans (文件 ID 468883.1)
#1 alter system dump datafile 7 block 351087;
另外一種是直接宣告跳過那些壞塊,可以直接使用dbms_repair來修復。
execute dbms_repair.skip_corrupt_blocks('TESTOB','TEST_ORDER');
但是因為問題發生在備庫所以還是無法執行這個包的。
SQL> execute dbms_repair.skip_corrupt_blocks('TESTOB','TEST_ORDER');
BEGIN dbms_repair.skip_corrupt_blocks('TESTOB','TEST_ORDER'); END;
*
ERROR at line 1:
ORA-00604: error occurred at recursive SQL level 1
ORA-16000: database open for read-only access
ORA-00604: error occurred at recursive SQL level 1
ORA-16000: database open for read-only access
ORA-06512: at "SYS.DBMS_REPAIR", line 419
ORA-06512: at line 1
所以還是需要在主庫來執行,儘管主庫中還是沒有這個錯誤的。
SQL> execute dbms_repair.skip_corrupt_blocks('TESTOB','TEST_ORDER');
PL/SQL procedure successfully completed.
執行過程很快,修復後自己也在觀察是否還收到過ORA的錯誤警告,按照目前的情況來看,這個問題應該還是順利解決了,因為已經過去了快兩週,之前每一兩天就會拋個錯誤。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/23718752/viewspace-1813341/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- rman映象備份全庫的時候報ora-00600錯誤。
- 備庫查詢導致的ORA-01110錯誤及修復
- Ubuntu 更新錯誤修復大全Ubuntu
- 如何修復 HTTP 505 錯誤?HTTP
- 如何修復那些奇怪的 JavaScript 錯誤JavaScript
- 一個備庫中ORA錯誤資訊的分析
- MySQL修復表的簡單分析MySql
- 如何修復終端中的 macOS 命令列拼寫錯誤Mac命令列
- eclipse中maven專案failonmissingwebxml錯誤的修復EclipseMavenAIWebXML
- win10系統lsp錯誤怎樣修復_win10修復lsp錯誤的步驟Win10
- Rust中錯誤處理的最簡單指南Rust
- 如何修復Windows 10中的Java虛擬機器致命錯誤WindowsJava虛擬機
- 如何修復HTTP 301錯誤?HTTP
- 如何修復代理400錯誤請求?
- dataguard備庫出現GAP修復
- 如何修復http代理出現的503錯誤?HTTP
- 如何在macOS中修復多個檔案的錯誤許可權Mac
- Oracle 修復由於主庫NOLOGGING引起的備庫ORA-01578和ORA-26040錯誤Oracle
- 修復由於主庫NOLOGGING操作引起的備庫ORA-01578和ORA-26040錯誤
- 簡單易懂的tinker熱修復原理分析
- Vue packages version conflicts 錯誤修復VuePackage
- Checkpoint log:invalid bitmap page錯誤修復
- 如何修復HTTP 302錯誤呢?HTTP
- MySQL GTID複製錯誤修復演示MySql
- http代理401錯誤修復步驟HTTP
- 如何修復http代理406錯誤呢?HTTP
- 修復svn hook導致的字符集錯誤Hook
- ORA-00600錯誤分析
- 簡單恢復模式下的備份模式
- 簡單介紹Sybase資料庫的備份與恢復(轉)資料庫
- Android熱修復簡單總結Android
- Tinker 熱修復框架 簡單上手教程框架
- 從全備中恢復單庫或單表,小心有坑!
- 如何掃描和修復 Linux 磁碟錯誤Linux
- SQL一致性錯誤修復SQLSQL
- SQL Server 資料庫損壞、檢測以及簡單的修復辦法SQLServer資料庫
- 簡簡單單躲過JavaScript的3個錯誤釋出JavaScript
- oracle錯誤之ORA-00600Oracle