oracle 导出表数据【dmp文件】

应用场景:

从A数据库把表数据导出来,导入到B数据库


一、数据导入导出方式

通过dmp文件进行导入导出。

效率最快。

不需要考虑表结构,导入导出数据时已经包含表结构。


二、需要注意的地方:

1、导入前删除B数据库里面的所有表结构;


2、必须保证B数据库的用户表空间和A数据库的用户表空间 名称一致。否则,当涉及到含有 blob、clob字段的表数据时,将无法导入这种类型的表 并提示表空间不存在;

原因:LOB类型的数据全部存储在表空间中,表中只存放指针,即使在建表时没指定表空间,数据也全部存入该数据库默认表空间中。

解决方法: 

在被导入数据库中创建与原数据库名称相同表空间,修改默认表空间为此表空间。若在建表时指定了LOB字段表空间,则在被导入数据库中创建存放此LOB字段表空间。 

若被导入数据库中强制指定其他表空间存储LOB字段,可在导入数据后,执行空间迁移命令移动LOB数据到指定的表空间。  

命令: 
alter table 表名 move tablespace 表空间1 lob (LOB字段1,LOB字段2) store as(tablesapce 表空间2); 

重命名表空间名字:

alter tablespace 表空间名1 rename to 表空间名2;


3、必须考虑空表情况,否则没有数据的表将无法导出,并提示:EXP-00011:table不存在。因此对于空表情况,需要做一些检查和设置。

原因:oracle创建一个表时默认不分配segment,只有在插入数据时才会产生(当然也可以强制分配),以节省磁盘空间。

解决方法:

就是想办法让空表有segment:

第一种:可以通过插入数据的方式(不想要这些数据可以回滚),只要有insert动作就会分配segment;
第二种:就是强制分配:alter table tablename allocate extent;

❶.用数据库帐号登录: 
  1.1 查找所有数据表为空的表 
select table_name from user_tables where NUM_ROWS=0; 
  1.2 把这些表组成修改Segment的脚本: 

select 'alter table '||table_name||' allocate extent;' from user_tables where num_rows=0; 

oracle 导出表数据【dmp文件】_第1张图片

  1.3 将1.2中查询的结果导出来,或者复制出来,并执行修改所有空表。 


为了后面创建的表能直接分配segment:
用系统账户登录数据库,修改参数deferred_segment_creation(11g新增的)。该参数即指是否延迟创建segment,默认为true。如果想让表创建时就分配segment,那么就应该修改该参数为false即alter system set deferred_segment_creation=false

❶.用system帐号进入: 
  1.1 查看deferred_segment_creation是否为true 

show parameter deferred_segment_creation; 

  1.2 如果为true,则修改为false 

alter system set deferred_segment_creation=false; 

oracle 导出表数据【dmp文件】_第2张图片



你可能感兴趣的:(oracle 导出表数据【dmp文件】)