运维管理11 分钟阅读
Oracle 直连 TiDB 可行吗?
大家好,这里是公众号 DBA学习之路,分享一些学习数据库路上的知识和经验。 @TOC目录 今天业务抛了个问题过来:Oracle 能不能直接查 TiDB? 第一反应是“这俩不是一套体系”,但转念一想,TiDB 在协议层面兼
2026年1月21日
oraclerac
DBA 实战课程
系统学习 Oracle DBA
- 2738+ 篇实战文章
- 1500+ 步骤截图
- 10 大核心模块
开通会员 ¥128/月起
查看完整课程在知识库中专注阅读,并随时返回相关工具与课程
大家好,这里是公众号 DBA学习之路,分享一些学习数据库路上的知识和经验。

本章目标:掌握本章核心知识点 前置要求:完成前序章节学习 预计时长:60 分钟
今天业务抛了个问题过来:Oracle 能不能直接查 TiDB?
第一反应是“这俩不是一套体系”,但转念一想,TiDB 在协议层面兼容 MySQL,而 Oracle 早就可以通过 透明网关 + ODBC + DBLink 访问 MySQL,那 TiDB 理论上也走得通。
实际动手验证了一下,结论很明确:确实可以。不需要做数据同步,不用引入中间服务,也不必改应用代码,只要在 Oracle 里建一个 DBLink,就能直接查询 TiDB 表。
本文记录的就是这次完整的落地过程。
环境本身并不复杂,两端都是 CentOS 7.9,数据库版本也都算主流:
Oracle 19c 其实已经把 ODBC 透明网关准备好了,不需要再额外装什么组件。先简单确认一下:
1[oracle@orcl:/home/oracle]$ cd $ORACLE_HOME/hs2[oracle@orcl:/u01/app/oracle/product/19.3.0/db/hs]$ dg4odbc34Oracle Corporation --- 2026-01-20 16:11:29.88722800056Heterogeneous Agent Release 19.0.0.0.0 - Production Built with7 Oracle Database Gateway for ODBC看到 Oracle Database Gateway for ODBC,说明没有问题。
透明网关本身在 Oracle 里,但真正和外部数据库打交道,还是要靠系统层面的 ODBC。
CentOS 7 上直接用本地 YUM 源安装即可:
1[root@orcl:/root]# yum install -y unixODBC*装完之后,确认一下环境是否正常:
1[root@orcl:/root]# odbcinst -j2unixODBC 2.3.13DRIVERS............: /etc/odbcinst.ini4SYSTEM DATA SOURCES: /etc/odbc.ini5FILE DATA SOURCES..: /etc/ODBCDataSources6USER DATA SOURCES..: /root/.odbc.ini这一步很关键,如果 ODBC 本身不干净,后面 Oracle 报错会非常“玄学”。
TiDB 在客户端看来就是 MySQL,这里直接使用 MySQL Connector/ODBC。
驱动从官方归档页下载即可:https://downloads.mysql.com/archives/c-odbc/

安装过程很简单:
1[root@orcl:/root]# rpm -ivh mysql-connector-odbc-8.0.27-1.el7.x86_64.rpm这里我直接在 /etc/odbc.ini 里定义 DSN,简单直观:
1[root@orcl:/root]# cat> /etc/odbc.ini <<'EOF'2[ODBC Data Sources]3myodbc8w = MyODBC 8.0 UNICODE Driver DSN4myodbc8a = MyODBC 8.0 ANSI Driver DSN56[myodbc8w]7Description = Connector/ODBC 8.0 UNICODE Driver DSN8Driver = /usr/lib64/libmyodbc8w.so9SERVER = 192.168.31.22210USER = root11PASSWORD = testtest12PORT = 400013DATABASE = cid_dsds_wex14OPTION = 0 15TRACE = OFF16EOFDSN 名称 myodbc8w,后面会反复用到,一定要前后一致。
在引入 Oracle 之前,先用 isql 把 ODBC 本身测通。
1[oracle@orcl:/home/oracle]$ isql myodbc8w -v2+---------------------------------------+3| Connected! |4| |5| sql-statement |6| help [tablename] |7| quit |8| |9+---------------------------------------+10SQL> show tables;能正常 Connected!,说明 Linux → TiDB 这段链路已经没有问题,后续的问题只会发生在 Oracle 透明网关层。
接下来开始配置 Oracle。
先在 tnsnames.ora 里定义一个服务名,注意这里的 HOST 是 Oracle 自己的 IP,不是 TiDB 的:
1[oracle@orcl:/home/oracle]$ cat >> $ORACLE_HOME/network/admin/tnsnames.ora <<'EOF'2myodbc8w =3 (DESCRIPTION=4 (ADDRESS=5 (PROTOCOL=TCP) (HOST= 192.168.31.221) (PORT=1521)6 )7 (CONNECT_DATA=8 (SID=myodbc8w)9 )10 (HS=OK)11)12EOF透明网关的核心配置文件在,文件名必须是 init<SID>.ora,这里 SID 就是 myodbc8w:
1[oracle@orcl:/home/oracle]$ cat> $ORACLE_HOME/hs/admin/initmyodbc8w.ora <<'EOF'2HS_FDS_CONNECT_INFO=myodbc8w3HS_FDS_SHAREABLE_NAME=/usr/lib64/libodbc.so4HS_FDS_SUPPORT_STATISTICS=FALSE5HS_LANGUAGE = AMERICAN_AMERICA.AL32UTF86HS_NLS_NCHAR = UCS27HS_FDS_TRACE_LEVEL = debug8EOF如果后续有字符集、SQL 转换相关问题,这个文件通常是第一排查点。
透明网关是通过监听拉起的,需要在 listener.ora 中显式注册一个 SID:
1[oracle@orcl:/home/oracle]$ cat>> $ORACLE_HOME/network/admin/listener.ora <<'EOF'2SID_LIST_LISTENER= 3 (SID_LIST= 4 (SID_DESC= 5 (SID_NAME=myodbc8w)6 (ORACLE_HOME=/u01/app/oracle/product/19.3.0/db)7 (PROGRAM=dg4odbc)8 (ENVS=LD_LIBRARY_PATH=/usr/lib64)9 ) 10 )11EOF修改完成后,重载监听:
1[oracle@orcl:/home/oracle]$ lsnrctl reload检查 TNS:
1[oracle@orcl:/home/oracle]$ tnsping myodbc8w只要不报错,说明监听侧已经能正确拉起 dg4odbc。
创建 DBLink:
1SYS@orcl SQL> create public database link testtidb2 connect to "root"3 identified by "testtest"4 using 'myodbc8w';测试查询:
1SYS@orcl SQL> select count(*) from test@testtidb ;23 COUNT(*)4----------5 44527956结果正常返回,说明链路已经完全打通。
从 Oracle 到 TiDB,看起来是两套体系,其实中间那条桥一直都在。ODBC + 透明网关 + DBLink,这套“老技术”,在今天依然非常稳。
只要分清楚每一层的职责,先通 ODBC,再通 Oracle,整个过程反而比想象中要顺得多。
