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权限登录。
已连接。
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>
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/24570973/viewspace-758192/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/24570973/viewspace-758192/