金仓数据库 KSQL 连接实战:从基础连接到密码管理与故障排查

10 阅读9分钟

金仓数据库 KSQL 连接实战:从基础连接到密码管理与故障排查

前言

ksql 是与 KingbaseES 数据库交互的核心命令行工具。无论是日常管理、脚本自动化,还是在无法使用图形界面的远程服务器上工作,熟练掌握 ksql 都是必备技能。

本文结合官方文档(V9R1)与实践经验,深入解析 ksql 的多种连接方式,详细对比两种密码文件(.kbpass.encpwd)的使用场景,并重点剖析密码获取优先级机制及环境变量配置不当引发的认证陷阱,旨在为各位同仁提供一份详尽的实践参考。

💡 前置知识:本文主要关注客户端连接技术。关于连接建立后,数据库如何通过 sys_hba.confsys_ident.conf 进行访问控制与身份验证,已在笔者之前的文章《KingbaseES 实战:深度解析用户、会话与连接控制》中详细讲解,本文仅作关键提示。

第一部分:KSQL 基础连接方式详解

ksql 支持多种灵活的方式连接到数据库。最核心的是指定目标位置(主机、端口)身份(用户)目标库

1.1 命令行参数直连(最常用)

这是最直观、最通用的连接方式,适合临时管理和日常操作。

命令格式:

ksql -h <主机IP> -p <端口号> -d <数据库名> -U <用户名>

核心参数解析:

参数全称含义默认值备注
-h--host数据库服务器的主机名或 IP 地址。localhost不指定 -h 时,默认使用 Local Socket(本地套接字)方式连接。
-p--port数据库服务器的监听端口。54321如果端口是默认值,或已设置环境变量 KINGBASE_PORT,可省略。
-U--username连接数据库时使用的用户名。使用当前操作系统用户名如果用户名是默认值,或已设置环境变量 KINGBASE_USER,可省略。
-d--dbname指定要连接的数据库名称。kingbase如果命令行第一个非选项参数是数据库名,也可省略 -d
-W--password强制提示输入密码。(自动判断)服务器要求密码时会自动提示。使用 -W 可强制提示,避免一次失败的连接尝试。
-w--no-password永不提示输入密码。(自动判断)适用于脚本。如果服务器要求密码但未通过其他方式提供,连接将失败。

示例:

# 连接到 IP 为 192.168.126.16,端口 54321 的 test 数据库,用户为 system
[kingbase@node02 ~]$ ksql -h 192.168.126.16 -p 54321 -U system -d test
用户 system 的口令:
授权类型: 企业版.
输入 "help" 来获取帮助信息.
1.2 四种基础连接方式深度剖析

方式一:Local Socket 方式(本地套接字)

  • 原理:当客户端与服务器在同一台物理机上时,可以不通过网络,直接通过操作系统提供的 Unix Domain Socket 进行通信。这种方式速度最快,仅限于本机访问。
  • 方法:连接命令中不指定 -h 参数
  • 验证
    # 在数据库服务器本机执行
    [kingbase@node02 ~]$ ksql -d test -U system
    用户 system 的口令:
    授权类型: 企业版.
    输入 "help" 来获取帮助信息.
    
    test=# SELECT inet_client_addr(), inet_client_port();
     inet_client_addr | inet_client_port
    ------------------+------------------
                      |                  # 显示为空,表示连接来自本地套接字
    (1 行记录)
    

方式二:TCP/IP 方式(网络连接)

  • 原理:通过标准的 TCP/IP 网络协议进行连接。这是最常见的远程连接方式。
  • 方法:连接命令中必须指定 -h 参数(主机名或IP)。
  • 验证
    [kingbase@node02 ~]$ ksql -h 192.168.126.16 -p 54321 -U system -d test
    用户 system 的口令:
    授权类型: 企业版.
    输入 "help" 来获取帮助信息.
    
    test=# SELECT inet_client_addr(), inet_client_port();
     inet_client_addr | inet_client_port
    ------------------+------------------
     192.168.126.16   |            28459 -- 显示客户端的真实IP和端口
    (1 行记录)
    

方式三:连接串(Connection String)方式

  • 原理:将所有连接参数组合成一个字符串,作为 ksql 的参数。格式灵活,类似于 JDBC URL。
  • 方法:将连接串直接作为 ksql 的参数。
  • 验证
    [kingbase@node02 ~]$ ksql "host=192.168.126.16 port=54321 user=system dbname=test password=kingbase"
    授权类型: 企业版.
    输入 "help" 来获取帮助信息.
    
    test=# SELECT inet_client_addr(), inet_client_port();
     inet_client_addr | inet_client_port
    ------------------+------------------
     192.168.126.16   |            28461 -- 显示客户端的真实IP和端口
    (1 行记录)
    

