传输表空间【转】

以传输表空间的方式快速迁移Oracle中的空间数据库

已有 489 次阅读   2012-08-13 13:18    标签:   Oracle   空间数据库 

http://blog.3snews.net/space.php?uid=61756&do=blog&id=64549


一个项目中需要将存储在oracle中的GIS数据从一台服务器迁移到另一台服务器,项目成员最初是以传统的exp/imp方式来导,因为数据量巨大,结果花了好几天的时间还没有导完。发现此问题后建议项目用Oracle提供的传输表空间的机制来快速迁移数据库,只花了很少的时间就完成迁移了。

其实有不少同行碰到过类似的问题,也有不少人问过,Oracle有没有类似于SQL Server的那种脱机-》拷贝-》挂载的方式来迁移数据库?

其实Oracle也有类似的机制,就是传输表空间,比SQL Server稍麻烦一些,但也基本是类似思路:设为只读-》导出元数据-》拷贝-》导入元数据-》设为可读写。

发现很多人对Oracle的传输表空间的使用不太了解,撰文介绍一下。

1. 在源服务器上以sysdba权限登录。

SQL> connect  sys/mypwd@srcSID as sysdba
已连接。

2. 在源服务器上检查表空间是否为自包含

SQL> exec dbms_tts.transport_set_check('SrcTablespace',true);

PL/SQL 过程已成功完成。

SQL> select * from transport_set_violations;

未选定行

若select * from transport_set_violations;返回了有记录则需处理后才能传输表空间。

3. 将源表空间改为只读

SQL> alter tablespace SrcTablespace read only;

表空间已更改。

4. 查看源表空间关联的数据文件

SQL> select file_name  from dba_data_files where tablespace_name='SRCTABLESPACE';

5. 在源服务器上执行导出操作
执行导出操作有两种方案,一种是用exp导出,另一种是用expdp导出,exp的方式比较简单:
exp transport_tablespace=y tablespaces=SrcTablespace file=C:\exptbs.dmp

但推荐以expdp的方式,expdp支持Binary_Double和Binary_Float的列,exp是不支持的。

要以expdp导出需要先在sqlplus中创建DIRECTORY,以sysdba权限登录sqlplus

SQL> Create or Replace DIRECTORY DumpDir as 'C:\';

在控制台中执行如下命令:

expdp directory=dumpdir dumpfile=exptest.dmp transport_tablespaces=SrcTablespace

迁移表空间的导出只导出元数据信息,所以非常快,不管多大的数据库,一般几分钟就可以导出完毕。

6. 拷贝导出文件和数据文件到目标服务器

7. 在目标机器上需要先创建对应的用户,注意新创建的用户不需要指定默认表空间,等迁移完成后再指定默认表空间。另外需要注意的是在目标机器上不需要创建表空间,而且要确保没有同名的表空间存在。

给用户分配Connect, Resource权限即可。

SQL> connect sys/mypwd@destSID as sysdba
已连接。
SQL> create user testimp identified by testimp;

用户已创建。

SQL> grant connect,resource to testimp;

授权成功。

8. 执行导入操作。导入操作应该与导出操作相对应,若是以exp导出的,需要以imp导入,若是以expdp导出的,需要以impdp导入。两种方式各提供一个例子:

imp transport_tablespace=y file=c:\exptbs.dmp tablespaces=SrcTablespace datafiles=('C:\Data\File1.dbf','C:\Data\File2.dbf' )

如果是以expdp方式导出,需要以impdp方式导入,在导入之前,需要在目标服务器上也创建Directory:

SQL> Create or Replace DIRECTORY DumpDir as ‘C:\’;

impdp DIRECTORY=dumpdp DUMPFILE=exptest.dmp transport_datafiles=('C:\Data\File1.dbf','C:\Data\File2.dbf' )

9. 导入完毕后,在目标服务器上会自动创建好表空间,此时可修改用户的默认表空间

SQL>alter user testimp default tablespace SrcTablespace;

用户已更改

10. 将表空间改为Read Write

SQL> alter tablespace SrcTablespace read write;

表空间已更改。

回到源服务器,同样也将表空间改为Read Write。

至此,以传输表空间的方式迁移Oracle数据库算是初步完成,但还有些扫尾工作。

迁移完成后会发现数据源中创建不了数据集了,新建数据集的时候总是失败,究其原因,是因为原服务器的序列数据没有同步迁移过来,序列(sequence)数据是存储在系统表空间中的,导出表空间无法将其导出,只能手工来处理。

11. 在源服务器上启动sqlplus,以sysdba用户登录

SQL> set heading off

SQL> set linesize 500

SQL> spool d:\seq.sql

SQL>

select 'create sequence '||sequence_name||
' minvalue '||min_value||
' maxvalue '||max_value||
' start with '||last_number||
' increment by '||increment_by||
(case when cache_size=0 then ' nocache' else ' cache '||cache_size end) ||';'
from dba_sequences where sequence_owner='TESTIMP';
select 'create sequence '||sequence_name||          ' minvalue '||min_value||          ' maxvalue '||max_value||          ' start with '||last_number||          ' increment by '||increment_by||          (case when cache_size=0 then ' nocache' else ' cache '||cache_size end) ||';'  from dba_sequences where sequence_owner='TESTIMP';
SQL> spool off
SQL> quit
执行完成后在D:盘下生成了一个seq.sql的文件,将此文件拷贝到目标服务器,然后在目标服务器以testimp用户登录sqlplus并执行生成的SQL脚本文件:
SQL> @d:\seq.sql
OK,至此,所有的数据都迁移过来了,Over.

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/24570973/viewspace-758192/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/24570973/viewspace-758192/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值