SinoDB 之 How-to(3)- DBeaver连接SinoDB的常见问题及处理方法

0、本文示例使用的环境

  • 操作系统:CentOS 7.9(虚拟机)
  • 主机名:C79
  • 主机IP:192.168.59.128
  • SinoDB:V16.8
  • SinoDB安装目录:/opt/sinodbms
  • SinoDB实例名:ol_sinodb1210
  • SinoDB实例端口号:19000
  • SQLHOSTS 文件(sqlhosts.ol_sinodb1210)

ol_sinodb1210 onsoctcp 192.168.59.128 19000
#dr_sinodb1210 drsoctcp c79 dr_sinodb1210
#lo_sinodb1210 onsoctcp 127.0.0.1 lo_sinodb1210

  • DBeaver:V24.1.1

1、Connection refused

测试连接或连接到SinoDB时发生连接错误,错误信息 Connection refused: connect,如下面两图:
在这里插入图片描述
在这里插入图片描述

1.1、可能的原因

(1)SinoDB数据库实例未启动。
(2)SinoDB实例端口号错误
(3)数据库服务器 SELinux 设置问题

1.2、检查

1.2.1、检查实例是否已启动

到数据库服务器上检查SinoDB数据库实例是否已经启动,检查方法通常为使用 onstat - 命令查看实例状态:

onstat -

检查结果如下图:
在这里插入图片描述
上图中的 “shared memory not initialized" 证明名称为 ol_sinodb1210 的SinoDB数据库实例未启动。

1.2.2、检查实例端口号

可以在数据库服务器上执行 onstat -g ntt 命令查看实例的服务端口号:

onstat -g ntt

本文示例的输出如下图:
在这里插入图片描述
从上图输出可以看到端口号为19000,而在上面第二个图中的连接配置端口中指定的端口为 19001(手误,故意的,哈哈~~ )。

BTW:对于典型安装时创建的默认实例,上面 onstat -g ntt 的输出中,端口号位置显示的是实例名,这时可以参考 SinoDB 之 How-to(1)- 查看典型安装实例的端口号 来查看具体的端口号。

1.2.3、检查数据库服务器 SELinux 设置

可以在数据库服务器上执行 sestatus 命令来查看 SELinux 状态,如下图:
在这里插入图片描述
上图说明,数据库服务器正在以 enforcing 模式启用了 SELinux,这会导致 DBeaver 连接到 SinoDB 时被拒绝。

1.3、解决办法

1.3.1、实例未启动

使用 oninit 命令启动SinoDB实例,具体命令通常为“oinit -vy":

oninit -vy

执行 oninit -vy 命令后可以通过 onstat - 命令确认实例是否已成功启动:
在这里插入图片描述
上面输出信息中的“On-Line”表示SinoDB实例已经成功启动。

在DBeaver中再次测试连接或打开已保存的连接,验证是否可以正确连接。
在这里插入图片描述

1.3.2、端口号错误

修改端口号为正确的端口号,之后再次测试连接或打开已保存的连接,验证是否可以正确连接。

1.3.3、修改 SELinux 设置

可以禁用SELinux,以解决上面的 Connection refused 问题,方法如下:
打开 /etc/selinux/config 文件进行修改,把其中 SELINUX 参数值由默认的 enforcing 修改为 disabled ,如下图:
在这里插入图片描述
保存修改后,重启数据库服务器主机(比如使用 reboot 命令),以让上面的修改生效。
注意:需要使用 root 身份修改 /etc/selinux/config 文件。

BTW:事实上,上面这种把 enforcing 修改为 disabled 的方式是一种简单粗暴的方法,更多地应用于测试环境或实验环境,生产环境中需要根据具体的安全需要对 SELinux 进行设置,具体的设置方法本文不进行描述。

2、SQLException