特殊字符处理(重要):如果密码中包含特殊字符(如 :, @, =, &, $ 等),直接拼接可能导致解析错误。建议将整个连接字符串用双引号 " 括起来,以防止 Shell 提前解析特殊字符或 ksql 解析器误判分隔符。

方式四:服务名(Service Name)方式

  • 原理:将一组连接参数定义在一个服务配置文件中,并赋予一个别名(服务名)。连接时只需引用服务名,便于管理多套环境配置。
  • 步骤
    1. 创建配置文件 ~/.sys_service.conf
      [kingbase@node02 ~]$ cat ~/.sys_service.conf
      [test]
      host=192.168.126.16
      port=54321
      dbname=test
      # username=system      # 用户名也可以在连接时指定
      
    2. 使用服务名连接
      [kingbase@node02 ~]$ ksql system@test
      用户 system 的口令:
      授权类型: 企业版.
      输入 "help" 来获取帮助信息.
      
      test=#                     # 连接成功
      
      (注:密码仍需交互输入,或通过后续介绍的 .kbpass 文件处理)
1.3 连接方式对比与选择建议
连接方式适用场景优点缺点
Local Socket客户端与数据库在同一台服务器。速度最快,无需网络配置,仅限于本机访问。无法远程连接。
TCP/IP绝大多数远程管理、开发、脚本调用。通用性强,可跨网络,配置简单。需开放网络端口,有网络延迟。
连接串在脚本或程序中动态构造连接参数。参数集中,便于作为变量传递,格式灵活。命令行中字符串较长,易出错。
服务名管理多套环境(开发、测试、生产)。配置与使用分离,便于维护和切换环境。需要额外的配置文件。

注意事项:无论使用何种连接方式,连接请求最终能否被接受,都取决于服务器端 sys_hba.conf 文件的配置。该文件根据客户端IP、数据库名、用户名来决定是否允许连接以及使用何种认证方法。若客户端的IP未在 sys_hba.conf 中显式授权,即使连接参数完全正确,也会被拒绝连接。

第二部分:密码管理进阶:.kbpass 与 .encpwd

在特殊环境中,为了实现自动化脚本或避免频繁交互式输入密码,我们需要安全地存储凭据。KingbaseES 提供了两种不同机制的文件,切勿混淆

2.1 客户端密码文件 .kbpass(推荐用于日常免密登录)

