Category Archives: ORACLE

所有Oracle技术文章

访问ASM的ONNN进程占用大量CPU

客户的11.2 RAC环境中突然一个O002进程占用了100%的CPU,且一直不释放。 导致这个问题的原因应该是通过ASMCMD工具从ASM中拷贝了一个归档日志到本地磁盘,随后就发现一个ora_ [root@node-2 ~]# top top – 21:14:25 up 257 days, 4:33, 2 users, LOAD average: 1.69, 1.70, 1.56 Tasks: 994 total, 2 running, 991 sleeping, 0 stopped, 1 zombie Cpu(s): 2.2%us, 0.1%sy, 0.0%ni, 97.5%id, 0.2%wa, 0.0%hi, 0.0%si, 0.0%st … Continue reading

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

使用kfed出现无法初始化diag的错误

测试环境上使用kfed工具出现错误。 错误信息如下: grid@solaris:~$ kfed ERROR!!! could NOT initialize the diag context grid@solaris:~$ id uid=502(grid) gid=501(dba) grid@solaris:/u02/app/oracle/product/11.2.0/grid/bin$ ./kfed Unable TO run program edgrid@solaris:~$ kfed ERROR!!! could not initialize the diag context grid@solaris:~$ id uid=502(grid) gid=501(dba) grid@solaris:/u02/app/oracle/product/11.2.0/grid/bin$ ./kfed Unable to run program … Continue reading

Posted in ORACLE | Tagged , , , | 1 Comment

DBCA添加节点出现PRKC-1055错误

很早以前写过几篇文章,描述在RAC环境下添加节点的问题,其中在使用DBCA添加节点时,碰到了PRKC-1055错误。 Oracle10203RAC环境添加新节点(六):http://yangtingkun.itpub.net/post/468/493937 运行DBCA在配置好新实例的设置后,在最后运行的时候报错:Failed to create directory “” on “racnode3”, “PRKC-1055: Directory name passed was null”. PRKC-1055: Directory name passed was null。 本来一直认为是Oracle的DBCA处理不当,导致使用OMF存在异常,并最终引发了这个问题。最近Kamus也碰到了这个问题,最终发现是由于参数设置的问题,导致新增节点的目录参数设置和已有节点的参数冲突从而导致了问题。 可以参考文档DBCA Fails With PRKC-1055 While Adding a New Instance to an Existing RAC Database [ID 394519.1]。 简单的说,DBCA会验证目录设置在所有节点上是否存在。可以通过下面的脚本找到所有修改过的参数: SELECT … Continue reading

Posted in ORACLE | Tagged , , | Leave a comment

利用触发器解决更新主键冲突的问题

