Windows环境下,本地Oracle创建dblink连接远程mysql

时间:2023-03-09 03:03:13
Windows环境下,本地Oracle创建dblink连接远程mysql

前言

我的情况是,本地安装了oracle(安装完成后带有SQL Developer,不需要再安装instantclient),创建dblink去连接远程的mysql。有些朋友可能是 本地使用PL\SQL(需安装instantclient)去连接 远程oracle,连接成功后创建并使用dblink去连接远程mysql,这时候要注意的是在远程的oracle环境中配置对应的mysql-odbc。如果还是无法实现,可以看看我在文章里对于这个过程的理解,再对照自己的情况,逐步排查问题,希望对你有帮助。

实现参考:Oracle连接odbc数据源 http://www.cnblogs.com/mellowsmile/p/5218882.html

oracle 不同安装包的区别(结合网上答案,自己整合琢磨的,如有错误,请大佬指出):

Windows环境下,本地Oracle创建dblink连接远程mysql

个人的Oracle安装情况

oracle安装参考教程:https://www.cnblogs.com/hoobey/p/6010804.html

我安装的是32位的Oracle Database 11g R2(之所以选择32位,是因为成功的案例都是用32位的,具体选择的依据我没查出来,有知道的大佬请不吝赐教,谢谢~),具体路径见下截图

Windows环境下,本地Oracle创建dblink连接远程mysql

oracle_home D:\guowenwen\product\11.2.0\dbhome_1,错误信息查找是在D:\guowenwen\product\11.2.0\dbhome_1\hs\trace目录下

个人的安装记录

1、安装32位mysql odbc驱动

下载路径:https://dev.mysql.com/downloads/connector/odbc/

我是选择后缀为.msi的包进行安装的,如果选择zip文件那就不用再安装了。安装mysql odbc注意选择32位/64位,选择的依据不是根据你的操作系统的位数,而是根据软件(Oracle版本)的位数,我安装的oracle位数是32位,所以这里选择安装32位的mysql odbc。如果你不知道怎么选择,那就64位和32位的mysql odbc都安装了,你可以在C:\Program Files (x86)\Mysql中查看到32位的odbc,在C:\Program Files\MySQL中查看到64位的odbc(这边查看的odbc的路径或有不同,在这里,我给出我的安装路径,目的是为了指出在C:\Program Files (x86)中安装的是32位的程序,在C:\Program Files安装的是64位的程序,我之前一直没有搞清楚)

2、新建32位系统DSN(unicode driver)并需要测试成功

这里需要清楚,安装了32位的odbc那就需要新建32位的系统DSN。

1】在控制面板=》管理工具=》数据源(ODBC)=》新建系统DSN(unicode driver) 是64位的

2】在C:\Windows\SysWOW64\odbcad32.exe路径下 新建的系统DSN  是32位的

注意这里的Data Source Name,我这里设置的是TESTMYSQL,在接下来的配置中会用到这个名称。在TCP/IP中输入你要远程连接的mysql数据库的IP地址,要点击Test按钮进行测试,测试成功方可

Windows环境下,本地Oracle创建dblink连接远程mysql       Windows环境下,本地Oracle创建dblink连接远程mysql

3、在D:\guowenwen\product\11.2.0\dbhome_1\NETWORK\ADMIN目录的listener.ora 文件中添加红色的信息(如果该目录下没有listener.ora文件,那就自己新建一个,下面是我所有的配置内容)

#ORACLE_HOME按需替换
SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC=
(SID_NAME=TESTMYSQL) #这里SID_NAME一定要和第二步建立的odbc名字一致
(ORACLE_HOME=D:/guowenwen/product/11.2.0/dbhome_1)
(PROGRAM=dg4odbc) #一定要写dg4odbc
)
(SID_DESC=
(SID_NAME=dg4odbc)
(ORACLE_HOME=D:\guowenwen\product\11.2.0\dbhome_1)
(PROGRAM=dg4odbc)
)
#就我本人来说,这个目录下是没有listener.ora文件的,此时我可以用SQL Developer连接上本地oracle数据库,但是我自己配置了listener.ora文件后,就无法连接本地oracle了
#解决方案就是添加以下的代码块,再重启监听就可以了
(SID_DESC =
(GLOBAL_DBNAME = ORCL)
(ORACLE_HOME = D:\guowenwen\product\11.2.0\dbhome_1)
(SID_NAME = ORCL)
)
) LISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = IPC)(KEY = PNPKEY))
(ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))
)
)

