Monthly Archives: February 2012

ORA-600(kjrpar:noalloc)错误

由于ORA-4031引发的ORA-600错误。 告警日志中错误如下: Sat Jan 28 06:07:49 2012 Errors IN file /export/home/OracleHomes/admin/jykfdb/bdump/jykfdb1_j000_21874.trc: ORA-12012: error ON auto EXECUTE OF job 66 ORA-04031: unable TO allocate 6592 bytes OF shared memory ("shared pool","STANDARDSYS","PL/SQL MPCODE","PKR: PL_UEP") Sat Jan 28 06:08:15 2012 Errors IN file … Continue reading

Posted in BUG | Tagged , , , , , | 1 Comment

ORA-600(kjbclose:L)错误

数据库关闭过程中出现这个错误。 错误信息如下: Sat May 14 20:12:58 EAT 2011 Shutting down instance (immediate) Sat May 14 20:12:58 EAT 2011 Shutting down instance: further logons disabled Sat May 14 20:13:00 EAT 2011 Stopping background process CJQ0 Sat May 14 20:13:00 EAT 2011 … Continue reading

Posted in BUG | Tagged , , | Leave a comment

Oracle SecureBackup管理员手册

和其他备份管理工具比较类似,绝大部分工作都是通过图形化界面配置。 如果对比其他几个备份工具看,SecureBackup和他们相比确实比较类似,实现的功能大同小异,菜单和界面的组织形式也非常类似。 可能对于日常监控、管理带库的操作者而言,这种图形化的工具相对比较方便,但是对于关注备份策略、备份存储以及备份效率的DBA来说,这种工具总感觉不是很顺手。当然还没有具体用过SecureBackup,应该是没有发言权的,不过从文档介绍的功能和图形化方式来看,似乎并没有比其他厂商提供的产品有什么显著的不同。

Posted in BOOKS | Leave a comment

一次客户数据库恢复的过程

前一段时间给一个客户恢复了一个数据库。 事情其实已经过去一段时间了,而且整个过程无非是一个数据库的基于时间的不完全恢复,从技术角度讲,没有什么太多可以值得描述的,而且由于所有的操作都是在客户的主机上进行,因此没有留下任何的痕迹,因此这件事情很难写成一篇技术相关的文章,所以也就一直没有写出来。 今天打算简单描述一下这个问题,主要是受Eygle的影响,Eygle最近刚刚写完一本新书《数据安全警示录》,我在帮他进行一些文字上的检查工作。在这本书中,Eygle用他帮别人恢复数据库的案例来警示大家,希望大家能利用别人的失败教训来警醒我们自己。 虽然我的这个案例在技术上并没有太多值得描述的,但是这个案例本身却很有借鉴意义,在这里和大家分享一下。 我们接到客户的请求是周五的下午,据说客户的数据库在周四夜里DOWN机,随后负责维护的人员对数据库进行了恢复,但是数据库丢失了部分数据,客户对于恢复的程度不认可,于是找到了我们。 开始以为只是由于不完全恢复的RESETLOGS导致了少量的数据丢失,可能需要通过类似LOGMINER的方法来看看能否多恢复一些数据,但是到了现场进行了简单的沟通后,发现我们之前得到的信息非常的不准确。 客户的数据库在周四夜里11点左右DOWN机,随后负责维护的人员对数据库进行了恢复,但是数据库最终只恢复到了周四上午10点左右,客户对于这种程度的恢复当然是不认可的,以致于最终对于现场负责维护的技术人员的不信任,最终找到了我们。 而对于现场环境的检查后,发现了很多的问题。 数据库DOWN机的原因是由于当前日志损坏,由于数据库的日志每组只有一个,这个当前日志的损坏不但导致数据库的DOWN机,而且会造成数据的丢失。但是损失仅此而已,只是当前日志中少部分已经COMMIT但是还没有写到数据文件的数据。对于这种情况,最差的情况是丢失一个小时的数据,也就是说到上一个日志切换时刻数据都是正常的。而对于当前日志丢失的情况,完全没有必要也没有理由去执行全库的恢复,只要清除当前损坏的日志就可以打开数据库。执行全库的恢复说明维护人员根本不理解Oracle的备份恢复机制,只是发现数据库无法正常打开,就去盲目的还原并恢复数据库,导致更多的问题产生。 维护人员水平不高,因此备份策略的不严谨以及备份和恢复过程的混乱也是意料之内的事情。首先,Oracle的备份策略存在比较严重的问题,客户的环境中有存储备份的带库,这对于数据库备份而言,应该是更安全的保障,但是备份策略的设置不但没有提高备份的安全性,反而使得备份的可用性下降。 客户的数据库每周执行一次全库备份,每天进行一次增量的备份,此外每天要进行多次的归档日志的备份。除了全库备份一定存储在带库上之外,增量备份和归档日志的备份有可能存储在带库上,也有可能存储在磁盘上,且没有任何一个位置上的备份是齐备的。以这次的问题为例,进行数据库的恢复首先需要恢复4天前带库上的全备,然后需要应用3天前带库上的增量,2天前磁盘上的增量,1天前带库上的增量,以及带库和本地磁盘上最近一天的归档备份。这种备份策略导致的一个问题就是,如果磁盘或带库任意出现一点损坏,就会导致数据库无法完全恢复。带库设备本来可以增加备份的可靠性,但是这种备份策略的设置使得备份的安全性和可靠性被降到最低。此外这种备份的存储和恢复也会给备份恢复的性能带来很大的影响。 除了备份策略的问题之外,操作过程也存在非常严重的问题。其中一点就是,数据库恢复过程的RMAN输出日志被删除。由于缺少当时恢复过程的日志,无法确定维护人员当时具体执行的操作是什么,所有的信息只能来自当事人的口述,本来口述这个方式就不靠谱,何况还是一个概念本身就不很清晰的人,而且问题产生的后果已经比较严重,很难说他在描述的过程中是否为自己开脱。总之,按照当事人的描述,恢复步骤应该是没有问题的,但是恢复后数据库中的数据只到早上10点左右,缺少了最后一天12个小时的数据。 最后维护人员还犯了一个更加严重的错误,第一次在进行数据库恢复的过程中,有一些带库上的归档日志文件被恢复到本地磁盘上。在数据库恢复完成后,出于空间的考虑,所有硬盘上恢复出来的归档日志被删除。但是由于删除的时候没有进行限定,删除操作删除了数据库硬盘上所有的归档,不仅包括恢复过程中从带库恢复到硬盘上的,还包括最新的几个还没有进行过备份的归档文件。这个删除的操作最终导致了数据库再次进行恢复时,丢失了最后两个小时的数据。 可以看到,原本一个只是损失几分钟数据,造成半个小时左右停机时间的故障,由于维护人员的错误,导致问题一步步放大,最终造成了损失2个小时左右的数据,且数据库停机一天半以上的重大事故。

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

Oracle Database 9i/10g/11g编程艺术——深入数据库体系结构

周三的ACOUG大会上得到了Tom签名的这本书。 这本书的第一版《Oracle9i&10g编程艺术》在08年就看过了,不过Tom的这本第二版是11年1月出版的,而我居然在拿到手之后才知道,可谓是后知后觉了。对于Tom的书来说根本没有必要多做介绍,每一本都是经典,只要静下心去读就好了。 编程艺术给人感觉面向开发人员,不过里面包含的大部分内容对于DBA而言也是同样应该了解的,至少我当时就从第一版中获益匪浅。 《Export One on One Oracle》第一版是8i到9i版本,到第二版变成9i到10g版本。而这本书第一版是9i到10g的版本,到这一版已经是9i、10g和11g的版本了。这说明Tom本身也在不断学习,不断将最新的特性纳入到他的著作中。在12c很快就要面世的情况下,有一些国内的从业者却还没有用过11g,如果再不抓紧时间学习,那么技术真的是很快就会落伍了。

