Category Archives: oracle 10g

数据库不能正常关闭的问题

数据库版本为10.2.0.3,shutdown immediate不能正常关闭数据库。 因为要将数据库从非归档模式转为归档模式,所以需要干净的关闭数据库。shutdown abort是不行的。 在shutdown数据库前已经确定没有大的事务在进行(可以查看v$transaction.USED_UBLK)。 但是shutdown immediate后数据库不能被正常关闭,数据库不停地写redo。 shutdown abort然后再起来后通过logmnr来分析redo文件 SQL> EXECUTE DBMS_LOGMNR.ADD_LOGFILE(LOGFILENAME => ‘/oracle/logs/log1.dbf’,OPTIONS => DBMS_LOGMNR.NEW); PL/SQL procedure successfully completed. SQL> EXECUTE DBMS_LOGMNR.START_LOGMNR(OPTIONS => DBMS_LOGMNR.DICT_FROM_ONLINE_CATALOG); PL/SQL procedure successfully completed. 查看V$LOGMNR_CONTENTS中的SQL_REDO发现都是delete from col_usage$表的SQL delete from “SYS”.”COL_USAGE$” where “OBJ#” = ‘376767’ and … Continue reading

Posted in oracle, oracle 10g | 102 Comments

重现ORA-24816

在oracle 10.2版本中,ORA-24816是一个常见的错误,错误描述如下: 24816, 00000, “Expanded non LONG bind data supplied after actual LONG or LOB column” // *Cause: A Bind value of length potentially > 4000 bytes follows binding for // LOB or LONG. // *Action: Re-order the binds so … Continue reading

Posted in oracle 10g | 148 Comments

尽量缩短oracle upgrade时间

在做oracle upgrade的时候,因为需要down机,所以节约每一分钟时间都很重要,特别是当需要升级很多台数据库的时候。 我们过去两年的时间内升级了两三百台primary数据库。从节约时间上来说,大致有以下三个tips: 1. 将新的binary copy到服务器上,在维护前先relink all。 2. 在中间startup upgarde的时候采用比较小的SGA参数,这样可以节约allocate和deallocate SGA的时间,特别是对于SGA较大的情况(>20GB) 3. set echo off 这里不仅仅指运行catupgrd.sql前的set echo off,而且要修改两个脚本,将其中的set echo on改为set echo off或者去掉。 \mv $ORACLE_HOME/rdbms/admin/prvthlrt.plb $ORACLE_HOME/rdbms/admin/prvthlrt.plb.bak sed ‘s/SET ECHO ON/SET ECHO OFF/’ $ORACLE_HOME/rdbms/admin/prvthlrt.plb.bak > $ORACLE_HOME/rdbms/admin/prvthlrt.plb \mv $ORACLE_HOME/rdbms/admin/catocm.sql $ORACLE_HOME/rdbms/admin/catocm.sql.bak sed ‘s/set echo … Continue reading

Posted in oracle 10g | 123 Comments

如何安全的split partition

在split partition时,如果所有索引都是local index并且新split出来的partition为空时,oracle不需要rebuild index,这就是fast split。 但是当新的partition非空时,则index处于unusable状态,需要rebuild index。而在rebuild index这段时间内,如果有SQL进来,就会出问题了。 oracle并没有给出一个安全的split partition的方法,比方说如果不能做fast split则不要做split。而unusable index对于7*24系统是非常危险的。 当然你可以在split的时候去跟踪,一旦发现写入新的segment,则取消操作,但是这样还是有风险。而且一般都是定期做split,通过脚本实现,不太可能每次都手工做。 要实现fast split关键是找到正确的split point。一般我们首先跑一个查询,找出当前这个partition的最大partition key,然后再加一就是split point,然后根据这个split point来做split。但是这中间有一个时间间隔,如果这中间有新的数据插入的话,split point就不对了。 对于partition key为一个列的分区表来说,查询可以走index range(max) scan,这个时间间隔很短,可能遇到该问题的概率很小,但是如果partition key为多列的话,只能走fast full index scan,这个时间间隔可能很长,风险大大增加了。 为了避免这一风险,我采用了下面的方法: 1. 查询将要做split的partition的最大partition_key select $sql_hint max(Partition_key+1) SPLITPOINT from $tablename partition(${maxpartname}) 2. 以exclusive模式lock … Continue reading

Posted in oracle 10g | 130 Comments

row-level dependency tracking (10g new feature)

在10g版本中加入了row-level dependency tracking的新特性,默认是关闭的。 一般情况下,一个block中只有一个SCN号来记录整个block里的变化,打开该特性后每一行都有一个SCN号。 在建表时指定ROWDEPENDENCIES属性可以打开这一功能,我们来看下面的测试: SQL> select count(*) from test; COUNT(*) ———- 0 SQL> insert into test select rownum from dual connect by level SELECT ORA_ROWSCN,rowid from test; ORA_ROWSCN ROWID ———- —————— 205810221 AAAGinAABAAAGnxAAA 205810221 AAAGinAABAAAGnxAAB 205810221 AAAGinAABAAAGnxAAC 205810221 AAAGinAABAAAGnxAAD … Continue reading

Posted in oracle 10g | 98 Comments