4、在D:\guowenwen\product\11.2.0\dbhome_1\NETWORK\ADMIN目录的tnsnames.ora文件中添加红色的信息(如果该目录下没有tnsnames.ora文件,那就自己新建一个,下面是我所有的配置内容)

#这里的内容和listener.ora是对应的
LISTENER_ORCL =
(ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521)) ORCL =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = ORCL)
)
) TESTMYSQL =
(DESCRIPTION=
(ADDRESS=(PROTOCOL=TCP)(HOST=localhost)(PORT=1521)) #ORACLE服务器的IP,我是在本地oracle上创建dblink,所以HOST填localhost
(CONNECT_DATA=
(SID=TESTMYSQL)) #这里的SID和第二步的odbc名字一致
(HS=OK) #一定要加
) dg4odbc =
(DESCRIPTION=
(ADDRESS=(PROTOCOL=tcp)(HOST=localhost)(PORT=1521))
(CONNECT_DATA=(SID=dg4odbc))
(HS=OK)
)

5、在D:\guowenwen\product\11.2.0\dbhome_1\hs\admin目录下创建initXXX.ora文件,XXX的名字要与第二步odbc的名字一致,本例中创建 initTESTMYSQL.ora文件,添加以下代码

HS_FDS_CONNECT_INFO = TESTMYSQL #注意这里的名字
HS_FDS_TRACE_LEVEL = debug #调试状态,如果连接出错,在路径D:\guowenwen\product\11.2.0\dbhome_1\hs\trace下可以看到错误信息

6、重启监听

两个选择,一是图形化界面操作,二是打开cmd操作,这里选择第二种

右键单击cmd,以管理员身份运行(不然可能会提示:TNS-01190: The user is not authorized to execute the requested listener command),输入以下命令(都需要执行成功,有错误自己找一下解决方案)

C:\Users\guowenwen>lsnrctl stop
C:\Users\guowenwen>lsnrctl start
C:\Users\guowenwen>tnsping MYSQL_LOCAL

7、打开SQL Developer,创建DBLINK

如果使用dblink出错,查看Oracle_HOME\hs\trace的报错信息,如果出现类似内容Access denied for users 'mysql用户名'@‘mysql的ip地址’,原因可能是创建dblink时用户名和密码没加“ ”

create database link MYSQL_LOCAL connect to "mysql用户" identified by “mysql用户密码” using 'MYSQL_LOCAL'; //using后面的名字应该与第二步odbc名字一致

8、使用DBLINK

select * from "表名"@MYSQL_LOCAL;

个人的原理解析

参考:oracle HS 深入解析 及协同Gateway工作流程 http://www.cnblogs.com/wwwiori/archive/2009/06/22/1508068.html

要点(个人的理解,没有深入研究,如果有错误请大佬们不吝赐教):oracle——dg4odbc——odbc——mysql

在本地oracle上使用dblink时(步骤7,8),oracle会连接到HS,HS会去对应目录下查找设置的Agent Componet Code(步骤5),因为我是直接安装了Oracle database(默认安装ODBC Agent),对应的Agent Componet Code是dg4odbcc.exe(对应的步骤3,4,这也是步骤4中设置PROGRAM=dg4odbc的原因),Agent Componet Code接下来去查找Driver(需要连接的数据库的驱动,即步骤1步骤的操作),连接到Driver后,Driver去连接DB(即步骤2,其意义是让Driver知道怎么连接对应的DB),远程DB接收到来自本地Oracle的命令,执行并一步步返回。

Windows环境下,本地Oracle创建dblink连接远程mysql

Windows环境下,本地Oracle创建dblink连接远程mysql

 总结

实现需求的过程中,搜索问题的解决方案时我发现有些文章说需要用到Database Gateways(举的例子是sqlserver),当时也不知道连接mysql不成功是不是因为没安装Gateways的原因(虽然现在知道对于连接mysql来说并不需要),就去找Gateways的知识。但问题是,我找gateways的下载路径就找了很久,更别说其他,现在贴出相关的链接,给有需要的朋友一点参考,减少搜索时间。

gateway下载地址参考:http://www.cnblogs.com/tuyile006/p/4142395.html

oracle database gateway for odbc 介绍:https://docs.oracle.com/database/122/ODBCU/database-gateway-for-odbc-introduction.htm#ODBCU100

最后,还是这句话,如果在阅读的过程中发现了任何问题,还请各位大佬们不吝赐教,感谢~~