OPAQUE_TRANSFORM提示的产生

最近经常在AWR中看到带有OPAQUE_TRANSFORM提示的SQL语句,根据分析可以确认执行这个SQL的语句是通过数据库链连接到本地,但是测试时发现,普通的数据库链连接并不会导致这个提示的产生。
于是做了一个简单的例子:

-bash-3.2$ sqlplus test/test
SQL*Plus: Release 10.2.0.5.0 - Production ON Mon DEC 5 15:05:09 2011
Copyright (c) 1982, 2010, Oracle. ALL Rights Reserved.
Connected TO:
Oracle DATABASE 11g Enterprise Edition Release 11.2.0.2.0 - Production
WITH the Partitioning, OLAP, DATA Mining AND REAL Application Testing options
SQL> SET pages 100 LINES 120
SQL> CREATE DATABASE link link_10g CONNECT TO test IDENTIFIED BY test USING '192.168.0.20/orcl10g';
DATABASE link created.
SQL> SELECT global_name FROM global_name@link_10g;
GLOBAL_NAME
--------------------------------------------------------------------------------------
ORCL10G

在10g的数据库上,建立TEST用户和测试表,监控从11g通过数据库链的连接:

[ora10g@hpserver ~]$ sqlplus / AS sysdba
SQL*Plus: Release 10.2.0.4.0 - Production ON Mon DEC 5 15:09:27 2011
Copyright (c) 1982, 2007, Oracle. ALL Rights Reserved.
Connected TO:
Oracle DATABASE 10g Enterprise Edition Release 10.2.0.4.0 - Production
WITH the Partitioning, Oracle Label Security, DATA Mining AND REAL Application Testing options
SQL> CREATE USER test IDENTIFIED BY test DEFAULT tablespace users;
USER created.
SQL> GRANT CONNECT, resource TO test;
GRANT succeeded.
SQL> conn test/test
Connected.
SQL> CREATE TABLE t AS SELECT * FROM all_objects;
TABLE created.
SQL> conn / AS sysdba
Connected.
SQL> SELECT SID, USERNAME FROM V$SESSION WHERE USERNAME = 'TEST';
SID        USERNAME
---------- ------------------------------
146        TEST

回到11g环境中执行下面的查询:

SQL> CREATE TABLE t AS SELECT * FROM dba_objects;
TABLE created.
SQL> SET autot trace
SQL> SELECT b.owner, a.object_name FROM t a, t@link_10g b WHERE a.owner = b.owner AND a.object_name = b.object_name;
4626 ROWS selected.
Execution Plan
----------------------------------------------------------
Plan hash VALUE: 2085754
-------------------------------------------------------------------------------------------
| Id  | Operation          | Name | ROWS  | Bytes | Cost (%CPU)| TIME     | Inst   |IN-OUT|
-------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT   |      |  5391 |   615K|    59   (2)| 00:00:01 |        |      |
|*  1 |  HASH JOIN         |      |  5391 |   615K|    59   (2)| 00:00:01 |        |      |
|   2 |   REMOTE           | T    |  5391 |   178K|    16   (0)| 00:00:01 | LINK_~ | R->S |
|   3 |   TABLE ACCESS FULL| T    | 13657 |  1106K|    42   (0)| 00:00:01 |        |      |
-------------------------------------------------------------------------------------------
Predicate Information (IDENTIFIED BY operation id):
---------------------------------------------------
   1 - access("A"."OWNER"="B"."OWNER" AND "A"."OBJECT_NAME"="B"."OBJECT_NAME")
Remote SQL Information (IDENTIFIED BY operation id):
----------------------------------------------------
   2 - SELECT "OWNER","OBJECT_NAME" FROM "T" "B" (accessing 'LINK_10G' )
Note
-----
   - dynamic sampling used FOR this statement (level=2)
