Monthly Archives: March 2012

默认值和触发器的顺序

今天在写触发器的时候突然想到这一点,为了验证想法,做了一个简单的例子。 如果一个字段拥有默认值,且包含一个BEFORE的行级触发器,当不指定值时,二者的生效顺序如何: SQL> CREATE TABLE t_trigger_default (id NUMBER, col varchar2(30) DEFAULT ‘default’); TABLE created. SQL> CREATE TRIGGER t_b_tri_def 2 BEFORE INSERT ON t_trigger_default 3 FOR each ROW 4 BEGIN 5 :NEW.col := ‘trigger’; 6 END; 7 / TRIGGER created. SQL> … Continue reading

Posted in ORACLE | Tagged , , | Leave a comment

设置到相同SID仍无法连接实例

今天有同事问,为什么设置了正确的SID后仍然连接到空闲实例,且启动到MOUNT状态就报错。 根据他的描述,基本上可以判断是ORACLE_HOME的设置问题,于是做了一个简单的例子重新了这个问题: [orat0@hpserver2 ~]$ env|grep ORACLE ORACLE_SID=orcl10g ORACLE_BASE=/t0/orat0/app/oracle ORACLE_HOME=/t0/orat0/app/oracle/product/10.2.0/db_1 [orat0@hpserver2 ~]$ sqlplus / AS sysdba SQL*Plus: Release 10.2.0.5.0 – Production ON Thu Mar 22 16:06:48 2012 Copyright (c) 1982, 2010, Oracle. ALL Rights Reserved. Connected TO an idle instance. SQL> … Continue reading

Posted in ORACLE | Tagged , , | Leave a comment

快速增加表的默认值的方法

看到ITPUB上有人提到,如何快速的在一个3亿条记录的表中增加一个包含DEFAULT值的新字段。描述一下如何快速的添加表的默认值。 Oracle11新特性——在线操作功能增强(二) :http://yangtingkun.itpub.net/post/468/401293 对于这个问题,常规的方法有三个: 一、直接ALTER TABLE ADD COLUMN,这种方法的好处是简单,一个命令就可以完成,缺点是耗时非常长,而且在漫长的执行过长中都会锁定表,导致应用无法修改数据,并且在完成后容易造成大量的行迁移,从而影响后续访问的性能; 二、CREATE TABLE AS SELECT的方式,这种方式相对第一种而言,效率更高,如果是非归档模式,那么完成速度会更快。但是缺点同样很明显,首先需要大量的停机时间,而且表上的索引、约束、触发器以及权限等都需要手工处理,比较麻烦; 三、在线重定义,这种方式应该算是这三种中最佳的,锁表时间非常短,对业务影响最小,但是缺点是整个操作的时间并不会变短,和第二种方式一样,都需要2倍的存储空间,而且操作相对复杂。 如果数据库的版本是11g,那么这就不是问题了,以前写过专门的文章,描述11g是如何快速添加一个包含非空DEFAULT值的列的。那么对于10g及以前版本的数据库而言,增加一个包含默认值的字段难道就真的要忍受漫长的执行时间和大量的REDO、UNDO的占用吗。 其实完全可以仿照11g的方式,来自己实现10g中字段的快速添加。记得Tom在描述数据库的解析时提到过,软解析要优于硬解析,软软解析要优于软解析,而速度最快的莫过于不解析。提高速度的最高境界就是根本不做。 那么对于添加默认值的方式也可以才有这种方法,对于已经存在的记录的默认值,我们根本不去添加,一个简单的例子如下: SQL> CREATE TABLE T_ADD_COLUMN (ID NUMBER, NAME VARCHAR2(30)); TABLE created. SQL> INSERT INTO T_ADD_COLUMN 2 SELECT ROWNUM, OBJECT_NAME 3 FROM DBA_OBJECTS; 11955 ROWS created. … Continue reading

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

oinstall组用户连接数据库报错error while loading shared libraries: libskgxp10.so

名称很长,不过仍然不足以描述这个错误的背景。确切的描述应该是oracle用户下的ORACLE_HOME,迁移到其他位置,并将oracle属主改变为其他用户,但是oinstall组未变。随后其他oinstall组用户,无法以/ as sysdba登录数据库。 公司测试环境,ORACLE_HOME为/u01/app/oracle/product/10.2.0/db_1,将ORACLE_HOME切换到/t0/orat0/app/oracle/product/10.2.0/db_1目录下,并将ORACLE_HOME的属主从oracle改为orat0。 授权后,orat0用户直接登录就出现这个错误: [orat0@hpserver2 ~]$ sqlplus / AS sysdba SQL*Plus: Release 10.2.0.5.0 – Production ON Sun Mar 18 16:12:03 2012 Copyright (c) 1982, 2010, Oracle. ALL Rights Reserved. oracleorcl10g: error while loading shared libraries: libskgxp10.so: cannot OPEN shared … Continue reading

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

