创建oracle访问mysql的数据链路步骤

本文详细介绍了如何通过MySQL ODBC驱动和Oracle的数据库链接功能实现MySQL与Oracle之间的数据同步过程。包括MySQL用户创建、ODBC数据源配置、Oracle监听器配置及测试验证等关键步骤。

(1)登陆到mysql
C:/Documents and Settings/Administrator>mysql -h localhost -u root -p
Enter password: *****
Welcome to the MySQL monitor. Commands end with ; or /g.
Your MySQL connection id is 69
Server version: 5.0.51a-community-nt MySQL Community Edition (GPL)

Type 'help;' or '/h' for help. Type '/c' to clear the buffer.
(2)创建数据库
mysql> create database oracle;
Query OK, 1 row affected (0.00 sec)
(3)创建被访问的mysql用户
mysql> grant all privileges on oracle.* to 'orauser'@'%' identified by 'orauser'
with grant option;
Query OK, 0 rows affected (0.00 sec)

mysql> exit
Bye
(4)登陆该用户,并测试
C:/Documents and Settings/Administrator>mysql -h localhost -u orauser -p
Enter password: *******
Welcome to the MySQL monitor. Commands end with ; or /g.
Your MySQL connection id is 70
Server version: 5.0.51a-community-nt MySQL Community Edition (GPL)

Type 'help;' or '/h' for help. Type '/c' to clear the buffer.
mysql> use oracle;
Database changed
mysql> create table test(tid integer,tname varchar(20));
Query OK, 0 rows affected (0.06 sec)

mysql> insert into test(tid,tname)values(1,'byf');
Query OK, 1 row affected (0.03 sec)

mysql> insert into test(tid,tname)values(2,'others');
Query OK, 1 row affected (0.02 sec)

mysql> select * from test;
+------+--------+
| tid | tname |
+------+--------+
|    1 | byf    |
|    2 | others |
+------+--------+
2 rows in set (0.00 sec)

mysql>
(5)安装mysql odbc driver 3.51并设置odbc数据源
data source name:mysqlora
server:localhost
user: orauser
password:orauser
database:oracle
(6)配置初始化参数%ORACLE_HOME%/admin/initmysqlora.ora
HS_FDS_CONNECT_INFO =mysqlora
HS_FDS_TRACE_LEVEL = on
(7)配置%ORACLE_HOME%/newtwork/admin/tnsname.ora
mysqlora=
(DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))
    )
    (CONNECT_DATA =
      ( SID= mysqlora))
      (HS=OK)
)
(8)配置%ORACLE_HOME%/newtwork/admin/listener.ora
LISTENER =
(DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))
)

SID_LIST_LISTENER =
(SID_LIST =
    (SID_DESC =
      (GLOBAL_DBNAME = oradb)
      (ORACLE_HOME = D:/oracle)
      (SID_NAME = oradb)
    )
    (SID_DESC =
      (PROGRAM = hsodbc)
      (ORACLE_HOME = D:/oracle/)
      (SID_NAME = mysqlora)
    )
)
(9)建立oracle到mysql的数据链路,并测试

C:/Documents and Settings/Administrator>sqlplus /nolog

SQL*Plus: Release 9.2.0.1.0 - Production on 星期五 8月 8 14:17:49 2008

Copyright (c) 1982, 2002, Oracle Corporation. All rights reserved.

SQL> conn byf/1234;
已连接。

SQL> create database link mysqlora
2 connect to "orauser" identified by "orauser" using 'mysqlora';

数据库链接已创建。

SQL> select * from test@mysqlora;

      tid tname
---------- --------------------
        1 byf
        2 others

SQL>