Statistics
----------------------------------------------------------
         11  recursive calls
          1  db block gets
        584  consistent gets
        214  physical reads
        256  redo SIZE
     140575  bytes sent via SQL*Net TO client
       3788  bytes received via SQL*Net FROM client
        310  SQL*Net roundtrips TO/FROM client
          1  sorts (memory)
          0  sorts (disk)
       4626  ROWS processed

在10g环境中,检查对应的SQL语句:

SQL> SELECT SQL_TEXT FROM V$SQL WHERE SQL_ID IN (SELECT SQL_ID FROM V$SESSION WHERE SID = 146);
no ROWS selected
SQL> SELECT SQL_TEXT FROM V$SQL WHERE SQL_ID IN (SELECT PREV_SQL_ID FROM V$SESSION WHERE SID = 146);
SQL_TEXT
--------------------------------------------------------------------------------
SELECT "OWNER","OBJECT_NAME" FROM "T" "B"

并没有找到预期的OPAQUE_TRANSFORM提示。看来并不是简单的通过数据库链查询的SQL就会导致这个提示,查询了一下MOS发现,最常见的类似INSERT AS SELECT方式就会导致这个HINT的产生,验证一下,在11g数据库中执行:

SQL> SET autot off
SQL> ALTER TABLE t DROP (edition_name, namespace);
TABLE altered.
SQL> EXPLAIN plan FOR INSERT INTO t SELECT * FROM t@link_10g;
Explained.
SQL> SELECT * FROM TABLE(dbms_xplan.display);
PLAN_TABLE_OUTPUT
-------------------------------------------------------------------------------------------
Plan hash VALUE: 1788691278
-------------------------------------------------------------------------------------------
|Id | Operation                | Name| ROWS  | Bytes |Cost(%CPU)| TIME     | Inst   |IN-OUT|
-------------------------------------------------------------------------------------------
| 0 | INSERT STATEMENT         |     |  5391 |   673K|  16   (0)| 00:00:01 |        |      |
| 1 |  LOAD TABLE CONVENTIONAL | T   |       |       |          |          |        |      |
| 2 |   REMOTE                 | T   |  5391 |   673K|  16   (0)| 00:00:01 | LINK_~ | R->S |
-------------------------------------------------------------------------------------------
Remote SQL Information (IDENTIFIED BY operation id):
----------------------------------------------------
   2 - SELECT /*+ OPAQUE_TRANSFORM */ "OWNER","OBJECT_NAME","SUBOBJECT_NAME","OBJECT_ID",
       "DATA_OBJECT_ID","OBJECT_TYPE","CREATED","LAST_DDL_TIME","TIMESTAMP","STATUS","TEMPORARY"
       ,"GENERATED","SECONDARY" FROM "T" "T" (accessing 'LINK_10G' )
17 ROWS selected.
SQL> INSERT INTO t SELECT * FROM t@link_10g;
4656 ROWS created.

在执行计划中已经可以看到OPAQUE_TRANSFORM提示的存在了,为了进一步验证,运行一个INSERT INTO SELECT语句,在10g环境中查询本地的SQL:

SQL> SELECT SQL_TEXT FROM V$SQL WHERE SQL_ID IN (SELECT PREV_SQL_ID FROM V$SESSION WHERE SID = 146);
SQL_TEXT
--------------------------------------------------------------------------------
SELECT /*+ OPAQUE_TRANSFORM */ "OWNER","OBJECT_NAME","SUBOBJECT_NAME","OBJECT_ID
","DATA_OBJECT_ID","OBJECT_TYPE","CREATED","LAST_DDL_TIME","TIMESTAMP","STATUS",
"TEMPORARY","GENERATED","SECONDARY" FROM "T" "T"

现在可以确认,平常看到的OPAQUE_TRANSFORM提示,都是通过数据库链执行INSERT INTO SELECT语句所致。

Posted in ORACLE | Tagged , , | Leave a comment

索引重建的数据源(二)

