#
客戶在比較繁忙的時刻執行了索引的REBUILD操作,導致大量會話被鎖,最終對ONLINE REBUILD操作執行了取消操作,引發了一系列更嚴重的ORA-600錯誤。
登錄數據庫后,發現兩個節點上ORACLE_BASE所在目錄都已經100%占用。數據庫無法正常通過/ AS SYSDBA方式登錄。
查詢告警日志發現大量的ORA-600和ORA-7445錯誤:
Tue May 08 21:20:26 EAT 2012
Errors in file /oracle/app/admin/orcl/udump/orcl2_ora_1555.trc:
ORA-07445: exception encountered: core dump [0000000000000000] [SIGSEGV] [Invalid permissions for mapped object] [0x000000000] [] []
Tue May 08 21:20:27 EAT 2012
Errors in file /oracle/app/admin/orcl/udump/orcl2_ora_3891.trc:
ORA-00600: internal error code, arguments: [kghstack_underflow_internal_3], [0x60000000003002F0], [keybuf], [], [], [], [], []
Tue May 08 21:20:27 EAT 2012
Errors in file /oracle/app/admin/orcl/udump/orcl2_ora_26190.trc:
ORA-07445: exception encountered: core dump [0000000000000000] [SIGSEGV] [Invalid permissions for mapped object] [0x000000000] [] []
Tue May 08 21:20:27 EAT 2012
Errors in file /oracle/app/admin/orcl/udump/orcl2_ora_2873.trc:
ORA-07445: exception encountered: core dump [0000000000000000] [SIGSEGV] [Invalid permissions for mapped object] [0x000000000] [] []
Tue May 08 21:20:27 EAT 2012
Errors in file /oracle/app/admin/orcl/udump/orcl2_ora_4518.trc:
ORA-00600: internal error code, arguments: [kghstack_underflow_internal_3], [0x60000000003002F0], [keybuf], [], [], [], [], []
Tue May 08 21:20:27 EAT 2012
Errors in file /oracle/app/admin/orcl/udump/orcl2_ora_22469.trc:
ORA-00600: internal error code, arguments: [kghstack_underflow_internal_3], [0x60000000003002F0], [keybuf], [], [], [], [], []
Tue May 08 21:20:28 EAT 2012
Errors in file /oracle/app/admin/orcl/udump/orcl2_ora_26440.trc:
ORA-07445: exception encountered: core dump [0000000000000000] [SIGSEGV] [Invalid permissions for mapped object] [0x000000000] [] []
Tue May 08 21:20:29 EAT 2012
Errors in file /oracle/app/admin/orcl/udump/orcl2_ora_762.trc:
ORA-07445: exception encountered: core dump [0000000000000000] [SIGSEGV] [Invalid permissions for mapped object] [0x000000000] [] []
Tue May 08 21:20:29 EAT 2012
Errors in file /oracle/app/admin/orcl/udump/orcl2_ora_26106.trc:
ORA-07445: exception encountered: core dump [0000000000000000] [SIGSEGV] [Invalid permissions for mapped object] [0x000000000] [] []
Tue May 08 21:20:30 EAT 2012
Errors in file /oracle/app/admin/orcl/udump/orcl2_ora_1597.trc:
ORA-07445:出現異常錯誤:核心轉儲[0000000000000000] [SIGSEGV] [Invalid permissions for mapped object] [0x000000000] [] []
Tue May 08 21:20:30 EAT 2012
Errors in file /oracle/app/admin/orcl/udump/orcl2_ora_856.trc:
ORA-07445: exception encountered: core dump [0000000000000000] [SIGSEGV] [Invalid permissions for mapped object] [0x000000000] [] []
.
.
.
檢查對應的TRACE文件,發現導致錯誤語句執行的是TABLE_A表的插入:
ksedmp: internal or fatal error tb
ORA-00600:內部錯誤代碼,參數: [kghstack_underflow_internal_3], [0x60000000003002F0], [keybuf], [], [], [], [], []
Current SQL statement for this session:
INSERT INTO TABLE_A (O_ID, P_ID, S_ID, F_ITEM, F_NAME, T_MON, D_MON, I_MON, P_STATE, P_TIME, R1, R2) VALUES (:B10 , SUBSTR(:B10 , LENGTH(:B10 ) - 1, 2), :B9 , :B8 , :B7 , :B6 , :B5 , :B4 , :B3 , NULL, :B2 , :B1 )
----- PL/SQL Call Stack -----
object line object
handle number name
c00000203c2cc550 119 package body U1.P_O_I
c00000203b788200 288 procedure U1.U_B_O_I
c00000203719b8d0 1 anonymous block
----- Call Stack Trace -----
calling call entry argument values in hex
location type point (? means dubious value)
-------------------- -------- -------------------- ----------------------------
ksedst()+64 call ksedst1() 000000000 ? 000000001 ?
ksedmp()+2176 call ksedst() 000000000 ?
C000000000000D20 ?
4000000004037940 ?
000000000 ? 000000000 ?
000000000 ?
ksfdmp()+112 call ksedmp() 000000003 ?
9FFFFFFFFFFF1230 ?
60000000000BA290 ?
9FFFFFFFFFFF1800 ?
C000000000000999 ?
400000000407F9B0 ?
kgerinv()+304 call ksfdmp() 9FFFFFFFFFFF1D90 ?
000000003 ?
9FFFFFFFFFFF1810 ?
60000000000BA290 ?
C000000000000612 ?
40000000098C38B0 ?
kgeasnmierr()+144 call kgerinv() 60000000000318D0 ?
4000000001AD98A0 ?
6000000000032988 ?
4000000001AD98A0 ?
9FFFFFFFFFFF1DD0 ?
$cold_kghstack_unde call kgeasnmierr() 60000000000318D0 ?
rflow_internal()+36 9FFFFFFFBF3B1168 ?
8 9FFFFFFFBF3B1178 ?
6000000000032D00 ?
000000002 ?
60000000003002F0 ?
000000001 ? 000000006 ?
kghstack_free()+208 call $cold_kghstack_unde 60000000000318D0 ?
rflow_internal() 60000000003002F0 ?
60000000000BA290 ?
C000000000000B1D ?
4000000002F7A510 ?
00002C87B ?
6000000000031A10 ?
ksmfrs()+48 call kghstack_free() 60000000000318D0 ?
60000000003002F0 ?
rpiswu2()+1312 call ksmfrs() 60000000003002F0 ?
C000000000001026 ?
4000000002F78960 ?
000000000 ? 000000000 ?
000000000 ?
rpidrv()+2352 call rpiswu2() 9FFFFFFFFFFF2AF0 ?
4000000002F7AE60 ?
00002F833 ?
60000000000A7D20 ?
9FFFFFFFFFFF1E20 ?
C000000000001ABD ?
4000000000F14558 ?
60000000000C6CF0 ?
psddr0()+864 call rpidrv() 000000018 ? 000000066 ?
9FFFFFFFFFFF3700 ?
000000038 ?
9FFFFFFFFFFF2B20 ?
60000000000BA290 ?
psdnal()+736 call psddr0() 000000018 ? 000000066 ?
9FFFFFFFFFFF3700 ?
000000030 ?
pevm_EXECC()+832 call psdnal() 9FFFFFFFFFFF54D0 ?
C00000203489A9F8 ?
C0000000000011AA ?
9FFFFFFFBE832840 ?
C00000203C2CC550 ?
400000000313C770 ?
000026035 ?
pfrinstr_EXECC()+16 call pevm_EXECC() 9FFFFFFFBE83D1D0 ?
0 9FFFFFFFBE8328B0 ?
000000020 ?
pfrrun_no_tool()+19 call pfrinstr_EXECC() 9FFFFFFFBE83D1D0 ?
2 C000001DA198D61C ?
9FFFFFFFBE83D238 ?
pfrrun()+1376 call pfrrun_no_tool() 9FFFFFFFBE83D1D0 ?
000002001 ?
9FFFFFFFBE83D238 ?
60000000000BA290 ?
C000000000000A1C ?
4000000003163040 ?
9FFFFFFFBE83D620 ?
9FFFFFFFBE83D298 ?
plsql_run()+1328 call pfrrun() 9FFFFFFFFFFF3788 ?
9FFFFFFFFFFF3770 ?
60000000000BA290 ?
9FFFFFFFFFFF4370 ?
9FFFFFFFFFFF4370 ?
C000000000000E23 ?
4000000002C34D70 ?
peicnt()+560 call plsql_run() 9FFFFFFFFFFF4380 ?
000000001 ? 000000000 ?
9FFFFFFFFFFF4380 ?
60000000000BA290 ?
9FFFFFFFFFFF4E90 ?
kkxexe()+1008 call peicnt() 9FFFFFFFFFFF54D0 ?
9FFFFFFFBE83D1D0 ?
9FFFFFFFFFFF4EA0 ?
60000000000BA290 ?
9FFFFFFFFFFF5420 ?
C000000000000A1C ?
000000020 ?
9FFFFFFFFFFF4F00 ?
opiexe()+8016 call kkxexe() 0000051F0 ?
.
.
.
這個SQL語句是正常的業務操作,而這種簡單的INSERT都會導致ORA-600和ORA-7445錯誤,說明插入的表或索引本身存在問題。
檢查表和索引的狀態,發現索引部分分區狀態異常:
CREATE INDEX "U1"."IDX_F_2"
ON "U1"."TABLE_A" ("S_ID")
PCTFREE 10 INITRANS 2 MAXTRANS 255 NOLOGGING
STORAGE(
BUFFER_POOL DEFAULT) LOCAL
(PARTITION "P1"
PCTFREE 10 INITRANS 2 MAXTRANS 255 NOLOGGING
STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT)
TABLESPACE "TBS7" ,
PARTITION "P2"
PCTFREE 10 INITRANS 2 MAXTRANS 255 NOLOGGING
STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT)
TABLESPACE "TBS8" ,
PARTITION "P3"
PCTFREE 10 INITRANS 2 MAXTRANS 255 NOLOGGING
STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT)
TABLESPACE "TBS9" ,
PARTITION "P4"
PCTFREE 10 INITRANS 2 MAXTRANS 255 NOLOGGING
STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT)
TABLESPACE "TBS10" ,
PARTITION "P5"
PCTFREE 10 INITRANS 2 MAXTRANS 255 NOLOGGING
STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT)
TABLESPACE "TBS1" ,
PARTITION "P6"
PCTFREE 10 INITRANS 2 MAXTRANS 255 NOLOGGING
STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT)
TABLESPACE "TBS2" ,
PARTITION "P7"
PCTFREE 10 INITRANS 2 MAXTRANS 255 NOLOGGING
STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT)
TABLESPACE "TBS3" ,
PARTITION "P8"
PCTFREE 10 INITRANS 2 MAXTRANS 255 NOLOGGING
STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT)
TABLESPACE "TBS4" ,
PARTITION "P9"
PCTFREE 10 INITRANS 2 MAXTRANS 255 NOLOGGING
STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT)
TABLESPACE "TBS5" ,
PARTITION "P10"
PCTFREE 10 INITRANS 2 MAXTRANS 255 NOLOGGING
STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT)
TABLESPACE "TBS6" )
ALTER INDEX "U1"."IDX_F_2" MODIFY PARTITION "P6" UNUSABLE
ALTER INDEX "U1"."IDX_F_2" MODIFY PARTITION "P7" UNUSABLE
和客戶溝通后,確認今天問題發生之前有人對索引進行維護操作,操作語句包括:
alter index u1.IDX_F_2 rebuild partition p6 parallel
alter index U1.IDX_T_2 rebuild partition P9 nologging parallel online
alter index U1.IDX_T_1 rebuild partition P3 nologging parallel online
alter index U1.IDX_F_2 rebuild partition P1 nologging parallel online
alter index U1.IDX_T_4 rebuild partition P1 nologging parallel online
alter index U1.IDX_F_4 rebuild partition P5 nologging parallel online
在對索引進行維護之后,數據庫中出現了大量的enq: TM – contention等待,TM鎖出現的原和是索引IDX_F_2的PARTITION P6重建語句沒有添加ONLINE參數有直接關系。隨后大量會話被阻塞,而整個索引重建操作被人為中止,其中包括正在運行的ONLINE REBUILD操作,而ONLINE REBUILD操作被中止是十分危險的,很容易導致bug的產生,而當前就導致了ORA-600和ORA-7445的產生。
由于客戶著急解決問題,因此對數據庫進行了重啟。重啟后,ORA-600錯誤信息不再出現。但是前臺應用報錯,索引失效。
SELECT 'ALTER INDEX U1.' || INDEX_NAME || ' REBUILD PARTITION ' || PARTITION_NAME || ';'
FROM DBA_IND_PARTITIONS
WHERE INDEX_OWNER = 'U1'
AND STATUS != 'USABLE';
獲取所有失效的索引重建語句,將索引重新編譯后,數據庫恢復正常。
在Oracle的MOS上沒有找到與之最相關的bug信息,反而是找到了一個相關性很高的補丁信息,而對應的bug信息并沒有公開:補丁程序13737888: ONLINE DDL:ORA-600[KGHSTACK_UNDERFLOW_INTERNAL_3], [0X2B7F4E1E7678], [KEYBUF]。
前兩天看到一篇Redhat官方的Oracle安裝文檔,對于Linux內核參數的修改描述的非常清晰。
安裝Oracle之前,除了檢查操作系統的硬件和軟件是否滿足安裝需要之外,一個重點就是修改內核參數,其中最主要的是和內存相關的參數設置。
SHMMAX參數:Linux進程可以分配的單獨共享內存段的最大值。一般設置為內存總大小的一半。這個值的設置應該大于SGA_MAX_TARGET或MEMORY_MAX_TARGET的值,因此對于安裝Oracle數據庫的系統,shmmax的值應該比內存的二分之一大一些。
# grep MemTotal /proc/meminfo
# cat /proc/sys/kernel/shmmax
上面的命令是檢查系統內存的大小,以及當前shmmax的設置。
# echo 21474836480 > /proc/sys/kernetbl/shmmax
# sysctl -w kernel.shmmax=21474836480
# echo "kernel.shmmax=21474836480" >> /etc/sysctl.conf
這是設置shmmax參數的幾種方法,這三種方式都可以將shmmax設置為20G。這個參數的修改可以不重啟數據庫。個人推薦使用第二種sysctl命令的方式。采用第三種方式需要執行sysctl –t操作或重啟,但是為了確保下次重啟后設置值仍然生效,第三種方式是必不可少的。前兩種方式類似alter system set scope = memory,而第三種方式則類似alter system set scope = spfile。
SHMMNI參數:設置系統級最大共享內存段數量。Oracle10g推薦最小值為4096,可以適當比4096增加一些。
# cat /proc/sys/kernel/shmmni
# echo 4096 > /proc/sys/kernel/shmmni
# sysctl -w kernel.shmmni=4096
# echo "kernel.shmmni=4096" >> /etc/sysctl.conf
檢查和設置方法如上,這和shmmax的修改方式沒有區別,不在贅述。
SHMALL參數:設置共享內存總頁數。這個值太小有可能導致數據庫啟動報錯。很多人調整系統內核參數的時候只關注SHMMAX參數,而忽略了SHMALL參數的設置。這個值推薦設置為物理內存大小除以分頁大小。
# getconf PAGE_SIZE
通過getconf獲取分頁的大小,用來計算SHMALL的合理設置值:
SQL> select 32*1024*1024*1024/4096 from dual;
32*1024*1024*1024/4096
----------------------
8388608
對于32G的內存,4K分頁大小的系統而言,SHMALL的值應該設置為8388608。
# cat /proc/sys/kernel/shmall
# echo 8388608 > /proc/sys/kernel/shmall
# sysctl -w kernel.shmall=8388608
# echo " kernel.shmall=8388608" >> /etc/sysctl.conf
查詢和設置方法如上。
信號燈semaphores是進程或線程間訪問共享內存時提供同步的計數器。
SEMMSL參數:設置每個信號燈組中信號燈最大數量,推薦的最小值是250。對于系統中存在大量并發連接的系統,推薦將這個值設置為PROCESSES初始化參數加10。
SEMMNI參數:設置系統中信號燈組的最大數量。Oracle10g和11g的推薦值為142。
SEMMNS參數:設置系統中信號燈的最大數量。操作系統在分配信號燈時不會超過LEAST(SEMMNS,SEMMSL*SEMMNI)。事實上,如果SEMMNS的值超過了SEMMSL*SEMMNI是非法的,因此推薦SEMMNS的值就設置為SEMMSL*SEMMNI。Oracle推薦SEMMNS的設置不小于32000,假如數據庫的PROCESSES參數設置為600,則SEMMNS的設置應為:
SQL> select (600+10)*142 from dual;
(600+10)*142
------------
86620
SEMOPM參數:設置每次系統調用可以同時執行的最大信號燈操作的數量。由于一個信號燈組最多擁有SEMMSL個信號燈,因此有推薦將SEMOPM設置為SEMMSL的值。Oracle驗證的10.2和11.1的SEMOPM的配置為100。
通過下面的命令可以檢查信號燈相關配置:
# cat /proc/sys/kernel/sem
250 32000 100 128
對應的4個值從左到右分別為SEMMSL、SEMMNS、SEMOPM和SEMMNI。修改方法為:
# echo 610 86620 100 142 > /proc/sys/kernel/sem
# sysctl -w kernel.sem="610 86620 100 142"
# echo "kernel.sem=610 86620 100 142" >> /etc/sysctl.conf
在9i以前,很多功能都是不區分表和物化視圖的區別的,到了10g以后。很多功能會將表和物化視圖區分對待。
原本通用的COMMENT ON TABLE語句,對物化視圖不再有效,必須要使用COMMENT ON MATERIALIZED VIEW語句代替。
SQL> SELECT * FROM V$VERSION;
BANNER
----------------------------------------------------------------
Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 - 64bi
PL/SQL Release 10.2.0.4.0 - Production
CORE 10.2.0.4.0 Production
TNS for Linux: Version 10.2.0.4.0 - Production
NLSRTL Version 10.2.0.4.0 - Production
SQL> CREATE TABLE T_BASE (tbID NUMBER, TYPE VARCHAR2(30), NUM NUMBER);
Table created.
SQL> CREATE MATERIALIZED VIEW LOG ON T_BASE
2 WITH ROWID, SEQUENCE (TYPE, NUM)
3 INCLUDING NEW VALUES;
Materialized view log created.
SQL> CREATE MATERIALIZED VIEW MV_BASE
2 REFRESH FAST ENABLE QUERY REWRITE AS
3 SELECT TYPE, SUM(NUM) SUM_NUM, COUNT(NUM) CNT_NUM, COUNT(*) CNT
4 FROM T_BASE
5 GROUP BY TYPE;
Materialized view created.
SQL> COMMENT ON TABLE MV_BASE IS 'COMMENT ON A MATERIALIZED VIEW ';
COMMENT ON TABLE MV_BASE IS 'COMMENT ON A MATERIALIZED VIEW '
*
ERROR at line 1:
ORA-12098: cannot comment on the materialized view
SQL> COMMENT ON MATERIALIZED VIEW MV_BASE IS 'COMMENT ON A MATERIALIZED VIEW ';
Comment created.
SQL> COL COMMENTS FOR A60
SQL> SELECT * FROM USER_MVIEW_COMMENTS;
MVIEW_NAME COMMENTS
------------------------------ ------------------------------------------------------------
MV_BASE COMMENT ON A MATERIALIZED VIEW
其實不只是COMMENT發生了變化,關于物化視圖的執行計劃Oracle也對其進行細化,將物化視圖的掃描和全表掃描區分開:
SQL> SET AUTOT ON EXP
SQL> SELECT COUNT(*) FROM MV_BASE;
COUNT(*)
----------
0
Execution Plan
----------------------------------------------------------
Plan hash value: 3034976462
-------------------------------------------------------------------------
| Id | Operation | Name | Rows | Cost (%CPU)| Time |
-------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 2 (0)| 00:00:01 |
| 1 | SORT AGGREGATE | | 1 | | |
| 2 | MAT_VIEW ACCESS FULL| MV_BASE | 1 | 2 (0)| 00:00:01 |
-------------------------------------------------------------------------
Note
-----
- dynamic sampling used for this statement
SQL> SELECT /*+ REWRITE */ TYPE, COUNT(*) FROM T_BASE GROUP BY TYPE;
no rows selected
Execution Plan
----------------------------------------------------------
Plan hash value: 1008429399
----------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
----------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 30 | 2 (0)| 00:00:01 |
| 1 | MAT_VIEW REWRITE ACCESS FULL| MV_BASE | 1 | 30 | 2 (0)| 00:00:01 |
----------------------------------------------------------------------------------------
Note
-----
- dynamic sampling used for this statement
在9i以前,很難從執行計劃中區分掃描的是表還是物化視圖,但是現在一目了然了。
總的來說,這種改進還是很有意義的,用戶可以更清楚的了解處理的對象到底是表還是物化視圖。
客戶RAC環境在一個節點重啟后,另一個節點出現IPC send timeout信息。
詳細錯誤信息為:
Wed May 2 22:07:00 2012
IPC Send timeout detected.Sender: ospid 20808
Receiver: inst 1 binc 1718095761 ospid 16263
Wed May 2 22:07:02 2012
IPC Send timeout detected.Sender: ospid 6677
Receiver: inst 1 binc 1718095761 ospid 16263
Wed May 2 22:07:09 2012
IPC Send timeout detected.Sender: ospid 16758
Receiver: inst 1 binc 1718096035 ospid 16261
Wed May 2 22:07:13 2012
IPC Send timeout detected.Sender: ospid 8947
Receiver: inst 1 binc 1718095761 ospid 16263
Wed May 2 22:07:13 2012
IPC Send timeout detected.Sender: ospid 6583
Receiver: inst 1 binc 1718095761 ospid 16263
Wed May 2 22:07:31 2012
IPC Send timeout to 0.0 inc 24 for msg type 12 from opid 132
Wed May 2 22:07:31 2012
IPC Send timeout detected.Sender: ospid 17068
Receiver: inst 1 binc 1718095761 ospid 16263
Wed May 2 22:07:34 2012
Communications reconfiguration: tbinstance_number 1
Wed May 2 22:07:34 2012
IPC Send timeout to 0.0 inc 24 for msg type 12 from opid 154
Wed May 2 22:07:45 2012
IPC Send timeout to 0.0 inc 24 for msg type 12 from opid 64
Wed May 2 22:07:45 2012
IPC Send timeout to 0.0 inc 24 for msg type 12 from opid 95
Wed May 2 22:07:54 2012
IPC Send timeout detected.Sender: ospid 21078
Receiver: inst 1 binc 1718095761 ospid 16263
Wed May 2 22:07:59 2012
IPC Send timeout to 0.0 inc 24 for msg type 12 from opid 24
Wed May 2 22:08:04 2012
Trace dumping is performing id=[cdmp_20120502220729]
Wed May 2 22:08:24 2012
IPC Send timeout to 0.0 inc 24 for msg type 12 from opid 146
Wed May 2 22:08:36 2012
Trace dumping is performing id=[cdmp_20120502220805]
Wed May 2 22:08:38 2012
Trace dumping is performing id=[cdmp_20120502220805]
Wed May 2 22:10:55 2012
Evicting instance 1 from cluster
Wed May 2 22:11:32 2012
Waiting for instances to leave:
1
這個信息并不正常,查詢MOS后發現,這是一個bug,問題描述可以參考:'IPC Send Timeout Detected' errors between QMON Processes after RAC reconfiguration [ID 458912.1]。
對于當前的10.2.0.4環境,需要針對Bug 6200820進行PATCH修正,而對于10.2.0.3版本則需要應用Patch 6326889。
在MOS中查到不少類似IPC Timeout的問題,多數都會影響10.2.0.4版本,且大部分都在10.2.0.5中被fixed,因此如果這個問題出現頻繁,升級到10.2.0.5也是一個不錯的選擇。
Oracle 10g監聽listener不能啟動的原因有很多種,本文我們對這些造成listener不能啟用的原因進行了總結,接下來就讓我們一起來了解一下這部分內容。
1.當遇到Oracle出現下面提示時:ora-01034:oracle not available,ora-27101:shared mermory realm does not exist.
解決方式:
方法1:
1.輸入:connect/as sysdba;
2.重啟計算機就OK了;
方法2:
在命令行中輸入命令如下:
1. C:>svrmgrl
2. Oracle Server Manager Release 3.1.7.0.0 - Production
3. Copyright (c) 2000, Oracle Corporation.
tbAll Rights Reserved.
4. Oracle8i Enterprise Edition Release 8.1.7.0.0 - Production
5. With the Partitioning option
6. JServer Release 8.1.7.0.0 - Production
7.
8. SVRMGR> connect internal/oracle
9. 連接成功。
10.
11. SVRMGR> startup startup
12.
后再連接數據庫應該沒有問題了。
2. Oracle的Listener突然不能啟動,錯誤碼是1067.
解決方法:
進入dos
輸入lsnrctl start
等待顯示結果,我的結果如下
啟動tnslsnr:請稍候…
TNSLSNR for 32-bit Windows: Version 9.2.0.1.0 - Production
系統參數文件為E:oracleora92networkadminlistener.ora
寫入E:oracleora92networkloglistener.log的日志信息
監聽該對象時出錯: (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=123.118.1.39)(PORT=1521)))。
TNS-12545:因目標主機或對象不存在,連接失敗。
TNS-12560: TNS:協議適配器錯誤。
TNS-00515:因目標主機或對象不存在,連接失敗。
32-bit Windows Error: 49: Unknown error.
監聽程序未能啟動。請參閱上面的錯誤消息…
仔細核對,原來是自己修改了Ip地址。
方法1:可修改ip地址。
方法2:可修改E:oracleora92networkadminlistener.ora文件的配置。
3. AGENT服務無法啟動
解決方法︰
可以刪除networkagent目錄下的。q,.ver等文件,然后重新agentctl start即可。
若提示sqlnet.ora錯誤,可以查看一下sqlnet.ora內容。
1. # SQLNET.ORA Network Configuration file: D:oracleora92networkadminsqlnet.ora
2. # Generated by Oracle configuration tools.
3. SQLNET.AUTHENTICATION_SERVICES= (NTS)
4. NAMES.DIRECTORY_PATH= (TNSNAMES, ONAMES, HOSTNAME)
三層結構的sqlnet.ora的name
1. # NAMES.PREFERRED_SERVERS =
2. # (ADDRESS_LIST =
3. # (ADDRESS = (PROTOCOL = TCP)(HOST = MICROSOF-3D9384)(PORT = 1575))
4. # )
4. Oracle http server啟動不了
把IIS里面用80端口的站點停掉就行了,或者把Oracle Http Server端口改掉。
關于Oracle 10g監聽listener不能啟動的錯誤解決方案的總結就介紹到這里了,希望本次的介紹能夠對您有所收獲!
#g_kclist{font-size:12px;width:570px;float:none; margin-top:5px; clear:right}
#g_kclist a{color:#000; text-decoration:none}
#g_kclist h2{margin:0px;padding:0px;font-size:14px; text-align:center;background:url(http://www.thea.cn/zt/zt_img/zczhongduan.gif) no-repeat;line-height:31px;color:#fff}
#g_kclist table{line-height:25px;background:#B0DA90;margin-top:8px}
#g_kclist table td{ text-align:center;background:#fff}
#g_kclist table td.td1 a{color:#f00}
#g_kclist table th{background:#F2F7ED;color:#525F46}
Oracle中可以按照如下方式對用戶登陸失敗進行審計:
1、確認sys.aud$ 是否存在?
desc sys.aud$
2、觀察user$表中lcount為非0的用戶,如果包含被鎖賬戶,則可以判定很有可能是該用戶登陸嘗試失敗過多
造成了賬戶被鎖:
select name,lcount from sys.user$;
3、修改audit參數: audit_trail=none
alter system set audit_trail=db scope=spfile;
重啟數據庫。參數生效。
4、開啟tb登陸失敗審計:
AUDIT SESSION WHENEVER NOT SUCCESSFUL;
5、登陸失敗嘗試。
sqlplus w/錯誤密碼
6、檢查審計記錄
select * from sys.aud$;
里面有會話基本信息和機器名,用戶名等。
解鎖用戶
alter user atest account unlock;
解除由于密碼連續錯誤而鎖定用戶
alter profile default limit failed_login_attempts unlimited;
#g_kclist{font-size:12px;width:570px;float:none; margin-top:5px; clear:right}
#g_kclist a{color:#000; text-decoration:none}
#g_kclist h2{margin:0px;padding:0px;font-size:14px; text-align:center;background:url(http://www.thea.cn/zt/zt_img/zczhongduan.gif) no-repeat;line-height:31px;color:#fff}
#g_kclist table{line-height:25px;background:#B0DA90;margin-top:8px}
#g_kclist table td{ text-align:center;background:#fff}
#g_kclist table td.td1 a{color:#f00}
#g_kclist table th{background:#F2F7ED;color:#525F46}
由于歷史的原因,在多數企業都同時存在多個數據庫平臺,在每個數據庫平臺上都運行著相關的一套或多套應用。隨著單位業務不斷擴大,如何在不影響現有應用運行的前提下,快速有效地整合這些分布在單位內部不同數據庫平臺上的數據,是一個困擾CIO們的問題。面對這一問題,現有解決方案大致可分為以下兩種:
1.在應用程序上建立連接不同數據源的數據連接,這樣做要求程序員分清哪個連接是對應哪個數據庫的,而且如果設計時涉及到存儲過程還要按照不同數據庫的要求分別編寫,加重了程序員的要求。
2.在數據庫中設立快照,定時把其他數據源的數據復制到本地數據庫,這樣雖然解決了前一種方法中不同數據源的問題,但是由于是定時復制,數據不能實時同步,在實時性要求高的應用中這種方法便不能使用。
由于上述兩種方法都存在一定的缺點,這里介紹一種Oracle提供的解決oracle數據庫與異種數據源的連接問題的解決方案—Oracle的異構服務(Heterogeneous Services)。
程序運行效果截圖
異構服務
“異構服務”是集成在Oracle 8i數據庫軟件中的功能,它提供了從Oracle數據庫訪問其他非Oracle數據庫的通用技術。熟悉Oracle的讀者都很清楚,Oracle提供通過建立DB Link的方法訪問非本地數據庫,而“異構服務”提供通過建立DB Link使你能夠執行Oracle SQL查詢,透明地訪問其他非Oracle數據庫里的數據,就像訪問Oracle遠程數據庫一樣。“異構服務”分為兩種:
1. 事務處理服務(Transation Service):通過事務處理服務,使用戶在訪問非Oracle數據庫中支持事務處理功能。
2. SQL服務: 通過SQL服務,使用戶直接在Oracle數據庫中執行對非Oracle數據庫的各種SQL語句。
根據異構服務代理程序的不同,“異構服務”連接方式可以分為透明網關和通用連接兩種。
透明網關(Transparent Gateways) 透明網關使用Oracle提供的特定網關程序來設置代理,tb例如連接SQL Server則必須要有SQL Transparent Gateway for SQL Server。
通用連接(Generic Connectivity) 通用連接又分為ODBC連接和OLE DB連接兩種,其連接方法和透明網關沒有本質區別,只不過通用連接是和數據庫一起提供的功能,你不需要向Oracle購買相關的透明網關程序。
連接實例
這個實例的應用環境是Oracle 8.1.7,操作系統Windows 2000 Server英文版,采用通用連接的ODBC for SQL Server連接SQL Server 2000中文版。安裝步驟如下:
1. 安裝HS部件。
缺省情況下,HS服務是和Oracle 8.1.7一起安裝的,你可以查詢SYS用戶下是否存在HS_BASE_CAPS視圖,以確認HS部件是否安裝,如果沒有可以用相關的安裝盤進行安裝。
2. 配置ODBC系統連接字。
在控制面板選擇“Data Sources (ODBC)”,在“系統DNS”內配置ODBC for SQL Server連接字(dnsora2sql)。
3.配置tnsnames.ora,它位于ORACLE_HOME\NETWORK\ADMIN。
在這個文件中增加如下代碼:
Lnk2sql =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = HOSTNAME)(PORT = 1521)))
(CONNECT_DATA =
(SID = hs4sql) |< 服務的SID名稱,要和Listener里配置的sid相同)
(HS=OK) |< 打開HS服務選項
)
4.配置listener.ora,它位于ORACLE_HOME\NETWORK\ADMIN。
在這個文件中增加如下代碼:
SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(SID_NAME = hs4sql) |< 服務的SID名稱,與tnsname名稱相對應
(ORACLE_HOME = C:\oracle\ora9201)
(PROGRAM = hsodbc) |< 要使用的HS服務程序,如果使用OLE DB,程序名為hsole )
)
5. 重新啟動Oracle listener。
6. 編輯位于ORACLE_HOME\HS\ADMIN內init.ora,這里是iniths4sql。
修改如下兩行代碼:
HS_FDS_CONNECT_INFO = dnsora2sql |< ODBC系統名
HS_FDS_TRACE_LEVEL = 0
7. 創建DATABASE LINK。
create database link ‘ora2sql’ connect
to sql1 identified by sql1 using ‘lnk2sql’;
8. 測試連接。如:
SQL> select * from 到此我們已經完成了使用ODBC連接SQL SERVER的配置工作。
總體上說,異構服務擴展了Oracle數據庫連接異種數據源的能力,加強了企業數據的整合,是一個快速有效經濟地整合企業內部異構數據的解決方案。
ADO是Active Data Object的縮寫,稱為ActiveX數據對象。利用ADO對象,通過ODBC驅動程序或OLE DB連接字符串,可實現對任意數據庫的存取和訪問。
OLE DB是微軟用來替代ODBC的一種數據庫訪問技術。是一種對關系型數據庫和非關系型數據庫均有效的一種數據庫訪問技術。
ADO提供了7個獨立的對象,利用這些對象,可實現對數據庫的存取和訪問:
·Connection 連接對象。
·Command 命令對象,利用命令對象可執行一個SQL存儲過程或有參數的查詢。
·Parameter 參數對象。
·Recordset 記錄集對象,代表從數據表中通過查詢所獲得的一組記錄。通過該對象的方法和屬性,可實現對記錄的存取和操作。
·Field 字段對象,代表記錄集中的一個字段。Fields為字段集合,tb代表一條記錄的全部字段。
·Property 屬性對象。
·Error 錯誤對象。
Connection,Command和Recordset是整個ADO的核心,通過Connection對象與一個數據庫建立連接,然后利用Command對象執行查詢,從而返回查詢結果,并將結果(記錄集)存入Recordset對象中,利用服務器端腳本,通過訪問Recordset對象,便可獲得查詢到的記錄內容。
另外,利用Connection對象的Execute方法和Recordset對象的Open方法,也可執行一個查詢,返回一個記錄集。
ODBC數據源的用戶數據源,系統數據源和文件數據源。用戶和系統DSN存儲在WindowsNT注冊表中,系統DSN可被登錄的所有用戶訪問和使用,用戶DSN只能提供特定的用戶訪問和使用。 文件DSN是存儲在一個擴展名為.dsn的文本文件中,可供多個用戶訪問和使用,并可實現復制,通用性強,一般采用此方式。
ADO連接對象
連接對象在使用前必須先創建該對象的實例:
Set 實例名=Server.CreateObject("ADODB.Connection")
連接對象的方法:
·Open方法
連接對象.Open 數據源名 | 連接字符串
帶參數調用Open方法時,其參數實質是傳遞給連接對象的ConnectionString屬性的。因此,可事先設置ConnectionString屬性的值,然后再調用不帶參數的Open方法。
·Close方法
連接對象.Close 釋放:Set conn=Nothing
·Execute方法
該方法用于執行SQL語句。根據SQL語句執行后是否返回記錄集,該方法的使用格式分為以下兩種:
1.執行SQL查詢語句時,將返回查詢得到的記錄集。
用法為:
Set 對象變量名=連接對象.Execute("SQL 查詢語言")
Execute方法調用后,會自動創建記錄集對象,并將查詢結果存儲在該記錄對象中,通過Set方法,將記錄集賦給指定的對象保存,以后對象變量就代表了該記錄集對象。
2.執行SQL的操作性語言時,沒有記錄集的返回。
此時用法為:
連接對象.Execute "SQL 操作性語句" [, RecordAffected][, Option]
·RecordAffected 為可選項,此出可放置一個變量,SQL語句執行后,所生效的記錄數會自動保存到該變量中。通過訪問該變量,就可知道SQL語句隊多少條記錄進行了操作。
·Option 可選項,該參數的取值通常為adCMDText,它用于告訴ADO,應該將Execute方法之后的第一個字符解釋為命令文本。通過指定該參數,可使執行更高效。
·BeginTrans、RollbackTrans、CommitTrans方法
這三個方法是連接對象提供的用于事務處理的方法。BeginTrans用于開始一個事物;RollbackTrans用于回滾事務;CommitTrans用于提交所有的事務處理結果,即確認事務的處理。
事務處理可以將一組操作視為一個整體,只有全部語句都成功執行后,事務處理才算成功;若其中有一個語句執行失敗,則整個處理就算失敗,并恢復到處里前的狀態。
BeginTrans和CommitTrans用于標記事務的開始和結束,在這兩個之間的語句,就是作為事務處理的語句。判斷事務處理是否成功,可通過連接對象的Error集合來實現,若Error集合的成員個數不為0,則說明有錯誤發生,事務處理失敗。Error集合中的每一個Error對象,代表一個錯誤信息。
另外,利用SQL本身所提供的事務處理語句,通過編寫存儲過程,然后利用ADO命令對象的相關方法,通過調用執行存儲過程,也可實現事務。
DECODE()函數用法
作用:將輸入數值與函數中的參數列表相比較,根據輸入值返回一個對應值。函數的參數列表是由若干數值及其對應結果值組成的若干序偶形式。當然,假如未能與任何一個實參序偶匹配成功,則函數也有默認的返回值。 區別于SQL的其它函數,DECODE函數還能識別和操作空值。
語法:DECODE(control_value,value1,result1[,value2,result2…][,default_result]);
control _value試圖處理的數值。DECODE函數將該數值與后面的一系列的偶序相比較,以決定返回值。 value1是一組成序偶的數值。假如輸入數值與之匹配成功,則相應的結果將被返回。對應一個空的返回值,可以使用要害字NULL于之對應 result1 是一組成序偶的結果值。 default_result 未能與任何一個值匹配時,函數返回的默認值。
例如: selectdecode( x , 1 , 'x is 1 ', 2 , 'x is 2 ', 'others') from dual 當x等于1時,則返回'x is 1'. 當x等于2時,則返回'x is 2'. 否則,返回others'. 需要,比較2個值的時候,可以配合SIGN()函數一起使用。 SELECT DECODE( SIGN(5 -6), 1 'Is Positive', -1, 'Is Nagative', 'Is Zero') 同樣,也可以用CASE實現: SELECT CASE SIGN(5 - 6) WHEN 1 THEN 'Is Positive'WHEN -1 THEN 'Is Nagative'ELSE 'Is Zero' ENDFROM DUAL此外,還可以在Order by中使用Decode. 例如:表table_subject,有subject_name列。要求按照:語、數、外的順序進行排序。
tb這時,就可以非常輕松的使用Decode完成要求了。 select * from table_subject order by decode(subject_name, '語文', 1, '數學', 2, , '外語',3)
將所有的結果全部寫出
select * from classes t
數據為
1 1 一班 NUM_1
2 2 二班 NUM_2
3 3 三班 NUM_3
4 4 四班 NUM_4
select t.* from classes t order by decode(t.classnum,'NUM_1',4,'NUM_2',3,'NUM_3',1);
1 3 三班 NUM_3
2 2 二班 NUM_2
3 1 一班 NUM_1
4 4 四班 NUM_4
必須將所有的結果寫出
本周Oracle宣布下一步將全力實施它的安全策略,并透露計劃去整合安全產品到應用產品線同時擴展企業安全搜索。為確保自己成為一家名副其實的安全產品廠商,Oracle花費了大量資金,先后收購了許多訪問管理、身份管理和其他安全性軟件制造商。
在周三的安全性策略簡報中,Oracle公司承諾將會整合些安全性產品到自己的Fusion應用系統中。該系統將在2008年發布。公司還計劃下個月擴展新的企業安全搜索的能力,允許搜索引擎不僅可以搜索Oracle應用系統和數據庫而且還可直接訪問電子郵件和文件系統。
當Oracle做到產品安全時,它的范圍將是非常廣闊的。在數據庫方面,公司提出高級安全性選項用于數據加密,數據庫保護用于防止內部用戶濫用他們的數據訪問權限,安全標簽用于指定不同安全級別的數據,安全備份用于加密備份的磁帶。Oracle還提供了多樣的身份管理能力,包括目錄服務、身份驗證、web服務訪問控制。Oracle還將審計和一致性應用作為其安全措施的一部分。
如何辨別安全領域的產品主要看產品是否具備自動安全處理能力如身份管理和數據保護。Oracle負責服務器技術的高級副總裁Thomas Kurian說:“通過Fusion中我們將整合那些全部的安全特性到我們的企業應用中。”但這并意味著Oracle的單機安全應用會在近期發布,目前它還在研發過程中。所以客戶需要繼續去管理他們的非Oracle的應用系統。
Oracle的企業安全搜索可以讓企業員工在整個公司數據庫和應用系統中搜尋信息。Oracle總裁Charles Phillips說:“客戶說希望讓他們的用戶能夠象用Google一樣的搜索,但不能搜尋到他們不該看到的信息。”企業安全搜索設計與Oracle Portal開發的企業門戶配合使用,如同在Oracle數據庫開發數據庫應用。公司計劃去新增個適配器實現企業對微軟Exchange和SharePoint的搜索。
企業策略組織的高級分析師Jon Oltsik說,Oracle認定產品的安全特性有廣闊市場機會,同樣市場目標IBM收購了Internet Security Systems,EMC收購了RSA Security。但是客戶關心的是增強他們IT基礎設置的安全性,而不是去防止他們咨詢奇特的問題。雖然歷史不是總能暗示出未來,但IT安全支持者不可能忘記在Oracle危急補丁升級期間的那些壞經歷。當Oracle轉向安全領域時,它被人們認為是賣萬金油的,主要就是他們產品質量的因素。
投資者金融服務公司Investors Bank & Trust早已經使用了Oracle的電子商務應用和數據庫,但是系統使用的效果沒有之前預期的好。該金融服務公司在過去兩年一直是采用的IBM的訪問和身份管理技術。Investors Bank & Trust公司企業應用主管說:"如果Oracle真的能夠將安全特性整合到他們的產品中,能夠他們承諾的那樣去做的話,他們的軟件產品將變的更加引人注目"。
從目前來看,Oracle Fusion計劃的實現還有很長的路要走。在這期間Oracle需要繼續面對那些長期的競爭對手,tb如CA,IBM和sun等。現在的疑問不是Oracle能不能夠將安全性產品推銷給自己的客戶群而是他能不能就產品銷售給競爭對手的客戶。
#g_kclist{font-size:12px;width:570px;float:none; margin-top:5px; clear:right}
#g_kclist a{color:#000; text-decoration:none}
#g_kclist h2{margin:0px;padding:0px;font-size:14px; text-align:center;background:url(http://www.thea.cn/zt/zt_img/zczhongduan.gif) no-repeat;line-height:31px;color:#fff}
#g_kclist table{line-height:25px;background:#B0DA90;margin-top:8px}
#g_kclist table td{ text-align:center;background:#fff}
#g_kclist table td.td1 a{color:#f00}
#g_kclist table th{background:#F2F7ED;color:#525F46}