.kbpass 文件允许 ksqlsys_dump 等客户端工具自动读取密码。密码以明文存储,依赖操作系统文件权限进行保护。

  • 文件位置

    • Linux/Unix: ~/.kbpass
    • Windows: %APPDATA%\kingbase\kbpass.conf
  • 文件格式

    主机名:端口:数据库名:用户名:密码
    

    支持通配符 *。前四个字段都可以使用 * 进行匹配。

  • 配置步骤

    1. 创建并编辑文件
      vi ~/.kbpass
      # 添加连接记录,例如:
      localhost:54321:test:system:kingbase 
      192.168.126.16:54321:*:system:kingbase
      
    2. 设置严格的文件权限(至关重要!)
      chmod 600 ~/.kbpass
      # 验证权限
      ls -l ~/.kbpass
      # 输出应为:-rw------- 1 kingbase kingbase ... .kbpass
      
      如果权限设置过宽(如 644),客户端工具出于安全考虑将忽略此文件。
  • 效果验证:配置完成后,再次连接将不再提示输入密码,直接登录成功。

     [kingbase@node02 ~]$ ksql test system
     授权类型: 企业版.
     输入 "help" 来获取帮助信息.
     test=# \q
     [kingbase@node02 ~]$ ksql test system -h 192.168.126.16
     授权类型: 企业版.
     输入 "help" 来获取帮助信息.
     test=# 
     ```
    

注意事项:密码字段中不能包含换行符

2.2 加密密码文件 .encpwd(用于服务器进程,客户端也可读取)

.encpwd 文件存储的是经过加密的密码,主要设计用途是为数据库服务器端进程(如主备复制、WAL发送进程)或集群管理组件提供自动认证。需要注意的是,ksql 等客户端工具在实际实现中也会读取此文件,且其优先级高于 .kbpass 文件。因此,在同时使用两种文件时,务必确保密码一致。

  • 文件位置:通常为数据库运行用户(如 kingbase)家目录下的 ~/.encpwd

  • 生成方式:必须使用自带的 sys_encpwd 工具生成,不支持手动编辑。

    工具说明

    [kingbase@node02 ~]$ sys_encpwd --help
    sys_encpwd 是 KingbaseES 用户密码配置工具。
    
    使用方法:
    sys_encpwd [OPTION]... [PASSWORD]
    
    通用选项:
    [-H, --hostname=]                   主机名
    [-P, --portnum=]                    端口号
    [-D, --database=]                   数据库名称
    [-U, --user=]                       用户名
    [-W, --password=]                   口令
    [-V, --version]                    显示版本信息,然后退出
    [-?, --help]                        显示帮助信息,然后退出
    
  • 常用示例

    # 为 system 用户创建加密记录(密码为 kingbase123)
    [kingbase@node02 ~]$ sys_encpwd -H \* -P 54321 -D \* -U system -W kingbase123
    [kingbase@node02 ~]$ cat .encpwd
    *:54321:*:system:a2luZ2Jhc2UxMjM=
    
  • 主要应用场景

    • 数据库集群部署:为 esrep 等集群专用用户提供自动认证,实现主备节点间无密码同步。
    • 物理备份工具sys_rmansys_backup.sh 等工具在执行备份任务时自动读取密码。
    • 高安全要求的自动化脚本:当脚本需要以较高权限运行且不希望密码明文暴露时。
  • ⚠️ 重要提醒:如果通过 SQL 修改了用户密码,必须立即使用 sys_encpwd 更新 .encpwd 文件,否则依赖此文件的服务(如主备复制、审计日志)将会因密码不匹配而失败。

2.3 核心区别与选择建议
特性.kbpass.encpwd
密码形式明文(依赖操作系统权限保护)加密
主要用途客户端工具(ksqlsys_dump)的免密登录服务器端进程、集群组件、备份工具的自动认证(客户端也可读取)
生成工具手动编辑文本sys_encpwd 工具
安全性中(取决于文件权限是否为600)高(加密,需通过 sys_encpwd 工具管理)
优先级说明优先级较低优先级较高(当两个文件同时存在时,客户端会优先使用 .encpwd 中的密码)
常用场景你自己ksql 连数据库时用数据库集群内部进程之间通信时用

第三部分:密码获取优先级机制与故障排查

理解 KingbaseES 客户端获取密码的完整决策流程,是排查认证问题的关键。根据实测,正确的优先级机制如下:

3.1 正确的密码获取优先级(从高到低)
  1. 连接字符串中的 password 参数: 在连接串中直接指定密码(如 ksql "host=... password=xxx")优先级最高。这是最直接的指定方式。

  2. KINGBASE_PASSWORD 环境变量: 如果未在连接串中指定密码,客户端会检查是否设置了此环境变量。

    ⚠️ 安全提醒:不推荐使用这个环境变量。因为某些操作系统允许其他用户查看进程的环境变量,存在密码泄露风险。

  3. 密码文件: 如果上述方式都未提供密码,客户端会按顺序查找密码文件:

    • 首先:查找 ~/.encpwd 加密密码文件。
    • 其次:如果 .encpwd 不存在或未匹配,则查找 ~/.kbpass 明文密码文件。

    此外,可以通过 passfile 连接参数或 KINGBASE_PASSFILE 环境变量指定一个明文格式的自定义密码文件路径,该文件将替代默认的 .kbpass 被查找。

    自定义密码文件路径示例

    • 方法一:使用 passfile 连接参数

      # 在连接字符串中指定
      ksql "host=192.168.126.16 user=system dbname=test passfile=/home/kingbase/my_pass.conf"
      
    • 方法二:设置 KINGBASE_PASSFILE 环境变量

      # 临时设置
      export KINGBASE_PASSFILE=/home/kingbase/my_pass.conf
      ksql -h 192.168.126.16 -U system -d test
      
      # 永久设置(写入 ~/.bash_profile)
      echo 'export KINGBASE_PASSFILE=/home/kingbase/my_pass.conf' >> ~/.bash_profile
      

    ⚠️ 重要提示:自定义密码文件的内容必须符合 .kbpass 文件格式(主机名:端口:数据库名:用户名:密码),并且必须设置严格的权限(chmod 600),否则客户端将忽略该文件。

  4. 密码回调函数(编程接口特有): 对于特定的编程接口(如 ADO.NET 的 Kdbndp),可以配置 ProvidePasswordCallback 委托,在代码中动态生成密码。其优先级通常高于环境变量和密码文件,但低于直接指定的连接参数。

  5. 交互式提示输入: 如果以上所有自动获取密码的途径都失败,并且服务器要求密码认证,客户端才会提示用户输入密码。

    注意:如果使用了 -w (--no-password) 选项,客户端将永不提示输入密码,此时若无法从上述途径获得密码,连接将直接失败。

3.2 关键提示:连接控制文件的作用

需要特别注意的是,即使客户端成功提供了正确的用户名和密码,连接请求最终能否被接受,还取决于服务器端的连接控制文件。

sys_hba.conf 是连接的第一道防线,它根据客户端IP、数据库名、用户名来决定是否允许连接以及使用何种认证方法。常见的认证失败原因之一,就是客户端的IP未在 sys_hba.conf 中显式授权,此时数据库日志会报出 no sys_hba.conf entry 错误。

sys_ident.conf 则用于在 ident 认证模式下,将操作系统用户映射为数据库用户。

📌 内容延伸:关于这两个文件的详细配置语法、认证方法选择、规则匹配顺序以及实战案例,请参考文章:《KingbaseES 实战:深度解析用户、会话与连接控制》

3.3 常见陷阱:环境变量引发的认证失败

理解了上述优先级,就不难诊断因环境变量导致的认证问题。

  • 问题现象: 在某 KES 集群环境中,DBA 发现自动化备份脚本偶尔报错 FATAL: password authentication failed for user "esrep"。但在终端手动执行 ksql -U esrep 并输入正确密码时,却能正常登录。

  • 快速排查: 在出问题的环境中,立即执行以下命令检查是否存在冲突的环境变量:

    echo $KINGBASE_PASSWORD
    env | grep KINGBASE
    
  • 原因分析: 运维人员曾在 .bash_profile 中为方便测试,设置了 export KINGBASE_PASSWORD="Old_Test_Password"。当自动化脚本运行时:

    1. 脚本未在连接串中指定密码。
    2. 客户端检测到 KINGBASE_PASSWORD 环境变量,优先使用其中的旧密码进行认证。
    3. 旧密码与数据库中的真实密码不匹配,导致认证失败。

    而手动登录时,由于键盘输入密码的优先级高于环境变量,所以成功登录。

  • 其他环境变量干扰: 除了密码,KINGBASE_HOSTKINGBASE_PORT 如果指向了错误的节点(例如指向了未配置信任连接的备库),同样会导致连接异常。

3.4 解决方案与最佳实践
  1. 清理全局环境变量: 检查 ~/.bash_profile~/.bashrc/etc/profile 等文件,严禁在其中永久设置 KINGBASE_PASSWORD

    unset KINGBASE_PASSWORD
    
  2. 规范使用密码文件

    • 对于人工运维,配置 ~/.kbpass 并设好权限(600),这是推荐的安全实践。
    • 对于自动化脚本,优先使用 sys_encpwd 生成的加密文件,并注意其优先级高于 .kbpass
    • 如果需要同时使用两种文件,务必确保 .encpwd 中的密码是最新且正确的。
  3. 确保连接控制文件配置正确

    • 任何新增的应用服务器,务必在 sys_hba.conf 中添加对应的IP授权。
    • 修改 sys_hba.conf 后,执行 SELECT sys_reload_conf(); 并检查数据库日志,确保配置生效。
  4. 故障排查第一步: 遇到莫名其妙的认证失败,立即执行以下检查:

    # 1. 检查环境变量干扰
    echo $KINGBASE_PASSWORD
    env | grep KINGBASE
    
    # 2. 检查密码文件权限和内容
    ls -l ~/.kbpass ~/.encpwd   # 必须是 600 权限
    cat ~/.encpwd                # 检查加密密码是否存在
    cat ~/.kbpass                # 检查明文密码是否正确
    
    # 3. 检查数据库日志,定位具体拒绝原因
    tail -f $KINGBASE_DATA/sys_log/kingbase.log
    # 常见错误:no sys_hba.conf entry / password authentication failed
    
  5. 集群专用配置: 对于 esrep 等集群内部用户,应严格使用集群管理工具生成的 .encpwd 文件,并确保这些文件仅由对应的系统用户读取。

总结与建议

掌握 ksql 的连接细节和密码获取机制,是金仓数据库运维的基本功。结合业务合规与等保要求,建议遵循以下原则:

  1. 日常运维:优先使用服务名 (.sys_service.conf).kbpass(权限必须600),减少重复输入,提高效率。避免在命令行中直接暴露密码。

  2. 脚本自动化严禁在配置文件中硬编码密码。优先使用 .encpwd 配合 sys_encpwd 工具,满足等保对密码存储的加密要求。注意 .encpwd 优先级高于 .kbpass,不建议两者并存,如确需并存则需确保密码一致。

  3. 访问控制:新增应用服务器必须先在 sys_hba.conf 中按IP段授权,遵循最小权限原则。定期审计该文件,清理过期规则,满足等保对访问控制的要求。

  4. 故障排查:遇到认证失败,按顺序检查:环境变量(echo $KINGBASE_PASSWORD)、密码文件权限(600)、.encpwd内容、sys_hba.conf配置、数据库日志。每一步都有明确的合规依据。

  5. 密码生命周期:业务密码定期更换时,必须同步更新 .encpwd.kbpass。建议建立密码变更流程,避免因文件不一致导致服务中断或审计不合规。

通过规范化的连接管理和定期的配置审计,既能保障业务连续性,也能满足合规要求。