应用场景:
从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;
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;