客户数据库出现大量cache buffer chains latch

客户产品数据库上午出现了严重的性能问题,简单记录一下问题的诊断和解决过程。

可以看到,数据库的DB TIME已经涨到了非常高的地步,这说明系统正经受着非常严重的性能问题:

Snap Id

Snap Time

Sessions

Cursors/Session

Begin Snap:

7170

31-3月 -12 08:00:50

395

10.5

End Snap:

7172

31-3月 -12 09:00:27

689

11.7

Elapsed:

59.61 (mins)

DB Time:

17,270.93 (mins)

 

从TOP 5看,等待事件中最明显的是latch: cache buffers chains,从当前系统的状态也可以看到这一点:

SQL> SELECT EVENT, COUNT(*) FROM GV$SESSION GROUP BY EVENT HAVING COUNT(*) > 5 ORDER BY 2 DESC;
 
EVENT                                                              COUNT(*)
---------------------------------------------------------------- ----------
latch: cache buffers chains                                            1043
SQL*Net message FROM client                                             500
SQL*Net message TO client                                                35
rdbms ipc message                                                        29
gc cr request                                                            25
latch free                                                               13
gcs remote message                                                       10
gc buffer busy                                                            7
 
8 ROWS selected.

系统中部分SQL的执行时间已经长达几个小时:

SQL ordered by Elapsed Time

Elapsed Time (s)

CPU Time (s)

Executions

Elap per Exec   (s)

% Total DB Time

SQL Id

SQL Module

SQL Text

341,821

11,917

112

3051.97

32.99

JDBC Thin Client

