跳转至

GaussDB / openGauss 连接器

华为 GaussDBopenGauss 源自 PostgreSQL,所以编译出的 SQL 按 PostgreSQL 生成,解码策略也原样沿用 PostgreSQL 连接器的。

真正不同的是线协议。GaussDB 用一套私有的 SHA256 握手替换了 PostgreSQL 的 SASL 认证,而它的认证码编号与 PostgreSQL 的相撞——标准驱动(libpq、tokio-postgres)在校验口令之前就失败了。所以这个连接器用的是能原生讲这套握手的专用驱动,这意味着 pg_hba 方法为 sha256 的服务器(也就是生产默认配置)不需要任何服务端改动就能连上。

exec-gaussdb 控制。

连接配置

datasources:
  gaussdb:
    type: gaussdb
    host: gauss.internal
    port: 8000                       # GaussDB(DWS) 默认端口;openGauss 是 5432
    username: dosi
    password: ${GAUSSDB_PASSWORD}
    database: analytics
    schema: main                     # 可选
    compat_mode: PG                  # 可选:PG | A | B —— 连接时会校验
    sslmode: require                 # 云上实例通常开着 ssl=on
    # sslrootcert: /etc/ssl/gauss-ca.pem   # 只有 verify-ca / verify-full 才需要

参数

类型 必填 默认 说明
type string gaussdb——openGauss 也用这个值。
host string 是* *除非给了 uri:
port int 驱动默认 GaussDB(DWS) 常见是 8000,openGauss 是 5432。
username string
password string 尽量用 ${VAR}。口令存储格式的要求见认证
database string
schema string 固定 search_path
uri string postgres:// DSN。它会取代那些离散连接键;显式的 sslmode: 仍然覆盖 DSN 里的。
compat_mode string PGAB。写了它,执行器会在首次连接时探测数据库,不一致就拒绝执行。
sslmode string prefer PostgreSQL 同一套阶梯。
sslrootcert path 校验类模式必填。
default bool false 连接配置

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

认证

能不能连上,取决于服务端 pg_hba 的方法,以及这个账号的口令是怎么存的(设置口令时的 password_encryption_type):

口令存储 hba 方法 md5 sha256
MD5(type=0 可用 可用(服务端回落到 MD5)
SHA256(type=2,默认) 被拒,并给出提示¹ 可用,原生 SHA256
MD5 + SHA256(type=1 可用 可用,原生 SHA256

¹ 这种组合下服务端不会在握手里传 PBKDF2 迭代次数,任何客户端都推导不出密钥。错误信息里直接写了处理办法:把口令在 password_encryption_type = 1(双存储)下重设一次,或者把 hba 方法改成 sha256。SM3 存储的口令(type=3)同样会被明确拒绝。

TLS

PostgreSQL 相同的 sslmode/sslrootcert 阶梯。华为云上的托管实例一般开着 ssl=on 且用自签证书,那里用 sslmode: require 是对的。

兼容模式

GaussDB 的数据库在创建时会指定 PGA(Oracle 风格,也是 GaussDB 的默认)或 B(MySQL 风格)兼容模式;更新的内核还有 M(完全 MySQL)。

PGAB 都支持。用 compat_mode: 声明你预期的那个,执行器会在首次连接时校验,不一致就直接报错——错误的假设会悄悄改变查询语义,那比一次明确的拒绝糟糕得多。

M 兼容的数据库在连接时就会被拒:M 不是语义变体,而是另一种 SQL 方言,那里连 CAST(x AS varchar) 都是语法错误,PostgreSQL 方言的 SQL 根本跑不了。

有两处模式差异活在已存的数据里而不是查询里,所以只做声明、不做改写:

  • A 模式下空字符串就是 NULL——写入 '' 存下来是 NULL,col = '' 永远匹配不到。要写可移植的判空,用 col = '' OR col IS NULL
  • B 模式下字符串比较忽略尾部空格(MySQL 的 PAD SPACE),并且 ORDER BY 升序时 NULL 排在最前。

已知限制

  • 没有三参数 DATEDIFF,这一点继承自 PostgreSQL:同样是 SQLSTATE 42883 的拒绝,所以用了它的指标在这个方言下会在编译期被拒。
  • 所有兼容模式下整数除法都得到实数——这是内核行为而不是模式行为,与标准 PostgreSQL 相反。

本地验证连接

$ dosi query --model model.yaml --metrics revenue --execute --connection gaussdb

compat_mode: 写错会在这一步暴露,而不是等到后面数字算错才发现。

排错

报错 原因与处理
auth 类错误,提示里提到 password_encryption_type 上表里那种 hba 方法 × 口令存储的组合根本无法工作。把口令在 password_encryption_type = 1 下重设,或把 hba 方法改成 sha256
connection "x": the database reports DBCOMPATIBILITY 'A' but the profile declares compat_mode: PG compat_mode:,或者把连接指向按声明模式创建的数据库。
connection "x": DBCOMPATIBILITY 'M' databases speak MySQL-dialect SQL, which this executor's PostgreSQL-dialect pipeline cannot target 换用 PGAB 模式的数据库。
connection "x": bad url: <e> uri: 不是合法的 postgres:// DSN。
this build has no gaussdb executor (feature "exec-gaussdb" not enabled) 官方二进制自带;自己编译的要加 --features exec-gaussdb

参考链接