Posted in BOOKS | Leave a comment

DDL触发器设置导致DDL无法执行(二)

公司测试数据库发现执行DDL报错。 继续描述问题的诊断和解决。 DDL触发器设置导致DDL无法执行(一):http://yangtingkun.itpub.net/post/468/526410 从对象定义是找不到问题的原因的,只能通过10046跟踪一下: SQL> ALTER SESSION SET EVENTS ‘10046 TRACE NAME CONTEXT FOREVER, LEVEL 12’; Session altered. SQL> CREATE TABLE T_CREATE (ID NUMBER); CREATE TABLE T_CREATE (ID NUMBER) * ERROR at line 1: ORA-00604: error occurred at recursive SQL … Continue reading

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

DDL触发器设置导致DDL无法执行(一)

公司测试数据库发现执行DDL报错。 由于篇幅所限,这里简单描述一下问题产生的现象。 打算进行个测试,结果发现建表时报错: SQL> CREATE TABLE T_EXCHANGE (ID NUMBER, CREATED DATE, TYPE VARCHAR2(18)) 2 PARTITION BY RANGE (CREATED) SUBPARTITION BY LIST (TYPE) 3 (PARTITION P1 VALUES LESS THAN (TO_DATE(’2012-1′, ‘YYYY-MM’)) 4 (SUBPARTITION P1SP1 VALUES (’TABLE’), 5 SUBPARTITION P1SP2 VALUES (’INDEX’), … Continue reading

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

20120222ACOUG&Oracle技术研讨会——Meeting Thomas Kyte

标题很长,没有办法,因为要表达的东西很多。 今天是ACOUG和Oracle联合组织的一期活动,和以往最大的区别在于,这一期我们请来了大名鼎鼎的Thomas Kyte,也就是ASK TOM中的Tom。正是由于Tom的明星人气,导致ACOUG的60个名额在4个小时内就已经满了。 近距离接触大师的机会是非常难得的,更难得是除了有机会聆听大师的演讲,还有机会向大师提问,唯一可惜的是,Tom对于我的提问回答是NO。当然我问的是12C的新特性,由于Oracle的策略所致,Tom无法在产品正式发布之前进行任何新特性的透露。 Tom的演讲的主体是Oracle的技术发展,总结了从9i到11g以来Oracle在各个方面所带来技术改变;而Eygle演讲的主体则是一个深入的技术细节,描述了一个数据库崩溃后如何进一步诊断和恢复。 明天在上海还有一场同样的ACOUG活动,这里预先祝愿活动圆满成功了。

Posted in NEWS | Leave a comment

获取表空间是否可自动扩展的SQL

好长时间没写SQL了,今天看到同事在使用一个检查表空间是否可自动扩展的SQL,不但效率不高,而且非常的累赘,忍不住自己写了一个。 原始SQL如下: SQL> SELECT DISTINCT tablespace_name, autoextensible 2 FROM DBA_DATA_FILES 3 WHERE autoextensible = ‘YES’ 4 UNION 5 SELECT DISTINCT tablespace_name, autoextensible 6 FROM DBA_DATA_FILES 7 WHERE autoextensible = ‘NO’ 8 AND tablespace_name NOT IN 9 (SELECT DISTINCT tablespace_name 10 … Continue reading

Posted in ORACLE | Tagged , , | Leave a comment

ORA-600(kgeade_is_0)错误

一个和并行执行有关的bug。 虽然是并行执行相关,但是报错的并不是Pnnn进程,事实上,实在RAC环境中查询GV$表导致了这个错误。 Wed May 04 15:56:02 EAT 2011 Starting ORACLE instance (normal) LICENSE_MAX_SESSION = 0 LICENSE_SESSIONS_WARNING = 0 Interface TYPE 1 lan900 192.168.194.0 configured FROM OCR FOR USE AS a cluster interconnect Interface TYPE 1 lan901 10.142.194.0 configured FROM OCR … Continue reading

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