SELECT count(*)   total FROM ( s…

244,752

3,380

147

1664.98

23.62

JDBC Thin Client

SELECT count(*)   total FROM ( s…

52,419

11,331

3

17472.91

5.06

JDBC Thin Client

select   cf.cardid, (CASE WHEN c…

38,767

532

11

3524.24

3.74

JDBC Thin Client

SELECT count(*)   total FROM ( s…

37,146

2,524

2

18573.15

3.58

JDBC Thin Client

SELECT count(*)   total FROM ( s…

30,796

2,331

5

6159.20

2.97

JDBC Thin Client

SELECT count(*)   total FROM ( s…

29,991

2,506

1

29991.41

2.89

JDBC Thin Client

SELECT count(*)   total FROM ( s…

24,762

875

3

8254.06

2.39

JDBC Thin Client

SELECT count(*)   total FROM (SE…

17,845

699

2

8922.50

1.72

JDBC Thin Client

SELECT count(*)   total FROM (SE…

17,470

1,295

0

1.69

JDBC Thin Client

select * from   (select aa.*, ro…

 

 

其实根据这些现象,基本上可以判断问题了。肯定是SQL执行计划的改变导致了当前的性能问题。而类似绑定变量窥探之类的问题只会影响个别的SQL,而这么大面积的执行计划的改变,几乎可以断定是统计信息造成的。

询问了一下客户最近的操作,原来昨天夜里通过数据库链的方式导入了一部分数据。而今天一早问题就出现了。

其实问题已经很明显了,在通过数据库链加载数据后,并没有重新收集统计信息,且由于加载时间是在半夜,这批数据也没有赶上每天22:00的统计信息自动收集的工作。这就使得Oracle在生成执行计划时,会依赖数据加载前的统计信息,从而造成了错误的执行计划。

首先解决问题的根源问题,对加载过数据的表重新收集统计:

SQL> SELECT 'EXEC DBMS_STATS.GATHER_TABLE_STATS(''USER1'', ''' || TABLE_NAME || ''', CASCADE => TRUE)' FROM DBA_TABLES WHERE OWNER = 'USER1' AND LAST_ANALYZED > TRUNC(SYSDATE);
 
'EXECDBMS_STATS.GATHER_TABLE_STATS(''USER1'','''||TABLE_NAME||''',CASCADE=>TRUE)'
-----------------------------------------------------------------------------------------
EXEC DBMS_STATS.GATHER_TABLE_STATS('USER1', 'TABLE_1', CASCADE => TRUE)
EXEC DBMS_STATS.GATHER_TABLE_STATS('USER1', 'TABLE_2', CASCADE => TRUE)
.
.
.
EXEC DBMS_STATS.GATHER_TABLE_STATS('USER1', 'TABLE_3', CASCADE => TRUE)
EXEC DBMS_STATS.GATHER_TABLE_STATS('USER1', 'TABLE_4', CASCADE => TRUE)
 
12 ROWS selected.
 
SQL> EXEC DBMS_STATS.GATHER_TABLE_STATS('USER1', ' TABLE_1', CASCADE => TRUE)
 
PL/SQL PROCEDURE successfully completed.
 
SQL> EXEC DBMS_STATS.GATHER_TABLE_STATS('USER1', ' TABLE_2', CASCADE => TRUE)
 
PL/SQL PROCEDURE successfully completed.
 
.
.
.
 
SQL> EXEC DBMS_STATS.GATHER_TABLE_STATS('USER1', ' TABLE_3', CASCADE => TRUE)
 
PL/SQL PROCEDURE successfully completed.
 
SQL> EXEC DBMS_STATS.GATHER_TABLE_STATS('USER1', ' TABLE_4', CASCADE => TRUE)
 
PL/SQL PROCEDURE successfully completed.

虽然问题的根源已经被解决,但是当前运行的SQL并不会改变执行计划,因此还需要找到问题的SQL,从后台将其结束:

SQL> SELECT 'kill -9 ' || spid FROM v$session s, v$process p WHERE s.username = 'USER2' AND s.paddr = p.addr AND event = 'latch: cache buffers chains';
 
'KILL-9'||SPID
--------------------
KILL -9 28321
KILL -9 25384
KILL -9 23697
KILL -9 7239
.
.
.
KILL -9 9331
KILL -9 13759
 
740 ROWS selected.
 
SQL> SELECT 'kill -9 ' || spid FROM gv$session s, gv$process p WHERE s.username = 'USER2' AND s.paddr = p.addr AND event = 'latch: cache buffers chains' AND s.inst_id = p.inst_id AND s.inst_id = 2;
 
'KILL-9'||SPID
--------------------
KILL -9 23992
KILL -9 5289
KILL -9 21067
KILL -9 16816
KILL -9 16820
KILL -9 26767
.
.
.
KILL -9 14981
KILL -9 26678
KILL -9 26682
 
258 ROWS selected.

分别在两个节点杀掉这些执行计划存在问题的会话,释放被大量占用的系统资源。

由于Oracle的执行计划并非在收集统计信息后马上生效,因此还有个别的SQL仍然沿用错误的执行计划:

SQL> SELECT DISTINCT inst_id, sql_id FROM gv$session WHERE event = 'latch: cache buffers chains';
 
INST_ID SQL_ID
---------- -------------
1 39gvg7vbcm8jx
1 a6aqkm30u7p90
 
SQL> SELECT address, hash_value FROM v$sqlarea WHERE sql_id = 'a6aqkm30u7p90';
 
ADDRESS HASH_VALUE
---------------- ----------
C000000EB7ED3420 3248739616
 
SQL> EXEC dbms_shared_pool.purge('C000000EB7ED3420,3248739616','C')
 
PL/SQL PROCEDURE successfully completed.
 
SQL> SELECT address, hash_value FROM v$sqlarea WHERE sql_id ='39gvg7vbcm8jx';
 
ADDRESS HASH_VALUE
---------------- ----------
C000001037B8E308 3603538493
 
SQL> EXEC dbms_shared_pool.purge('C000001037B8E308’, ‘3603538493', 'C')
 
PL/SQL PROCEDURE successfully completed.

由于当前的数据库版本是10.2.0.5,因此可以很方便的使用dbms_shared_pool将执行计划错误的SQL清除出共享池,强制其重新生成执行计划。

SQL> SELECT event, COUNT(*) FROM gv$session WHERE username LIKE != USER GROUP BY EVENT ORDER BY 2 DESC;
 
EVENT                                                              COUNT(*)
---------------------------------------------------------------- ----------
SQL*Net message FROM client                                             370
SQL*Net message TO client                                                15
gc cr request                                                            10
latch free                                                                4
Streams AQ: waiting FOR messages IN the queue                             1
 
5 ROWS selected.

数据库中SQL执行计划错误除了导致大量的latch: cache buffers chains等待以外,还存在gc cr request和latch free等这些等待事件,经分析同样是由于错误的执行计划所致。将这些会话采用相同的方法清除后,系统负载恢复到正常范围:

Snap Id

Snap Time

Sessions

Cursors/Session

Begin Snap:

7188

31-3月 -12 14:55:17

257

20.3

End Snap:

7189

31-3月 -12 15:03:07

256

19.9

Elapsed:

7.84 (mins)

DB Time:

70.46 (mins)

 

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

标签安全管理员手册

Oracle的LABEL安全选件从9i就有,不过一直没有研究过。
当时对于这个LABEL SECURITY的最早印象就是,这是9i中为数不多的安装后V$OPTION视图中显示没有启用的选件之一,印象毕竟深的除了RAC就是这个标签安全了。而到了10g中这个标签安全依然是默认没有启用的选件。
记得当时Kamus研究过这个功能,当时凑热闹了解了一下,这种了解都是流于表面,而且这么长时间早就忘光了。
最近对安全方面毕竟关注,因此这些平时不太常用的功能也开始逐渐的挨个往起捡了。
在线文档地址:http://www.oracle.com/pls/db112/to_toc?pathname=network.112%2Fe10745%2Ftoc.htm&remark=portal+%28Books%29

Posted in BOOKS | Leave a comment

将指定SQL的执行计划从共享池删除

如果Oracle的优化器产生了某种错误的执行计划,或者我们希望Oracle对于某个SQL重新进行分析,那么就需要这个SQL的执行计划在共享池中过期,而简单的方法在10.2.0.4以后才出现。
对于以前的版本而言,最显而易见的方法莫过于直接刷新共享池,但是如果是数据库中绝大部分的SQL都存在问题,那么这种方法无可厚非,也可能是见效最快的方法,而如果数据库中仅仅是个别的SQL存在问题,那么这种方法就过于暴力了。

SQL> SELECT COUNT(*) FROM dual;
  COUNT(*)
----------
         1
SQL> SELECT sql_id, address, hash_value, executions, loads, parse_calls, invalidations
  2  FROM v$sqlarea
  3  WHERE sql_text = 'select count(*) from dual';
SQL_ID        ADDRESS          HASH_VALUE EXECUTIONS      LOADS PARSE_CALLS INVALIDATIONS
------------- ---------------- ---------- ---------- ---------- ----------- -------------
4m94ckmu16f9k 00000000B6C61FC0 4094900530          1          1           1             0
SQL> SELECT COUNT(*) FROM v$sqlarea;
  COUNT(*)
----------
      3061
SQL> ALTER system FLUSH shared_pool;
System altered.
SQL> SELECT sql_id, address, hash_value, executions, loads, parse_calls, invalidations
  2  FROM v$sqlarea
  3  WHERE sql_text = 'select count(*) from dual';
no ROWS selected
SQL> SELECT COUNT(*) FROM v$sqlarea;
  COUNT(*)
----------
        37

为了一个SQL而清空整个共享池,这个代价确实太大了,何况对于一个繁忙的OLTP系统而言,这个刷新共享池的操作所带来的风险和后果与直接关闭数据库相比,也没有太大的差别。
那么有没有细粒度一点的办法呢,其实方法有很多,相关表上任何的DDL都会导致SQL执行计划的失效,但是DDL本身风险就毕竟高,如果想要对系统影响最小,那么这个DDL就非GRANT莫属。只需要当前用户将这个表的权限授权给自己,就可以达到想要的效果:

SQL> SELECT COUNT(*) FROM dual;
  COUNT(*)
----------
         1
SQL> SELECT sql_id, address, hash_value, executions, loads, parse_calls, invalidations
  2  FROM v$sqlarea
  3  WHERE sql_text = 'select count(*) from dual';
SQL_ID        ADDRESS          HASH_VALUE EXECUTIONS      LOADS PARSE_CALLS INVALIDATIONS
------------- ---------------- ---------- ---------- ---------- ----------- -------------
4m94ckmu16f9k 00000000B6C61FC0 4094900530          1          1           1             0
SQL> SELECT 1 FROM dual;
         1
----------
         1
SQL> SELECT * FROM dual;
D
-
X
SQL> SELECT 'a' FROM dual;
'
-
a
SQL> select count(1) from dual;
  COUNT(1)
----------
         1
SQL> select sql_id, address, hash_value, executions, loads, parse_calls, invalidations
  2  from v$sqlarea
  3  where lower(sql_text) like '%dual%';
SQL_ID        ADDRESS          HASH_VALUE EXECUTIONS      LOADS PARSE_CALLS INVALIDATIONS
------------- ---------------- ---------- ---------- ---------- ----------- -------------
gr7s3j0cg8pr6 00000000B6A5A470  418666214          1          1           1             0
40p7rprfbt1as 00000000B69BDC38 3703342424          1          1           1             0
520mkxqpf15q8 00000000B6DD9610 2866845384          1          1           1             0
ak90gdq0udv37 00000000B6E3C6B0 2175200359          2          2           2             1
4m94ckmu16f9k 00000000B6C61FC0 4094900530          1          1           1             0
a5ks9fhw2v9s1 00000000B698DA88  942515969          1          1           1             0
800hwktjz3zuc 00000000B6999268 1676803916          1          1           1             0
7 rows selected.
SQL> grant select on dual to sys;
grant select on dual to sys
                        *
ERROR at line 1:
ORA-01749: you may not GRANT/REVOKE privileges to/from yourself
 
SQL> grant select on dual to public;
Grant succeeded.
SQL> select sql_id, address, hash_value, executions, loads, parse_calls, invalidations
  2  from v$sqlarea
  3  where lower(sql_text) like '%dual%';
SQL_ID        ADDRESS          HASH_VALUE EXECUTIONS      LOADS PARSE_CALLS INVALIDATIONS
------------- ---------------- ---------- ---------- ---------- ----------- -------------
gr7s3j0cg8pr6 00000000B6A5A470  418666214          2          1           2             0
ak90gdq0udv37 00000000B6E3C6B0 2175200359          2          2           2             1

对于其他用户而言,都可以使用将表的查询权限授权给OWNER本身的方法,但是测试用户本身为SYS,因此需要其他用户授权,方便起见使用了授权给PUBLIC的方式。可以看到,这种方式同样可以生效,但是仍然存在打击面过大的问题。对于系统中一个频繁访问的表,很可能这个授权的操作,导致少则几十,多则几百个SQL都是失效,这个风险仍然不可小觑。
那么对于就没有一个可以将粒度控制在SQL本身上的方法吗?在11g中,Oracle的DBMS_SHARED_POOL包新增了PURGE功能,可以完美的解决这个问题,这个方法在10.2.0.4和10.2.0.5补丁集中也被添加进来,使得10.2的高版本同样可以实现这个功能,使用方法很简单:

SQL> SELECT COUNT(*) FROM dual;
  COUNT(*)
----------
         1
SQL> SELECT sql_id, address, hash_value, executions, loads, parse_calls, invalidations
  2  FROM v$sqlarea
  3  WHERE sql_text = 'select count(*) from dual';
SQL_ID        ADDRESS          HASH_VALUE EXECUTIONS      LOADS PARSE_CALLS INVALIDATIONS
------------- ---------------- ---------- ---------- ---------- ----------- -------------
4m94ckmu16f9k 00000000B6C61FC0 4094900530          1          2           1             1
SQL> SELECT 1 FROM dual;
         1
----------
         1
SQL> SELECT * FROM dual;
D
-
X
SQL> SELECT sql_id, address, hash_value, executions, loads, parse_calls, invalidations
  2  FROM v$sqlarea
  3  WHERE LOWER(sql_text) LIKE '%dual%';
SQL_ID        ADDRESS          HASH_VALUE EXECUTIONS      LOADS PARSE_CALLS INVALIDATIONS
------------- ---------------- ---------- ---------- ---------- ----------- -------------
gr7s3j0cg8pr6 00000000B6A5A470  418666214          3          1           3             0
520mkxqpf15q8 00000000B6DD9610 2866845384          1          2           1             1
ak90gdq0udv37 00000000B6E3C6B0 2175200359          3          2           3             1
4m94ckmu16f9k 00000000B6C61FC0 4094900530          1          2           1             1
a5ks9fhw2v9s1 00000000B698DA88  942515969          1          2           1             1
SQL> EXEC dbms_shared_pool.purge('00000000B6C61FC0,4094900530', 'c')
PL/SQL PROCEDURE successfully completed.
SQL> SELECT sql_id, address, hash_value, executions, loads, parse_calls, invalidations
  2  FROM v$sqlarea
  3  WHERE LOWER(sql_text) LIKE '%dual%';
SQL_ID        ADDRESS          HASH_VALUE EXECUTIONS      LOADS PARSE_CALLS INVALIDATIONS
------------- ---------------- ---------- ---------- ---------- ----------- -------------
gr7s3j0cg8pr6 00000000B6A5A470  418666214          4          1           4             0
520mkxqpf15q8 00000000B6DD9610 2866845384          1          2           1             1
ak90gdq0udv37 00000000B6E3C6B0 2175200359          3          2           3             1
a5ks9fhw2v9s1 00000000B698DA88  942515969          1          2           1             1

过程PURGE的第一个参数为V$SQLAREA中用逗号分隔的ADDRESS列和HASH_VALUE列的值,第二个参数’c’表示PURGE的对象是CURSOR,不过实际上这里可以使用除了P(PROCEDURE/FUNCTION/PACKAGE)、T(TYPE)、R(TRIGGER)和Q(SEQUENCE)的任何值
使用这种方法,就可以精确的将一个SQL从共享池中删除,从而使得Oracle为这个SQL重新生成执行计划。这种方法只针对单个SQL语句,使得解决问题的同时不会造成任何的误伤。
不过需要注意一点,在10.2.0.4中,虽然PURGE过程已经存在,但是要使这个过程可以真正的生效,还必须设置一个EVENT:

SQL> ALTER system SET event = '5614566 trace name context forever' scope = spfile;
System altered.

设置EVENT后需要重启,DBMS_SHARED_POOL的PURGE才可以生效。也就是说,除非提前进行过设置,否则这个PURGE的功能对于一个产品环境而言,必须在10.2.0.5以上版本才可以使用。

Posted in ORACLE | Tagged , , , , , | 2 Comments

安装DBMS_SHARED_POOL包

Oracle提供了一个管理共享池对象的接口——DBMS_SHARED_POOL包,不过这个包在11g以前的版本是默认没有安装的。
先看一下11.2的情况:

SQL> SELECT * FROM v$version;
BANNER
--------------------------------------------------------------------------------
Oracle DATABASE 11g Enterprise Edition Release 11.2.0.3.0 - 64bit Production
PL/SQL Release 11.2.0.3.0 - Production
CORE    11.2.0.3.0      Production
TNS FOR Solaris: Version 11.2.0.3.0 - Production
NLSRTL Version 11.2.0.3.0 – Production
SQL> DESC dbms_shared_pool
PROCEDURE ABORTED_REQUEST_THRESHOLD
 Argument Name                  TYPE                    IN/OUT DEFAULT?
 ------------------------------ ----------------------- ------ --------
 THRESHOLD_SIZE                 NUMBER                  IN
PROCEDURE KEEP
 Argument Name                  TYPE                    IN/OUT DEFAULT?
 ------------------------------ ----------------------- ------ --------
 NAME                           VARCHAR2                IN
 FLAG                           CHAR                    IN     DEFAULT
PROCEDURE KEEP
 Argument Name                  TYPE                    IN/OUT DEFAULT?
 ------------------------------ ----------------------- ------ --------
 SCHEMA                         VARCHAR2                IN
 OBJNAME                        VARCHAR2                IN
 NAMESPACE                      NUMBER                  IN
 HEAPS                          NUMBER                  IN
PROCEDURE KEEP
 Argument Name                  TYPE                    IN/OUT DEFAULT?
 ------------------------------ ----------------------- ------ --------
 HASH                           VARCHAR2                IN
 NAMESPACE                      NUMBER                  IN
 HEAPS                          NUMBER                  IN
PROCEDURE MARKHOT
 Argument Name                  TYPE                    IN/OUT DEFAULT?
 ------------------------------ ----------------------- ------ --------
 SCHEMA                         VARCHAR2                IN
 OBJNAME                        VARCHAR2                IN
 NAMESPACE                      NUMBER                  IN     DEFAULT
 GLOBAL                         BOOLEAN                 IN     DEFAULT
PROCEDURE MARKHOT
 Argument Name                  TYPE                    IN/OUT DEFAULT?
 ------------------------------ ----------------------- ------ --------
 HASH                           VARCHAR2                IN
 NAMESPACE                      NUMBER                  IN     DEFAULT
 GLOBAL                         BOOLEAN                 IN     DEFAULT
PROCEDURE PURGE
 Argument Name                  TYPE                    IN/OUT DEFAULT?
 ------------------------------ ----------------------- ------ --------
 NAME                           VARCHAR2                IN
 FLAG                           CHAR                    IN     DEFAULT
 HEAPS                          NUMBER                  IN     DEFAULT
PROCEDURE PURGE
 Argument Name                  TYPE                    IN/OUT DEFAULT?
 ------------------------------ ----------------------- ------ --------
 SCHEMA                         VARCHAR2                IN
 OBJNAME                        VARCHAR2                IN
 NAMESPACE                      NUMBER                  IN
 HEAPS                          NUMBER                  IN
PROCEDURE PURGE
 Argument Name                  TYPE                    IN/OUT DEFAULT?
 ------------------------------ ----------------------- ------ --------
 HASH                           VARCHAR2                IN
 NAMESPACE                      NUMBER                  IN
 HEAPS                          NUMBER                  IN
PROCEDURE SIZES
 Argument Name                  TYPE                    IN/OUT DEFAULT?
 ------------------------------ ----------------------- ------ --------
 MINSIZE                        NUMBER                  IN
PROCEDURE UNKEEP
 Argument Name                  TYPE                    IN/OUT DEFAULT?
 ------------------------------ ----------------------- ------ --------
 NAME                           VARCHAR2                IN
 FLAG                           CHAR                    IN     DEFAULT
PROCEDURE UNKEEP
 Argument Name                  TYPE                    IN/OUT DEFAULT?
 ------------------------------ ----------------------- ------ --------
 SCHEMA                         VARCHAR2                IN
 OBJNAME                        VARCHAR2                IN
 NAMESPACE                      NUMBER                  IN
PROCEDURE UNKEEP
 Argument Name                  TYPE                    IN/OUT DEFAULT?
 ------------------------------ ----------------------- ------ --------
 HASH                           VARCHAR2                IN
 NAMESPACE                      NUMBER                  IN
PROCEDURE UNMARKHOT
 Argument Name                  TYPE                    IN/OUT DEFAULT?
 ------------------------------ ----------------------- ------ --------
 SCHEMA                         VARCHAR2                IN
 OBJNAME                        VARCHAR2                IN
 NAMESPACE                      NUMBER                  IN     DEFAULT
 GLOBAL                         BOOLEAN                 IN     DEFAULT
PROCEDURE UNMARKHOT
 Argument Name                  TYPE                    IN/OUT DEFAULT?
 ------------------------------ ----------------------- ------ --------
 HASH                           VARCHAR2                IN
 NAMESPACE                      NUMBER                  IN     DEFAULT
 GLOBAL                         BOOLEAN                 IN     DEFAULT
SQL>

11.2中,这个包在数据库创建的时刻就会默认安装完成,而且在11.2中,这个包的功能得到了进一步的增强。除了给一些已有的过程增加了重载的过程外,还新增了MARKHOT以及和它对应的UNMARKHOT过程。MARKHOT用来标记一个LIBRARY CACHE对象为热对象,而UNMARKHOT则取消这个标记。
在10g及以前版本,这个包在数据库创建后并未马上创建需要手工调用$ORACLE_HOME/rdbms/admin/dbmspool.sql来创建:

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> DESC dbms_shared_pool
ERROR:
ORA-04043: object dbms_shared_pool does NOT exist
SQL> @?/rdbms/admin/dbmspool.sql 
Package created.
GRANT succeeded.
VIEW created.
Package body created.
SQL> DESC dbms_shared_pool
PROCEDURE ABORTED_REQUEST_THRESHOLD
 Argument Name                  TYPE                    IN/OUT DEFAULT?
 ------------------------------ ----------------------- ------ --------
 THRESHOLD_SIZE                 NUMBER                  IN
PROCEDURE KEEP
 Argument Name                  TYPE                    IN/OUT DEFAULT?
 ------------------------------ ----------------------- ------ --------
 NAME                           VARCHAR2                IN
 FLAG                           CHAR                    IN     DEFAULT
PROCEDURE PURGE
 Argument Name                  TYPE                    IN/OUT DEFAULT?
 ------------------------------ ----------------------- ------ --------
 NAME                           VARCHAR2                IN
 FLAG                           CHAR                    IN     DEFAULT
 HEAPS                          NUMBER                  IN     DEFAULT
PROCEDURE SIZES
 Argument Name                  TYPE                    IN/OUT DEFAULT?
 ------------------------------ ----------------------- ------ --------
 MINSIZE                        NUMBER                  IN
PROCEDURE UNKEEP
 Argument Name                  TYPE                    IN/OUT DEFAULT?
 ------------------------------ ----------------------- ------ --------
 NAME                           VARCHAR2                IN
 FLAG                           CHAR                    IN     DEFAULT

在10g中,Oracle将包体创建的调用脚本添加到了dbmspool.sql中,而在更早的版本中,除了需要执行dbmspool.sql脚本意外,还需要手工方式执行$ORACLE_HOME/rdbms/admin/prvtpool.plb脚本来创建包体。

Posted in ORACLE | Tagged , , | Leave a comment

Oracle VM用户手册总结

虽然VM用户手册中没有找到我感兴趣的TroubleShooting的内容,但是关于详细配置的内容确实不少。
估计要是有时间的话,根据文档的细致描述仔细测试的话,有可能解决配置VM过程中的问题,不过没有故障诊断方面的信息一定会使得问题解决的成本大幅增加。
总的来说,VM的相关资料还是太少,而且官方文档的内容也太少,即使是METALINK上也没有太多有价值的信息。
从Oracle的策略上看,似乎也没有大力去发展VM,因此短期内VM无论是技术上还是市场上可能都很难有非常大的发展。

Posted in BOOKS | Leave a comment

Linux上Oracle启用异步IO

刚解决了一个异步io的问题,还是专门描述一下Oracle中设置异步IO的方式。
首先要检查操作系统上,异步io的相关包是否已经安装,如果没有的话,通过rpm进行安装,并检查系统上异步io的参数设置:

[oracle@localhost ~]$ rpm -qa|grep aio
libaio-0.3.107-10.el6.x86_64
libaio-devel-0.3.107-10.el6.x86_64
[oracle@localhost ~]$ more /proc/sys/fs/aio-max-nr 
1048576

然后检查数据库在链接时是否已经加载了aio的包:

[oracle@localhost ~]$ /usr/bin/ldd $ORACLE_HOME/bin/oracle | grep libaio
libaio.so.1 => /lib64/libaio.so.1 (0x0000003e13000000)

如果没有看到libaio的包,说明Oracle没有链接aio,那么这时就需要重新make oracle的可执行文件,9i的方法为:

make -f ins_rdbms.mk async_on
make -f ins_rdbms.mk ioracle

10g以后的方法为:

make PL_ORALIBS=-laio -f ins_rdbms.mk async_on

编译完成后,操作系统的设置完成,还需要设置数据库的初始化参数:

SQL> SHOW parameter disk_asynch_io
NAME                                 TYPE                             VALUE
------------------------------------ -------------------------------- --------------------
disk_asynch_io                       BOOLEAN                          TRUE
SQL> SHOW parameter filesystemio_options
NAME                                 TYPE                             VALUE
------------------------------------ -------------------------------- ------------------
filesystemio_options                 string                           NONE

对于裸设备而言,这样的设置就足够了,但是对于文件系统而言,还需要讲filesystemio_options设置为ASYNCH并重启数据库:

SQL> ALTER SYSTEM SET FILESYSTEMIO_OPTIONS = ASYNCH SCOPE = SPFILE;
System altered.

由于编译oracle可执行文件的时候也要关闭数据库,合理的安排设置参数的顺序,可减少数据库的重启次数。

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

Linux上Oracle是否使用异步io的诊断

客户的数据库IO负载较重,检查后发现并未设置异步IO。

整个数据库的负载都集中在IO相关的等待上:

Top 5 Timed Foreground Events

Event

Waits

Time(s)

Avg   wait (ms)

%   DB time

Wait   Class

log   file sync

697,116

70,128

101

36.29

Commit

db   file sequential read

2,982,135

54,498

18

28.20

User   I/O

db   file scattered read

754,680

38,741

51

20.05

User   I/O

free   buffer waits

35,410

20,560

581

10.64

Configuration

DB   CPU

6,172

3.19

 

检查后发现,当前系统并未使用异步io:

[oracle@localhost ~]$ cat /proc/slabinfo | grep kio
kioctx         37   140   384   10   1 : tunables   54   27   8 : slabdata    14    14     0
kiocb           0     0   256   15   1 : tunables  120   60   8 : slabdata     0     0     0

返回结果中kiocp对应的前两项为0,说明系统中没有使用异步io。

检查显示oracle已经链接了aio的包:

[oracle@localhost ~]$ /usr/bin/ldd $ORACLE_HOME/bin/oracle | grep libaio
libaio.so.1 => /lib64/libaio.so.1 (0x0000003e13000000)

而数据库中检查发现filesystemio_options设置有误:

SQL> show parameter disk_asynch_io

NAME                                 TYPE                             VALUE
------------------------------------ -------------------------------- --------------------
disk_asynch_io                       BOOLEAN                          TRUE
 
SQL> SHOW parameter filesystemio_options
 
NAME                                 TYPE                             VALUE
------------------------------------ -------------------------------- -------------------
filesystemio_options                 string                           NONE

当前使用的是文件系统,因此需要将filesystemio_options设置为asynch,才能开启异步io:

SQL> ALTER SYSTEM SET FILESYSTEMIO_OPTIONS = ASYNCH SCOPE = SPFILE;
 
System altered.
 
SQL> SHUTDOWN IMMEDIATE
DATABASE closed.
DATABASE dismounted.
ORACLE instance shut down.
SQL> STARTUP
ORACLE instance started.
 
Total System Global Area 6.0264E+10 bytes
Fixed SIZE 2242912 bytes
Variable SIZE 2147485344 bytes
DATABASE Buffers 5.7982E+10 bytes
Redo Buffers 131960832 bytes
DATABASE mounted.
DATABASE opened.
SQL>

再次检查系统上异步io的设置,发现异步io已经启动:

[oracle@localhost ~]$ more /proc/slabinfo |grep kio
kioctx       130   160   384   10   1 : tunables   54   27   8 : slabdata    16    16     0
kiocb         16    30   256   15   1 : tunables  120   60   8 : slabdata     2     2     1

可以看到,目前异步IO已经生效。

 

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

消除11.2上的db file parallel read

客户在11.2.0.3环境中进行压力测试,发现出现大量的db file parallel read等待事件。
这个等待是11g以后才出现的,而在11g以前,一般这个等待事件发生在数据文件的恢复过程中。而11g新增了prefetch的特性,也可能导致这个等待事件的产生。
当运行压力测试时,后台的等待事件如下:

SQL> SELECT event, COUNT(*) FROM v$session WHERE username = USER GROUP BY event ORDER BY 2;
EVENT                                                              COUNT(*)
---------------------------------------------------------------- ----------
SQL*Net message FROM client                                               1
SQL*Net message TO client                                                 1
db file sequential READ                                                  24
db file scattered READ                                                   33
db file parallel READ                                                    42

可以看到用户进程经历比较严重的IO等待,而此时的db file parallel read,并不会带来性能提升。
可以通过添加隐含参数的方法来屏蔽prefetch功能,从而避免db file parallel read等待事件的产生:

_db_block_prefetch_limit=0
_db_block_prefetch_quota=0
_db_file_noncontig_mblock_read_count=0

参数文件添加这三个隐含参数后,重启数据库,再次运行压力测试,发现db file parallel read等待事件已经消失:

SQL> SELECT event, COUNT(*) FROM v$session WHERE username = USER GROUP BY event ORDER BY 2;
EVENT                                                              COUNT(*)
---------------------------------------------------------------- ----------
SQL*Net message TO client                                                 1
db file scattered READ                                                   30
db file sequential READ                                                  70
Posted in ORACLE | Tagged , , , , , | 2 Comments

11gr2访问V$LOCK视图出现性能问题

在Oracle 11.2.0.3 For Linux X64环境中,碰到这个问题。
检查数据库是否存在锁信息,在查询V$LOCK视图时发现很长时间没有响应,甚至一度认为数据库HANG住:

SQL> SELECT * FROM v$lock WHERE TYPE != 'MR';
ADDR             KADDR             SID TY      ID1  ID2 LMODE REQUEST CTIME BLOCK
---------------- ---------------- ---- -- -------- ---- ----- ------- ----- -----
0000000C5A6AA770 0000000C5A6AA7C8 3405 TO     5124    2     3       0  8543     0
0000000C5A6AAA10 0000000C5A6AAA68 3405 TO     5124    1     3       0  8543     0
00007FEEB24CBDE8 00007FEEB24CBE48 4255 TM     5124    0     3       0  5455     0
0000000C5A6A4860 0000000C5A6A48B8    1 AE      100    0     4       0 10323     0
00007FEEB24CBDE8 00007FEEB24CBE48 1144 TM     5124    0     3       0   107     0
0000000C5A6A9DD0 0000000C5A6A9E28 1144 TO     5124    2     3       0   107     0
0000000C44D8FF08 0000000C44D8FF80 1144 TX 12845057 2063     6       0   107     0
0000000C5A6AA4D0 0000000C5A6AA528 3405 AE      100    0     4       0  9547     0
0000000C4F97CC28 0000000C4F97CCA0 3405 TX 12517398 2118     6       0  8543     0
0000000C5A6A2278 0000000C5A6A22D0 3680 RS       25    1     2       0 10346     0
0000000C5A6A3790 0000000C5A6A37E8 3963 TS       16    1     3       0  8906     0
0000000C5A6AACC8 0000000C5A6AAD20 4255 AE      100    0     4       0  5484     0
0000000C4FDC1288 0000000C4FDC1300 4255 TX 15073308 1757     6       0  5455     0
0000000C5A6AA850 0000000C5A6AA8A8 1144 TO     5124    1     3       0  7441     0
0000000C5A6A9338 0000000C5A6A9390 1420 TO     5124    2     3       0   840     0
0000000C5A6A4940 0000000C5A6A4998 1983 KD        0    0     6       0 10324     0
0000000C5A6A4B00 0000000C5A6A4B58 1983 KT    12540    0     4       0 10324     0
0000000C5A6A2198 0000000C5A6A21F0 3680 CF        0    0     2       0 10350     0
0000000C5A6A2438 0000000C5A6A2490 3397 RT        1    0     6       0 10346     0
0000000C5A6A1E18 0000000C5A6A1E70 3680 XR        4    0     1       0 10350     0
0000000C5A6A5F38 0000000C5A6A5F90 1134 AE      100    0     4       0   109     0
0000000C5A6A4E80 0000000C5A6A4ED8 1420 AE      100    0     4       0  2824     0
0000000C4FCAB578 0000000C4FCAB5F0 1420 TX 10223617 2128     6       0   840     0
0000000C5A6A9EB0 0000000C5A6A9F08 1420 TO     5124    1     3       0   840     0
0000000C5A6AA690 0000000C5A6AA6E8 4255 TO     5124    2     3       0  5455     0
00007FEEB24CBDE8 00007FEEB24CBE48 1420 TM     5124    0     3       0   840     0
0000000C5A6A6018 0000000C5A6A6070 1990 AE      100    0     4       0  1489     0
0000000C5A6A4A20 0000000C5A6A4A78 2831 PW        1    0     3       0 10323     0
0000000C5A6A1EF8 0000000C5A6A1F50 3680 RD        1    0     1       0 10350     0
0000000C5A6AA5B0 0000000C5A6AA608 1144 AE      100    0     4       0  7459     0
00007FEEB24CBDE8 00007FEEB24CBE48 3405 TM     5124    0     3       0  8543     0
0000000C5A6A2518 0000000C5A6A2570 3963 TS        3    1     3       0 10325     0
0000000C5A6AB128 0000000C5A6AB180 4255 TO     5124    1     3       0  5455     0
33 ROWS selected.
Elapsed: 00:13:13.74

一个如此简单的查询执行时间居然超过了13分钟,在这个SQL运行过程中检查发现,这个会话在等待直接路径写:

SQL> SELECT sql_text FROM v$sql WHERE sql_id IN (SELECT sql_id FROM v$Session WHERE sid = 1420);
SQL_TEXT
--------------------------------------------------------------------------------------
SELECT * FROM V$LOCK WHERE TYPE != :"SYS_B_0"
SQL> SELECT event, p1text, p1 FROM v$session WHERE sid = 1420;
EVENT                                    P1TEXT                  P1
---------------------------------------- --------------- ----------
direct path WRITE temp                   file NUMBER            201

检查了一下执行计划:

SQL> EXPLAIN plan FOR
  2  SELECT * FROM V$LOCK WHERE TYPE != 'MR';
Explained.
SQL> SELECT * FROM TABLE(dbms_XPlan.display);
PLAN_TABLE_OUTPUT
------------------------------------------------------------------------------------------------------------------------
Plan hash VALUE: 1899724433
-------------------------------------------------------------------------------------
| Id  | Operation              | Name       | ROWS  | Bytes | Cost (%CPU)| TIME     |
-------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT       |            |     1 |   158 |     1 (100)| 00:00:01 |
|*  1 |  HASH JOIN             |            |     1 |   158 |     1 (100)| 00:00:01 |
|   2 |   MERGE JOIN CARTESIAN |            |     5 |   400 |     0   (0)| 00:00:01 |
|*  3 |    FIXED TABLE FULL    | X$KSUSE    |     1 |    32 |     0   (0)| 00:00:01 |
|   4 |    BUFFER SORT         |            |     5 |   240 |     0   (0)| 00:00:01 |
|*  5 |     FIXED TABLE FULL   | X$KSQRS    |     5 |   240 |     0   (0)| 00:00:01 |
|   6 |   VIEW                 | GV$_LOCK   |    10 |   780 |     0   (0)| 00:00:01 |
|   7 |    UNION-ALL           |            |       |       |            |          |
|*  8 |     FILTER             |            |       |       |            |          |
|   9 |      VIEW              | GV$_LOCK1  |     2 |   156 |     0   (0)| 00:00:01 |
|  10 |       UNION-ALL        |            |       |       |            |          |
|* 11 |        FIXED TABLE FULL| X$KDNSSF   |     1 |   102 |     0   (0)| 00:00:01 |
|* 12 |        FIXED TABLE FULL| X$KSQEQ    |     1 |   102 |     0   (0)| 00:00:01 |
|* 13 |     FIXED TABLE FULL   | X$KTADM    |     1 |   102 |     0   (0)| 00:00:01 |
|* 14 |     FIXED TABLE FULL   | X$KTATRFIL |     1 |   102 |     0   (0)| 00:00:01 |
|* 15 |     FIXED TABLE FULL   | X$KTATRFSL |     1 |   102 |     0   (0)| 00:00:01 |
|* 16 |     FIXED TABLE FULL   | X$KTATL    |     1 |   102 |     0   (0)| 00:00:01 |
|* 17 |     FIXED TABLE FULL   | X$KTSTUSC  |     1 |   102 |     0   (0)| 00:00:01 |
|* 18 |     FIXED TABLE FULL   | X$KTSTUSS  |     1 |   102 |     0   (0)| 00:00:01 |
|* 19 |     FIXED TABLE FULL   | X$KTSTUSG  |     1 |   102 |     0   (0)| 00:00:01 |
|* 20 |     FIXED TABLE FULL   | X$KTCXB    |     1 |   102 |     0   (0)| 00:00:01 |
-------------------------------------------------------------------------------------
Predicate Information (IDENTIFIED BY operation id):
---------------------------------------------------
   1 - access("SADDR"="S"."ADDR" AND TO_CHAR(USERENV('INSTANCE'))||RAWTOHEX("
              RADDR")=TO_CHAR("R"."INST_ID")||RAWTOHEX("R"."ADDR"))
   3 - FILTER("S"."INST_ID"=USERENV('INSTANCE'))
   5 - FILTER("R"."KSQRSIDT"<>'MR')
   8 - FILTER(USERENV('INSTANCE') IS NOT NULL)
  11 - FILTER(("KSQLKMOD"<>0 OR "KSQLKREQ"<>0) AND
              "INST_ID"=USERENV('INSTANCE') AND BITAND("KSSOBFLG",1)<>0)
  12 - FILTER(("KSQLKMOD"<>0 OR "KSQLKREQ"<>0) AND
              "INST_ID"=USERENV('INSTANCE') AND BITAND("KSSOBFLG",1)<>0)
  13 - FILTER(("KSQLKMOD"<>0 OR "KSQLKREQ"<>0) AND
              "INST_ID"=USERENV('INSTANCE') AND BITAND("KSSOBFLG",1)<>0)
  14 - FILTER(("KSQLKMOD"<>0 OR "KSQLKREQ"<>0) AND
              "INST_ID"=USERENV('INSTANCE') AND BITAND("KSSOBFLG",1)<>0)
  15 - FILTER(("KSQLKMOD"<>0 OR "KSQLKREQ"<>0) AND
              "INST_ID"=USERENV('INSTANCE') AND BITAND("KSSOBFLG",1)<>0)
  16 - FILTER(("KSQLKMOD"<>0 OR "KSQLKREQ"<>0) AND
              "INST_ID"=USERENV('INSTANCE') AND BITAND("KSSOBFLG",1)<>0)
  17 - FILTER(("KSQLKMOD"<>0 OR "KSQLKREQ"<>0) AND
              "INST_ID"=USERENV('INSTANCE') AND BITAND("KSSOBFLG",1)<>0)
  18 - FILTER(("KSQLKMOD"<>0 OR "KSQLKREQ"<>0) AND
              "INST_ID"=USERENV('INSTANCE') AND BITAND("KSSOBFLG",1)<>0)
  19 - FILTER(("KSQLKMOD"<>0 OR "KSQLKREQ"<>0) AND
              "INST_ID"=USERENV('INSTANCE') AND BITAND("KSSOBFLG",1)<>0)
  20 - FILTER(("KSQLKMOD"<>0 OR "KSQLKREQ"<>0) AND
              "INST_ID"=USERENV('INSTANCE') AND BITAND("KSSPAFLG",1)<>0)
56 ROWS selected.
SQL> SELECT COUNT(*) FROM X$KSUSE;
  COUNT(*)
----------
      4528
SQL> SELECT COUNT(*) FROM X$KSQRS;
  COUNT(*)
----------
     20144

显然导致查询缓慢以及读取临时空间的问题原因在于执行计划的错误,而执行计划的错误在于统计信息不准确。
解决方法有两种,一种是使用RBO读取V$LOCK视图,另一种是收集V$视图的统计信息,是的Oracle获取正确的执行计划:

SQL> SELECT /*+ rule */ * FROM v$lock WHERE TYPE != 'MR';
ADDR             KADDR             SID TY      ID1  ID2 LMODE REQUEST CTIME BLOCK
---------------- ---------------- ---- -- -------- ---- ----- ------- ----- -----
0000000C5A6A4A20 0000000C5A6A4A78 2831 PW        1    0     3       0  9861     0
0000000C5A6A3790 0000000C5A6A37E8 3963 TS       16    1     3       0  8444     0
0000000C5A6A2518 0000000C5A6A2570 3963 TS        3    1     3       0  9863     0
00007FEEB24CC490 00007FEEB24CC4F0 1144 TM    75580    0     4       0  2615     0
0000000C5A6A6E30 0000000C5A6A6E88 1144 AE        0    1     4       0  2615     0
0000000C44D8FF08 0000000C44D8FF80 1144 TX 12124184 2594     6       0  2615     0
00007FEEB24CC490 00007FEEB24CC4F0 1144 TM       28    0     3       0  2615     0
0000000C5A6AA850 0000000C5A6AA8A8 1144 TO     5124    1     3       0  6979     0
00007FEEB24CC490 00007FEEB24CC4F0 1144 TM    75584    0     4       0  2615     0
0000000C5A6AA5B0 0000000C5A6AA608 1144 AE      100    0     4       0  6997     0
0000000C5A6A6018 0000000C5A6A6070 1990 AE      100    0     4       0  1027     0
0000000C5A6A4860 0000000C5A6A48B8    1 AE      100    0     4       0  9861     0
0000000C5A6A4940 0000000C5A6A4998 1983 KD        0    0     6       0  9862     0
0000000C5A6A4B00 0000000C5A6A4B58 1983 KT    12540    0     4       0  9862     0
0000000C5A6AA770 0000000C5A6AA7C8 3405 TO     5124    2     3       0  8081     0
00007FEEB24CC490 00007FEEB24CC4F0 3405 TM     5124    0     3       0  8081     0
0000000C5A6AA4D0 0000000C5A6AA528 3405 AE      100    0     4       0  9085     0
0000000C4F97CC28 0000000C4F97CCA0 3405 TX 12517398 2118     6       0  8081     0
0000000C5A6AAA10 0000000C5A6AAA68 3405 TO     5124    1     3       0  8081     0
0000000C5A6A2438 0000000C5A6A2490 3397 RT        1    0     6       0  9884     0
0000000C4FDC1288 0000000C4FDC1300 4255 TX 15073308 1757     6       0  4993     0
0000000C5A6AACC8 0000000C5A6AAD20 4255 AE      100    0     4       0  5022     0
0000000C5A6AB128 0000000C5A6AB180 4255 TO     5124    1     3       0  4993     0
0000000C5A6AA690 0000000C5A6AA6E8 4255 TO     5124    2     3       0  4993     0
00007FEEB24CC490 00007FEEB24CC4F0 4255 TM     5124    0     3       0  4993     0
0000000C5A6A9EB0 0000000C5A6A9F08 1420 TO     5124    1     3       0   378     0
0000000C5A6A9338 0000000C5A6A9390 1420 TO     5124    2     3       0   378     0
0000000C5A6A4E80 0000000C5A6A4ED8 1420 AE      100    0     4       0  2362     0
00007FEEB24CC490 00007FEEB24CC4F0 1420 TM     5124    0     3       0   378     0
0000000C4FCAB578 0000000C4FCAB5F0 1420 TX 10223617 2128     6       0   378     0
0000000C5A6A1EF8 0000000C5A6A1F50 3680 RD        1    0     1       0  9888     0
0000000C5A6A1E18 0000000C5A6A1E70 3680 XR        4    0     1       0  9888     0
0000000C5A6A2198 0000000C5A6A21F0 3680 CF        0    0     2       0  9888     0
0000000C5A6A2278 0000000C5A6A22D0 3680 RS       25    1     2       0  9884     0
34 ROWS selected.
Elapsed: 00:00:00.17
SQL> EXEC dbms_stats.gather_fixed_objects_stats
PL/SQL PROCEDURE successfully completed.
Elapsed: 00:04:03.17
SQL> EXPLAIN plan FOR
  2  SELECT * FROM v$lock WHERE TYPE != 'MR';
Explained.
Elapsed: 00:00:00.20
SQL> SELECT * FROM TABLE(dbms_xplan.display);
PLAN_TABLE_OUTPUT
---------------------------------------------------------------------------------------
Plan hash VALUE: 3524752130
--------------------------------------------------------------------------------------
| Id  | Operation               | Name       | ROWS  | Bytes | Cost (%CPU)| TIME     |
--------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT        |            |   104K|    11M|    55 (100)| 00:00:01 |
|   1 |  HASH JOIN              |            |   104K|    11M|    55 (100)| 00:00:01 |
|   2 |   HASH JOIN             |            |   522 | 49068 |    43 (100)| 00:00:01 |
|   3 |    VIEW                 | GV$_LOCK   |   522 | 40716 |    40 (100)| 00:00:01 |
|   4 |     UNION-ALL           |            |       |       |            |          |
|   5 |      FILTER             |            |       |       |            |          |
|   6 |       VIEW              | GV$_LOCK1  |   207 | 16146 |    28 (100)| 00:00:01 |
|   7 |        UNION-ALL        |            |       |       |            |          |
|   8 |         FIXED TABLE FULL| X$KDNSSF   |     1 |    40 |     2 (100)| 00:00:01 |
|   9 |         FIXED TABLE FULL| X$KSQEQ    |   206 |  8446 |    26 (100)| 00:00:01 |
|  10 |      FIXED TABLE FULL   | X$KTADM    |   254 | 10160 |    10 (100)| 00:00:01 |
|  11 |      FIXED TABLE FULL   | X$KTATRFIL |     1 |    36 |     0   (0)| 00:00:01 |
|  12 |      FIXED TABLE FULL   | X$KTATRFSL |     1 |    36 |     0   (0)| 00:00:01 |
|  13 |      FIXED TABLE FULL   | X$KTATL    |     1 |    54 |     0   (0)| 00:00:01 |
|  14 |      FIXED TABLE FULL   | X$KTSTUSC  |     1 |    39 |     0   (0)| 00:00:01 |
|  15 |      FIXED TABLE FULL   | X$KTSTUSS  |     1 |    39 |     0   (0)| 00:00:01 |
|  16 |      FIXED TABLE FULL   | X$KTSTUSG  |     1 |    36 |     0   (0)| 00:00:01 |
|  17 |      FIXED TABLE FULL   | X$KTCXB    |    55 |  2200 |     2 (100)| 00:00:01 |
|  18 |    FIXED TABLE FULL     | X$KSUSE    |  4528 | 72448 |     2 (100)| 00:00:01 |
|  19 |   FIXED TABLE FULL      | X$KSQRS    | 20093 |   431K|    10 (100)| 00:00:01 |
--------------------------------------------------------------------------------------
26 ROWS selected.
Elapsed: 00:00:00.06
SQL> SELECT * FROM v$lock WHERE TYPE != 'MR';
ADDR             KADDR             SID TY      ID1  ID2 LMODE REQUEST CTIME BLOCK
---------------- ---------------- ---- -- -------- ---- ----- ------- ----- -----
0000000C5A6A1E18 0000000C5A6A1E70 3680 XR        4    0     1       0 11480     0
0000000C5A6A1EF8 0000000C5A6A1F50 3680 RD        1    0     1       0 11480     0
0000000C5A6A2198 0000000C5A6A21F0 3680 CF        0    0     2       0 11480     0
0000000C5A6A2438 0000000C5A6A2490 3397 RT        1    0     6       0 11476     0
0000000C5A6A2278 0000000C5A6A22D0 3680 RS       25    1     2       0 11476     0
0000000C4F97A3E8 0000000C4F97A460 1136 TX 15335430  878     6       0     0     0
0000000C5A6A2518 0000000C5A6A2570 3963 TS        3    1     3       0 11455     0
0000000C4FC26180 0000000C4FC261F8  569 TX 15007765 1622     6       0     0     0
0000000C4FDBD628 0000000C4FDBD6A0 3682 TX 13107205 2166     6       0     0     0
0000000C4FA02A30 0000000C4FA02AA8 2272 TX 14090252 2079     6       0     0     0
0000000C5A6A4940 0000000C5A6A4998 1983 KD        0    0     6       0 11454     0
0000000C5A6A4B00 0000000C5A6A4B58 1983 KT    12540    0     4       0 11454     0
0000000C4FC23940 0000000C4FC239B8 1989 TX 10289157 2350     6       0     0     0
0000000C5A6A4A20 0000000C5A6A4A78 2831 PW        1    0     3       0 11453     0
0000000C5A6A9DD0 0000000C5A6A9E28 4258 AE      100    0     4       0   371     0
0000000C5A6AACC8 0000000C5A6AAD20 4255 AE      100    0     4       0  6614     0
0000000C5A6A68F0 0000000C5A6A6948 4251 AE      100    0     4       0   369     0
.
.
.
0000000C4FCAB578 0000000C4FCAB5F0 1421 TX 14417935 2082     6       0     0     0
0000000C4FA8CEA8 0000000C4FA8CF20 3118 TX 13828121 2491     6       0     0     0
0000000C4FA08ED0 0000000C4FA08F48 1420 TX 11730968 2288     6       0    41     0
0000000C4FE47090 0000000C4FE47108 3965 TX 13369364 2318     6       0     0     0
0000000C44E18550 0000000C44E185C8 2835 TX 13238301 2255     6       0     0     0
0000000C4FCAC998 0000000C4FCACA10 1423 TX 10158112 2226     6       0     0     0
0000000C44F291E0 0000000C44F29258  290 TX 12779538 2146     6       0     0     0
519 ROWS selected.
Elapsed: 00:00:00.19
Posted in ORACLE | Tagged , , , | Leave a comment

RMAN-600(8201)错误

客户数据库在执行RMAN备份时碰到这个错误。
错误信息如下:

RMAN-00571: ===========================================================
RMAN-00569: =============== ERROR MESSAGE STACK FOLLOWS ===============
RMAN-00571: ===========================================================
RMAN-03002: failure OF backup command at 03/25/2012 02:31:18
RMAN-00600: internal error, arguments [8201] [] [] [] []

根据MOS文档Rman Backup Failed With Error Rman-00600 [8201] [ID 412786.1]描述,导致错误的原因是控制文件中记录的信息和CATALOG中记录的信息出现了不一致的地方。Oracle给出的解决方案是CATALOG的全同步,不过执行RECYNC CATALOG后问题依旧:

RMAN> resync catalog; 
RMAN> SHOW ALL;
RMAN configuration parameters are:
CONFIGURE RETENTION POLICY TO RECOVERY WINDOW OF 45 DAYS;
CONFIGURE BACKUP OPTIMIZATION OFF; # DEFAULT
CONFIGURE DEFAULT DEVICE TYPE TO DISK; # DEFAULT
CONFIGURE CONTROLFILE AUTOBACKUP OFF; # DEFAULT
CONFIGURE CONTROLFILE AUTOBACKUP FORMAT FOR DEVICE TYPE DISK TO '%F'; # DEFAULT
CONFIGURE DEVICE TYPE DISK PARALLELISM 1 BACKUP TYPE TO BACKUPSET; # DEFAULT
CONFIGURE DATAFILE BACKUP COPIES FOR DEVICE TYPE DISK TO 1; # DEFAULT
CONFIGURE ARCHIVELOG BACKUP COPIES FOR DEVICE TYPE DISK TO 1; # DEFAULT
CONFIGURE MAXSETSIZE TO UNLIMITED; # DEFAULT
CONFIGURE ENCRYPTION FOR DATABASE OFF; # DEFAULT
CONFIGURE ENCRYPTION ALGORITHM 'AES128'; # DEFAULT
RMAN-00571: ===========================================================
RMAN-00569: =============== ERROR MESSAGE STACK FOLLOWS ===============
RMAN-00571: ===========================================================
RMAN-03002: failure OF SHOW command at 03/26/2012 10:10:03
RMAN-00600: internal error, arguments [8201] [] [] [] []

进一步查询MOS,发现Oracle在Bug 6035495 – ORA-19909 during MRP / RMAN-600 on resync [ID 6035495.8]文档中给出了更详细的描述。这个错误一般都发生在包含备库的情况,确认影响的版本是10.2.0.3,Oracle在10.2.0.4和11.1.0.6中fixed了这个问题。
而解决问题的方法是在备库执行RESET DATABASE命令,而在主库执行控制文件的重建。不过控制文件的重建则意味着停机以及备份信息的丢失,可以考虑暂时通过NOCATALOG方式的备份来避免错误的产生。

Posted in BUG | Tagged , , , , , | 4 Comments