对这个问题有了进一步的认识。
索引重建的数据源:http://yangtingkun.itpub.net/post/468/457384
上一篇文章测试的结果认为DDL也是基于CBO的,但是今天发现问题并非如此。Oracle在评估REBUILD索引时并不是根据统计信息,而是根据数据字典中非索引字段的长度:

SQL> CREATE TABLE t_rebuild (id NUMBER, flag CHAR(1));
TABLE created.
SQL> INSERT INTO t_rebuild SELECT rownum, 'a' FROM dba_objects;
15695 ROWS created.
SQL> commit;
Commit complete.
SQL> CREATE INDEX ind_t_rebuild_id ON t_rebuild(id);
INDEX created.
SQL> EXPLAIN plan FOR ALTER INDEX ind_t_rebuild_id rebuild;
Explained.
SQL> SELECT * FROM TABLE(dbms_xplan.display);
PLAN_TABLE_OUTPUT
-------------------------------------------------------------------------------------------
Plan hash VALUE: 3014377519
-------------------------------------------------------------------------------------------
| Id  | Operation              | Name             | ROWS  | Bytes | Cost (%CPU)| TIME     |
-------------------------------------------------------------------------------------------
|   0 | ALTER INDEX STATEMENT  |                  |    82 |  1066 |     2   (0)| 00:00:01 |
|   1 |  INDEX BUILD NON UNIQUE| IND_T_REBUILD_ID |       |       |            |          |
|   2 |   SORT CREATE INDEX    |                  |    82 |  1066 |            |          |
|   3 |    TABLE ACCESS FULL   | T_REBUILD        |    82 |  1066 |     2   (0)| 00:00:01 |
-------------------------------------------------------------------------------------------
10 ROWS selected.
SQL> ALTER TABLE t_rebuild MODIFY (flag CHAR(2));
TABLE altered.
SQL> EXPLAIN plan FOR ALTER INDEX ind_t_rebuild_id rebuild;
Explained.
SQL> SELECT * FROM TABLE(dbms_xplan.display);
PLAN_TABLE_OUTPUT
-------------------------------------------------------------------------------------------
Plan hash VALUE: 3014377519
-------------------------------------------------------------------------------------------
| Id  | Operation              | Name             | ROWS  | Bytes | Cost (%CPU)| TIME     |
-------------------------------------------------------------------------------------------
|   0 | ALTER INDEX STATEMENT  |                  |  2288 | 29744 |     7   (0)| 00:00:01 |
|   1 |  INDEX BUILD NON UNIQUE| IND_T_REBUILD_ID |       |       |            |          |
|   2 |   SORT CREATE INDEX    |                  |  2288 | 29744 |            |          |
|   3 |    TABLE ACCESS FULL   | T_REBUILD        |  2288 | 29744 |     7   (0)| 00:00:01 |
-------------------------------------------------------------------------------------------
10 ROWS selected.
SQL> ALTER TABLE t_rebuild MODIFY (flag CHAR(3));
TABLE altered.
SQL> EXPLAIN plan FOR ALTER INDEX ind_t_rebuild_id rebuild;
Explained.
SQL> SELECT * FROM TABLE(dbms_xplan.display);
PLAN_TABLE_OUTPUT
-------------------------------------------------------------------------------------------
Plan hash VALUE: 43729923
-------------------------------------------------------------------------------------------
| Id  | Operation              | Name             | ROWS  | Bytes | Cost (%CPU)| TIME     |
-------------------------------------------------------------------------------------------
|   0 | ALTER INDEX STATEMENT  |                  |  4738 | 61594 |    13   (0)| 00:00:01 |
|   1 |  INDEX BUILD NON UNIQUE| IND_T_REBUILD_ID |       |       |            |          |
|   2 |   SORT CREATE INDEX    |                  |  4738 | 61594 |            |          |
|   3 |    INDEX FAST FULL SCAN| IND_T_REBUILD_ID |       |       |            |          |
-------------------------------------------------------------------------------------------
10 ROWS selected.