测试连接时发生错误,错误信息 SQLException,如下图:
在这里插入图片描述
上图中URL字符串为:jdbc:sinodbms-sqli://192.168.59.128:19000/tdb:sinodbmsserver=ol_sinodb1210;NEWCODESET=utf8,8859-1,819;DB_LOCALE=en_US.UTF8;CLIENT_LOCALE=en_US.UTF8;

2.1、可能的原因

连接字符串(URL字符串)中指定的DB_LOCALE和/或CLIENT_LOCALE与实际不符。
DB_LOCALE 指的是URL字符串中指定的SinoDB实例的数据库(Database)对象在创建时指定的字符集,该字符集依赖于在SinoDB实例中创建数据库(Database)对象时环境变量中的字符集。URL中的DB_LOCALE必须与要连接的SinoDB实例的数据库对象的字符集一致,否则会在DBeaver中报上面这个SQLException错误。
CLIENT_LOCALE指的是尝试连接到SinoDB实例的客户端(比如这里的DBeaver)所使用的字符集。
BTW:事实上还有其它原因会导致DBeaver报 SQLException 错误,但编写本文时未能模拟到,后续有机会了继续补充。

2.2、检查

到数据库服务器上检查要连接到的SinoDB实例的数据库的字符集,看是否与URL字符串的DB_LOCALE一致。
具体方法如下:
在SinoDB数据库服务器上打开 dbaccess 并连接到 sysmaster 数据库,命令如下:

dbaccess sysmaster -

使用下面语句查看要连接到的数据库的字符集:

select * from sysdbslocale where dbs_dbsname=‘tdb’;

本文示例的输出如下图:
在这里插入图片描述
可以看到,tdb数据库的字符集为 en_US.819,与URL字符串中的DB_LOCALE=en_US.UTF8并不一致。
BTW:sysmaster库中的sysdbslocale是个系统表,该表中保存了当前实例中所有数据库(Database)对象的字符集。

2.3、解决办法

修改连接字符串,把DB_LOCALE指定为由 sysdbslocale 系统表中查询出的值。如果这个值是 en_US.819,可以省略 DB_LOCALE。
修改后在DBeaver中再次测试连接或打开已保存的连接,验证是否可以正确连接。

3、Connection timed out: connect

测试连接或打开已保存的连接时发生超时错误,错误信息 Connection timed out: connect,如下面两图:
在这里插入图片描述

在这里插入图片描述

3.1、可能的原因

(1)主机IP错误
(2)数据库服务器防火墙问题

3.2、检查

3.2.1、检查主机IP

可以通过 onstat -g ntt 和数据库服务器的 /etc/hosts 中的定义来确认IP是否正确。具体过程在这里不再描述,有疑问的读者可以在本文留言讨论。

3.2.2、检查数据库服务器防火墙设置

检查数据库服务器的防火墙状态,对于 CentOS V7.x 或内核版本为3.10及以版本的Linux,可以使用 systemctl 命令进行检查:

systemctl status firewalld

本文示例的输出如下图:
在这里插入图片描述
防火墙状态为 active (running) ,证明防火墙已经启用。

3.3、解决办法

3.3.1、主机IP错误

修改主机IP为正确的IP。

3.3.2、数据库防火墙设置

可以关闭防火墙或设置防火墙允许SinoDB实例的请求和响应通过防火墙,本文示例以关闭防火墙为例进行说明。
可以使用 systemctl 停止防火墙服务,命令如下(该命令需要以 root 身份执行):

systemctl stop firewalld

停止防火墙后,再次尝试测试连接,应该可以正确连接了。
为了防止数据库服务器重启后防火墙服务再次自动启动,可以使用 systemctl 禁用防火墙服务,命令如下(该命令也需要以 root 身份执行):

systemctl disable firewalld

BTW:生产环境中通常不应该禁用防火墙服务,而是对防火墙进行设置,允许SinoDB实例的请求和响应通过防火墙。具体的设置方法本文不再描述。

  • 18
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

五藏

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值