全库迁移、分区迁移、network_link迁移
一、全库迁移:
数据库全库迁移与imp/exp差不多,支持跨版本迁移,但是不支持windows与linux/unix跨平台迁移,因为两者路径书写方式不一致。全库迁移必须要保证源和目的数据库相关结构一致(主要是数据文件的目录)
1.首先在源库导出数据:
SQL> create directory expdir as 'd:\';
expdp '/ as sysdba' directory=expdir logfile=full.log full=y dumpfile=full_%U.dmp filesize=1024M job_name=hr exclude=schema:"in('scott')" parallel=2 --过滤掉scott用户的数据
2.目的库上导入数据:
(1)建立与源库相同的数据文件目录
(2)使用dbca或者手动建立新库:
(3)建立directory:
SQL> create directory expdir as 'd:\';
(4)把dmp文件拷贝到新库上的directory目录
(5)导入数据:
impdp '/ as sysdba' directory=expdir logfile=full.log full=y dumpfile=full_%U.dmp job_name=hr parallel=2
(6)编译无效对象
以dba角色登录,执行下列脚本:
SQL> @?\RDBMS\ADMIN\utlrp.sql
二、分区迁移:
数据泵分区迁移方法基本和传统工具一致,都需要目的数据库已经建立了相应的表空间,否则迁移失败。和之前exp/imp讨论的一样:分区表hr_event以end_time字段为分区键,每天的记录作为一个分区,每个分区对应一个表空间,对应一个数据文件。现在要导出2013年8月10日到8月26日的分区数据,如果把分区名写在tables参数里,由于分区较多,将会很麻烦,可以给query参数赋值,实现导出指定分区数据。
1.分区导出:
expdp hr/hr tables=hr_event directory=expdir dumpfile=hr_event.dmp logfile=hr.log parallel=2 query=hr_event:\"where end_time>=to_timestamp('2013-08-10 00:00:00','YYYY-MM-DD HH24:MI:SS') AND end_time<=to_timestamp('2013-08-27 00:00:00','YYYY-MM-DD HH24:MI:SS')\" job_name=hr
2.分区导入:
impdp hr/hr tables=hr_event directory=expdir dumpfile=hr_event.dmp logfile=hr.log parallel=2 query=hr_event:\"where end_time>=to_timestamp('2013-08-10 00:00:00','YYYY-MM-DD HH24:MI:SS') AND end_time<=to_timestamp('2013-08-27 00:00:00','YYYY-MM-DD HH24:MI:SS')\" table_exists_action=append job_name=hr
三、network_link实现网络导入导出
1.建立dblink:
C:\Users\Administrator>sqlplus / as sysdba
SQL> create database link orcljjyf2 connect to hr identified by hr using '192.168.73.208/orcljjyf2';
SQL> select sysdate from dual@orcljjyf2;
SYSDATE
--------------
26-8月 -13
2.执行导出:
在执行导出时,如果在本地数据库使用dba角色用户导出,那么dblink指向的用户在服务器端必须具备exp_full_database权限,否则会报错,例如:
C:\Users\Administrator>sqlplus / as sysdba
SQL> create user test identified by test default tablespace users quota unlimited on users temporary tablespace temp;
SQL> grant connect,resource,dba to test
SQL> grant create table,create database link to test;
SQL> grant read,write on directory expdir to test;
C:\Users\Administrator>sqlplus TEST/test
SQL> create database link hr_208 connect to hr identified by hr using '192.168.73.208/orcljjyf2';
expdp 'test/test' tables=hr_event network_link=hr_208 directory=expdir dumpfile=hr_event.dmp logfile=hr.log parallel=2 query=hr_event:\"where end_time>=to_timestamp('2013-08-10 00:00:00','YYYY-MM-DD HH24:MI:SS') AND end_time<=to_timestamp('2013-08-27 00:00:00','YYYY-MM-DD HH24:MI:SS')\" job_name=hr
Export: Release 10.2.0.5.0 - 64bit Production on 星期一, 26 8月, 2013 12:36:30
Copyright (c) 2003, 2007, Oracle. All rights reserved.
连接到: Oracle Database 10g Enterprise Edition Release 10.2.0.5.0 - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options
ORA-31631: 需要权限
ORA-39149: 无法将授权用户链接到非授权用户
解决办法:可以直接登录到dblink指向的远程服务器,给hr用户授exp_full_database权限:
C:\Users\Administrator>sqlplus sys/talent@192.168.73.208/orcljjyf2 as sysdba
SQL> grant exp_full_database to hr;
接下来执行导入操作就会成功了。
expdp 'test/test' network_link=hr_208 directory=expdir dumpfile=hr_event.dmp logfile=hr.log parallel=2 tables=hr.hr_event query=hr.hr_event:\"where end_time>=to_timestamp('2013-08-10 00:00:00','YYYY-MM-DD HH24:MI:SS') AND end_time<=to_timestamp('2013-08-27 00:00:00','YYYY-MM-DD HH24:MI:SS')\" job_name=hr
网络状况良好时,为了避免繁琐的数据复制工作,使用network_link选项是一个很不错的选择。因为 它克服了不能通过网络导出导入的缺点,而且同样支持交互操作。数据泵也可以进行表空间的导入导出操作,方法和exp/imp基本一致,本文不再讨论了。