停止空想

老张的空中之家

存档于 四月, 2007

ORA-00001: unique constraint (PERFSTAT.STATS$SQL_SUMMARY_PK) violated

作者:admin 发表时间:四月 - 18 - 2007

转自

有朋友遇到Statspack ORA-00001错误。

Errors in file /oracle/app/oracle/admin/shyz/bdump/shyz1_ora_2588734.trc:
ORA-12012: error on auto execute of job 328
ORA-00001: unique constraint (PERFSTAT.STATS$SQL_SUMMARY_PK) violated
ORA-06512: at “PERFSTAT.STATSPACK”, line 1361
ORA-06512: at “PERFSTAT.STATSPACK”, line 2471
ORA-06512: at “PERFSTAT.STATSPACK”, line 91
ORA-06512: at line 1
Sun Oct 16 00:43:39 2005

这个错误此前从未遇到,但是既然是主键冲突,那肯定是存在重复主键的数据。

肯定能暂时解决问题方法就是暂时禁用唯一约束检查:

ALTER TABLE PERFSTAT.STATS$SQL_SUMMARY MODIFY CONSTRAINT STATS$SQL_SUMMARY_PK DISABLE NOVALIDATE;

然后观察数据来发现根本问题,最后彻底解决之。

到Metalink搜索了一下,发现存在一个相关Bug,Bug号为:2784796.
在设置了cursor_sharing为similar或者force之后,可能触发此Bug,导致主键冲突。

此bug据说在Oracle10g中已经修正。

===========

自己的问题

按照这个disable novalidate pk constraint以后,是可以正常进行statspack.snap了

但是之后发现有一个问题:

在做spreport 的时候,许久不能做出报告。10046追踪数据,则发现大量的scatter read 等待事件。

select count(*) from stats$sql_summary; 发现这个表的数据量很大,几百万。

而之前在disable novalidate pK的时候,默认已经把该表上的pk对应的unique index给删除了。

所以手动在原来位置上建立非unique index,解决问题。

类别:Oracle

alter table add column default

作者:admin 发表时间:四月 - 8 - 2007

alter table test add (d number DEFAULT 0) ;

这个操作是对该表 现存的所有的列都添加一个列,并且将新添的这个列更新为default的值。

所以该操作不能在线执行,会锁表。

上面的操作相当于

alter table add(d number)
alter table modify(d number default 30);
update table set d=30 where d is null;

而下面的操作
alter table table_name add col_name data_type;
atler table table_name modify col_name default default_value;
只对以后新的数据有效!之前的都为null

这个操作瞬间可以完成

类别:Oracle