unixODBC的安装与使用
前言
已经好多年没写日志了,最近在一个项目中有需要数据库直接另一数据库的需求,折腾了两天,通过unixODBC解决了,写一下总结,与大家分享一下。
需求
- 项目运行于linux服务器(当前环境为Centos)
- 项目使用的是mariadb数据库;
- 另一数据库为异种数据库,可能是mysql,oracle,Sqlserver等等;
- 曾经因另一异种数据库数据量较小,使用定期同步功能,将数据同步到项目数据库,但现在的环境中目标数据库数据量较大,定期同步都无法在确定时间内完成,所以考虑数据库端能够直接异种数据库以达到不用修改代码即可以实现数据查询的目的。
解决方案
经多方尝试,最后选择unixODBC来实现以上目标。
unixODBC的安装
这一步相对比较简单,如果你的CentOS源比较合适的话,yum可以直接安装,实在水行,也可以到unixODBC官网下载,unixODBC本身是免费的。
1 | yum install -y unixODBC |
各种数据库驱动的安装与配置
虽然unixODBC本身是免费的,但各种驱动程序官网虽然提供,但基本是付费的;但各种数据库官网同样提驱动,可以去各数据库官网下载,都是免费的,只是可能需要在各网站有相应账号,注册即可。这里提供本人下载的文件名以供参考。
如果通过yum安装的 unixODBC,会提供odbcinst命令,且默认就安装了两种(PostgreSQL和MySQL)驱动。
通过以下命令查看unixODBC的配置
1 | [root@localhost ~]# odbcinst -j |
默认驱动配置
1 | [root@localhost ~]# cat /etc/odbcinst.ini |
安装其他驱动并配置
我从oracle官网下载了以下文件,请注意文件版本一定要配套,sqlplus并不是必须的,只是为了验证odbc配置和查询结果用。1
2
3
4oracle-instantclient-basic-21.1.0.0.0-1.x86_64.rpm
oracle-instantclient-devel-21.1.0.0.0-1.x86_64.rpm
oracle-instantclient-odbc-21.1.0.0.0-1.x86_64.rpm
oracle-instantclient-sqlplus-21.1.0.0.0-1.x86_64.rpm
依次安装好后,驱动程序一般会出现在 /usr/lib/oracle/21/client64/lib目录下,既然安装了sqlplus可以试试能否正常连接oracle1
2
3
4
5
6
7
8
9
10
11
12sqlplus 账号/密码@IP:端口/实例名
SQL*Plus: Release 12.2.0.1.0 Production on 星期四 10月 10 11:14:52 2024
Copyright (c) 1982, 2016, Oracle. All rights reserved.
上次成功登录时间: 星期四 10月 10 2024 03:30:58 +08:00
连接到:
Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
打开/etc/odbcinst.ini增加以下内容1
2
3
4[Oracle]
Description = ODBC for Oracle
Driver = /usr/lib/oracle/21/client64/lib/libsqora.so.21.1
FileUsage = 1
odbc配置
打开/etc/odbc.ini 文件进行配置
1 | [root@localhost ~]# cat /etc/odbc.ini |
这样就配置好了一个新的数据源名称,叫ora,后面 会在mariadb中使用到这个名称。
odbc的验证
安装好unixODBC后同时会安装isql命令,可以检查配置是否成功1
2
3
4
5
6
7
8
9
10
11isql ora
+---------------------------------------+
| Connected! |
| |
| sql-statement |
| help [tablename] |
| echo [string] |
| quit |
| |
+---------------------------------------+
如果成功进入,表明配置是成功的,如果不能进入请仔细检查配置。
在mariadb中的使用
mariadb中需要有 connect引擎
首先,mariadb中需要有 connect引擎,如果没有请先安装1
yum install MariaDB-connect-engine -y
之后使用 sql命令查看
1 | [root@localhost ~]# mysql |
从上表中,如果显示 CONNECT | YES ,说明 connect引擎安装成功,否则请检查和设置。
mariadb中创建别名表
成功后,继续在sql命令状态执行1
2
3
4
5
6
7DROP TABLE IF EXISTS 别名表;
create OR REPLACE table 别名表
CHARSET='utf8mb4'
ENGINE='CONNECT'
table_type='ODBC'
tabname='oracle中的真实表或者视图'
CONNECTION='DSN=ora;';
这样就在mariadb中创建了一张别名表对应到oracle中的真实表,后续我们就可以直接在mariadb中查询另一个数据库中的数据了。
注意事项
- 文件 /etc/odbc.ini中的 Driver = Oracle,这里的Oracle是/etc/odbcinst.ini中方括号内的名称
- 如果在 sqlplus中查询显示中文正常,而在 isql中查询显示的是乱码,需要增加 DMEnvAttr 这个配置,特别重要,少有文档提到这个怎么配置
- mariadb中创建别名时 CONNECTION=’DSN=ora;’; 这里的ora是 /etc/odbc.ini里 DSN 填写的值,在 odbc.ini文件中 方括号内的内容最后与DSN后面的值一致。