导入导出(imp/exp)备份参数研究系列二

      前篇已整理COMPRESS以及FEEDBACK参数,紧接前文,再对其他参数进行一下说明,以便供自己和大家以后翻阅。

3. QUERYPARFILE参数
   

QUERY参数概念挺好理解,即根据条件导出表的部分符合要求的集合。比如对T表只想导出Id>100的记录,在UNIX/LINUX操作系统exp命令如下:

点击(此处)折叠或打开

  1. exp scott/tiger tables=t file=t.dmp log=t.log QUERY="\"where ID>100\""
QUERY="\"where ID>100\""此处就限制了仅导出ID>100的记录,虽然QUERY在日常工作中很有用,也很好理解,但我相信大家和我一样,看到QUERY后面附带的转义字符直接头大了另人更恼火的是转义字符的写法在WINDOWSUNIX/LINUX平台还不一样,好像更复杂一些(还好我没那么用过),总之如果限制条件多了,光写转义字符这些足够让你产生咋服务器的想法。那么怎么解决此问题呢?为规避不同操作系统上不同转义字符带来的麻烦,Oracle提供了PARFILE参数,用PARFILE的好处在于写起来简单易懂且每个操作系统平台通用。用PARFILE参数重新上述exp语句如下:
Par文件:

点击(此处)折叠或打开

  1. userid=scott/tiger
  2. tables=t
  3. file=t_par.dmp
  4. log=t_par.log
  5. QUERY="where ID>100"
导出语句:

点击(此处)折叠或打开

  1. exp parfile=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生成的,在expuser导出时,有可能先导出sequence然后再导出表,这样就会导致在sequence导出之后,在对应的表导出之前,有新的数据insert到这张表,并且及时提交了,因此会导致导出表的时候的主键值已经大于之前导出的sequence值。下面通过实验展现:

点击(此处)折叠或打开

  1. create user test identified by test;
  2. grant dba to test;
  3. conn test/test
  4. create table t (id int);
  5. alter table t add primary key (id);
  6. create sequence seq_t increment by 1 start with 1 nocache;
  7. begin
  8. for i in 1..100000 loop
  9. insert into t values (seq_t.nextval);
  10. commit;
  11. end loop;
  12. end;
  13. /
为模拟生产环境,在上述insert语句过程,我们新开另一会话对用户进行导出

点击(此处)折叠或打开

  1. 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文件移到新服务器,按照如下进行用户导入

点击(此处)折叠或打开

  1. 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,表处于同一个时间点,避免了上述问题的产生。

点击(此处)折叠或打开

  1. 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/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值