跳转至

TiDB 连接器

TiDB 讲 MySQL 线协议,所以 Dosi 用和 MySQL 完全相同的适配器连它——文本协议、池化连接、共享的 ResultSet 归一——并按 TiDB 的 MySQL 兼容方言编译 SQL。

配置里唯一容易写错的是端口:TiDB 监听 4000,不是 3306。由 exec-mysql feature 控制。

连接配置

datasources:
  tidb:
    type: tidb
    host: ${TIDB_HOST}
    port: 4000
    username: dosi
    password: ${TIDB_PASSWORD}
    database: analytics

mysql:// DSN 同样可用:

    uri: mysql://dosi:${TIDB_PASSWORD}@tidb.internal:4000/analytics

参数

类型 必填 默认 说明
type string tidb
host string 是* *除非给了 uri:
port int 3306(驱动默认) TiDB 监听 4000——显式写上。
username string
password string 尽量用 ${VAR}
database string
uri string mysql:// DSN。它会取代离散键:写了之后 hostportusernamepassworddatabase 都不再生效。
default bool false 连接配置

本连接器解析但不使用的键: sslmodesslrootcertschemacatalogarrow_flight_portaccountrolewarehousecompat_mode

已知限制

  • 没有 FULL OUTER JOIN 多粒度合并改用可移植的 UNION 键 CTE + LEFT JOIN 形态,模型不用改。
  • 没有三参数 DATEDIFF,也没有 CORR / COVAR_*——两者都继承自 MySQL 兼容性,都在编译期被拒,而不是用近似值代替。
  • 这个适配器没有 TLSsslmode/sslrootcert 不生效。所以强制 TLS 的 TiDB Cloud Endpoint 目前还连不上。

本地验证连接

$ dosi query --model model.yaml \
    --metrics revenue --group-by orders.status --execute --connection tidb

排错

报错 原因与处理
cannot reach server: <io error> 多半是端口:TiDB 是 4000,而 3306 上可能是另一个完全不同的服务。
connection "x": bad url: <e> uri: 不是合法的 mysql:// DSN。
带着 TiDB 原文的 auth 错误 凭据不对,或者在 database: 上没权限。
server rejected SQL (<code>): <message> TiDB 拒了编译出的语句。
this build has no tidb executor (feature "exec-mysql" not enabled) TiDB 走 MySQL 适配器:--features exec-mysql

参考链接