随着非索引列的长度增加,重建索引的执行计划由全表扫描变成了索引快速全扫。
整个过程并没有收集过表或索引的统计信息,但是执行计划已经发生了改变,下面尝试关闭统计信息动态收集,以及设置表和列属性的方式影响执行计划:

SQL> ALTER SESSION SET optimizer_dynamic_sampling = 0;
SESSION altered.
SQL> EXPLAIN plan FOR ALTER INDEX ind_t_rebuild_id rebuild;
Explained.
SQL> SELECT * FROM TABLE(dbms_xplan.display);
PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------------------
Plan hash VALUE: 43729923
-------------------------------------------------------------------------------------------
| Id  | Operation              | Name             | ROWS  | Bytes | Cost (%CPU)| TIME     |
-------------------------------------------------------------------------------------------
|   0 | ALTER INDEX STATEMENT  |                  |  4738 | 61594 |    13   (0)| 00:00:01 |
|   1 |  INDEX BUILD NON UNIQUE| IND_T_REBUILD_ID |       |       |            |          |
|   2 |   SORT CREATE INDEX    |                  |  4738 | 61594 |            |          |
|   3 |    INDEX FAST FULL SCAN| IND_T_REBUILD_ID |       |       |            |          |
-------------------------------------------------------------------------------------------
10 ROWS selected.
SQL> EXEC dbms_stats.set_table_stats(USER, 'T_REBUILD', numrows => 1, numblks => 1, avgrlen => 2)
PL/SQL PROCEDURE successfully completed.
SQL> EXPLAIN plan FOR ALTER INDEX ind_t_rebuild_id rebuild;
Explained.
SQL> SELECT * FROM TABLE(dbms_xplan.display);
PLAN_TABLE_OUTPUT
-------------------------------------------------------------------------------------------
Plan hash VALUE: 43729923
-------------------------------------------------------------------------------------------
| Id  | Operation              | Name             | ROWS  | Bytes | Cost (%CPU)| TIME     |
-------------------------------------------------------------------------------------------
|   0 | ALTER INDEX STATEMENT  |                  |     1 |     2 |     2   (0)| 00:00:01 |
|   1 |  INDEX BUILD NON UNIQUE| IND_T_REBUILD_ID |       |       |            |          |
|   2 |   SORT CREATE INDEX    |                  |     1 |     2 |            |          |
|   3 |    INDEX FAST FULL SCAN| IND_T_REBUILD_ID |       |       |            |          |
-------------------------------------------------------------------------------------------
10 ROWS selected.
SQL> EXEC dbms_stats.set_column_stats(USER, 'T_REBUILD', 'FLAG', avgclen => 1)
PL/SQL PROCEDURE successfully completed.
SQL> EXPLAIN plan FOR ALTER INDEX ind_t_rebuild_id rebuild;
Explained.
SQL> SELECT * FROM TABLE(dbms_xplan.display);
PLAN_TABLE_OUTPUT
-------------------------------------------------------------------------------------------
Plan hash VALUE: 43729923
-------------------------------------------------------------------------------------------
| Id  | Operation              | Name             | ROWS  | Bytes | Cost (%CPU)| TIME     |
-------------------------------------------------------------------------------------------
|   0 | ALTER INDEX STATEMENT  |                  |     1 |     2 |     2   (0)| 00:00:01 |
|   1 |  INDEX BUILD NON UNIQUE| IND_T_REBUILD_ID |       |       |            |          |
|   2 |   SORT CREATE INDEX    |                  |     1 |     2 |            |          |
|   3 |    INDEX FAST FULL SCAN| IND_T_REBUILD_ID |       |       |            |          |
-------------------------------------------------------------------------------------------
10 ROWS selected.

很明显DDL执行计划的确定其实和统计信息没有什么关系,而完全是根据数据字典确定的。因此这实际上也是一种RULE,只不过Oracle将这个条件写到了优化器中,如果将优化器设置为RULE,Oracle同样可以做出相同的判断:

SQL> ALTER SESSION SET optimizer_mode = rule;
SESSION altered.
SQL> DROP TABLE t_rebuild purge;
TABLE dropped.
SQL> CREATE TABLE t_rebuild (id NUMBER, flag CHAR(1));
TABLE created.
SQL> INSERT INTO t_rebuild SELECT rownum, 'a' FROM dba_objects;
15695 ROWS created.
SQL> commit;
Commit complete.
SQL> CREATE INDEX ind_t_rebuild_id ON t_rebuild(id);
INDEX created.
SQL> EXPLAIN plan FOR ALTER INDEX ind_t_rebuild_id rebuild;
Explained.
SQL> SELECT * FROM TABLE(dbms_xplan.display);
PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------------------
Plan hash VALUE: 3014377519
---------------------------------------------------
| Id  | Operation              | Name             |
---------------------------------------------------
|   0 | ALTER INDEX STATEMENT  |                  |
|   1 |  INDEX BUILD NON UNIQUE| IND_T_REBUILD_ID |
|   2 |   SORT CREATE INDEX    |                  |
|   3 |    TABLE ACCESS FULL   | T_REBUILD        |
---------------------------------------------------
Note
-----
   - rule based optimizer used (consider USING cbo)
14 ROWS selected.
SQL> ALTER TABLE t_rebuild MODIFY flag CHAR(3);
TABLE altered.
SQL> EXPLAIN plan FOR ALTER INDEX ind_t_rebuild_id rebuild;
Explained.
SQL> SELECT * FROM TABLE(dbms_xplan.display);
PLAN_TABLE_OUTPUT
------------------------------------------------------------------------------------------
Plan hash VALUE: 43729923
 
---------------------------------------------------
| Id  | Operation              | Name             |
---------------------------------------------------
|   0 | ALTER INDEX STATEMENT  |                  |
|   1 |  INDEX BUILD NON UNIQUE| IND_T_REBUILD_ID |
|   2 |   SORT CREATE INDEX    |                  |
|   3 |    INDEX FAST FULL SCAN| IND_T_REBUILD_ID |
---------------------------------------------------
Note
-----
   - rule based optimizer used (consider USING cbo)
14 ROWS selected.

不过由于很多DDL操作对于的表或对象本身就没有统计信息,完全使用CBO是不现实的,也是不准确的,所以采用这种基于规则的执行计划也是有道理的。不过事实上,对于DDL而言,有多种执行计划可选择的其实也并不多。

Posted in ORACLE | Tagged , | Leave a comment

ORA-600(qerfxFetch_01)错误

在客户的9201数据库中,发现这个错误。
错误信息为:

Wed Jul 29 09:23:32 2009
Errors IN file /opt/oracle/admin/eomsdb/udump/eomsdb_ora_20242.trc:
ORA-00600: internal error code, arguments: [qerfxFetch_01], [], [], [], [], [], [], []

查询MOS发现,这是我见过描述最为简洁的bug:Bug 2306106 – OERI:[qerfxFetch_01] possible – affects OEM [ID 2306106.8],在描述部分只有三个词,可能影响OEM。
这个bug在9.2.0.2和10.1.0.2中被fixed。

Posted in BUG | Tagged , , | Leave a comment

11g收集统计信息引发wri$_optstat_histhead_history表的删除

在查看一个客户11.2.0.2的AWR报告时,发现了这个问题。

在SQL ORDER
BY ELASPED TIME表中,前两项的结果如下:

Elapsed
Time (s)

Executions

%Total

%CPU

%IO

SQL
Id

SQL
Module

SQL
Text

10,752.79

0

25.86

98.20

7.49

4sff1qphjvbwn

SQL*Plus

BEGIN
dbms_stats.gather_table_…

10,752.75

13

25.86

98.20

7.49

bqn2h1xrmhmht

