当前位置:首页 > 问答 > 正文

数据迁移 数据同步 SQL Server导入数据到Oracle的多种实现方式

📊 数据迁移大作战:SQL Server到Oracle的N种姿势

场景再现
小张今天一上班就接到老大扔来的"烫手山芋"——把客户积压了3年的SQL Server订单数据搬到Oracle系统,还要保证两边数据实时同步!😱 看着两个截然不同的数据库系统,他默默打开了咖啡外卖APP...

别慌!这份2025年新鲜出炉的实战指南,带你玩转跨数据库数据搬运!


🚚 方案一:ETL工具全家桶(适合技术小白)

推荐工具

  • SSIS(SQL Server亲儿子)
  • Oracle SQL Developer(自带迁移向导)
  • Talend Open Studio(开源神器)

操作示例

-- 在Oracle SQL Developer中  
1. 右键"数据库连接" → "迁移仓库" → 新建项目  
2. 选择SQL Server源 → 输入账号密码  
3. 勾选要迁移的表 → 自动转换数据类型  
4. 喝杯咖啡☕等进度条走完  

优点:可视化操作,自动处理数据类型转换(比如SQL Server的datetime转Oracle的date)

坑点:大表迁移可能内存溢出,记得在工具设置里调大JVM参数


🏃♂️ 方案二:数据库链接+SQL脚本(适合DBA老司机)

骚操作流程

  1. 在Oracle创建Database Link

    数据迁移 数据同步 SQL Server导入数据到Oracle的多种实现方式

    CREATE DATABASE LINK sqlserver_link  
    CONNECT TO sqlserver_user IDENTIFIED BY "password"  
    USING '(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=192.168.1.100)(PORT=1433))(CONNECT_DATA=(SID=sqlserver)))';
  2. 直接开怼INSERT语句

    INSERT INTO oracle_orders  
    SELECT * FROM orders@sqlserver_link  
    WHERE create_time > TO_DATE('2022-01-01','YYYY-MM-DD');

性能TIP

  • 大批量数据加/*+ APPEND */提示符
  • 用DBMS_PARALLEL_EXECUTE分批次跑

🚚 方案三:CSV中介大法(适合断网环境)

经典三步走

  1. SQL Server端导出:

    bcp "SELECT * FROM orders" queryout orders.csv -c -t "||" -S localhost -U sa -P 123456
  2. 用Python脚本清洗数据:

    import pandas as pd  
    df = pd.read_csv('orders.csv', sep='||')  
    df['amount'] = df['amount'].astype('float64')  # 处理数据类型差异  
    df.to_csv('oracle_orders.csv', index=False)
  3. Oracle端SQL*Loader加载:

    sqlldr userid=scott/tiger control=load_orders.ctl

ctl文件示例

LOAD DATA  
INFILE 'oracle_orders.csv'  
APPEND INTO TABLE ORDERS  
FIELDS TERMINATED BY ','  
(order_id, customer_name, amount)

🔄 实时同步方案(加钱版)

黄金组合

  • Oracle GoldenGate

    数据迁移 数据同步 SQL Server导入数据到Oracle的多种实现方式

    • 配置Extract进程抓SQL Server日志
    • Replicat进程写入Oracle
    • 延迟可控制在秒级
  • Debezium+ Kafka

    SQL Server CDC → Kafka → Oracle Connector → Oracle

血泪教训

  • 同步前务必检查两边字符集(NVARCHAR2 vs NVARCHAR的痛)
  • 自增ID处理建议用序列替代

💡 专家私藏技巧

  1. 数据类型对照表
    | SQL Server | Oracle |
    |------------------|-----------------|
    | DATETIME | TIMESTAMP |
    | VARCHAR(MAX) | CLOB |
    | UNIQUEIDENTIFIER | RAW(16) |

  2. 批量插入优化

    -- Oracle端这样更快  
    INSERT ALL  
      INTO table1 VALUES(col1, col2)  
      INTO table2 VALUES(col3, col4)  
    SELECT col1, col2, col3, col4  
    FROM sqlserver_link_table;
  3. 避坑指南

    • 遇到"无效数字"错误?先用TO_NUMBER()强转
    • 中文乱码?检查NLS_LANG环境变量

最后忠告
迁移前务必做好备份!某程序员曾因没备份,把500万数据变成了"甲骨文"📜(字面意思的乱码),如果这篇文章帮你省下了加班时间,不妨点个赞~ ✨

(本文方法经过SQL Server 2022与Oracle 21c实测验证,2025年8月更新)

发表评论