如何连接Oracle 11g与19c数据库并实现特定列插入同步?
Oracle 11g到19c特定列数据传输方案
场景说明
我们正在从Oracle 11g迁移至Oracle 19c,需要测试插入操作时能否将11g中特定列的数据传输到19c。具体需求为:将11g中PRODUCT表和SUPPLIER表的对应列数据,合并传输到19c的PRODUCT WAREHOUSE表,三者对应列结构一致:
源端(Oracle 11g)
PRODUCT表
| Product_name | product_description |
|---|---|
| Bolt | Metal |
| Ziptie | Plastic |
SUPPLIER表
| Product_name | Supplier |
|---|---|
| Bolt | Home Depot |
| Ziptie | Plastic Corp |
目标端(Oracle 19c)
PRODUCT WAREHOUSE表
| Product_name | product_description | Supplier |
|---|---|---|
| Bolt | metal | Home Depot |
| Ziptie | plastic | Plastic Corp |
可行方案
一、DBLINK数据库链接(实时插入测试首选)
这是Oracle原生跨库访问方式,适合验证实时插入场景:
- 在19c端创建指向11g的DBLINK
登录19c数据库,执行以下SQL:CREATE DATABASE LINK dblink_11g CONNECT TO 11g用户名 IDENTIFIED BY 11g密码 USING '(DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = 11g服务器IP)(PORT = 1521)) (CONNECT_DATA = (SERVICE_NAME = 11g数据库服务名)) )'; - 执行跨库插入(合并两表数据)
直接通过DBLINK读取11g数据并插入到19c目标表:
注:如果仅需单表特定列,简化SELECT语句即可。INSERT INTO "PRODUCT WAREHOUSE" (Product_name, product_description, Supplier) SELECT p.Product_name, LOWER(p.product_description), s.Supplier FROM PRODUCT@dblink_11g p JOIN SUPPLIER@dblink_11g s ON p.Product_name = s.Product_name;
二、EXPDP/IMPDP数据泵(批量迁移测试)
适合批量导出特定列后导入的测试场景:
- 11g端导出特定列
使用expdp命令导出目标列(替换占位符):expdp 11g用户名/11g密码@11g服务名 tables=PRODUCT,SUPPLIER \ columns=(PRODUCT.PRODUCT_NAME,PRODUCT.PRODUCT_DESCRIPTION,SUPPLIER.PRODUCT_NAME,SUPPLIER.SUPPLIER) \ dumpfile=prod_supp.dmp logfile=prod_supp_export.log - 19c端导入并合并
将dump文件传输到19c服务器后,可先导入临时表再合并,或直接通过SQL语句插入:
然后执行合并插入:impdp 19c用户名/19c密码@19c服务名 dumpfile=prod_supp.dmp logfile=prod_supp_import.log \ remap_table=PRODUCT:PRODUCT_TEMP,SUPPLIER:SUPPLIER_TEMPINSERT INTO "PRODUCT WAREHOUSE" (Product_name, product_description, Supplier) SELECT p.Product_name, LOWER(p.product_description), s.Supplier FROM PRODUCT_TEMP p JOIN SUPPLIER_TEMP s ON p.Product_name = s.Product_name;
三、SQL*Loader(文件中转式测试)
适合通过中间文件传输数据的场景:
- 11g端导出特定列到CSV
执行SQL脚本生成CSV文件:SET HEADING OFF FEEDBACK OFF PAGESIZE 0 COLSEP ',' SPOOL prod_supp.csv SELECT p.Product_name, p.product_description, s.Supplier FROM PRODUCT p JOIN SUPPLIER s ON p.Product_name = s.Product_name; SPOOL OFF - 19c端用SQL*Loader导入
编写控制文件load_prod.ctl:
执行导入命令:LOAD DATA INFILE 'prod_supp.csv' INTO TABLE "PRODUCT WAREHOUSE" FIELDS TERMINATED BY ',' (Product_name, product_description "LOWER(:product_description)", Supplier)sqlldr 19c用户名/19c密码@19c服务名 control=load_prod.ctl log=load.log
四、Oracle GoldenGate(实时同步测试)
如果需要验证持续的插入/更新同步场景,可使用GoldenGate:
- 在11g端配置Extract进程,捕获PRODUCT、SUPPLIER表的特定列变更
- 在19c端配置Replicat进程,将变更同步到PRODUCT WAREHOUSE表
- 适合长期数据同步的迁移验证
内容的提问来源于stack exchange,提问作者Ian
相关产品推荐
相关产品推荐

