需求背景
为什么要用数据泵+dblink,是因为本来想直接用数据泵的方式先导出再导入数据库,奈何数据库服务器只剩下1个G的内存了,而数据文件是70个G,查阅很多资料后发现可以用数据泵+dblink的方式指定导出文件位置或指定导入文件位置,很好的解决了空间不足无法导出的问题。
以上过程都在linux服务器上操作
一:首先要做的是在目标端数据库建立用户,表空间,赋权限等操作
1.1 目标端数据库建立表空间CREATE TABLESPACE tablespace_name DATAFILE 'D:\tablespace\tablespace.dbf' SIZE 500M AUTOEXTEND ON NEXT 50M EXTENT MANAGEMENT LOCAL UNIFORM SIZE 512K; 1.2 目标端数据库建立用户create user user_name identified by "passwd" default tablespace tablespace_name;1.3 目标端建立和源端数据库dblinkcreate public database link dblink_name connect to system identified by passwd using 'ip:port/orcl'; 这里的system是目标端数据库用户名 passwd是目标端数据库账号 ip/port/orcl 是源端数据库ip/端口/数据库实例1.4 创建导出文件目录CREATE OR REPLACE DIRECTORY export_file AS 'u01\dump.dmp';1.5 赋权限给新建用户grant read,write on directory export_file to user_name;
二:在目标端数据库进行数据导入导出操作
impdp system/passwd network_link=dblink_name schemas=user_name EXCLUDE=statistics cluster=N job_name=SYS_IMPORT_ILA_SAP parallel=20
其中system、passwd是目标端信息 dblink_name是上文建立的通向源端 schemas是用户名 因为我这里的需求是复制整个用户,其他的都是正常参数,可自行调整。通过impdp+dblink可以省略expdp导出的步骤。expdp username/password DIRECTORY=expdp_file NETWORK_LINK=dblink_name DUMPFILE=net_export.dmp
三:检查数据总量
检查数据库表总量这里不要用user_tables,与实际值会有差异,所以写个游标循环打印出表对应总量,在源端数据库和目标端数据库中SQL窗口运行之后,在output窗口查看结果比对一下就可以了。
declare s varchar2(500);name2 varchar2(500);--cursor 声明 光标cursor cur_emp is select table_name from user_tables;
begin for i in cur_emp loopname2 := 'select count(*) from '||i.table_name;execute immediate name2 into s;if (s>=0) thendbms_output.put_line(i.table_name||':'||s); end if;end loop;
end;
导入的时候有可能会遇到
job stopped due to fatal error
job遇到致命性错误
这里需要在
导入语句中将参数 exclude改为 exclude=PROCACT_INSTANCE
这是一个Oracle的bug
当表里有数据时 impdp的TABLE_EXISTS_ACTION这个参数给了我们几个选择
SKIP:跳过已经存在的表,继续导入下一个对象,如果CONTENT设置了DATA_ONLY参数,则不能使用SKIP
APPEND:不会影响已存在的数据,在原有数据表的基础上继续增加数据
REPLACE:先删除掉表,然后创建表,最后完成数据插入
TRUNCATE:删除已存在的行,然后插入所有的数据