delete
from sys.wri$_optstat_h…

可以看到,这2两个语句在花费时间,占用CPU以及IO的百分比上惊人的一致,这绝对不是一个偶然的事件。

第一个SQL是收集表的统计信息,显然这是在SQLPLUS里面执行的操作,其执行次数是0,说明在采样时间内,这个操作还没有完成。根据Elspsed Time估算,这个SQL已经运行了3个小时。

而第二个SQL是在删除wri$_optstat_histhead_history表,从表名上看,应该和awr的历史统计信息有关,其执行次数是13次。一个合理的推断就是收集统计信息会导致wri$_optstat_histhead_history表的删除操作,而这个删除操作可能异常缓慢,从而引发了这个问题。

查询MOS,果然发现是一个bug:Bug 10279045 – Slow Statistics purging
(SYSAUX grows) [ID 10279045.8],导致问题的原因是在进行统计信息的PURGE操作时,删除wri$_optstat_histhead_history表产生了长时间的全表扫描操作。

确认影响的版本包括11.1.0.7、11.2.0.1和11.2.0.2,这个问题在11.2.0.3中被fixed。

 

Posted in BUG | Tagged , , | Leave a comment

Oracle VM服务器安装和升级手册

还记得Oracle一推出VM时,我写了一篇文章,不过之后一直没有研究VM。一转眼VM的版本已经到了3.0。
之所以以前一直研究,是因为一直认为数据库和虚拟化的关系并不大。最近几年VMWare发展迅猛,但是跑在上面的数据库却寥寥无几。因此,即使是Oracle自己推出的VM,也一直没有提起兴趣来研究。
不过Oracle的VM有一个最大的优点,就是Oracle在计算License时,承认它自己VM所划分的CPU数,而其他虚拟化软件的CPU划分,严格意义上Oracle是不承认的。
除了License上的好处,各种模板的推出也带来了快速部署的好处。因此打算深入研究一下Oracle的VM,由于以前确实没有安装过,所以这次从安装手册开始看起。
这篇文档的地址:http://docs.oracle.com/cd/E20065_01/doc.30/e18548/toc.htm

Posted in BOOKS | Leave a comment

Oracle高级安全管理手册总结

国内越来越多客户开始注重安全相关的内容了,使得原本一些很少使用的技术,现在开始变得十分的流行。
这篇文档介绍的透明数据加密、网络传输数据加密以及ORACLE Wallet等内容,目前已经有不少客户开始或准备开始应用。而对于绝大部分人而言,这些还是一个很新的内容,真正有经验的人并不多,而随着以后安全性方面的内容越来越受重视,具有安全性知识的DBA会拥有更多的机会。

Posted in BOOKS | Leave a comment

运行脚本diagcollection.pl报错

Oracle的RAC提供了diagcollection.pl脚本,用来收集CLUSTER和数据库的脚本。不过在客户环境中执行这个脚本报错。
详细错误信息为:

