GaussDB / openGauss 连接器¶
华为 GaussDB 和 openGauss 源自 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 | 否 | — | PG、A 或 B。写了它,执行器会在首次连接时探测数据库,不一致就拒绝执行。 |
sslmode |
string | 否 | prefer |
与 PostgreSQL 同一套阶梯。 |
sslrootcert |
path | 否 | — | 校验类模式必填。 |
default |
bool | 否 | false |
见连接配置。 |
本连接器解析但不使用的键: arrow_flight_port、account、role、warehouse、catalog。
认证¶
能不能连上,取决于服务端 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 的数据库在创建时会指定 PG、A(Oracle 风格,也是 GaussDB 的默认)或 B(MySQL 风格)兼容模式;更新的内核还有 M(完全 MySQL)。
PG、A、B 都支持。用 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 相反。
本地验证连接¶
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 |
换用 PG、A 或 B 模式的数据库。 |
connection "x": bad url: <e> |
uri: 不是合法的 postgres:// DSN。 |
this build has no gaussdb executor (feature "exec-gaussdb" not enabled) |
官方二进制自带;自己编译的要加 --features exec-gaussdb。 |
参考链接¶
- 官网:华为 GaussDB · openGauss
- 连接配置:openGauss——连接数据库,以及 openGauss 文档
- 同一套线协议:PostgreSQL · Hologres
- 连接配置