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实例的请求和响应通过防火墙。具体的设置方法本文不再描述。