Monthly Archives: April 2012

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

有朋友问我能否用触发器实现更新数据时,如果发现主键已经存在,则将冲突的主键更新为当前记录之前的主键值。 简单的说,如果表中存在主键为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)错误:http://yangtingkun.net/?p=690 RMAN-600(8201)错误的重现:http://yangtingkun.net/?p=716 恢复数据库出现ORA-38727:http://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

2012年4月数据库技术大会第三天

由于今天有事,只听了金官丁和BITI的演讲。 发现我确实和ITPUB的数据库大会八字不合,前两次都和重要的事情发生了冲突,导致无法参加,这次总算没有发生正面的冲突,不过第三天的演讲还是受到了影响,只能听两个小时左右的演讲,连上午的重头戏之一,biti_rainy、eygle和piner三巨头的圆桌会议都错过了。 好在听了的两场演讲让我不需此行。Biti和金官丁都已经华丽的转型为管理人员,他们的一些思考可以给现在还在技术职位上奋斗的DBA们指出方向。个人认为,技术人员容易犯一个毛病,只顾低头研究技术,忘了抬头看看方向。如果方向的选择存在问题,不但容易绕弯路,也容易对自己的前途产生迷茫。如果说技术的获取会有多种渠道,那么方向的思考却是数据库大会给我们带来的最大收获之一。让我们听听那些通过技术走向成功的人的经验,对于我们思考自己的方向和前途有着非常大的借鉴意义。 大会今天圆满结束了,三届大会人数一届高过一届,这说明数据库大会受到越来越多国内DBA们的认同,最后希望明年的数据库大会能够碰到更多的老朋友,也结识更多的新朋友。

Posted in NEWS | Leave a comment

2012年4月数据库技术大会第二天

今天的主题中王珊教授、Eygle和老虎是亮点。 上午首先是《数据库系统概论》的作者王珊带来的《Big data时代数据库的机遇、调整和应战》。说实话,我就属于半路出家,没有接触过数据库的基础理论。虽然对于基本的三范式有一些了解,不过像《数据库系统概论》这种专业的理论基础确实没有看过。虽然没有拜读过王珊教授的数据库理论,但是现场听到王教授的关于Big Data的演讲,感触还是非常深的。王教授的理论和技术方面,不是我这种后学之辈有资格进行评价的。不过以王教授这种国内数据库的先行者,现在尚且不断的学习新知识,研究最新的数据库应用方向,足以说明在数据库是学无止境的,因此革命尚未成功,同志们仍需努力。 Eygle的演讲内容已经很熟悉了,一方面是对他最近的一些案例比较了解,另一方面是公司内部有过类似的演讲。Eygle的场面掌控能力非常强,而且安全性方面的内容也非常吸引人。 无独有偶,Eygle后面一个主题,杨宁给我们带来的也是安全相关的内容《数据库攻防实践与SOX安全审计》。两个安全方案的演讲放在一起很有意思,一个是从DBA角度看如何进行数据库的安全管理,另一个是从攻击的角度看Oracle存在哪些漏洞。而大会的两场安全方面的演讲也说明安全性相关问题收到越来越多人的关注。 下午主要听了老虎的演讲,演讲前半部分是一个RAC加载的性能案例分析,而后半部分变成了数据建模的新的算法和数据分析方法。这两部分内容跨度之大,整个大会上无出其右。如果说前半部分是一个很容易理解的CASE,那么后半部分就基本上不知所云了。

Posted in NEWS | Leave a comment

2012年4月数据库技术大会第一天

今年是ITPUB组织数据库大会的第三年了,而我却是第一次参加。 PUB组织的架构师大会倒是一次都没有拉过,而前两次数据库大会却阴差阳错的都错过了。而且这也是我第一次在数据库大会上分享主题。当然这时废话,大会都没参与过,何来的主题分享。 虽然以前在Oracle的圆桌会议以及ACOUG上都分享过不同的主题,不过在这么大规模的会议上发表演讲,还确实是头一次。在加上最近一段时间工作上的事情比较多,因此演讲和PPT的准备时间都很紧张,甚至是今天的早上,都还在修改PPT。内容主要是一些比较有特点的案例的分享,并且希望通过案例的解决过程带给大家一些思考。 今天除了准备自己的演讲外,上午还去听了三思的演讲。小伙已经从原来的STEP BY STEP的实践阶段成长到设计符合特定应用场景的高可用架构的阶段了,而且目前身兼Oracle和MySql两大绝技,可谓博采众家、内外兼修。 下午和我同一个会场的基本上都是熟人,郑保卫、侯圣文和刘磊分别带来了精彩的演讲,使得我原本计划抽空去Mysql和DB2的会场取经的计划落空了。 晚上是IT168/ITPUB组织的晚宴,基本上演讲的嘉宾和PUB的版主都到齐了,可以说每年PUB组织的数据库大会,也是版主们每年最大的聚会,很多平时外地难得一见的版主汇聚一堂。只是可惜老虎的龙虾仍然是神“龙”首尾都不见。 最后给出我分享主题的PPT下载地址:http://yangtingkun.net/wp-content/uploads/2012/04/Think-Different.pptx

Posted in NEWS | Leave a comment

RMAN-600(8201)错误的解决

根据错误信息的判断,找到一个不重建控制文件的解决方案。 RMAN-600(8201)错误:http://yangtingkun.net/?p=690 RMAN-600(8201)错误的重现:http://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