大家好,这里是公众号 DBA学习之路,分享一些学习国产数据库路上的知识和经验。
目录
前言
经常使用 Oracle 数据库的 DBA 对 sqlplus 命令肯定不陌生,而在 KingbaseES 数据库中,对应的工具就是 KSQL。
熟悉我文章的朋友可能知道,我在使用 sqlplus 工具时,经常使用 sas 来快速连接 Oracle 数据库,其实就是使用 alias 别名的方式创建了一个快捷方式,虽然是一个小技巧,但是对数据库维护来说十分便捷。
在接触使用 KingbaseES 时,自然也想着研究一下 KSQL 有没有类似的快捷方式使用,经过仔细研究发现,KSQL 实现的方式比 Oracle 多多了,本文就介绍一下 KSQL 免密登录的几种方式,以及我总结的最佳免密配置方式。
介绍
KingbaseES KSQL 工具面向的是所有使用 KingbaseES 的用户,主要是数据库管理员人员。KSQL 是 KingbaseES 数据库的一个组件,在安装 KingbaseES 数据库时,默认会安装 KSQL。
KSQL 工具很容易使用,没接触过的建议查看 ksql 帮助命令来大致了解一下如何使用:
[kingbase@kes:/home/kingbase]$ ksql --help
ksql是Kingbase 的交互式客户端工具。
使用方法:
ksql [选项]... [数据库名称 [用户名称]]
通用选项:
-c, --command=命令 执行单一命令(SQL或内部指令)然后结束
-d, --dbname=DBNAME 指定要连接的数据库 (默认:"kingbase")
-f, --file=文件名 从文件中执行命令然后退出
-l, --list 列出所有可用的数据库,然后退出
-v, --set=, --variable=NAME=VALUE
设置ksql变量NAME为VALUE
(例如,-v ON_ERROR_STOP=1)
-V,--version 输出版本信息,然后退出
-X, --no-ksqlrc 不读取启动文档(~/.ksqlrc)
-1 ("one"), --single-transaction
作为一个单一事务来执行命令文件(如果是非交互型的)
-?, --help[=options] 显示此帮助,然后退出
--help=commands 列出反斜线命令,然后退出
--help=variables 列出特殊变量,然后退出
输入和输出选项:
-a, --echo-all 显示所有来自于脚本的输入
-b, --echo-errors 回显失败的命令
-e, --echo-queries 显示发送给服务器的命令
-E, --echo-hidden 显示内部命令产生的查询
-L, --log-file=文件名 将会话日志写入文件
-M, --enable-client-encryption
启用使用客户端加密功能
-n, --no-readline 禁用增强命令行编辑功能(readline)
-o,--outPut=FILENAME 将查询结果发送到file(or |pipe)
-q,--quiet 静静地运行(没有消息,只有查询输出)
-s, --single-step 单步模式 (确认每个查询)
-S, --single-line 单行模式 (一行就是一条 SQL 命令)
输出格式选项 :
-A,--no-align 不对齐表输出模式
--csv CSV(逗号分隔值)表输出模式
-F, --field-separator=STRING
用于未对齐输出的字段分隔符(默认值:"|")
-H,--html HTML表输出模式
-P, --pset=变量[=参数] 设置将变量打印到参数的选项(查阅 \pset 命令)
-R, --record-separator=STRING
记录分隔符用于未对齐输出(默认:newline)
-t, --tuples-only 只打印记录i
-T, --table-attr=文本 设定 HTML 表格标记属性(例如,宽度,边界)
-x,--expanded 打开扩展表outPut
-z, --field-separator-zero
将未对齐输出的字段分隔符设置为零字节
-0, --record-separator-zero
将未对齐输出的记录分隔符设置为零字节
联接选项:
-h, --host=主机名 数据库服务器主机或socket目录(默认:"本地接口")
-p, --port=端口 数据库服务器的端口(默认:"54321")
-U,--username=USERNAME 数据库用户名(默认:"kingbase")
-w, --no-password 永远不提示输入口令
-W, --password 强制口令提示 (自动)
-C,--client-cert-path cert-authentication文件路径
-k,--client-certkey-path 证书认证私钥文件路径
-K, --client-certpin-path 读取私钥文件的加密pin码文件路径
更多信息,请在ksql中输入 "\?"(用于内部命令),
或者参考Kingbase ES文档中的ksql章节。
这里只是简单介绍以下 KSQL 工具。
KSQL 连接数据库
常规连接方式
想要使用 KSQL 连接数据库,首先得知道数据库的名称,主机名,数据库用户以及数据库的端口号:
-d:要连接的数据库名称,默认为 kingbase-h:数据库服务器主机名,默认为本地接口-p:数据库服务器的端口,默认为 54321-U:数据库用户名,默认为 kingbase-w:永远不提示输入口令
连接数据库:
## 使用全参数指定方式连接,这种方式比较繁琐,但是规范
[kingbase@kes:/home/kingbase]$ ksql -d kingbase -h kes -p 54321 -U system
用户 system 的口令:
输入 "help" 来获取帮助信息.
kingbase=#
为了更快捷的连接数据库,可以尝试不指定参数名称来连接,忽略参数,自动填充默认值:
[kingbase@kes:/home/kingbase]$ ksql kingbase system
用户 system 的口令:
输入 "help" 来获取帮助信息.
kingbase=#
有默认值的选项可以不用指定,当不指定参数选项时,第一个被接收到的值将被解释为数据库名称(如果已经给出数据库名称,就解释为用户名)。不指定主机名,则默认连接当前主机上的数据库。
免密连接方式
alias 方式
这里参照我在 oracle 数据库的习惯,第一个想到的是使用别名的方式,实现起来最简单快捷:
## 配置别名 ksql
cat<<-EOF>>~/.bash_profile
alias ksql='ksql -d kingbase -h kes -p 54321 -U system'
EOF
source .bash_profile
## 直接使用 ksql 连接数据库
[kingbase@kes:/home/kingbase]$ ksql
用户 system 的口令:
输入 "help" 来获取帮助信息.
kingbase=#
但是,测试下来我感觉这种方式有点鸡肋,因为需要手动输入数据库用户密码,ksql 不支持明文指定密码的选项,好像没有类似 / as sysdba 类似的本地认证登录方式(有可能支持,但是我不知道,知道的朋友可以留言告知,谢谢)。
环境变量方式
在查阅官方文档之后发现,可以通过环境变量的方式,将 KINGBASE_DATABASE、 KINGBASE_HOST、KINGBASE_PORT、KINGBASE_USER 以及 KINGBASE_PASSWORD 设置为适当的值来实现免密登录:
cat<<-EOF>>~/.bash_profile
export KINGBASE_HOST=kes
export KINGBASE_PORT=54321
export KINGBASE_DATABASE=kingbase
export KINGBASE_USER=system
export KINGBASE_PASSWORD=kingbase
EOF
source ~/.bash_profile
## 此时只需要直接执行 ksql 就可以连接数据库
[kingbase@kes:/home/kingbase]$ ksql
输入 "help" 来获取帮助信息.
kingbase=#
这个方式完全实现了我的需求,但是明文密码存放在环境变量配置文件中,比较容易被人看到,不太安全。
kbpass 文件方式
除了环境变量方式,官方提供了 ~/.kbpass 文件来避免输入密码的方式,也很方便, kbpass 文件内容格式如下:
hostname:port:database:username:password
需要注意的几点:
- 1、当密码包含冒号
:时,必须用反斜杠\:进行转义 - 2、字符
*可以匹配任何字段中的任何值(密码除外) - 3、在 Unix 系统上,口令文件上的权限必须不允许所有人或组内访问(即权限为 0600),如果权限没有这么严格,该文件将被忽略。
配置 kbpass 文件免密登录:
## 创建 kbpass 文件
cat<<-EOF>~/.kbpass
kes:54321:kingbase:system:kingbase
EOF
## 授权文件 600 权限,仅用于 kingbase 用户访问
## 警告: 口令文件"/home/kingbase/.kbpass"的访问权限过大; 权限应设置为 u=rw (0600)或更少
chmod 600 ~/.kbpass
## 使用 kbpass 需要严格指定参数选项信息,否则无法匹配 kbpass 文件中的密码
[kingbase@kes:/home/kingbase]$ ksql -h kes -p 54321 -d kingbase -U system
输入 "help" 来获取帮助信息.
kingbase=#
这种方式虽然不需要明文显示密码,并且能不需要输入密码连接数据库,但是需要严格指定数据库信息,也不太方便。
最佳免密方式
alias + kbpass
使用别名的好处就是配置比较方便快捷:
## 配置别名
cat<<-EOF>>~/.bash_profile
alias ksql='ksql -d kingbase -h kes -p 54321 -U system'
EOF
source .bash_profile
## 配置 kbpass 文件
cat<<-EOF>~/.kbpass
kes:54321:kingbase:system:kingbase
EOF
chmod 600 ~/.kbpass
## 免密连接
[kingbase@kes:/home/kingbase]$ ksql
输入 "help" 来获取帮助信息.
kingbase=#
如果有多个数据库实例,只需要创建多个别名,然后在 kbpass 文件中加上对应数据库行即可,例如:
## 配置连接 test 库
cat<<-EOF>>~/.bash_profile
alias ksql1='ksql -d test -h kes -p 54321 -U system'
EOF
source .bash_profile
## kbpass 文件新增一行配置
cat<<-EOF>>~/.kbpass
kes:54321:test:system:kingbase
EOF
## 免密连接 test 库
[kingbase@kes:/home/kingbase]$ ksql1
输入 "help" 来获取帮助信息.
test=#
环境变量 + kbpass
使用环境变量的方式:
## 创建一个数据库名称命名的 .kingbase 环境变量文件,这样方便多个数据库进行切换
cp .bash_profile .kingbase
## 增加对应环境变量的配置信息,不需要加密码变量
cat<<-EOF>>~/.kingbase
export KINGBASE_HOST=kes
export KINGBASE_PORT=54321
export KINGBASE_DATABASE=kingbase
export KINGBASE_USER=system
EOF
source ~/.kingbase
## 配置 kbpass 文件
cat<<-EOF>~/.kbpass
kes:54321:kingbase:system:kingbase
EOF
chmod 600 ~/.kbpass
## 免密连接
[kingbase@kes:/home/kingbase]$ ksql
输入 "help" 来获取帮助信息.
kingbase=#
如果有多个数据库实例,只需要创建多个环境变量文件,然后在 kbpass 文件中加上对应数据库行即可,例如:
## 创建一个数据库名称命名的 .test 环境变量文件
cp .bash_profile .test
## 增加对应环境变量的配置信息,不需要加密码变量
cat<<-EOF>>~/.test
export KINGBASE_HOST=kes
export KINGBASE_PORT=54321
export KINGBASE_DATABASE=test
export KINGBASE_USER=system
EOF
source ~/.test
## kbpass 文件新增一行配置
cat<<-EOF>>~/.kbpass
kes:54321:test:system:kingbase
EOF
## 免密连接 test 库
[kingbase@kes:/home/kingbase]$ ksql
输入 "help" 来获取帮助信息.
test=#
总结
本文介绍了 KSQL 连接 KingbaseES 数据库的多种方式,通过以上测试以及对安全性的要求,建议大家可以使用 alias 或环境变量 + kbpass 的方式来配置免密登录,配置简单,使用便捷。
后记
后来,群友提供了一个官方本地认证的免密方式,配置比较简单。
修改 /data/sys_hba.conf 配置文件:
# TYPE DATABASE USER ADDRESS METHOD
# "local" is for Unix domain socket connections only
local all all scram-sha-256
将 local 认证方式 scram-sha-256 修改为 trust 即可:
# TYPE DATABASE USER ADDRESS METHOD
# "local" is for Unix domain socket connections only
local all all trust
重启数据库生效:
sys_ctl restart
本地免密连接:
[kingbase@kes:/home/kingbase]$ ksql -U sso test -p 54321
ksql (V8.0)
输入 "help" 来获取帮助信息.
test=> exit
如果遇到无法免密登录的情况:
[kingbase@kes:/home/kingbase]$ ksql -U sso test -p 54321
用户 sso 的口令:
ksql: 错误: 无法连接到服务器:fe_sendauth: no password supplied
可能是因为配置了以下环境变量:
export KINGBASE_HOST=kes
export KINGBASE_PORT=54321
export KINGBASE_DATABASE=test
export KINGBASE_USER=system
注释之后,退出重登 kingbase 主机用户即可:
[kingbase@kes:/home/kingbase]$ exit
注销
[root@kes ~]# su - kingbase
上一次登录: 六 10月 12 10:29:19 CST 2024 pts/0 上
[kingbase@kes:/home/kingbase]$ ksql -U sso test -p 54321
ksql (V8.0)
输入 "help" 来获取帮助信息.
test=> exit
所以,看起来最佳免密方式为:sys_hba.conf + alias
alias ksystem='ksql test system'
alias ksso='ksql test sso'
别名连接:
[kingbase@kes:/home/kingbase]$ ksystem
ksql (V8.0)
输入 "help" 来获取帮助信息.
test=# \conninfo
以用户 "system" 的身份,通过套接字"/tmp"在端口"54321"连接到数据库 "test"
test=# \q
[kingbase@kes:/home/kingbase]$ ksso
ksql (V8.0)
输入 "help" 来获取帮助信息.
test=> \conninfo
以用户 "sso" 的身份,通过套接字"/tmp"在端口"54321"连接到数据库 "test"
test=> \q
后续补充就到这了。




