大家好,这里是公众号 DBA学习之路,分享一些学习国产数据库路上的知识和经验。
目录
前言
经常使用 Oracle 数据库的 DBA 对 sqlplus 命令肯定不陌生,而在 KingbaseES 数据库中,对应的工具就是 KSQL。
熟悉我文章的朋友可能知道,我在使用 sqlplus 工具时,经常使用 sas 来快速连接 Oracle 数据库,其实就是使用 alias 别名的方式创建了一个快捷方式,虽然是一个小技巧,但是对数据库维护来说十分便捷。
在接触使用 KingbaseES 时,自然也想着研究一下 KSQL 有没有类似的快捷方式使用,经过仔细研究发现,KSQL 实现的方式比 Oracle 多多了,本文就介绍一下 KSQL 免密登录的几种方式,以及我总结的最佳免密配置方式。
介绍
KingbaseES KSQL 工具面向的是所有使用 KingbaseES 的用户,主要是数据库管理员人员。KSQL 是 KingbaseES 数据库的一个组件,在安装 KingbaseES 数据库时,默认会安装 KSQL。
KSQL 工具很容易使用,没接触过的建议查看 ksql 帮助命令来大致了解一下如何使用:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63
| [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:永远不提示输入口令
连接数据库:
1 2 3 4 5 6
| [kingbase@kes:/home/kingbase]$ ksql -d kingbase -h kes -p 54321 -U system 用户 system 的口令: 输入 "help" 来获取帮助信息.
kingbase=
|
为了更快捷的连接数据库,可以尝试不指定参数名称来连接,忽略参数,自动填充默认值:
1 2 3 4 5
| [kingbase@kes:/home/kingbase]$ ksql kingbase system 用户 system 的口令: 输入 "help" 来获取帮助信息.
kingbase=
|
有默认值的选项可以不用指定,当不指定参数选项时,第一个被接收到的值将被解释为数据库名称(如果已经给出数据库名称,就解释为用户名)。不指定主机名,则默认连接当前主机上的数据库。
免密连接方式
alias 方式
这里参照我在 oracle 数据库的习惯,第一个想到的是使用别名的方式,实现起来最简单快捷:
1 2 3 4 5 6 7 8 9 10 11 12 13
| cat<<-EOF>>~/.bash_profile alias ksql='ksql -d kingbase -h kes -p 54321 -U system' EOF
source .bash_profile
[kingbase@kes:/home/kingbase]$ ksql 用户 system 的口令: 输入 "help" 来获取帮助信息.
kingbase=
|
但是,测试下来我感觉这种方式有点鸡肋,因为需要手动输入数据库用户密码,ksql 不支持明文指定密码的选项,好像没有类似 / as sysdba 类似的本地认证登录方式(有可能支持,但是我不知道,知道的朋友可以留言告知,谢谢)。
环境变量方式
在查阅官方文档之后发现,可以通过环境变量的方式,将 KINGBASE_DATABASE、 KINGBASE_HOST、KINGBASE_PORT、KINGBASE_USER 以及 KINGBASE_PASSWORD 设置为适当的值来实现免密登录:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| 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
[kingbase@kes:/home/kingbase]$ ksql 输入 "help" 来获取帮助信息.
kingbase=#
|
这个方式完全实现了我的需求,但是明文密码存放在环境变量配置文件中,比较容易被人看到,不太安全。
kbpass 文件方式
除了环境变量方式,官方提供了 ~/.kbpass 文件来避免输入密码的方式,也很方便, kbpass 文件内容格式如下:
1
| hostname:port:database:username:password
|
需要注意的几点:
- 1、当密码包含冒号
: 时,必须用反斜杠 \: 进行转义
- 2、字符
* 可以匹配任何字段中的任何值(密码除外)
- 3、在 Unix 系统上,口令文件上的权限必须不允许所有人或组内访问(即权限为 0600),如果权限没有这么严格,该文件将被忽略。
配置 kbpass 文件免密登录:
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| cat<<-EOF>~/.kbpass kes:54321:kingbase:system:kingbase EOF
chmod 600 ~/.kbpass
[kingbase@kes:/home/kingbase]$ ksql -h kes -p 54321 -d kingbase -U system 输入 "help" 来获取帮助信息.
kingbase=
|
这种方式虽然不需要明文显示密码,并且能不需要输入密码连接数据库,但是需要严格指定数据库信息,也不太方便。
最佳免密方式
alias + kbpass
使用别名的好处就是配置比较方便快捷:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| cat<<-EOF>>~/.bash_profile alias ksql='ksql -d kingbase -h kes -p 54321 -U system' EOF
source .bash_profile
cat<<-EOF>~/.kbpass kes:54321:kingbase:system:kingbase EOF
chmod 600 ~/.kbpass
[kingbase@kes:/home/kingbase]$ ksql 输入 "help" 来获取帮助信息.
kingbase=#
|
如果有多个数据库实例,只需要创建多个别名,然后在 kbpass 文件中加上对应数据库行即可,例如:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| cat<<-EOF>>~/.bash_profile alias ksql1='ksql -d test -h kes -p 54321 -U system' EOF
source .bash_profile
cat<<-EOF>>~/.kbpass kes:54321:test:system:kingbase EOF
[kingbase@kes:/home/kingbase]$ ksql1 输入 "help" 来获取帮助信息.
test=
|
环境变量 + kbpass
使用环境变量的方式:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
| 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
cat<<-EOF>~/.kbpass kes:54321:kingbase:system:kingbase EOF
chmod 600 ~/.kbpass
[kingbase@kes:/home/kingbase]$ ksql 输入 "help" 来获取帮助信息.
kingbase=#
|
如果有多个数据库实例,只需要创建多个环境变量文件,然后在 kbpass 文件中加上对应数据库行即可,例如:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| 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
cat<<-EOF>>~/.kbpass kes:54321:test:system:kingbase EOF
[kingbase@kes:/home/kingbase]$ ksql 输入 "help" 来获取帮助信息.
test=#
|
总结
本文介绍了 KSQL 连接 KingbaseES 数据库的多种方式,通过以上测试以及对安全性的要求,建议大家可以使用 alias 或环境变量 + kbpass 的方式来配置免密登录,配置简单,使用便捷。
后记
后来,群友提供了一个官方本地认证的免密方式,配置比较简单。
修改 /data/sys_hba.conf 配置文件:
1 2 3 4
| # TYPE DATABASE USER ADDRESS METHOD
# "local" is for Unix domain socket connections only local all all scram-sha-256
|
将 local 认证方式 scram-sha-256 修改为 trust 即可:
1 2 3 4
| # TYPE DATABASE USER ADDRESS METHOD
# "local" is for Unix domain socket connections only local all all trust
|
重启数据库生效:
本地免密连接:
1 2 3 4 5
| [kingbase@kes:/home/kingbase]$ ksql -U sso test -p 54321 ksql (V8.0) 输入 "help" 来获取帮助信息.
test=> exit
|
如果遇到无法免密登录的情况:
1 2 3
| [kingbase@kes:/home/kingbase]$ ksql -U sso test -p 54321 用户 sso 的口令: ksql: 错误: 无法连接到服务器:fe_sendauth: no password supplied
|
可能是因为配置了以下环境变量:
1 2 3 4
| export KINGBASE_HOST=kes export KINGBASE_PORT=54321 export KINGBASE_DATABASE=test export KINGBASE_USER=system
|
注释之后,退出重登 kingbase 主机用户即可:
1 2 3 4 5 6 7 8 9
| [kingbase@kes:/home/kingbase]$ exit 注销 [root@kes ~] 上一次登录: 六 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
1 2
| alias ksystem='ksql test system' alias ksso='ksql test sso'
|
别名连接:
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| [kingbase@kes:/home/kingbase]$ ksystem ksql (V8.0) 输入 "help" 来获取帮助信息.
test= 以用户 "system" 的身份,通过套接字"/tmp"在端口"54321"连接到数据库 "test" test= [kingbase@kes:/home/kingbase]$ ksso ksql (V8.0) 输入 "help" 来获取帮助信息.
test=> \conninfo 以用户 "sso" 的身份,通过套接字"/tmp"在端口"54321"连接到数据库 "test" test=> \q
|
后续补充就到这了。