前篇已整理COMPRESS以及FEEDBACK参数,紧接前文,再对其他参数进行一下说明,以便供自己和大家以后翻阅。
QUERY="\"where ID>100\""此处就限制了仅导出ID>100的记录,虽然QUERY在日常工作中很有用,也很好理解,但我相信大家和我一样,看到QUERY后面附带的转义字符直接头大了,另人更恼火的是转义字符的写法在WINDOWS与UNIX/LINUX平台还不一样,好像更复杂一些(还好我没那么用过),总之如果限制条件多了,光写转义字符这些足够让你产生咋服务器的想法。那么怎么解决此问题呢?为规避不同操作系统上不同转义字符带来的麻烦,Oracle提供了PARFILE参数,用PARFILE的好处在于写起来简单易懂且每个操作系统平台通用。用PARFILE参数重新上述exp语句如下:
Par文件:
导出语句:
About to export specified tables via Conventional Path ...
. . exporting table T 3 rows exported
Export terminated successfully without warnings.
不用多说,大家可以看到parfile参数带来的好处了吧:简单明了易编辑,可重用。
4.CONSISTENT参数
该参数控制导出的所有对象是否一致, 比较典型的场景就是导出sequence的情况,某表的主键是用sequence生成的,在exp按user导出时,有可能先导出sequence然后再导出表,这样就会导致在sequence导出之后,在对应的表导出之前,有新的数据insert到这张表,并且及时提交了,因此会导致导出表的时候的主键值已经大于之前导出的sequence值。下面通过实验展现:
为模拟生产环境,在上述insert语句过程,我们新开另一会话对用户进行导出
截取部分日志如下:
About to export TEST's objects ...
. exporting database links
. exporting sequence numbers
. exporting cluster definitions
. about to export TEST's tables via Conventional Path ...
. . exporting table T 31530 rows exported
将test.dmp文件移到新服务器,按照如下进行用户导入
截取部分有用日志如下:
. importing TEST's objects into TEST
. . importing table "T" 31530 rows imported
Import terminated successfully without warnings.
整个导入导出过程正常,无报错。模拟生产环境向生产插入数据会怎么样?
SQL> insert into t values (seq_t.nextval);
insert into t values (seq_t.nextval)
*
ERROR at line 1:
ORA-00001: unique constraint (TEST.SYS_C004748) violated
看到了什么报错了,若真的是生产环境必然导致业务无法正常继续。为什么会报错呢,仔细查看导出日志可以看出整个导出先导出的sequence,后导出的表,在这个时间差原sequence已经增长,但已导出的sequence并没增长,导致在新库下seq_t.nextval的值其实已经在表中存在了,所以报违反主键约束。
解决此问题的办法很简单,只需要在导出过程设置CONSISTENT等于Y,从而保证导出的sequence,表处于同一个时间点,避免了上述问题的产生。
3. QUERY与PARFILE参数
QUERY参数概念挺好理解,即根据条件导出表的部分符合要求的集合。比如对T表只想导出Id>100的记录,在UNIX/LINUX操作系统exp命令如下:
点击(此处)折叠或打开
- exp scott/tiger tables=t file=t.dmp log=t.log QUERY="\"where ID>100\""
Par文件:
点击(此处)折叠或打开
- userid=scott/tiger
- tables=t
- file=t_par.dmp
- log=t_par.log
- QUERY="where ID>100"
点击(此处)折叠或打开
- exp parfile=par
. . exporting table T 3 rows exported
Export terminated successfully without warnings.
不用多说,大家可以看到parfile参数带来的好处了吧:简单明了易编辑,可重用。
4.CONSISTENT参数
该参数控制导出的所有对象是否一致, 比较典型的场景就是导出sequence的情况,某表的主键是用sequence生成的,在exp按user导出时,有可能先导出sequence然后再导出表,这样就会导致在sequence导出之后,在对应的表导出之前,有新的数据insert到这张表,并且及时提交了,因此会导致导出表的时候的主键值已经大于之前导出的sequence值。下面通过实验展现:
点击(此处)折叠或打开
- create user test identified by test;
- grant dba to test;
- conn test/test
- create table t (id int);
- alter table t add primary key (id);
- create sequence seq_t increment by 1 start with 1 nocache;
- begin
- for i in 1..100000 loop
- insert into t values (seq_t.nextval);
- commit;
- end loop;
- end;
- /
点击(此处)折叠或打开
- exp test/test owner=test file=test.dmp log=test.log
About to export TEST's objects ...
. exporting database links
. exporting sequence numbers
. exporting cluster definitions
. about to export TEST's tables via Conventional Path ...
. . exporting table T 31530 rows exported
将test.dmp文件移到新服务器,按照如下进行用户导入
点击(此处)折叠或打开
- imp test/test full=y file=test.dmp log=test_imp.log
. importing TEST's objects into TEST
. . importing table "T" 31530 rows imported
Import terminated successfully without warnings.
整个导入导出过程正常,无报错。模拟生产环境向生产插入数据会怎么样?
SQL> insert into t values (seq_t.nextval);
insert into t values (seq_t.nextval)
*
ERROR at line 1:
ORA-00001: unique constraint (TEST.SYS_C004748) violated
看到了什么报错了,若真的是生产环境必然导致业务无法正常继续。为什么会报错呢,仔细查看导出日志可以看出整个导出先导出的sequence,后导出的表,在这个时间差原sequence已经增长,但已导出的sequence并没增长,导致在新库下seq_t.nextval的值其实已经在表中存在了,所以报违反主键约束。
解决此问题的办法很简单,只需要在导出过程设置CONSISTENT等于Y,从而保证导出的sequence,表处于同一个时间点,避免了上述问题的产生。
点击(此处)折叠或打开
- exp test/test owner=test file=test.dmp log=test.log CONSISTENT=Y
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/29827284/viewspace-2134803/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/29827284/viewspace-2134803/