需求背景
为什么要用数据泵+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 目标端建立和源端数据库dblink
create 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 loop
name2 := 'select count(*) from '||i.table_name;
execute immediate name2 into s;
if (s>=0) then
dbms_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:删除已存在的行,然后插入所有的数据