<think>我们参考了站内引用,特别是引用[1]中提供了使用OracleDBLink连接到MySQL数据库的脚本示例,引用[3]提到了使用DataX工具进行数据库同步。但是用户需求是通过Oracle脚本定时推送数据到MySQL,这需要结合Oracle的定时任务和数据库链接。根据引用[1]的示例,我们可以通过创建DBLink来实现OracleMySQL的直接操作(查询、插入、更新、删除)。但是,实际中OracleMySQL的DBLink需要配置透明网关(TransparentGateway),或者使用其他中间件(如ODBC)来建立连接。引用[3]提到了使用DataX,这是一个数据同步工具,但它是外部的,不是Oracle脚本。因此,我们考虑两种方案:1.使用Oracle的DBLink(如果已配置透明网关)并结合Oracle的定时任务(如DBMS_SCHEDULER)来定时执行数据推送。2.使用外部脚本(例如Shell脚本调用DataX)并利用操作系统的定时任务(如cron)来执行。但是,用户明确要求使用Oracle脚本定时推送。因此,我们优先考虑在Oracle数据库内部完成。注意:DBLink直接操作MySQL需要配置透明网关,但配置过程复杂,且不是所有环境都支持。如果无法配置透明网关,我们可以考虑在Oracle中调用外部程序(使用Java存储过程或者外部过程)来实现,但这超出了纯SQL脚本的范围。因此,我们将给出一个基于配置了透明网关的DBLink的示例,并假设已经创建了到MySQL的数据库链接(mysql_link)。然后使用Oracle的DBMS_SCHEDULER包来定时执行推送数据的SQL语句。步骤:1.创建DBLink(如引用[1]所示),这里假设已经创建好。2.编写需要执行的SQL语句(插入、更新、删除等)。3.创建Oracle定时任务。注意:在实际操作中,直接通过DBLink操作MySQL表可能性能不高,特别是大量数据时。示例脚本:假设我们有一个需求:每天凌晨1点将Oracle中表source_table的数据增量推送到MySQL的target_table(通过DBLinkmysql_link)。首先,创建DBLink(如果还没有):```sqlCREATEDATABASELINKmysql_linkCONNECTTOmysql_userIDENTIFIEDBY"mysql_password"USING'tns_name_for_mysql';--这里的tns_name_for_mysql需要在tnsnames.ora中配置,指向MySQL数据库的透明网关```然后,编写一个存储过程来执行数据推送(这里以增量插入为例,假设有一个时间戳字段last_updated):```sqlCREATEORREPLACEPROCEDUREpush_data_to_mysqlASBEGIN--假设这里使用INSERT...SELECT语句,将新增数据推送到MySQLINSERTINTOtarget_table@mysql_link(col1,col2,...)SELECTcol1,col2,...FROMsource_tableWHERElast_updated>TRUNC(SYSDATE-1);--前一天的数据COMMIT;EXCEPTIONWHENOTHERSTHENROLLBACK;RAISE;END;/```最后,创建定时任务(使用DBMS_SCHEDULER):```sqlBEGINDBMS_SCHEDULER.CREATE_JOB(job_name=>'daily_push_to_mysql',job_type=>'PLSQL_BLOCK',job_action=>'BEGINpush_data_to_mysql;END;',start_date=>SYSTIMESTAMP,repeat_interval=>'FREQ=DAILY;BYHOUR=1;BYMINUTE=0;BYSECOND=0',enabled=>TRUE);END;/```然而,需要注意的是:-这种方法依赖于透明网关的配置,且配置过程可能较为复杂。-如果数据量很大,直接通过DBLink操作可能效率较低。因此,我们也可以考虑使用外部工具如DataX(引用[3]提到)来实现,然后在操作系统中设置定时任务(如cron)。但是,用户要求的是Oracle脚本,所以上述方案是尽可能在Oracle内部完成。如果透明网关不可用,我们可能需要使用其他方法,例如在Oracle中使用UTL_FILE包将数据导出为文件,然后使用外部程序将文件导入MySQL,但这仍然需要操作系统的定时任务配合,不能完全在Oracle内部完成。综上所述,我们优先给出了基于透明网关和Oracle定时任务的解决方案。注意:用户需要确保透明网关已正确配置,并且DBLink可用。相关问题:1.如何配置Oracle透明网关以连接到MySQL?2.如果没有透明网关,还有什么方法可以在Oracle内部定时将数据推送到MySQL?3.如何监控Oracle定时任务的执行情况?</think> ### 如何通过 Oracle 脚本定时推送数据到 MySQL 参考站内引用,结合 OracleMySQL 的数据库交互需求,以下是完整解决方案: #### 1. **使用 Oracle DBLink(直接连接)** 需先配置透明网关(需 DBA 权限),通过 DBLink 直接操作 MySQL 表[^1]: ```sql -- 创建数据库链路 CREATE DATABASE LINK mysql_link CONNECT TO mysql_user IDENTIFIED BY "mysql_password" USING 'mysql_tns'; -- 定时任务中执行数据推送(插入示例) BEGIN INSERT INTO target_table@mysql_link (col1, col2) SELECT col1, col2 FROM oracle_source_table WHERE update_time > SYSDATE-1; COMMIT; END; ``` #### 2. **使用 DataX 工具(异步批量同步)** 适用跨平台大数据量场景(需安装 DataX)[^3]: ```json // datax_job.json 配置示例 { "job": { "content": [{ "reader": { "name": "oraclereader", "parameter": {"username": "ora_user", "password": "ora_pwd", "column": ["*"], "connection": [{"jdbcUrl": ["jdbc:oracle:thin:@//host:1521/sid"], "table": ["source_table"]}]} }, "writer": { "name": "mysqlwriter", "parameter": {"username": "mysql_user", "password": "mysql_pwd", "column": ["*"], "connection": [{"jdbcUrl": "jdbc:mysql://host:3306/db", "table": ["target_table"]}]} } }] } } ``` 通过操作系统 crontab 定时调用: ```bash 0 2 * * * /bin/python /opt/datax/bin/datax.py /path/to/datax_job.json ``` #### 3. **使用 UTL_FILE 导出 + MySQL LOAD DATA(文件中转)** 适合异构数据库无法直连的场景: ```sql -- Oracle 定时导出 CSV BEGIN UTL_FILE.FOPEN('DATA_DIR', 'export.csv', 'W'); FOR rec IN (SELECT * FROM source_table) LOOP UTL_FILE.PUT_LINE(rec.col1 ||','|| rec.col2); END LOOP; UTL_FILE.FCLOSE; END; -- Linux cron 调用 MySQL 导入脚本 */30 * * * * mysql -u user -p'pwd' -e "LOAD DATA LOCAL INFILE '/tmp/export.csv' INTO TABLE target_table" ``` > **关键注意事项**: > 1. DBLink 方案需安装 [Oracle Database Gateway for MySQL](https://docs.oracle.com/en/database/oracle/oracle-database/19/admin/configuring-oracle-database-gateway.html) > 2. DataX 任务需提前在服务器部署运行时环境 > 3. 文件中转需保证两端服务器目录权限互通 > 4. 定时任务需评估锁表和性能影响 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值