NS_CACHE参数对用户密码验证的影响

1.问题描述及复现

  客户在使用dbeaver 管理工具连接SinoDB时,提示密码错误,但客户确认密码是正确的。 并且密码为刚刚修改的。
jdbc连接串为:

jdbc:informix-sqli:/fj_ods:INFORMIXSERVER=cm_sinodb;SQLH_TYPE=FILE;SQLH_FILE=/tmp/sinodb.host;user=daq_dba;password=*****;NEWCODESET=utf8,8859-1,819;CLIENT_LOCALE=en_US.8859-1;DB_LOCALE=en_US.8859-1;DBDATE=y4md;IFX_LOCK_MODE_WAIT=10;IFX_USE_STRENC=true

  出现反馈此问题后,我们尝试如下操作。

  • jdbc 连接串,密码部分加上单引号’’或者双引号” ”
  • 修改密码,密码修改成只有数字密码;修改成包含大小写字母和数字密码、修改成包含大小写字母、数字、特殊字符密码。
  • 更换dbeaver jdbc驱动文件,更改成SinoDB 自带的jdbc文件。
  • 更换SinoDB 管理工具DbVisualizer。

尝试以上操作,连接SinoDB依旧提示密码错误, 或者有时候又能验证成功。

2.问题原因:

  管理员更改了informix密码后,立即使用管理工具连接SinoDB数据库提示密码报错,因为数据库参数NS_CACHE为默认值900(单位为秒,等于15分钟)导致密码生效延迟导致。

3.NS_CACHE参数含义和用法

  为了查找和解析主机名(或 IP 地址)、服务名、用户(和密码)或组,数据库服务器使用适当的系统调用查询操作系统。可通过使用 SinoDB名称服务高速缓存机制,您可以避免许多的这些 OS 查找,该机制在可配置的时间量中保存并重复使用每一检索的信息条。如果您的操作系统不提供自身的高速缓存,则您应设置 NS_CACHE 配置参数。 服务器从高速缓存中取得信息比在查询操作系统时快。然而,如果您通过将保留时间设置为 0 来禁用一个或多个高速缓存,则数据库服务器将为主机、服务、用户或组信息来查询操作系统。

在操作系统级别对名称服务进行的更改不会立即反映在 SinoDB名称服务高速缓存:例如,更改 IP 地址、 添加用户到组或从组中移除用户,或新的密码。然而,您可使用 onmode -wf 或 onmode -wm 命令来立即更改 NS_CACHE 信息。当您用 onmode -wf 或 onmode -wm 命令更改一个特别的高速缓存的值时,服务器立即终止那个高速缓存中所有现有的条目。

4.解决方式:

  为使informix更改后密码立即生效,可以禁用NS_CACHE功能。
在informix用户下执行如下命令

onmode -wf NS_CACHE="host=0,service=0,user=0,group=0"