有朋友问我能否用触发器实现更新数据时,如果发现主键已经存在,则将冲突的主键更新为当前记录之前的主键值。 简单的说,如果表中存在主键为1和2的记录,如果一条UPDATE语句将1更新为2,那么想要实现的功能是为了确保这个UPDATE可以执行成功,在后台自动将ID为2的记录更新为1。 这个功能应该可以实现,但是直接在触发器中肯定无法实现,因为这是一个标准的变异表问题。而且即使是采用自治事务的方式,也需要小心,因为要修改原有的记录就必须通过UPDATE实现,而这个UPDATE又会导致触发器的触发,如果处理不当,就会导致循环触发。 SQL> CREATE TABLE T (ID NUMBER, NAME VARCHAR2(30), CONSTRAINT PK_T PRIMARY KEY (ID)); TABLE created. SQL> CREATE OR REPLACE PROCEDURE P_UPDATE_T (P_NEW NUMBER, P_OLD NUMBER) AS 2 BEGIN 3 FOR I IN (SELECT ID FROM T WHERE … Continue reading

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

ORA-600(6002)错误

客户数据库出现ORA-600(6002)错误。 在告警文件中出现大量的错误: Sun Apr 1 16:15:41 2012 Errors IN file /oracle/orcl/udump/orcl_ora_16555.trc: ORA-00600: internal error code, arguments: [6002], [0], [0], [4], [0], [], [], [] Sun Apr 1 16:16:43 2012 Errors IN file /oracle/orcl/udump/orcl_ora_16555.trc: ORA-00600: internal error code, arguments: [6002], [0], … Continue reading

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

四人过桥问题的SQL解法

看了开发版的帖子,又没有忍住,简单写了一个SQL语句。关于问题的详细描述可以参考http://www.itpub.net/thread-1595264-1-1.html 传说中的微软面试题: 有一群人A,B,C,D (人数>=2)要在夜里走过独木桥过河,他们只有一把手电筒。四个人的速度不同,过河分别需要1,2,5,10分钟,桥上最多走两个人,两个人一起走时按速度慢的计算。过河一定要用手电筒。请问最快的方法是如何安排,需要几分钟? 例子输出: A B,A,A C,A,A D 19 直接给出最终结果: SQL> WITH C AS 2 (SELECT NAME, TIME, POWER(2, ROWNUM – 1) POS FROM BRIDGE_CROSSING), 3 A AS 4 (SELECT 0 RN, A.NAME || ‘ ‘ || B.NAME NAME, … Continue reading

Posted in ORACLE | Tagged , , | Leave a comment

恢复导致ORA-600(kccfhb_1)错误

这篇文章仍然是RMAN-600错误的后续系列。 RMAN-600(8201)错误:https://yangtingkun.net/?p=690 RMAN-600(8201)错误的重现:https://yangtingkun.net/?p=716 恢复数据库出现ORA-38727:https://yangtingkun.net/?p=759 当控制文件里存在更大RESETLOGS的ORPHAN时,Oracle在10.2.0.3及以前版本是存在bug的,开始仅仅认为这个问题影响CATALOG模式的备份。但是测试发现,对于数据库的恢复同样存在影响。 如果数据库的FLASHBACK出于打开状态,那么恢复操作就会报错ORA-38727错误,而如果FLASHBACK处于关闭状态,恢复操作就可能碰到ORA-600(kccfhb_1)错误。 [orat1@hpserver2 ~]$ sqlplus / AS sysdba SQL*Plus: Release 10.2.0.3.0 – Production ON Mon Apr 16 10:58:58 2012 Copyright (c) 1982, 2006, Oracle. ALL Rights Reserved. Connected TO: Oracle DATABASE 10g Enterprise Edition Release 10.2.0.3.0 … Continue reading

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

恢复数据库出现ORA-38727

一个测试数据库在恢复时出现ORA-38727错误。 错误信息如下: [orat1@hpserver2 ~]$ rman target / Recovery Manager: Release 10.2.0.3.0 – Production ON Sat Apr 14 09:56:01 2012 Copyright (c) 1982, 2005, Oracle. ALL rights reserved. connected TO target DATABASE: TEST10G (DBID=1030910857) RMAN> recover tablespace tbs013; Starting recover at … Continue reading

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

RMAN-600(8201)错误的解决

根据错误信息的判断,找到一个不重建控制文件的解决方案。 RMAN-600(8201)错误:https://yangtingkun.net/?p=690 RMAN-600(8201)错误的重现:https://yangtingkun.net/?p=716 其实解决方法很简单,由于导致错误的原因是目前的主库做过FAILOVER,导致RESETLOGS的时间比当前控制文件中的RESETLOGS时间要大,Oracle在进行RMAN同步的时候判断不严谨,导致数据同步不完整,并最终体现在一些RMAN命令上,比如SHOW ALL或BACKUP等。 这个问题只影响10.2.0.3及以下版本,因此升级是可以解决问题的。 此外,由于导致问题的根源在于控制文件中的ORPHAN记录,因此手工重建控制文件也是确实可行的方案。 其实除了这些方法外,还有一个办法。就是利用备库或之前备份的控制文件来创建CATALOG。由于只是当前的主库经历过FAILOVER,也就是RESETLOGS的操作,而原来的主库也就是现在的备库并没有经历这个操作,因此用之前的主库也就是目前的备库的控制文件来注册CATALOG就可以屏蔽这个错误。 测试将备库SWITCHOVER为主库,然后通过REGISTER DATABASE命令,可以顺利的进行CATALOG的同步。再次执行SWITCHOVER,切换当前主库为问题主库,这时通过问题主库连接刚才同步后的CATALOG,此时运行SHOW ALL和BACKUP命令都不会再出现错误。 这种方法可以临时的解决这个问题,但是一旦需要对问题主库执行完全同步,则问题可能会重现。 除了使用STANDBY控制文件外,如果可以找到数据库FAILOVER之前的备份控制文件,采用类似的方法,同样可以解决这个问题。

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

DML_LOCKS设置为0导致SHUTDOWN IMMEDIATE失败

DML_LOCKS参数设置系统中允许DML锁的数量,如果将这个参数设置为0,会禁止ENQUEUE的产生,有可能轻微的提升系统的性能。 不过如果将这个参数设置为0,带来的后果会严重很多: SQL> SHOW parameter dml_locks NAME TYPE VALUE ———————————— ———– —————————— dml_locks INTEGER 264 SQL> ALTER system SET dml_locks = 0 scope = spfile; System altered. SQL> shutdown immediate DATABASE closed. DATABASE dismounted. ORACLE instance shut down. SQL> startup … Continue reading

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