来自 IT技术分享 2018-11-16 08:47 的文章

Oracle 11G在用EXPORT导出时总结

Oracle 11G在用EXPORT导出时,空表不能导11G R2中有个新特性,当表无数据时,不分配segment,以节省空间
解决方法:insert一行,再rollback就产生segment了。该方法是在在空表中插入数据,再删除,则产生segment。导出时则可导出空表。
设置deferred_segment_creation 参数,该参数值默认是TRUE,当改为FALSE时,无论是空表还是非空表,都分配segment。修改SQL语句:
alter system set deferred_segment_creation=false scope=both;需注意的是:该值设置后对以前导入的空表不产生作用,仍不能导出,只能对后面新增的表产生作用。如需导出之前的空表,只能用第一种方法。可以构建针对空表分配空间的命令语句select 'alter table '||table_name||' allocatAAAAtent' from user_tables where num_rows=0;
把查询结果导出,执行导出的语句,强行修改segment值,然后再导出即可导出空表,注意:数据库插入数据前,修改11g_R2参数可以导出空表
查找空表select table_name from user_tables where NUM_ROWS=0;,Oracle 10g以后增加了expdp和impdp工具,用此工具也可以导出空的表
oracle expdp/impdp 用法详解创建逻辑目录,该命令不会在操作系统创建真正的目录,最好以system等管理员创建。
create directory db_bak as 'd: est\dump';查看管理理员目录(同时查看操作系统是否存在,因为Oracle并不关心该目录是否存在,如果不存在,则出错)select * from dba_directories;
给system用户赋予在指定目录的操作权限,最好以system等管理员赋予。grant read,write on directory db_bak to system;
3.10  REMAP_TABLESPACE 将源表空间的所有对象导入到目标表空间中,我们将dave表空间下的对象导入到bl表空间下。
为了把用户按表空间归类,需要把用户所有的当前数据转移到另一个表空间里,那么可以使用impdp的remap_tablespace参数。下面就这一内容进行实验。
$ expdp  'test5/[email protected]' directory=backup dumpfile=tbs.dmp logfile=tbs.log tablespaces=dave
$ impdp  'test5/[email protected]' directory=backup dumpfile=user.dmp logfile=user.log remap_tablespace=test1:test3 table_exists_action=replace
3.9  REMAP_SCHEMA 该选项用于将源方案的所有对象装载到目标方案中.  我们导出dave 用户下的表,然后把它导入bl用户下。
【IMPDP】实现不同用户之间的数据迁移——REMAP_SCHEMA参数
$ expdp  'test5/[email protected]' directory=backup dumpfile=user.dmp logfile=user.log schemas=dave
$ impdp  'test5/[email protected]' directory=backup dumpfile=user.dmp logfile=user.log remap_schema=dave:bl
3.12  TRANSPORT_DATAFILES该选项表示的是表空间的传输。用于指定搬移空间时要被导入到目标数据库的数据文件。
这种方法的操作步骤如下:
(1)将表空间改成read only 状态,然后copy 待传输的表空间的所有数据文件到目标库。 这里可以进行重命名。
(2)按transport 方式导出表空间。注意:这步操作只把metadata,即元数据,只有定义,没有data导入了dump文件。 实际的data 我们在第一步已经copy 过去了。
(3)import 我们的数据。(4)将表空间改成read write:
元数据(metadata)从我们的dump文件导入,Data Pump将实际的data从我们指定的workers.dat 导入。 这里必须写绝对路劲。我们看个实例:
1.先对表空间Dave 添加一个数据文件:SQL> alter tablespace test4 add datafile 'd: est44.dbf' size 10m;
2.copy 到其他实例的对应位置,在移动之前先将表空间改成read only 状态:SQL> alter tablespace test4 read only;
将表空间下的所有数据文件移动到其他的实例上。可以进行重命令。 我这里是同一个实例。 因为我这里是一个实例。 我将我们刚才添加的数据文件test44.dbf 移动到'e: est44.dbf'下。 待expdp 完成后,我们将表空间drop掉,在import进来。$ cp d: est44.dbf e: est44.dbf 将dave01.dbf 复制成bl03.dbf. 等会删除表空间,不然会被删除掉。
3.expdp 导出元数据:$expdp 'test4/[email protected]' directory=backup dumpfile=test4.dmp transport_tablespaces=test4
4.import 数据:先把表空间drop掉在import:SQL> drop tablespace test4 including contents and datafiles;
$ impdp 'test4/[email protected]' directory=backup dumpfile=test4.dmp transport_datafiles='d: est4.dbf', 'e: est44.dbf'
注意一点:这里transport 的表空间,在另一个实例上是不可以存在的。 不然不能导入。如果文件很多,也可以写入个配置文件里。 导入时通过PARFILE参数来指定。
(5)将表空间改成read write模式:
SQL> alter tablespace test4 read write;
SQL> select tablespace_name,status from dba_tablespaces;
transport_datafiles 注意的几点:
(1)表空间所有的数据文件都要copy到目标库。copy d: est_test.dbf  e: est_test1.dbf;copy
(2)copy 之间,将表空间改成read only 状态。alter tablespace test_test read only;
(3)copy之后可以对数据文件进行重命名。 所以,transport_datafiles 也可以用来对数据文件进行重命名和移动位置。drop tablespace test_test including contents and datafiles;
(4)transport_datafiles 完成之后,不要忘记将表空间改成读写模式。impdp 'test5/[email protected]' directory=backup dumpfile=TEST222.DMP transport_datafiles='d: est_test.dbf', 'e: est_test1.dbf';C:\>exp \"sys/ymhas sysdba\" file=d:/tbs.dmp tablespaces=(data_tbs,idx_tbs)transport_tablespace=y tts_full_check=y=>将两个表空间一起导出,不要数据(tablespaces=(data_tbs,idx_tbs):要导出的表空间;transport_tablespace=y:只导出元数据;tts_full_check=y进行完全自包含检查)
总结错误:(1) ORA-29335: 表空间'DATA_TBS' 不为只读,导出的表空间必须为只读状态,否则出现如下错误(2) ORA-29341: 可传送集不是自包含的 “可传送集不是自包含的”的两种处理方法:
1、将所有的依赖表空间一起传,比如该题中,一个表空间会出现自检错误,两个表空间同时自检则不会。
SQL> Execute sys.dbms_tts.transport_set_check('data_tbs',TRUE,TRUE);
SQL> SELECT * FROM sys.transport_set_violations;
2、讲表空间处理为自包含:比如将索引删除,导到其他数据库后重建索引,或者将索引重建到数据文件的表空间,然后导出一个表空间
注意:当再sys或system用户下创建表时,使用表空间传输也会出现“可传送集不是自包含的”,并且无法两个表空间同时传输,所以最好必要导出sys和system建表使用的表空间,不管是不是自带的system还是新建的表空间。EXP-00008: 遇到ORACLE 错误29341,ORA-29341: 可传送集不是自包含的,ORA-06512: 在 "SYS.DBMS_PLUGTS", line 1387
(3) IMP-00053: 导入模式与导出转储文件不兼容:1、可能是跨平台时存储格式不同导致(未测试);2、同一平台下,注意导出的参数和导入的参数,因为导出时忘了加transport_tablespace=y ,把数据也改导出,导入时又加入该参数,导致错误:IMP-00053: 导入模式与导出转储文件不兼容,IMP-00000: 未成功终止导入
(4) ORA-27041: 无法打开文件O/S-Error: (OS2) 系统找不到指定的文件。 (5) ORA-19722: 数据文件D:\oracle\oradata\DATA_TBS版本错误
表空间设置为只读就是为了保证数据的一致性,因此只有讲表空间的数据文件拷贝完成之后才能在源数据库恢复表空间的可读写状态。否则,在目标数据库导入的时候就会出现下列错误:
(6) PLS-00201: 必须声明标识符'DBMS_PLUGTS.NEWTABLESPACE' 使用普通用户或system用户导入时如果出现如下错误,可以使用'sys/ymh as sysdba'来导入,可以加入参数TTS_OWNERS=scott(TTS_OWNERS未详细测试)(7) OSD-04002: 无法打开文件O/S-Error: (OS123) 文件名、目录名或卷标语法不正确。 如果有多个数据文件,datafile=XXX,XXX,中间用逗号隔开即可,不要用""号将多个概括,否则出现如下错误
 
 
本文出自 “技术知识交流” 博客AAAAAAAAAAAAA align="left">http://www.bkjia.com/oracle/484707.htmlwww.bkjia.comtruehttp://www.bkjia.com/oracle/484707.htmlTechArticleOracle 11G在用EXPORT导出时,空表不能导11G R2中有个新特性,当表无数据时,不分配segment,以节省空间 解决方法:insert一行,再rollback就产生...

本文源自: AG88平台