[20120918]exp要注意的问题CONSISTENT参数.txt
前几天开发要导出一个schema做测试,因为新程序改动太大,要求导出一份该schema下的全部数据,开发导入后出现
一些错误,反馈日志log后,才发现是主外键的问题,原来我忘记在导出时加入参数CONSISTENT=y.
缺省这个参数是N.
今天做一个测试看看差别在哪里:
exp前先刷新共享池.
alter system flush shared_pool;
host exp sh/xxxxxx file=aaa.dmp direct=y
create table exp1 as select sql_text from v$sql where module like 'exp%'
alter system flush shared_pool;
host exp sh/xxxxxx file=aaa.dmp CONSISTENT=y direct=y
create table exp2 as select sql_text from v$sql where module like 'exp%'
对比exp1与exp2的差异:
SQL> select * from exp2 minus select * from exp1 ;
SQL_TEXT
--------------------------
SET TRANSACTION READ ONLY
SQL> select * from exp1 minus select * from exp2 ;
no rows selected
--可以发现差异仅仅在exp前,要执行SET TRANSACTION READ ONLY.设置事务只读.
--这样其他回话做DML操作,应该不会备份,如果备份事件很长,可能会出现ora-01555错误.
简单做一个SET TRANSACTION READ ONLY的测试:
SQL> create table t ( a number);
Table created.
session1:
insert into t values(1);
commit;
set transaction read only
SQL> select * from t;
A
----------
1
session2:
insert into t values(2);
commit;
SQL> select * from t;
A
----------
1
2
--看见2条记录.
回到session1:
SQL> select * from t;
A
----------
1
--依旧仅仅看到1条记录.做一个插入看看:
SQL> insert into t values(3);
insert into t values(3)
*
ERROR at line 1:
ORA-01456: may not perform. insert/delete/update operation inside a READ ONLY transaction
--出现ora-01456错误,无法在这个状态下执行DML语句.
--再建立1个索引看看.
SQL> create index i_t_id on t(a);
Index created.
SQL> select * from t;
A
----------
1
2
--因为建立索引包含隐式提交,建立索引后能看到2条,同理commit,rollback也是一样的效果.