您的位置:首页 > 数据库 > Oracle

oracle 不同表空间的数据迁移

2010-07-31 17:20 441 查看
1.expdp和impdp

expdp
假设sglaw用户的默认表空间是users,导出用户sglaw所有数据:

SQL> conn / as sysdba
SQL> create directory dir as '/home/oracle/';
SQL> grant read,write on directory dir to system;

$expdp system/oracle directory=dir dumpfile=sglaw.dmp schemas=sglaw logfile=sglaw.log

impdp
导入sglaw用户所有数据到gh,并且转换表空间users为gh:

SQL> conn / as sysdba
SQL> create directory dir as '/home/oracle/';
SQL> grant read,write on directory dir to system;

$impdp system/oracle directory=dir dumpfile=sglaw.dmp remap_tablespace=users:gh remap_schema=sglaw:gh logfile=sglaw.log

总结:执行impdp时无需创建gh用户,在导入时会自动创建并改名用户sglaw为gh(拥有sglaw的所有权限等),自动设置默认表空间为转换后的表空间gh。如果有多个表空间需要转换,则使用多个remap_tablespace=源:目标 字段。

此种方法只限于支持oracle10g以上版本。

2.exp和imp

要实现oracle9i和oracle10g直接不同表空间的数据迁移,就比较麻烦了,而且不一定能够成功。

首先在原库上正常导出(假设原用户数据存放在users表空间)

$exp username/password file=aaa.dmp log=aaa.log

在目标库上操作如下:

SQL> conn / as sysdba

SQL> create tablespace aaa datafile '/dev/raw/raw30';

SQL> create user username identified by password default tablespace aaa;

SQL> alter user username quota unlimited on aaa;

SQL> grant connect,imp_full_database to username;

然后执行导入

$imp username/password file=aaa.dmp log=aaa.log

由于用户username没有对users表空间的操作配额,所以表会自动存放到username的默认表空间。但是有时候发现,有些表通过这种方法是无法转换过来,本人知识尚浅,不知道是不是很应用写死表空间有关系。

通过conn username/password

select count(*) from user_tables;

来简单查看表的数量是否和原库相同。

查看用户表存放的表空间:

select distinct tablespace_name from user_tables;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: