ora-600 [4000]的又一次处理
今天公司有台开发库由于大楼停电,导致数据库起不来,报出的错误是ora-600 [4000] [5]这样的错误。类似于这样的错误我以前也处理过一次。详见这里。由于是开发库又有备份,所以把这个案例拿来玩玩:[@more@]用10046事件打开,可以看到下面的信息:create table bootstrap$ ( line# number not null, obj# number not null, sql_text varchar2(4000) not null) storage (initial 50K objno 56 extents (file 1 block 377))PARSING IN CURSOR #2 len=55 dep=1 uid=0 oct=3 lid=0 tim=1220697932880067 hv=2111436465 ad='64
report obsolete引起core dump
环境:aix 5.3.0.7oracle 9.2.0.8 RACRMAN 9.2.0.8+catalog[@more@]rman 维护时,report obsolete或者delete obsolete导致core dump,在前段时间虽然没有出现core dump,但是每次delete obsolete都无法真正删除那些obsolete的对象。这是个bug。采用9206的rman可以解决这个问题。最好是打上补丁5765357。
奇怪的ORA-01034: ORACLE not available
环境:oracle 10.2.0.3 linux 4.4 64bit应用程序连接日志中每天都有好几次ORA-01034: ORACLE not available的错误。。。[@more@]但是数据库一直是正常的,alert日志中也没有任何错误。检查监听也是正常的,有个动态注册和静态注册。怀疑是静态注册引起,于是在listener.ora里面将静态注册去掉。结果除了上面的错误,又出现了ORA-12519, TNS:no appropriate service handler found错误。这时就比较明显了,说明总有几次链接需要这个静态注册的服务的,但是为什么会报ora-1034呢?仔细检查listener.ora的配置:SID_LIST_LISTENER = (SID_L
Recost for order by (using index)引起的SQL Tunning的问题
问题来源于http://www.itpub.net/thread-957261-1-1.html。mihawk 对10053 trace name文件解释的挺好的。[@more@]这个问题以前也听同事们讲过,但由于没有看过10053的trace 文件,开始还以为是oracle cbo选择错了。今天看了这个trace文件,才发现并不是oracle的cbo出了问题,也不是统计信息不正确,看起来是这个recost for order by 的cost比较上面出了些问题,也许有隐含参数就像optimizer_index_cost_adj这个参数一样,可以控制这个recost for order by的cost成本。于是查找x$ksppi,还真发现一个隐含参数_SORT_ELIMINATION_COST_RAT,其
RMAN-20021: database not set
环境:oracle9208 64bit aix 5304采用rman备份,不间断地报出如下错误:RMAN-03002: failure of backup command at 11/30/2007 04:07:53RMAN-20021: database not set经查,居然说是要设置NLS_LANG才可以。设置NLS_LANG后还真可以了。靠。[@more@]
where子句后现条件的顺序引起的问题
说起来,我想大家都知道在where子句后面条件的排列顺序对sql语句的性能是有影响的,特别是在rule模式下,在cbo模式,大家对这块的关注越来越少了。不过这次我却碰到这样的一个问题。[@more@]如下的一条sql:select o.order_idfrom all_order o where o.gmt_trade_finished>to_date('20070911172907','yyyymmddhh24miss') and o.gmt_trade_finished<=to_date('20071113160832','yyyymmddhh24miss') and (mod(to_number(o.order_id),9)=2 and o.site='xxx');在all_order表中,order_id为varchar2类型,大部分为数字,其中sit
oracle10G配置的修改
刚上线一套oracle10.2.0.3,装好后简单做了如下一些配置:1.AUTO_SPACE_ADVISOR_JOB作业:It runs the Automatic Segment Advisor, which identifies segments that have space available for reclamation,and then makes recommendations that you can view with Enterprise Manager or a set of PL/SQL package procedures. This job was introduced in 10gR2 and is not present in 10gR1。 2.execute_em_dbms_job_procs作业 这具job每分钟执行一次,里面包括 EMD_COLLECTION.RUN_COLLECTIONS(),EM_PING.MARK_NODE_STATUS();, EM_
oracle10.2.0.3在linux64bit上面安装碰到的问题
这次在linux 64bit上面整了一套oracle10.2.0.3的db。碰到了以下几个问题,记录一下。[@more@]1.手工配置oem的问题emca -config dbcontrol db -repos create 它将创建sysman用户。注意该用户不能自己手工创建,否则将会报出failed to unlock em-related accounts错误。由于网络上面的安全设置默认的1158端口不能访问,修改以下端口修改端口:emca -reconfig ports -DBCONTROL_HTTP_PORT 20720 2.在oracle10.2.0.3里面一定要有监听动态注册的服务才能连的上,否则将会报以下的错误:sqlplus rnd/xxx@aepdb_stdSQL*Plus: Release 10.2.0.3.0
奇怪的ORA-16040: standby destination archive log file is locked
OS:AIX 5.3 64BIToracle:9.2.0.8 64BITdata guard环境,一主一备,采用lgwr传送归档日志在高峰期在主库报出ORA-16040: standby destination archive log file is locked这样的错误。[@more@]这个错误不影响业务,也不影响系统。错误信息如下:ARC3: Begin FAL archive (thread 1 sequence 20334 destination alisoft_std)Creating archive destination LOG_ARCHIVE_DEST_3: 'alisoft_std'Mon Oct 8 02:01:21 2007ARC0: FAL archive, error 16040 creating remote archivelog file 'alisoft_std'Mon Oct 8 02:01:21 2007Errors in file /
在obj$基表中大量的non-existant类型对象是咋回事?
今天hoterran跟我说obj$中怎么会有那么多type#=10的对象存在。即select obj#,name,type# from obj$ where type#=10;其type#为10表示的是什么类型呢?[@more@]对obj$基表字段的解释可以从sql.bsq文件中获得,关于type#的解释,我们可以从中得到: type# number not null, /* object type (see KQD.H): */ /* 1 = INDEX, 2 = TABLE, 3 = CLUSTER, 4 = VIEW, 5 = SYNONYM, 6 = SEQUENCE, */ /* 7 = PROCEDURE, 8 = FUNCTION, 9 = PACKAGE, 10 = NON-EXISTENT, */ /* 11 = PACKAGE BODY,
not null对sql tunning的影响
由于普通索引中是不包含null记录的,这就意味着null与not null对sql tunning肯定在某些情况下会有影响。比如说如果某个字段允许为null的话, 那么这个字段上面就没法走 INDEX (FAST FULL SCAN) 。但是在某些情况下,我们知道这个字段上面不可能有null值的,只是表设计时没有对这个字段加上not null的约束,此时单独访问这个字段时oracle也不会走index fast full scan。当然只需增加not null约束或者修改sql,增加is not null的子条件是可以解决的。具体见下面的例子:[@more@]在test表的domain_user_id字段上面建个索引。该字段是允许为nu
关于oracle11g新增加带默认值的列的新特性的问题
最近经常看到大家在研究oracle11g的新特性,由于时间关系,我现在还没有开始正在研究oracle11g,只是大概了解oracle11g的新特性。其中有一个是新增加带默认值的列的细小改动。具体可以参见piner和老和尚的blog。我这里想说的是oracle这个细小的改动,在某些情况下也许会带来的一些问题。举个例子:某个列,新增加default的值为1,然后在随后的操作或者需求当中,要求某些记录该列的值就是null。此时查询这条记录该列的值时,得到的却不是null,而应该是1了。换句话说,在oracle11g中,只要有default值的列就不允许业务上将该列的值设为nul
opatch打补丁时一个错误
用opatch打补丁,比较常见的一个错误是:Problems with the lock fileLock file exists, details are: Interim Patch 5508574 is holding the lock from this patch 5484847, probably due to previous unsuccessful operation也就是某个补丁未成功时,接下来打补丁就有可能会出现上面的错误:解决办法是删除 $ORACLE_HOME/.patch_storage/patch_locked[@more@]
oracle 11g新特性
oracle 11g推出了众多的新特性,这次的感觉是虽然oracle 11g不像oracle 10g一样是个划时代的版本,但是oracle 11g却对oracle 10g做了非常好的完善,它在许多细小的地方都可以体现出来。一年以后,也许要考虑换到oracle 11g了。以下是自己对新特性的一些简单的罗列,主要是写给自己的。[@more@]1.oracle快速文件:使的对大对象,非结构化的数据放在db里面能够达到文件系统级别的访问速度。2.据说字符集自动适应本地化显示。具体还不太明白。3.数据压缩2-3倍/数据加密。需要带key来访问,这就解决了备份文件被偷,带库被偷导致数据丢失的风险
在cursor中控制事务大小的一个小的注意事项
我们为了控制事务的大小,一般都是采用IF (MOD (v_count, 1000) = 0)THEN COMMIT;END IF;这样的方式。其中v_count是一个计数器。[@more@]但是,我这次碰到一个问题,这个cursor里面的事务每次执行时还是太大。这个过程是这样写的: PROCEDURE sp_move_order_to_history AS error_info VARCHAR2 (512); v_count NUMBER; s_start DATE; BEGIN FOR x IN (SELECT ROWID rid, order_id FROM all_order WHERE gmt_modified < ADD_MON
一次细小的sql tunning
大家在sql tunning时,首先都会去看执行计划。但set autotrace traceonly exp看执行计划显示的却是不全,有些细小的地方就无法发现。下面是我一次经历,其实挺简单的,只是希望对对家有所提醒。[@more@]创建测试表格:create">c2c@c2c>create table bak_all_order as select * from all_order where rownum<10000;Table created.create">c2c@c2c>create index bak_test on bak_all_order (SELLER_DOMAIN_USER_ID,CLOSINGDATE,IS_DELETED,TRADE_STATUS);Index created.有这么条语句,执行非常的频繁:SELECT count(*)
RAC+Dataguard环境中JDBC Failover配置
在rac+dataguard的环境中,为了减少应用宕机时间及改动,提高业务的可用性,要求jdbc客户端配置failover。同时为了很好地做应用分割,又不能load balance。即在第一个实例不行时,去偿试第二个实例,两个实例都不行时,去偿试data guard。这样的目的看起来简单,其实有些细小的地方值的注意。下面是一个配置的例子:[@more@]jdbc:oracle:thin:@(description= (ADDRESS_LIST = (LOAD_BALANCE=OFF)(FAILOVER=ON) (ADDRESS = (PROTOCOL = TCP)(HOST = x)(PORT = 1521)) (ADDRESS = (PROTOCOL = TCP)(HOST = y)(PORT = 1521
一个“奇怪”的问题
好久没有更新博客了,最近事情太多。昨天晚上弄到凌晨4点才睡觉。刚刚碰到一个奇怪的搞笑的事情,与大家共享一下。[@more@]开发人员说,在开发库中出现奇怪的事情:有一张表格A,没有人在修改它,但是不知道为什么记录数老是在不断的变化。他们用的sql语句是这样的:select count(*) from A where A.col < sysdate and A.col >sysdate-3;记录数在不断地减少,好像有人在删除它。我登陆DB,查看v$transaction没有任何记录。查看v$session_wait,就那么几个会话, 它们做的事情都与A表无关。查看dba_jobs_running也没有任何记录。奇了
文件系统与裸设备性能比较
现在有一种经典的说法是oracle安装的祼设备上面比安装在文件系统上面要快。是不是任何情况下都是这样呢?以下是我的一点个人分析,如有不对之处请指出。[@more@]目前一般的文件系统都是有日志的。为了尽量减少文件系统的不一致性,缩短操作系统的启动时间,文件系统需追踪引起系统改变的记录,这些记录存放在与文件系统相分离的地方,通常我们叫“日志”。一旦这些日志记录被安全地写入,日志文件系统就可以应用它们清除引起系统改变的记录。这个日志的作用就像oracle中redo的作用一样。数据库建在文件系统上面主要有以下几点需要考虑:1.
在Intel扩展64BIT上安装64位oracle9208碰到的问题
OS:redhat AS 4u4 64bit.20G内存4个双核CPU。这次安装过程中碰到如下问题,记下来,使得大家以后碰到同样的问题时可以减少时间。[@more@]1.在安装oracle时,在18%处停住了。显示为copying naeet.o。解决办法:设置export LD_ASSUME_KERNEL=2.4.19环境变量。2.有几个编译错误,如extproc32。解决办法:这些编译需要以gcc296和g++296来编译。以如下命令创建 296版本的gcc和g++命令,并将它们的权限改为755。exec /usr/bin/gcc32 -static-libgcc -B/usr/lib/gcc-lib/i386-redhat-linux/2.96/ "$@"创建g++命令:exec /usr/bin/g++3