【每日一错】PDB之间数据迁移
文章目录
- 题目
- 答案解析
- 扩展学习
- 一、常见迁移方法
- 1. 使用 EXPDP/IMPDP 工具(推荐)
- 2. 使用 DB Link + SQL 语句
- 3. 使用 DBMS\_DATAPUMP 包
- 二、方法对比
- 总结
题目
答案解析
解析:普通 SQL 语句(INSERT INTO … SELECT、CTAS)无法直接跨 PDB 访问数据,因为每个 PDB 都是独立的数据库环境,拥有自己的数据字典和会话范围。
扩展学习
在 Oracle 19c 的 CDB(Container Database) 架构中,每个 PDB(Pluggable Database) 都是一个独立的数据库环境,拥有自己的数据字典、用户和表空间。
PDB 与 PDB 之间默认不能直接访问数据,因此跨 PDB 数据迁移需要借助特定的技术手段。
一、常见迁移方法
1. 使用 EXPDP/IMPDP 工具(推荐)
原理:Data Pump 将数据导出为转储文件(DMP),再导入到目标 PDB。
流程:
-
在源 PDB 使用
expdp
导出:expdp user1/password@pdb1 tables=table1 dumpfile=table1.dmp directory=dp_dir
-
将 DMP 文件传输到目标 PDB 所在服务器的 Data Pump 目录。
-
在目标 PDB 使用
impdp
导入:impdp user2/password@pdb2 tables=table1 dumpfile=table1.dmp directory=dp_dir
优点:官方推荐,速度快,支持并行,适合大数据量和结构+数据迁移。
缺点:需要磁盘空间存放 DMP 文件。
2. 使用 DB Link + SQL 语句
原理:在目标 PDB 建立到源 PDB 的 Database Link,通过远程 SQL 查询实现数据复制。
示例:
-- 在目标 PDB 创建 DB Link
CREATE DATABASE LINK pdb1_linkCONNECT TO user1 IDENTIFIED BY passwordUSING 'PDB1';-- CREATE TABLE AS SELECT
CREATE TABLE new_table AS
SELECT * FROM table1@pdb1_link;-- INSERT INTO SELECT
INSERT INTO table2
SELECT * FROM table1@pdb1_link;
优点:操作简单,适合小规模、临时数据传输。
缺点:受网络延迟影响,不适合大数据量;需要手动维护结构和索引。
3. 使用 DBMS_DATAPUMP 包
原理:Data Pump 的 PL/SQL API 版本,底层与 expdp/impdp 相同。
示例:
DECLAREh1 NUMBER;
BEGINh1 := DBMS_DATAPUMP.OPEN(operation => 'EXPORT', job_mode => 'TABLE', job_name => 'MY_JOB', version => 'LATEST');DBMS_DATAPUMP.ADD_TABLE(h1, 'SCOTT', 'EMP');DBMS_DATAPUMP.ADD_FILE(h1, 'emp_data.dmp', 'DATA_PUMP_DIR');DBMS_DATAPUMP.START_JOB(h1);DBMS_DATAPUMP.DETACH(h1);
END;
/
优点:适合在 PL/SQL 程序中自动化数据迁移。
缺点:需要 PL/SQL 编程,不是初学者首选。
二、方法对比
方法 | 是否需 DB Link | 是否走网络直连 | 是否需中间文件 | 速度 | 适用场景 |
---|---|---|---|---|---|
DB Link + SQL | 是 | 是 | 否 | 一般 | 小数据量、临时迁移 |
EXPDP/IMPDP | 否 | 否 | 是 | 快 | 大数据量、结构+数据迁移 |
DBMS_DATAPUMP | 否 | 否 | 是 | 快 | 自动化迁移、批量作业 |
总结
跨 PDB 数据迁移的选择原则:
- 少量数据 → DB Link + SQL。
- 大数据量 / 结构迁移 → EXPDP/IMPDP(推荐)。
- 需要自动化 → DBMS_DATAPUMP。