relink报错ldflags: No such file or directory relink

由于数据库的ORACLE_HOME发生了变化,需要对ORACLE_HOME进行relink操作,结果发现relink时报错。 错误信息摘录如下: [orat0@hpserver2 db_1]$ relink utilities – Linking Import utility (imp) rm -f /t0/orat0/app/oracle/product/10.2.0/db_1/rdbms/lib/imp gcc -o /t0/orat0/app/oracle/product/10.2.0/db_1/rdbms/lib/imp -L/t0/orat0/app/oracle/product/10.2.0/db_1/rdbms/lib/ -L/t0/orat0/app/oracle/product/10.2.0/db_1/lib/ -L/t0/orat0/app/oracle/product/10.2.0/db_1/lib/stubs/ /t0/orat0/app/oracle/product/10.2.0/db_1/rdbms/lib/s0impdrv.o /t0/orat0/app/oracle/product/10.2.0/db_1/rdbms/lib/defopt.o -ldbtools10 -lclntsh `cat /t0/orat0/app/oracle/product/10.2.0/db_1/lib/ldflags` -lnsslb10 -lncrypt10 -lnsgr10 -lnzjs10 -ln10 -lnnz10 -lnl10 -lnro10 `cat /t0/orat0/app/oracle/product/10.2.0/db_1/lib/ldflags` -lnsslb10 -lncrypt10 -lnsgr10 -lnzjs10 … Continue reading

Posted in ORACLE | Tagged , , | Leave a comment

ORACLE_HOME迁移后需要设置LD_LIBRARY_PATH环境变量

在10g以后,一般情况下环境变量中没有必要设置LD_LIBRARY_PATH,但是一旦将ORACLE_HOME迁移到其他目录,则环境变量中还需要添加这个变量。 Linux和Unix支持TAR方式迁移ORACLE_HOME,如果有需要将ORACLE_HOME放到其他路径下,那么一般都会使用tar的方式将整个路径拷贝到目标目录。 但是迁移后,如果直接尝试sqlplus启动,可能报错: [orat3@hpserver2 ~]$ sqlplus / AS sysdba sqlplus: error while loading shared libraries: libsqlplus.so: cannot OPEN shared object file: No such file OR directory[orat3@hpserver2 ~]$ sqlplus / as sysdba sqlplus: error while loading shared libraries: libsqlplus.so: cannot open … Continue reading

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

ORA-600(19004)错误

客户数据库出现ORA-600(19004)错误。 错误信息如下: ORA-00600: internal error code, arguments: [19004], [], [], [], [], [], [], []ORA-00600: internal error code, arguments: [19004], [], [], [], [], [], [], [] 对应的详细TRACE为: *** 2012-03-15 13:10:31.283 ksedmp: internal OR fatal error ORA-00600: internal error code, … Continue reading

Posted in BUG | Tagged , , | Leave a comment

ORA-600(kzdugt)错误

创建用户时产生ORA-600(kzdugt)错误。 错误信息为: Mon Mar 12 12:06:58 CST 2012 Errors IN file /u01/app/oracle/admin/orcl10g/udump/orcl10g_ora_22193.trc: ORA-00600: internal error code, arguments: [kzdugt], [], [], [], [], [], [], []Mon Mar 12 12:06:58 CST 2012 Errors in file /u01/app/oracle/admin/orcl10g/udump/orcl10g_ora_22193.trc: ORA-00600: internal error code, arguments: [kzdugt], … Continue reading

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

分配LOB空间失败导致ORA-600(kddummy_blkchk)错误

测试环境发现一个ORA-600错误,简单重现了一下。 错误信息如下: Fri Mar 2 23:28:49 2012 Corrupt Block Found TSN = 4, TSNAME = USERS RFN = 4, BLK = 395, RDBA = 16777611 OBJN = 0, OBJD = 53647, OBJECT = /6ee738c_AccessorUtilities, SUBOBJECT = SEGMENT OWNER = PUBLIC, … Continue reading

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

删除表空间报错ORA-600(ktssdrp1)错误

测试环境的新建表空间在删除时报错。 数据库创建一个新的表空间后执行删除,出现了ORA-600的错误信息: SQL> SELECT tablespace_name FROM dba_tablespaces; TABLESPACE_NAME —————————— SYSTEM UNDOTBS SYSAUX TEMP TBS_1 GGX USERS PERFSTAT STATSPACK ALA_TEST 10 ROWS selected. SQL> DROP tablespace ala_test including contents AND datafiles; DROP tablespace ala_test including contents AND datafiles * ERROR at … Continue reading

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