对于oralce db_link mysql数据库,从开始到写博客,花了2天时间,配置了2遍。第一遍网上找资料跟着配置,安装了Gateway for ODBC。第二遍把虚拟机系统重新做了,没有安装Gateway for ODBC,两次均成功。好了废话少说,进入正题。

一、系统环境

oracle客户端:win10系统,oralce client64位

oralce服务端:win10系统(虚拟机),oracle database64位

二、配置ODBC

检查oracle服务端是否有ODBC数据源驱动,因为我是64位系统

mysql dblink会有什么问题 mysql dblink oracle_oracle

打开ODBC数据源

mysql dblink会有什么问题 mysql dblink oracle_bc_02

选择系统DSN,注意一定要选择系统DSN。

mysql dblink会有什么问题 mysql dblink oracle_oracle_03


若安装ODBC报此错误

mysql dblink会有什么问题 mysql dblink oracle_mysql_04

则需要安装Microsoft Visual C++。

下载地址: https://download.microsoft.com/download/3/2/2/3224B87F-CFA0-4E70-BDA3-3DE650EFEBA5/vcredist_x64.exe(64位的)

下载安装Microsoft Visual C++之后,再次安装mysql odbc,安装完成之后进行mysql odbc的配置

mysql dblink会有什么问题 mysql dblink oracle_mysql_05

 

 三、配置透明网关

在oralce服务端,找到安装目录,例如我的是E:\app\Administrator\product\11.2.0\dbhome_1

在此目录下找到hs\admin\initdg4odbc.ora复制一份,命名规则是:init+sid.ora,所以就是initmysqlodbc.ora

打开initmysqlodbc.ora文件,将默认的

HS_FDS_CONNECT_INFO = <odbc data_source_name>
HS_FDS_TRACE_LEVEL = <trace_level>改为:
HS_FDS_CONNECT_INFO = mysqlodbc
HS_FDS_TRACE_LEVEL = off

然后返回到dbhome_1文件夹下,找到NETWORK\ADMIN\listener.ora

添加

(SID_DESC = 
      (SID_NAME = MYSQLODBC)
      (ORACLE_HOME = E:\app\Administrator\product\11.2.0\dbhome_1)
      (PROGRAM = dg4odbc) #注意dg4odbc不要改动
     )

再打开tnsnames.ora

添加

MYSQLODBC =
  (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))
    )
    (CONNECT_DATA =
      (SERVICE_NAME = mysqlodbc)
    )
    (HS = OK)
  )

然后重启监服务,可以在service.msc里重启,也可以使用命令

停止:lsnrctl stop ,

启动:lsnrctl start;

四、创建db_link并查询

create database link mysqlodbc connect to "root" identified by "密码" using 'mysqlodbc';--注意用户名密码双引号,using后面单引号。

五、进行查询

select * from "test"@mysqlodbc--注意oralce会自动将sql转换为大写,而mysql大小写是两张不同的表,所以在此要使用单引号以便在mysql中可以识别。

六、部分错误解决方案

1.ORA-28546: 连接初始化失败, 可能是 Net8 管理错误

解决方案1:检查initmysqlodbc.ora文件

查看HS_FDS_CONNECT_INFO = mysqlodbc中的mysqlodbc是否与自己在ODBC数据源中所起的名称是否一致。

 解决方案2:检查自己是否没有重启监听服务

2.ORA-00942: 表或视图不存在: 

mysql dblink会有什么问题 mysql dblink oracle_bc_06

 

解决方案:查询sql语句,mysql的表一定要带双引号,否则Mysql无法识别。

 

 

后记:第一次配置的时候走了不少弯路,所以写下此篇文章以便有需要的人少走一点弯路。