在Alteryx中使用Postgres ODBC Driver为何产生超百次多端口连接尝试?
问题描述
- 使用
psqlodbc_15_00_0000驱动与Alteryx 23.1集成时,出现两类异常:- 尽管ODBC配置已指定服务端端口54338,PostgreSQL日志却显示超100次随机客户端临时端口的连接尝试,该现象在多台机器上一致出现;但单独使用ODBC驱动(如Excel中)仅生成标准日志,无异常行为。
- 日志中频繁出现SQL语法错误与对象不存在错误,涉及非PostgreSQL兼容的语法(如
USER()、SYSIBM.SYSDUMMY1、rdb$relations)。
连接端口异常日志示例
2024-01-17 14:31:05.378 CET [1960709] : [1-1] db=[unknown],user=[unknown],app=[unknown],client= LOG: connection received: host= port=57126 2024-01-17 14:31:05.398 CET [1960709] : [2-1] db=,user=,app=[unknown],client= LOG: connection authenticated: identity="CN=,OU=,DC=,DC=,DC=fr" method=ldap (9) 2024-01-17 14:31:05.398 CET [1960709] : [3-1] db=,user=,app=[unknown],client= LOG: connection authorized: user= database=29rp1rrb 2024-01-17 14:31:05.422 CET [1960709] : [4-1] db=,user=,app=[unknown],client= LOG: disconnection: session time: 0:00:00.044 user=_ database= host= port=57126 2024-01-17 14:31:14.944 CET [1960797] : [1-1] db=[unknown],user=[unknown],app=[unknown],client= LOG: connection received: host= port=57198 2024-01-17 14:31:14.958 CET [1960797] : [2-1] db=,user=,app=[unknown],client= LOG: connection authenticated: identity="CN=,OU=,DC=,DC=,DC=fr" method=ldap (9) 2024-01-17 14:31:14.958 CET [1960797] : [3-1] db=,user=,app=[unknown],client= LOG: connection authorized: user= database=2 2024-01-17 14:31:14.980 CET [1960797] : [4-1] db=,user=,app=[unknown],client= LOG: disconnection: session time: 0:00:00.036 user=_ database= host= port=57198
SQL错误日志示例
2024-01-17 14:06:49.598 CET [1950358] : [4-1] db=,user=zsiq_alteryx,app=PostgreSQL ODBC Driver 1.5.2.1002,client=10.208.11.222 ERROR: syntax error at or near "(" at character 12 2024-01-17 14:06:49.598 CET [1950358] : [5-1] db=,user=zsiq_alteryx,app=PostgreSQL ODBC Driver 1.5.2.1002,client=10.208.11.222 STATEMENT: select USER(), APPLICATION_ID() from system.iota 2024-01-17 14:06:49.599 CET [1950358] : [6-1] db=,user=zsiq_alteryx,app=PostgreSQL ODBC Driver 1.5.2.1002,client=10.208.11.222 ERROR: syntax error at or near "(" at character 12 2024-01-17 14:06:49.599 CET [1950358] : [7-1] db=,user=zsiq_alteryx,app=PostgreSQL ODBC Driver 1.5.2.1002,client=10.208.11.222 STATEMENT: select USER(), APPLICATION_ID() from system.iota 2024-01-17 14:06:49.605 CET [1950358] : [8-1] db=,user=zsiq_alteryx,app=PostgreSQL ODBC Driver 1.5.2.1002,client=10.208.11.222 ERROR: relation "sysibm.sysdummy1" does not exist at character 31 2024-01-17 14:06:49.605 CET [1950358] : [9-1] db=,user=zsiq_alteryx,app=PostgreSQL ODBC Driver 1.5.2.1002,client=10.208.11.222 STATEMENT: select USER as USER_NAME from SYSIBM.SYSDUMMY1 2024-01-17 14:06:49.605 CET [1950358] : [10-1] db=,user=zsiq_alteryx,app=PostgreSQL ODBC Driver 1.5.2.1002,client=10.208.11.222 ERROR: relation "sysibm.sysdummy1" does not exist at character 31 2024-01-17 14:06:49.605 CET [1950358] : [11-1] db=,user=zsiq_alteryx,app=PostgreSQL ODBC Driver 1.5.2.1002,client=10.208.11.222 STATEMENT: select USER as USER_NAME from SYSIBM.SYSDUMMY1 2024-01-17 14:06:49.611 CET [1950358] : [12-1] db=,user=zsiq_alteryx,app=PostgreSQL ODBC Driver 1.5.2.1002,client=10.208.11.222 ERROR: relation "rdb$relations" does not exist at character 15 2024-01-17 14:06:49.611 CET [1950358] : [13-1] db=,user=zsiq_alteryx,app=PostgreSQL ODBC Driver 1.5.2.1002,client=10.208.11.222 STATEMENT: select * from rdb$relations
解决方案
针对随机客户端端口问题
日志中显示的port=57126这类端口是客户端发起连接时使用的临时端口,并非PostgreSQL服务端监听端口,属于TCP连接的正常行为——客户端会从系统临时端口池随机选取端口发起连接,ODBC配置中指定的54338是服务端端口,两者不冲突。
- 若日志中无连接失败记录,此现象无需处理;
- 若需限制客户端端口范围,可通过操作系统层面配置(如Windows的
netsh命令、Linux的sysctl参数)约束临时端口池。
针对SQL语法错误问题
错误日志中的SQL语句属于DB2/Informix等数据库的语法,而非PostgreSQL兼容语法,这是Alteryx默认的元数据探测逻辑导致的,可通过以下方式解决:
- 修改ODBC连接参数:
- 在Alteryx的ODBC连接设置的「Advanced」标签页,添加
DriverCompletion=0参数,禁用Alteryx自动执行的元数据探测语句; - 或在ODBC数据源管理器中,为PostgreSQL驱动添加
DisablePrepare=1和UseServerSidePrepare=0参数,强制驱动使用PostgreSQL原生语法。
- 在Alteryx的ODBC连接设置的「Advanced」标签页,添加
- 自定义SQL查询:
在Alteryx输入工具中直接使用PostgreSQL兼容语句,例如用current_user替代USER(),用pg_catalog.pg_tables替代rdb$relations,避免依赖Alteryx自动生成的探测语句。 - 调整Alteryx数据库兼容性设置:
进入Alteryx的「Options > User Settings > Edit User Settings > Database」,将PostgreSQL的兼容性模式设置为「PostgreSQL」,而非通用ODBC模式,减少跨数据库语法的自动生成。
内容的提问来源于stack exchange,提问作者Benoit
相关产品推荐
相关产品推荐

