做过跨库数据迁移的 DBA 对“导出、传输、导入”三步流程应该不陌生。中间生成的转储文件动辄几十 GB,不仅占用磁盘空间,还会拉长整个迁移周期。Oracle Data Pump 从 10g 开始引入 network_link 参数,正好解决这个问题。它的思路很直接:在目标库执行 impdp 时,通过一个数据库链接连接到源库,源库的 Data Pump 导出进程会把数据通过网络直接推送到目标库,目标库的导入进程随即写入本地,全程不需要落盘。这个能力对于源库磁盘紧张、不允许存放额外转储文件,或者希望自动化执行跨库同步的场景尤其有用。

当然,网络导入并不是银弹。它的数据链路完全依赖网络质量,如果源库与目标库之间带宽不足或延迟较高,导入速度会受到明显影响。同时,源库在导出过程中会承担额外的 CPU 和 I/O 压力。因此在正式使用前,需要评估网络条件和源库负载,并做好相应权限配置。
一、network_link 的工作原理与适用场景
要理解 network_link 模式,可以先对比传统 Data Pump 的两种用法。常规的 expdp + impdp 方式,先由 expdp 在源库生成 .dmp 文件,然后通过操作系统层面传输到目标服务器,最后 impdp 读取文件完成导入。这种方式的好处是转储文件可以重复使用,但磁盘占用和传输时间不可忽视。network_link 模式则不同,它由目标库发起导入会话,通过数据库链接调用源库的 Data Pump 导出进程,源库将数据以流式方式发送到目标库,目标库直接消费这些数据。整个过程没有中间文件产生。
从数据流向上看,命令虽然是在目标库执行,但实际的源数据读取发生在源库。目标库的 impdp 客户端通过 database link 与源库建立会话,源库上的 Data Pump worker 进程扫描表数据、索引元数据、约束等信息,然后把这些对象的 DDL 和数据通过 SQL*Net 协议传输到目标库。目标库在本地执行相应的创建表、插入数据等操作。因此,网络导入可以理解为“远程导出 + 本地导入”的二合一过程。
这种模式适合以下场景:源库和目标库网络互通,且带宽足够;需要快速完成迁移而不希望额外占用磁盘空间;或者希望将迁移步骤简化到一条 impdp 命令。但如果网络不稳定或者数据量特别巨大,还是建议先考虑传统方式或使用其他并行传输工具。
二、环境准备与权限配置
使用 network_link 之前,需要先在目标库完成两项基础配置:创建数据库链接和准备目录对象。数据库链接负责打通目标库到源库的通道,目录对象则用于存放导入过程中生成的日志文件以及可能用到的 SQLFILE 输出。即便不需要转储文件,Data Pump 仍然需要一个目录对象来写入日志,因此这一步不能省略。
创建数据库链接时,需要确保目标库的 TNS 配置能够解析源库的服务名,或者直接在 USING 子句中使用完整的连接描述。源库用户需要具备 EXP_FULL_DATABASE 角色,或者至少对要导出的模式拥有足够的读取权限;目标库用户则需要 IMP_FULL_DATABASE 角色。下面是在目标库执行的 SQL 示例:
-- 创建目录对象并授权给导入用户 CREATE OR REPLACE DIRECTORY dpump_dir AS '/u01/app/oracle/dump'; GRANT READ, WRITE ON DIRECTORY dpump_dir TO imp_user; -- 创建指向源库的数据库链接 CREATE DATABASE LINK source_link CONNECT TO source_user IDENTIFIED BY source_password USING 'source_tns';
代码中创建了一个名为 dpump_dir 的目录对象,物理路径指向 /u01/app/oracle/dump。如果是 Windows 环境,路径需要写成类似 D:\oracle\dump 的形式,注意反斜杠不要被省略。数据库链接 source_link 使用源库的 TNS 别名 source_tns 进行连接。实际使用时,source_user 和 source_password 需要替换为源库的真实账号信息。
创建完成后,可以先在目标库验证链接是否可用:
SELECT SYSDATE FROM dual@source_link;
如果能正常返回源库的系统时间,说明数据库链接连通。接下来还要确认目标库导入用户对目录对象有读写权限,否则 impdp 可能在写日志文件时报 ORA-39002 错误。
三、执行网络导入命令与参数解析
环境准备就绪后,就可以在目标库执行 impdp 命令。一个典型的网络导入命令如下:
impdp target_user/password@target_pdb \ directory=dpump_dir \ network_link=source_link \ schemas=HR \ remap_schema=HR:HR_COPY \ remap_tablespace=USERS:USERS_NEW \ parallel=4 \ logfile=hr_import.log
这条命令表示通过 source_link 从源库获取 HR 模式的数据,在目标库中导入为 HR_COPY 模式,同时把原来的 USERS 表空间映射到 USERS_NEW 表空间。parallel=4 表示启用 4 个并行 worker 进程加速导入。logfile 参数指定日志文件名,会写入之前创建的 dpump_dir 目录中。
network_link 是核心参数,它告诉 impdp 不要寻找本地转储文件,而是通过指定数据库链接从源库读取。directory 参数依然需要设置,因为日志必须落盘。schemas 参数用于限定要导入的模式;如果只导入某些表,可以使用 tables=HR.EMPLOYEES 这样的写法。remap_schema 和 remap_tablespace 分别用于处理模式名和表空间名的映射,在多环境迁移时非常实用。
如果需要保证导入数据的一致性,可以在命令中加上 flashback_time 或 flashback_scn 参数。例如 flashback_time=TO_TIMESTAMP('2024-06-01 10:00:00','YYYY-MM-DD HH24:MI:SS'),这样源库导出时所有数据都会基于这个时间点的一致性快照。不过使用闪回功能需要源库开启适当 undo 保留策略,否则容易报 ORA-01555 错误。
四、常见错误与性能优化建议
网络导入过程中最常见的错误之一是权限不足。如果源库用户没有 EXP_FULL_DATABASE 角色,执行时可能会遇到 ORA-31631 错误,提示需要 privileges。此时需要回到源库给对应用户授权,或者改用具有更高权限的账号创建数据库链接。另一个常见问题是 TNS 无法解析,报 ORA-12154,这通常是因为目标库的 tnsnames.ora 中没有配置源库服务名,或者数据库链接的 USING 子句写错了。
如果数据库链接本身连通,但 impdp 仍报 ORA-39002 或 ORA-39168,可以检查目录对象是否存在、导入用户是否有读写权限,以及日志文件是否与已有文件重名。在测试阶段,建议先导入一个小表验证全流程,再扩大到整个模式。例如:
impdp target_user/password@target_pdb \ directory=dpump_dir \ network_link=source_link \ tables=HR.DEPARTMENTS \ logfile=test_import.log
性能方面,网络导入的瓶颈一般出现在网络带宽和源库的导出能力上。并行度不是越大越好,如果带宽已经打满,增加 parallel 只会加剧网络拥塞。可以先从 parallel=2 开始测试,观察源库的 v$session_longops 和目标库的导入速率,再逐步调整。另外,可以通过 exclude=statistics 排除统计信息导入,后续在目标库单独收集统计信息,减少传输数据量。如果源库存在大量索引,导入时 Data Pump 会同时传输索引定义和索引数据,对于极大表可以考虑 exclude=index 先跳过索引,导入完成后再重建,这样能缩短在线导入窗口。
还需要注意,network_link 模式不适合用来传输大量 LOB 对象或者极端宽表,因为这些数据在 SQL*Net 传输过程中会产生较高的开销。遇到这类场景,可以对比传统 expdp 压缩转储文件的方式,看哪种更快。最后,导入完成后务必通过 dba_datapump_jobs 视图确认作业状态为 NOT RUNNING,并检查日志中有没有异常跳过或失败的对象。
Oracle数据泵network_link网络导入修改时间:2026-09-18 05:46:54