[root@smsdbrac1 ora_test]# $ORA_CRS_HOME/bin/diagcollection.pl -crshome=$ORA_CRS_HOME -collect
Production Copyright 2004, 2005, Oracle. ALL rights reserved
Cluster Ready Services (CRS) diagnostic collection tool
The following CRS diagnostic archives will be created IN the LOCAL directory.
crsData_smsdbrac1.tar.gz -> logs,traces AND cores FROM CRS home. Note: core files will be packaged ONLY WITH the -core OPTION.
ocrData_smsdbrac1.tar.gz -> ocrdump, ocrcheck etc
coreData_smsdbrac1.tar.gz -> contents OF CRS core files IN text format
Collecting crs DATA
sh: line 1: /bin/tar: Argument list too long
gzip: crsData_smsdbrac1.tar: No such file OR directory
Collecting OCR DATA
Collecting information FROM core files
Previous frame INNER TO this frame (corrupt stack?)
Previous frame INNER TO this frame (corrupt stack?)
The following Oracle Home diagnostic archives will be created IN the LOCAL directory.
oraData_smsdbrac1.tar.gz -> logs, traces AND cores FROM Oracle Home
Collecting oracle home DATA
/bin/tar: Removing LEADING `/' from member names

执行脚本出现Argument list too long的错误,查询MOS发现导致问题的原因CRS目录中的文件太多,以致于超过了shell的限制。
在11g中可以使用—afterdatevar来限制时间范围,从而减少CRS中采集的文件数量。
对于10.2版本,除了手工收集脚本这个办法外,还可以考虑手工减少日志数量的方法。进入$CRS_HOME/log//client目录,将所有一个月前的日志打包并压缩,然后删除,再次运行diagcollection.pl脚本即可。

Posted in BUG | Tagged , | Leave a comment

告警日志出现skgpspawn failed category 27142错误

客户的数据库告警日志出现skgpspawn failed信息。
详细错误信息如下:

Mon Nov 28 07:59:59 2011
skgpspawn failed:category = 27142, depinfo = 11, op = fork, loc = skgpspawn5
skgpspawn failed:category = 27142, depinfo = 11, op = fork, loc = skgpspawn3
skgpspawn failed:category = 27142, depinfo = 11, op = fork, loc = skgpspawn3
skgpspawn failed:category = 27142, depinfo = 11, op = fork, loc = skgpspawn3
skgpspawn failed:category = 27142, depinfo = 11, op = fork, loc = skgpspawn3
skgpspawn failed:category = 27142, depinfo = 11, op = fork, loc = skgpspawn3
Mon Nov 28 08:00:20 2011
skgpspawn failed:category = 27142, depinfo = 11, op = fork, loc = skgpspawn5
skgpspawn failed:category = 27142, depinfo = 11, op = fork, loc = skgpspawn3
skgpspawn failed:category = 27142, depinfo = 11, op = fork, loc = skgpspawn3

从信息上看,问题应该发生在fork操作时,或者说spawn进程时报错。
这个27142错误对应的实际上是ORA-27142错误。
ORA-27142 could not create new process
Cause: Operating system call error.
Action: Check errno and if possible increase the number of processes.
可以看到这个错误发生在操作系统调用的错误上,根据说明很可能是进程数受到了限制。
检查MOS,发现有两篇文档和当前的情况类似,其中之一是Skgpspawn Errors In Alert Log, New Connections to Database Fail [ID 435787.1],这篇文章中记录的错误和当前十分类似,唯一的差别在于depinfo为12。而导致这个错误的原因是SWAP空间不足。
另外一篇Bug 5141429 – “skgspawn 27142” errors and defunct Oracle processes [ID 5141429.8]记录的问题是由于僵尸进程所致,不过这篇文章记录错误信息与当前的区别仍然在于depinfo上,这篇文章的depinfo为0。
最终查询操作系统上的信息发现,除了系统中存在僵尸进程外,也有操作系统限制上的不同,只不过不是SWAP空间的不足,而是系统参数maxuprc设置太低所致。

Posted in BUG | Tagged , , , , , , , | Leave a comment

20111127ACOUG活动

今天ACOUG活动的三位嘉宾都是熟人。
第一个主题是smile_lan带来的《数据库访问控制最佳实践》。我们很多客户都需要部署安全相关的解决方案,而在整个解决方案中,技术只是其中一部分,而更多的制度和规则上的设置。而smile_lan带来的GE的案例,可以帮助我们了解全球跨国企业是如何设置数据库访问控制的。特别是OID(Oracle Internet Directory)的应用,在国内还没有碰到过应用的案例,部署OID来解决数据库用户集中访问的方式,绝非一般公司可以采用的方式,一方面需要Oracle数据库广泛的应用到整个企业的日常管理中,另一方面只有大量的数据库、管理员以及维护人员的管理需求还会使得企业采用集中帐号管理的方式。
第二个主题是sundog315带来的《猜想的力量 一次REDO分析的例子》。这个案例其实是数据库嘉年华上EYGLE一个案例的延续,EYGLE当时描述了这个问题,随后sundog315对于这个问题的一个细节问题进行了深入的研究,于是有了今天的这个主题。这个案例中,sundog315描述了他通过多次猜测并验证,最终解决这个问题的步骤。虽然猜测是非常重要的,但是个人认为更重要的是基础知识的积累,否则猜测只能是空中楼台。甚至即使猜到了正确的结果,但是没有知识的积累,也无法验证自己的测试结果。
最后是野花带来的搜索相关的主题,这个主题他在数据库嘉年华上进行演讲,今天的主题显得更加的轻车熟路。其实搜索确实是一门学问,很多新人之所以入门很苦难,就是碰到了自己无法解决的问题后,不知道如何通过搜索来解决问题。事实上,如果可以擅用搜索来解决问题,也证明了一个人的本身的水平的提高。

Posted in NEWS | Leave a comment

ORA-600(5351)错误

在告警日志中发现了ORA-600(5351)错误,同时出现大量的There are 3 memory allocation errors for object-level stat错误。
详细的错误信息为:

Tue Jun 22 12:00:09 2010
Thread 1 advanced TO log SEQUENCE 1522
CURRENT log# 3 seq# 1522 mem# 0: /dev/rredo03
There are 6 memory allocation errors FOR object-level stat
IN the LAST 15 minutes
There are 4 memory allocation errors FOR object-level stat
IN the LAST 15 minutes
There are 3 memory allocation errors FOR object-level stat
IN the LAST 15 minutes
There are 26 memory allocation errors FOR object-level stat
IN the LAST 15 minutes
There are 9 memory allocation errors FOR object-level stat
IN the LAST 15 minutes
There are 3 memory allocation errors FOR object-level stat
IN the LAST 15 minutes
There are 2 memory allocation errors FOR object-level stat
IN the LAST 15 minutes
There are 3 memory allocation errors FOR object-level stat
IN the LAST 15 minutes
There are 3 memory allocation errors FOR object-level stat
IN the LAST 15 minutes
Tue Jun 22 16:14:21 2010
Errors IN file /oracle/admin/ruledb/udump/ruledb_ora_233726.trc:
ORA-00600: internal error code, arguments: [5351], [4365070], [57664], [], [], [], [], []
Tue Jun 22 16:14:44 2010
Doing block recovery FOR file 201 block 170765
No block recovery was needed
There are 658 memory allocation errors FOR object-level stat
IN the LAST 15 minutes
There are 362 memory allocation errors FOR object-level stat
IN the LAST 15 minutes
There are 16 memory allocation errors FOR object-level stat
IN the LAST 15 minutes
There are 4 memory allocation errors FOR object-level stat
IN the LAST 15 minutes
Tue Jun 22 17:43:01 2010
ALTER SYSTEM SET db_cache_size='2100M' SCOPE=BOTH;
Tue Jun 22 17:43:17 2010
ALTER SYSTEM SET shared_pool_size='712M' SCOPE=BOTH;

在MOS中查询了一下ORA-600(5351),只差到一篇文章,基本上和当前的问题没有什么关系。不过除了这个明显的ORA-600错误外,大量的memory allocation errors for object-level错误信息也值得关注,查询发现问题和数据库共享池使用有关,如果频繁出现这个错误,最终可能导致ORA-4031错误。
Oracle在文档Memory Allocation Errors For Object-Level Stat Appearing in the Alert Log File [ID 757895.1]中描述了这个问题,而给出的解决方法是增大共享池或者设置隐含参数_OBJECT_STATISTICS=FALSE。
当前的数据库shared_pool的设置是500M左右,调整到712M后,无论是memory allocation errors还是ORA-600(5351)错误,都没有再重现。

Posted in BUG | Tagged , , , , , | Leave a comment