日期:2014-05-16 浏览次数:20417 次
最近客户提到关于exp出来的sequence小于表中数据的问题,研究了一下,解决了。
具体问题是这样的:表的主键是用sequence来生成的。在exp按user导出时,是先导出sequence然后再导出表,这就有可能发生这样的情况,
在sequence导出以后,在对应的表导出之前,有新的数据insert这张表,并且及时提交了,这使导出表的时候表中主键的值已经大于之前导出的seqence值。
如果把这个dmp文件导入到别的用户或是数据库中,对这个表进行插入,就会遇到主键冲突的错误。
这个问题的解决办法是在exp时加上consistent=y的参数,其作用是exp对所有要导出表的查询都是发生在同一时间的,也就是第一个表导出的那个时间,这样即使在sequence导出
之后有新的数据insert,exp也不会导出这些数据。
下面作实验验证。
?
--情况一:5个表,每个表有sequence,sequence是nocache的。在表导出过程中,不断插入数据。之后再imp,然后再插入数据,出现主键冲突错误。
SQL> create table t1 (a int);
表已创建。
SQL> create table t2 (a int);
表已创建。
SQL> create table t3 (a int);
表已创建。
SQL> create table t4 (a int);
表已创建。
SQL> create table t5 (a int);
表已创建。
SQL> create sequence seq_t1 increment by 1 start with 1 nocache;
序列已创建。
SQL> create sequence seq_T2 INCREMENT BY 1 START with 1 nocache;
序列已创建。
SQL> create sequence seq_t3 INCREMENT BY 1 START with 1 nocache;
序列已创建。
SQL> create sequence seq_t4 INCREMENT BY 1 START with 1 nocache;
序列已创建。
SQL> create sequence seq_t5 INCREMENT BY 1 START with 1 nocache;
序列