如何实现从Oracle数据库向MariaDB的数据拉取?
从Oracle拉取数据到MariaDB的可行方案
1. Oracle导出 + MariaDB导入(离线同步)
这是最易实现的离线方案,适合非实时需求:
- 在Oracle端用数据泵导出目标数据:
expdp your_oracle_user/your_pwd@orcl schemas=target_schema tables=table1,table2 dumpfile=oracle_dump.dmp logfile=export.log - 将导出文件传输到MariaDB服务器后,可选择两种导入方式:
- 若导出为SQL脚本,直接执行:
mysql -u mariadb_user -p target_mariadb_db < oracle_data.sql - 若导出为CSV(可通过Oracle SQL Developer或
UTL_FILE生成),用MariaDB的LOAD DATA高效导入:LOAD DATA INFILE '/path/to/data.csv' INTO TABLE target_mariadb_table FIELDS TERMINATED BY ',' ENCLOSED BY '"' LINES TERMINATED BY '\n' IGNORE 1 ROWS;
- 若导出为SQL脚本,直接执行:
2. Oracle创建DB_LINK推送数据(主动同步)
Oracle可以通过ODBC驱动建立到MariaDB的数据库链接,配合定时任务主动推送数据:
- 先在Oracle端配置MariaDB的ODBC DSN,再创建数据库链接:
CREATE DATABASE LINK mariadb_sync_link CONNECT TO mariadb_user IDENTIFIED BY mariadb_pwd USING 'mariadb_odbc_dsn'; - 编写PL/SQL脚本实现增量同步,比如:
MERGE INTO target_table@mariadb_sync_link t USING (SELECT * FROM source_oracle_table WHERE update_time > (SELECT COALESCE(MAX(update_time), TO_DATE('1970-01-01','YYYY-MM-DD')) FROM target_table@mariadb_sync_link)) s ON (t.id = s.id) WHEN MATCHED THEN UPDATE SET t.col1 = s.col1, t.update_time = s.update_time WHEN NOT MATCHED THEN INSERT (id, col1, update_time) VALUES (s.id, s.col1, s.update_time); COMMIT; - 用Oracle的
DBMS_SCHEDULER创建定时任务,自动执行同步:BEGIN DBMS_SCHEDULER.CREATE_JOB ( job_name => 'ORACLE_TO_MARIADB_SYNC', job_type => 'PLSQL_BLOCK', job_action => 'BEGIN /* 上面的MERGE脚本 */ END;', start_date => SYSTIMESTAMP, repeat_interval => 'FREQ=HOURLY;BYMINUTE=0;', enabled => TRUE, comments => 'Incremental sync from Oracle to MariaDB' ); END; /
3. ETL工具实现实时/准实时同步
如果需要低延迟的数据同步,推荐使用专业ETL工具:
- Oracle GoldenGate:捕获Oracle的Redo Log,将数据变更实时同步到MariaDB,支持复杂场景的增量复制。
- Apache Kafka Connect:配置Oracle Source Connector抽取数据,MariaDB Sink Connector写入数据,适合大数据流场景。
- Talend/Informatica:可视化配置抽取、转换、加载流程,支持定时或实时同步,上手门槛低。
4. MariaDB定时拉取(你已知方案的优化)
你提到的MariaDB通过数据链接拉取,可配合MariaDB事件调度器实现自动定时拉取:
-- 开启事件调度器 SET GLOBAL event_scheduler = ON; -- 创建每小时执行一次的同步任务 CREATE EVENT sync_oracle_data ON SCHEDULE EVERY 1 HOUR STARTS CURRENT_TIMESTAMP DO BEGIN INSERT INTO mariadb_target_table SELECT * FROM oracle_source_table@oracle_data_link WHERE update_time > (SELECT COALESCE(MAX(update_time), '1970-01-01 00:00:00') FROM mariadb_target_table); COMMIT; END;
内容的提问来源于stack exchange,提问作者Prabhakar Repalle
相关产品推荐
相关产品推荐

