公司项目需求,要在不同类型数据库间创建视图和存储过程查询,这就需要将从不同数据库(比如:Oracle和MYSQL两种数据库)中取数据。老板提出一个叫做“Oracle透明网关”的概念,然后让我去研究。网上其实已经有大手子做了一些文档,我这篇博客也是在这些文档的基础上自己实践后整理出来的(由于有一段时间了,所以当初的参考博客忘了,在此没办法贴出源地址,说一声抱歉!)。
根据个人理解,Oracle透明网关就是将Oracle数据库作为”宿主“,在你想要获取数据的数据库间搭建”通道“,然后在这些通道间获取数据加以处理,这样的话不同类型数据库间的数据并非直接进行交互,而是通过Oracle来进行,这样就可以实现诸如:在Oracle和MySQL数据库间创建视图等操作。
废话说完,下面开搞!
1.操作环境
系统:
Oracle版本信息:
MySQL版本信息:
注意:
1.在操作中我们需要用到gateway,由于Oracle11g安装时自带gateway,所以我不用再手动安装了。大家不知道自己是否已经安装的话,可以根据下面的方法检查的是否安装了oracle透明网关,如下。
打开cmd,输入dg4odbc ,如果已经安装将出现以下界面。
2.安装MySQL的数据源驱动(ODBC) 64位
数据源下载地址:
百度网盘:https://pan.baidu.com/s/18TJEq4_5EektWlLwHUH23Q
知道很多都是过路党,没有积分,所以就直接提供网盘下载地址了,当然,你也可以自行去官网(https://dev.mysql.com/downloads/connector/odbc/)下载,然后默认方式安装好。
2.配置数据源
以上准备工作做好后,接下来就是配置数据源了。根据我的图片引导一步步往下做就行了。
搜索数据源并打开(也可以再控制面板中搜索打开)
参数配置好,先测试,成功后然后点击ok保存确定,这样odbc数据源就配置好了。
3.配置透明网关
前面那么多麻烦事结束后,大家最关心的一步来了。
注意:此部分涉及Oracle配置问价的一些修改,建议修改前要备份。很重要!!!
首先你必须找到Oracle_Home所在文件位置,
我的oracle_Home位置是:C:\app\orange\product\11.2.0\dbhome_1
你可以参考查找,或者去环境变量配置中查找Oracle_Home的配置位置,下面很多配置文件和配置参数都需要知道Oracle_Home的具体位置。
3.1 找到initdg4odbc.ora文件
在C:\app\orange\product\11.2.0\dbhome_1\hs\admin目录下找到initdg4odbc.ora。
复制一份,重新命名,命名规则为:init+sid.ora。
比如我的sid为MYSQLODBC,所以此处我的文件名为:initMYSQLODBC.ora。
打开你复制重命名的文件,并添加以下内容。
HS_FDS_CONNECT_INFO = mysqlodbc 说明:和mysql的odbc保持一致
HS_FDS_TRACE_LEVEL = off 说明:需要调试时可以改为debug,调试完成改为off;
3.2 找到listener.ora文件
一般情况下,在C:\app\orange\product\11.2.0\dbhome_1\NETWORK\ADMIN目录下,找到listener.ora文件
注意:
有一般情况,必然会有特殊情况,在这里提一下吧(因为我自己就是特殊情况,哭唧唧)。
因为可能会出现多次安装Oracle导致卸载残留和环境变量没有清理干净,所以此处的文件以及3.3中的文件路径可能会在类似
C:\app\orange\product\instantclient_11_2\network\admin这样的位置。
只要找到就行,这两处位置,都是可以的,我的就是没有卸载完全,所以在上一行的位置中,实测可行。
打开listener.ora文件,进行如下修改,红色字体代表修改部分:
# listener.ora Network Configuration File: C:\app\orange\product\instantclient_11_2\network\admin\listener.ora
# Generated by Oracle configuration tools.
SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(SID_NAME = CLRExtProc)
(ORACLE_HOME = C:\app\orange\product\11.2.0\dbhome_1)
(PROGRAM = extproc)
(ENVS = "EXTPROC_DLLS=ONLY:C:\app\orange\product\11.2.0\dbhome_1\bin\oraclr11.dll")
)
(SID_DESC =
(SID_NAME = MYSQLODBC)
(ORACLE_HOME = C:\app\orange\product\11.2.0\dbhome_1)
(PROGRAM = dg4odbc)
)
)
LISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = DESKTOP-SDG5GMA)(PORT = 1521))
(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
)
)
ADR_BASE_LISTENER = c:\app\orange
修改之后,重启Oracle服务,这一操作实现方式多样,可以直接在service.msc里重启,也可以在cmd使用命令lsnrctl stop ,lsnrctl start。
3.3 找到tnsnames.ora文件(和3.2的文件在同一目录下)
打开并进行修改:
# tnsnames.ora Network Configuration File: C:\app\orange\product\instantclient_11_2\network\admin\tnsnames.ora
# Generated by Oracle configuration tools.
LISTENER_ORCL =
(ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))
ORACLR_CONNECTION_DATA =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
)
(CONNECT_DATA =
(SID = CLRExtProc)
(PRESENTATION = RO)
)
)
ORCL =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = orcl)
)
)
MYSQLODBC =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))
)
(CONNECT_DATA =
(SERVICE_NAME = mysqlodbc)
)
(HS = OK)
)
4 创建dblink
在sqlplus环境下执行如下语句,创建数据库连接:
create database link mysqlodbc connect to "root" identified by "123456" using 'mysqlodbc';--注意使用单引号
如果顺利,会出现创建成功提示,为了进一步确认连接是否可用,可以执行如下语句:
Select * from dual@mysqlodbc;
出现如上界面,即代表连接可用,大功告成。
当然,你也可以直接查询你建立透明网关的MySQL数据库的表,来验证是否是否成功,比如:
Select * from provinces@mysqlodbc;--provinces是我MySQL数据库中的表名
注意:
不知道是不是MySQL独有的特性还是怎么回事,在单独查询某个字段时,必须在此字段上加上双引号,像下面这样。否则,就会报错:ORA-00904: "PROVINCE": 标识符无效。
Select "province" from provinces@mysqlodbc;
既然说到这,就顺便说一下如何跨数据库创建视图吧,在宿主Oracle数据库和MySQL之间创建一个视图,如下:
CREATE OR REPLACE FORCE VIEW "C##WISH"."VI_TEST" ("CZXM", "province") AS
select u.czxm,p."province" from tuser u,provinces@mysqlodbc p where u.czdh='99300' and p."id"=13;
查询结果如下:
如果你看懂上面视图的创建,那么存储过程也就没什么问题了。
水平有限,如果有什么地方说的不对,欢迎指正!
好了,行文至此,打完收工。