最近碰到数据泵导出导入数据的时候,发现dblink并没有导入进来。
今天测试了下,发现了原因。
当dblink,是使用create database link 这样的语句创建的时候,按照schema导出导入,就可以导出导入dblink了。
如果创建dblink,使用的是create public database的时候,这样按照schema导出导入,是没有dblink的,因为此时查看dblink的owner,owner是public。
要想解决这样的问题,需要导出元数据,再导入元数据就可以了。导出的时候,加上full=y(不加这个导不出owner为public的dblink)
以下为测试过程
create public database link to_nocdb connect to sys identified by oracle using 'nocdb';
-- 导出
create database link no_pub_dlink connect to system identified by oracle using 'nocdb';
expdp dlinkuser/oracle directory=dump dumpfile=no_pubdlink.dmp logfile=nopubdlink_exp.log schemas=dlinkuser
D:\app\test\product\11.2.0\dbhome_1\BIN>expdp dlinkuser/oracle directory=dump dumpfile=no_pubdlink.dmp logfile=nopubdlin
k_exp.log schemas=dlinkuser
Export: Release 11.2.0.4.0 - Production on 星期六 10月 13 16:30:23 2018
Copyright (c) 1982, 2011, Oracle and/or its affiliates. All rights reserved.
连接到: Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options
自动启用 FLASHBACK 以保持数据库完整性。
启动 "DLINKUSER"."SYS_EXPORT_SCHEMA_01": dlinkuser/******** directory=dump dumpfile=no_pubdlink.dmp logfile=nopubdlink_
exp.log schemas=dlinkuser
正在使用 BLOCKS 方法进行估计...
处理对象类型 SCHEMA_EXPORT/TABLE/TABLE_DATA
使用 BLOCKS 方法的总估计: 64 KB
处理对象类型 SCHEMA_EXPORT/USER
处理对象类型 SCHEMA_EXPORT/SYSTEM_GRANT
处理对象类型 SCHEMA_EXPORT/ROLE_GRANT
处理对象类型 SCHEMA_EXPORT/DEFAULT_ROLE
处理对象类型 SCHEMA_EXPORT/PRE_SCHEMA/PROCACT_SCHEMA
处理对象类型 SCHEMA_EXPORT/DB_LINK
处理对象类型 SCHEMA_EXPORT/TABLE/TABLE
处理对象类型 SCHEMA_EXPORT/TABLE/COMMENT
处理对象类型 SCHEMA_EXPORT/TABLE/INDEX/INDEX
处理对象类型 SCHEMA_EXPORT/TABLE/CONSTRAINT/CONSTRAINT
处理对象类型 SCHEMA_EXPORT/TABLE/INDEX/STATISTICS/INDEX_STATISTICS
. . 导出了 "DLINKUSER"."T1" 5.023 KB 2 行
已成功加载/卸载了主表 "DLINKUSER"."SYS_EXPORT_SCHEMA_01"
******************************************************************************
DLINKUSER.SYS_EXPORT_SCHEMA_01 的转储文件集为:
D:\DUMP\NO_PUBDLINK.DMP
作业 "DLINKUSER"."SYS_EXPORT_SCHEMA_01" 已于 星期六 10月 13 16:31:21 2018 elapsed 0 00:00:44 成功完成
D:\app\test\product\11.2.0\dbhome_1\BIN>
进行导入
impdp dlinkuser/oracle directory=dir dumpfile=no_pubdlink.dmp logfile=impdp.log
C:\Users\test>impdp dlinkuser/oracle directory=dir dumpfile=no_pubdlink.dmp logfile=impdp.log TABLE_EXISTS_ACTION=trunca
te
Import: Release 12.2.0.1.0 - Production on 星期六 10月 13 16:33:52 2018
Copyright (c) 1982, 2018, Oracle and/or its affiliates. All rights reserved.
连接到: Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit Production
已成功加载/卸载了主表 "DLINKUSER"."SYS_IMPORT_FULL_01"
已在 AL32UTF8 字符集和 AL16UTF16 NCHAR 字符集中完成导入
已在 ZHS16GBK 字符集和 AL16UTF16 NCHAR 字符集中完成导出
警告: 字符集转换过程中可能出现数据丢失情况
启动 "DLINKUSER"."SYS_IMPORT_FULL_01": dlinkuser/******** directory=dir dumpfile=no_pubdlink.dmp logfile=impdp.log TABL
E_EXISTS_ACTION=truncate
处理对象类型 SCHEMA_EXPORT/USER
ORA-31684: 对象类型 USER:"DLINKUSER" 已存在
处理对象类型 SCHEMA_EXPORT/SYSTEM_GRANT
处理对象类型 SCHEMA_EXPORT/ROLE_GRANT
处理对象类型 SCHEMA_EXPORT/DEFAULT_ROLE
处理对象类型 SCHEMA_EXPORT/PRE_SCHEMA/PROCACT_SCHEMA
处理对象类型 SCHEMA_EXPORT/DB_LINK
处理对象类型 SCHEMA_EXPORT/TABLE/TABLE
表 "DLINKUSER"."T1" 已存在且已截断。由于截断了 table_exists_action, 将加载数据, 但是将跳过所有相关元数据。
处理对象类型 SCHEMA_EXPORT/TABLE/TABLE_DATA
. . 导入了 "DLINKUSER"."T1" 5.023 KB 2 行
作业 "DLINKUSER"."SYS_IMPORT_FULL_01" 已经完成, 但是有 1 个错误 (于 星期六 10月 13 16:34:18 2018 elapsed 0 00:00:23 完成
)
查询,可以看到 dlinkuser schema下的dblink已经导入进来了。
SYS@nocdb>select owner,db_link from dba_db_links;
OWNER DB_LINK
---------- ------------------------------
SYS SYS_HUB
PUBLIC DBMS_CLRDBLINK
DLINKUSER NO_PUB_DLINK
SYS@nocdb>
DLINKUSER@test>select owner,db_link from dba_db_links;
OWNER DB_LINK
---------- ------------------------------
PUBLIC DBMS_CLRDBLINK
PUBLIC TO_NOCDB
DLINKUSER NO_PUB_DLINK
-- 对于create public database语句创建的dblink,通过元数据的导出导入,也可以导出导入dblink。 导出导入的过程略。
导出导入的语句
expdp "'/ as sysdba '" directory=dump dumpfile=meta.dmp logfile=meta.log content=METADATA_ONLY full=y
impdp "'/ as sysdba '" directory=dir dumpfile=meta.dmp logfile=impmeta1.log
查看结果:可以发现,owner为public的dblink已经导入进来了 。
DLINKUSER@test>select owner,db_link from dba_db_links;
OWNER DB_LINK
---------- ------------------------------
PUBLIC DBMS_CLRDBLINK
PUBLIC TO_NOCDB
DLINKUSER NO_PUB_DLINK
DLINKUSER@test>
SYS@nocdb>select owner,db_link from dba_db_links;
OWNER DB_LINK
---------- ------------------------------
SYS SYS_HUB
PUBLIC DBMS_CLRDBLINK
PUBLIC TO_NOCDB
DLINKUSER NO_PUB_DLINK
SYS@nocdb>
END 。