更新时间:2026-07-28 GMT+08:00
分享

连接数据库

ODBC连接数据库之前需要准备好所需资源。连接数据库是通过配置ODBC数据源,使用ODBC API或者相应的驱动程序,实现应用程序与数据库之间的通信和交互。本章节介绍如何在Linux/Windows系统下配置数据源并连接到数据库。

Linux下配置数据源

  1. 安装unixODBC(默认unixODBC源码包已在环境准备中获取)。如果机器上已经安装了其他版本的unixODBC,可以直接覆盖安装。

    以unixODBC-2.3.7版本为例,在客户端执行如下命令安装unixODBC。
    tar zxvf unixODBC-2.3.7.tar.gz
    cd unixODBC-2.3.7
    
    ./configure --enable-gui=no #如果要在ARM服务器上编译,请追加一个configure参数: --build=aarch64-unknown-linux-gnu 
    make
    #安装可能需要root权限
    make install
    • 目前不支持unixODBC-2.2.1版本。
    • unixODBC默认安装到“/usr/local”目录下,生成数据源文件到 “/usr/local/etc”目录下,库文件生成在“/usr/local/lib”目录。
    • 通过编译带有--enable-fastvalidate=yes选项的unixODBC来获得更高性能。但此选项可能会导致向ODBC API传递无效句柄的应用程序发生故障,而不是返回SQL_INVALID_HANDLE错误。

  2. 替换客户端GaussDB驱动程序。

    将GaussDB-Kernel_数据库版本号_操作系统版本号_64bit_Odbc.tar.gz解压。解压后会得到两个文件夹:lib与odbc,在odbc文件夹中还会有一个lib文件夹。将解压后得到的/lib文件夹与/odbc/lib文件夹中的所有动态库都复制到“/usr/local/lib”目录下。

  3. 配置数据源。

    1. 配置ODBC驱动文件。

      在“/usr/local/etc/odbcinst.ini”文件中追加以下内容。

      [GaussMPP]
      Driver64=/usr/local/lib/gsqlodbcw.so
      setup=/usr/local/lib/gsqlodbcw.so

      odbcinst.ini文件中的配置参数说明如表1所示:

      表1 odbcinst.ini文件配置参数

      参数

      描述

      示例

      [DriverName]

      驱动器名称,对应数据源DSN中的驱动名。

      [GaussMPP]

      Driver64

      驱动动态库的路径。

      Driver64=/usr/local/lib/gsqlodbcw.so

      setup

      驱动安装路径,与Driver64中动态库的路径一致。

      setup=/usr/local/lib/gsqlodbcw.so

    2. 配置数据源文件。

      在“/usr/local/etc/odbc.ini”文件中追加以下内容。

      [gaussdb]
      Driver=GaussMPP
      #数据库Server IP
      Servername=127.0.0.1
      #数据库名
      Database=db1
      #数据库用户名
      Username=omm
      #数据库用户密码
      Password=
      #数据库侦听端口
      Port=8000
      Sslmode=allow

      odbc.ini文件配置参数说明如表2所示,更加详细的参数说明请参见Linux系统下配置数据源章节。

      表2 odbc.ini文件配置参数

      参数

      描述

      示例

      [DSN]

      数据源的名称。

      [gaussdb]

      Driver

      驱动名,对应odbcinst.ini中的DriverName。

      Driver=GaussMPP

      Servername

      服务器的IP地址。可配置多个IP地址。支持IPv4和IPv6。

      Servername=127.0.0.1

      Database

      要连接的数据库的名称。

      Database=db1

      Username

      数据库用户名称。

      Username=omm

      Password

      数据库用户密码。

      说明:
      • ODBC驱动本身已经对内存密码进行过清理,以保证用户密码在连接后不会再在内存中保留。
      • 但是如果配置了此参数,由于UnixODBC对数据源文件等进行缓存,可能导致密码长期保留在内存中。
      • 推荐在应用程序连接时,将密码传递给相应API,而非写在数据源配置文件中。同时连接成功后,应当及时清理保存密码的内存段。
      • 配置文件中填写密码时,需要遵循http规则:
        • 字符应当采用URL编码规范,如"!"应写作"%21","%"应写作"%25",因此应当特别注意字符。
        • "+"会被替换为空格" "。

      Password=********

      Port

      服务器的端口号。当开启负载均衡时,可配置多个端口号,且需与配置的多IP一一对应。如果开启负载均衡配置多个IP时,仍只配置一个端口号,则默认所有IP共用同一个端口号,即为配置的端口号。

      Port=8000

      Sslmode

      是否启用 SSL 连接。

      说明:

      关于Sslmode的选项的允许值,具体信息如表3 Sslmode的可选项及其描述所示。

      Sslmode=allow

      Debug

      控制调试模式的开启及日志输出级别。

      取值范围:0 ~ INT_MAX

      • 设置为0时表示不启用调试模式。
      • 设置为大于0的值时将启用调试日志,会打印gsqlODBC驱动的mylog。日志生成目录为/tmp/,文件名为mylog_xxx.log。
      • 设置为1时表示仅输出FATAL级别日志。
      • 设置为2时表示输出FATAL和ERROR级别日志。
      • 设置为3时表示输出FATAL、ERROR和WARN级别日志。
      • 设置为4时表示输出FATAL、ERROR、WARN和INFO级别日志。
      • 设置为≥5时表示输出所有级别日志,增加输出TRACE级别日志。

      默认值为0。

      说明:
      1. FATAL:报告致命错误。
      2. ERROR:报告异常错误。
      3. WARN:报告警告信息。
      4. INFO:记录程序运行中的正常关键信息。
      5. TRACE:提供开发人员使用的调试信息。

      Debug=5

      CommLog

      控制后端通信日志的开启及日志输出级别。

      取值范围:0 ~ INT_MAX

      • 设置为0时表示不启用。
      • 设置为大于0的值时将启用后端日志,会打印gsqlODBC驱动的qlog。日志生成目录为/tmp/,文件名为gsqlodbc_xxx.log。
      • 设置为1时表示仅输出ERROR级别日志。
      • 设置为2时表示输出ERROR和INFO级别日志。
      • 设置为≥3时表示输出ERROR、INFO和TRACE级别日志。

      默认值为0。

      说明:
      1. ERROR:报告异常错误。
      2. INFO:记录程序运行中的正常关键信息。
      3. TRACE:提供开发人员使用的调试信息。

      CommLog=1

      UseServerSidePrepare

      是否开启数据库端扩展查询协议。

      取值范围:0,1

      • 取值为0表示不开启。
      • 取值为1表示开启。

      默认值为1。

      UseServerSidePrepare=1

      UseBatchProtocol

      是否开启批量查询协议(打开可提高DML性能)。

      取值范围:0,1

      • 取值为0时,不使用批量查询协议(主要用于与早期数据库版本通信兼容)。
      • 取值为1,并且数据库support_batch_bind参数存在且为on时,将打开批量查询协议。

      默认值为1。

      UseBatchProtocol=1

      ForExtensionConnector

      此开关控制着savepoint是否发送,savepoint相关问题可以注意此开关。

      取值范围:0,1

      • 取值为0时表示发送savepoint。
      • 取值为1时表示不发送savepoint。

      默认值为1。

      ForExtensionConnector=1

      ConnectionExtraInfo

      GUC参数connection_info中显示驱动部署路径和进程属主用户的开关。

      取值范围:0,1

      • 取值为0时表示不打开此开关。
      • 取值为1时表示打开此开关。

      默认值为0。

      说明:

      当设置为1时,ODBC驱动会将当前驱动的部署路径、进程属主用户上报到数据库中。

      ConnectionExtraInfo=1

      BoolsAsChar

      是否将布尔值作为字符处理。

      取值范围:0,1

      • 取值为0时表示Bools值将会映射为SQL_BIT。
      • 取值为1时表示Bools值将会映射为SQL_CHAR。

      默认值为1。

      BoolsAsChar = 1

      RowVersioning

      是否在更新一行数据时,允许应用检测数据有没有被其他用户进行修改。

      取值范围:0,1

      • 取值为0时表示不允许应用检测。
      • 取值为1时表示允许应用检测。

      默认值为0。

      RowVersioning=1

      ShowSystemTables

      是否将默认系统表视为普通SQL表。

      取值范围:0,1

      • 取值为0时驱动不会将默认系统表视为普通SQL表。
      • 取值为1时驱动将默认系统表视为普通SQL表。

      默认值为0。

      ShowSystemTables=1

      AutoBalance

      ODBC控制负载均衡的开关。

      取值范围:0,1

      • 取值为0时表示不开启负载均衡。
      • 取值为1时开启负载均衡。

      默认值为0。

      说明:

      连接的数据库版本在505.2.0.SPC0200以下时,不支持容灾集群负载均衡。

      AutoBalance=1

      RefreshCNListTime

      开启负载均衡时可配置该参数,该参数为刷新CN列表的时间。整数型,单位为秒。

      取值范围:0 ~ INT_MAX

      • 取值为0时表示不开启该参数。
      • 取值大于0时表示该设定值为刷新CN列表的时间。

      默认值为10

      RefreshCNListTime=5

      Priority

      开启负载均衡时可配置该参数。

      取值范围:0,1

      • 取值为0时表示不开启该参数。
      • 取值为1时开启该参数。

      默认值为0。

      说明:

      当Priority开启时,应用程序发起的所有连接优先发送到配置文件中配置的CN上,当配置的CN全部不可用时,连接才会发送到剩余的CN上。

      Priority=1

      UsingEip

      开启负载均衡时可配置该参数。

      取值范围:0,1

      • 取值为0时表示不开启该参数。
      • 取值为1时开启该参数。

      默认值为0。

      说明:

      此值用于控制是否使用业务IP(对应pgxc_node表中node_host1和node_port1列)做负载均衡。当UsingEip开启时,表示使用业务IP做负载均衡;关闭表示使用数据IP(对应pgxc_node表中node_host和node_port列)做负载均衡。

      UsingEip=1

      MaxCacheQueries

      控制每个连接缓存的预编译语句个数。

      取值范围:0 ~ 4096

      默认值为0。

      说明:

      如果设置为0,则不开启客户端预编译语句缓存池。设置为大于4096的值会限制为4096。如果执行过的语句个数超过MaxCacheQueries设置的上限,则淘汰最近最少使用的语句。

      MaxCacheQueries=128

      MaxCacheSizeMiB

      控制每个连接缓存的预编译语句总大小,在MaxCacheQueries大于0时生效。

      取值范围:0 ~ 4096

      默认值为1。

      说明:

      如果缓存的语句总长度大于MaxCacheSizeMiB则淘汰最近最少使用的语句。单位为MB,设置为大于4096的值会限制为4096。

      MaxCacheSizeMiB=10

      TcpUserTimeout

      在支持TCP_USER_TIMEOUT套接字选项的操作系统上,指定传输的数据在TCP连接被强制关闭之前可以保持未确认状态的最大时长。

      取值范围:0 ~ INT_MAX

      默认值为0。

      说明:

      0表示使用系统缺省。通过Unix域套接字做的连接忽略这个参数。单位为毫秒。

      TcpUserTimeout=5000

      StandbyRead

      用于指定分布式是否开启备机读模式。

      取值范围:0,1

      • 取值为0时表示禁用备机读模式。
      • 取值为1时表示开启备机读模式。

      默认值为0。

      StandbyRead=1

      Pqopt

      用于设置libpq连接参数,参数之间用空格间隔。libpq参数请参见连接参数说明章节。

      Pqopt=keepalives=0

      KeepaliveTime

      在TCP应该发送一个保持激活的信息给服务器之后,控制不活动的秒数。如果是通过 Unix 域套接字进行连接,或者禁用了“保持激活”功能,则该参数将被忽略。

      取值范围:0 ~ INT_MAX

      设置为0值或者不配置表示使用系统缺省。

      说明:

      禁用“保持激活”功能需要通过Pqopt参数设置keepalives=0。

      KeepaliveTime=2

      KeepaliveInterval

      在TCP保持激活信息没有被应该传播的服务器承认之后,控制探活报文发送的间隔秒数。如果是通过 Unix 域套接字进行连接,或者禁用了“保持激活”功能,则该参数将被忽略。

      取值范围:0 ~ INT_MAX

      设置为0值或者不配置表示使用系统缺省。

      KeepaliveInterval=2

      KeepaliveCount

      控制TCP发送保持激活信息的次数。如果是通过 Unix 域套接字进行连接,或者禁用了“保持激活”功能,则该参数将被忽略。

      取值范围:0 ~ INT_MAX

      设置为0值或者不配置表示使用系统缺省。

      KeepaliveCount=2

      SocketTimeout

      用于控制客户端与服务端建立连接完全成功后的socket读写超时时间。单位为秒,默认为0。

      说明:

      该参数包括了数据库语句执行的超时时间,设置的过小可能导致语句执行时间本身发生超时,因此默认为0,需根据场景配置,建议设置非0值。

      SocketTimeout=5

      SocketTimeoutInConnect

      用于控制TCP三次握手成功后,客户端与服务端建立连接阶段的socket读写超时时间。单位为秒,默认为5。

      说明:

      该参数区别于SocketTimeout:由于三次握手成功后的客户端与服务端建立连接阶段可能存在阻塞,因此需要设置不影响语句执行超时的socket读写超时时间。

      SocketTimeoutInConnect=5

      CancelTimeout

      用于控制应用端发送cancel消息的超时时间。单位为秒,默认为0。

      CancelTimeout=5

      TcpSYNRetries

      用于控制TCP三次握手阶段时SYN最多重传的次数,超过该次数仍未建连成功即报错。默认为0次。

      说明:

      该参数在支持TCP_SYNCNT套接字选项的操作系统上,指定客户端建立连接三次握手阶段SYN包发送失败而重传的次数。0值表示使用系统缺省。通过Unix域套接字的连接忽略这个参数。

      TcpSYNRetries=3

      TextAsLongVarchar

      将内核侧text类型映射为驱动侧的SQL_LONGVARCHAR类型或者SQL_VARCHAR类型。

      取值范围:0,1。

      取值为0时表示将内核侧text类型映射为驱动侧的SQL_VARCHAR类型。

      取值为1时表示将内核侧text类型映射为驱动侧的SQL_LONGVARCHAR类型。

      默认值为1。

      TextAsLongVarchar=1

      MaxLongVarcharSize

      驱动侧的SQL_LONGVARCHAR类型的最大长度。

      取值范围:0 ~ INT_MAX。

      默认值为8190。

      MaxLongVarcharSize=8190

      MaxVarcharSize

      驱动侧的SQL_VARCHAR类型的最大长度。

      取值范围:0 ~ INT_MAX。

      默认值为255。

      MaxVarcharSize=255

      TargetServerType

      设定连接的主机的类型。主机的类型和设定的值一致时才能连接成功。设置规则如下:

      • primary(默认值):仅对主备系统中的主节点进行连接。
      • cluster-primary:仅对主集群CN节点能进行连接。
      • cluster-mainnode:仅对容灾集群CN节点能进行连接。
        说明:

        cluster-primary和cluster-mainnode选项只支持流式容灾。

      TargetServerType=cluster-primary

      EnableHostCache

      是否开启节点缓存功能,0表示不开启,1表示开启。默认开启。

      EnableHostCache=1

      表3 Sslmode的可选项及其描述

      Sslmode

      是否会启用SSL加密

      描述

      disable

      不使用SSL安全连接,为默认值。

      allow

      可能

      如果数据库服务器要求使用,则可以使用SSL安全加密连接,但不验证数据库服务器的真实性。

      prefer

      可能

      如果数据库支持,那么首选使用SSL安全加密连接,但不验证数据库服务器的真实性。

      require

      必须使用SSL安全连接,但是只做了数据加密,并不验证数据库服务器的真实性。

      verify-ca

      必须使用SSL安全连接,并且验证数据库是否具有可信证书机构签发的证书。

      verify-full

      必须使用SSL安全连接,在verify-ca的验证范围之外,同时验证数据库所在主机的主机名是否与证书内容一致。GaussDB不支持此模式。

      用户通过ODBC连接GaussDB服务器时,可以通过开启SSL加密客户端和服务器之间的通讯。在使用SSL时,默认用户已经获取了服务端和客户端所需要的证书和私钥文件,关于证书等文件的获取请参考Openssl相关文档和命令。

  4. 在客户端配置环境变量。

    vim ~/.bashrc

    在配置文件中追加以下内容。

    export LD_LIBRARY_PATH=/usr/local/lib/:$LD_LIBRARY_PATH
    export ODBCSYSINI=/usr/local/etc
    export ODBCINI=/usr/local/etc/odbc.ini

  5. 执行如下命令使设置生效。

    source ~/.bashrc

  6. 测试连接。

    安装后/usr/bin下面会存放生成的二进制,可执行isql -v gaussdb(数据源名称)命令。

    • 如果显示如下信息,表明配置正确,连接成功。
      +---------------------------------------+
      | Connected!                            |
      |                                       |
      | sql-statement                         |
      | help [tablename]                      |
      | quit                                  |
      |                                       |
      +---------------------------------------+
    • 若显示ERROR信息,则表明配置错误。请检查上述配置步骤是否正确执行。
    目前通过ODBC连接数据库时,会如下设置内核参数:
    SET extra_float_digits = 2;
    SET DateStyle = 'ISO';

    这些参数可能会导致ODBC客户端的行为与gsql客户端的行为不一致,例如,Date数据显示方式、浮点数精度表示等。如果实际期望和这些配置不符,建议在ODBC应用代码中显式设定这些参数。

    M-Compatibility模式数据库下,extra_float_digits的默认值为0。

Windows下配置数据源

Windows操作系统自带ODBC数据源管理器,无需用户手动安装管理器便可直接进行配置。

  1. 替换客户端GaussDB驱动程序。

    根据需要,将包名为GaussDB-Kernel_数据库版本号_Windows_X64_Odbc.tar.gz的64位驱动或包名为GaussDB-Kernel_数据库版本号_Windows_X86_Odbc.tar.gz的32位驱动解压后,单击gsqlodbc.exe进行驱动安装。

  2. 打开驱动管理器。

    请使用ODBC版本对应的ODBC驱动管理器(如果使用64位ODBC驱动,必须要使用64位的ODBC驱动管理器,假设操作系统安装盘符为C盘,如果是其他盘符,请对路径做相应修改)。

    • 如果需要在64位操作系统使用32位ODBC驱动请使用:C:\Windows\SysWOW64\odbcad32.exe,请勿直接使用“控制面板 > 管理工具 > 数据源(ODBC)”。

      WOW64的全称是"Windows 32-bit on Windows 64-bit",C:\Windows\SysWOW64\存放的是64位系统上的32位运行环境。而C:\Windows\System32\存放的是与操作系统一致的运行环境,具体的技术信息请查阅Windows的相关技术文档。

    • 32位操作系统请使用:C:\Windows\System32\odbcad32.exe,或者单击“计算机 > 控制面板 > 管理工具 > 数据源(ODBC)”打开驱动管理器。
    • 64位操作系统请使用:控制面板 > 管理工具 > 数据源(ODBC) 打开驱动管理。

  3. 配置数据源。

    在打开的驱动管理器上,选择“用户DSN > 添加 > GaussDB Unicode”,然后进行配置。如下图1所示:

    图1 ODBC Driver Setup

    参数说明请参见Linux下配置数据源文件配置参数。

    其中单击Datasource可以选择配置是否打印日志,单击后弹出对话框如下图2所示:

    图2 Advanced Options Page1

    此界面上配置的用户名及密码信息,将会被记录在Windows注册表中,再次连接数据库时不再需要输入认证信息。但是出于安全考虑,建议在单击“Save”按钮保存配置信息前,清空相关敏感信息,在使用ODBC的连接API时,再传入所需的用户名、密码信息。

  4. SSL模式。

    3中设置窗口的“SSL Mode”选项调整至“require”。

    表4 Sslmode的可选项及其描述

    Sslmode

    是否会启用SSL加密

    描述

    disable

    不使用SSL安全连接。

    allow

    可能

    如果数据库服务器要求使用,则可以使用SSL安全加密连接,但不验证数据库服务器的真实性。

    prefer

    可能

    如果数据库支持,那么首选使用SSL安全加密连接,但不验证数据库服务器的真实性。

    require

    必须使用SSL安全连接,但是只做了数据加密,并不验证数据库服务器的真实性。

    verify-ca

    必须使用SSL安全连接,并且验证数据库是否具有可信证书机构签发的证书。当前windows ODBC不支持cert方式认证。

    verify-full

    必须使用SSL安全连接,在verify-ca的验证范围之外,同时验证数据库所在主机的主机名是否与证书内容一致。当前windows ODBC不支持cert方式认证。

    用户通过ODBC连接GaussDB服务器时,可以通过开启SSL加密客户端和服务器之间的通讯。在使用SSL时,默认用户已经获取了服务端和客户端所需要的证书和私钥文件,关于证书等文件的获取请参考Openssl相关文档和命令。

  5. 测试连接。

    单击Test进行测试。

    • 如果显示如下,则表明配置正确,连接成功。
      图3 配置成功
    • 若显示ERROR信息,则表明配置错误。请重新检查上述配置是否正确。
    目前通过ODBC连接数据库时,会设置以下内核参数:
    SET extra_float_digits = 2;
    SET DateStyle = 'ISO';

    这些参数可能会导致ODBC客户端的行为与gsql客户端的行为不一致,例如,Date数据显示方式、浮点数精度表示等。如果实际期望和这些配置不符,建议在ODBC应用代码中显式设定这些参数。

    M-Compatibility模式数据库下,extra_float_digits的默认值为0。

操作示例

以开发源程序DBtest.c为例,此示例演示如何通过ODBC获取和处理GaussDB中的数据。

前提条件:数据源已配置成功(完整示例请参见获取和处理数据库中的数据章节)。

 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
// DBtest.c (compile with: libodbc.so)
// 程序头文件和全局变量请参考完整示例

// 申请环境句柄。       
V_OD_erg = SQLAllocHandle(SQL_HANDLE_ENV,SQL_NULL_HANDLE,&V_OD_Env);     
if ((V_OD_erg != SQL_SUCCESS) && (V_OD_erg != SQL_SUCCESS_WITH_INFO))        
{           
   printf("Error AllocHandle\n");           
   exit(0);        
}

// 设置版本信息(环境属性)。         
SQLSetEnvAttr(V_OD_Env, SQL_ATTR_ODBC_VERSION, (void*)SQL_OV_ODBC3, 0);

// 申请连接句柄。      
V_OD_erg = SQLAllocHandle(SQL_HANDLE_DBC, V_OD_Env, &V_OD_hdbc);     
if ((V_OD_erg != SQL_SUCCESS) && (V_OD_erg != SQL_SUCCESS_WITH_INFO))      
{                     
   SQLFreeHandle(SQL_HANDLE_ENV, V_OD_Env);          
   exit(0);       
}

// 获取用户名和用户密码。
char *userName;
userName = getenv("EXAMPLE_USERNAME_ENV");
char *password;
password = getenv("EXAMPLE_PASSWORD_ENV");

// 设置连接属性。
SQLSetConnectAttr(V_OD_hdbc, SQL_ATTR_AUTOCOMMIT,(SQLPOINTER *)SQL_AUTOCOMMIT_ON, 0);

// 连接数据库,这里的userName与password分别表示连接数据库的用户名和用户密码。
// 如果odbc.ini文件中已经配置了用户名密码,那么这里可以留空("");但是不建议这么做,因为一旦odbc.ini权限管理不善,将导致数据库用户密码泄露。    
V_OD_erg = SQLConnect(V_OD_hdbc, (SQLCHAR*) "gaussdb", SQL_NTS,  
				   (SQLCHAR*) userName, SQL_NTS,  (SQLCHAR*) password, SQL_NTS);        
if ((V_OD_erg != SQL_SUCCESS) && (V_OD_erg != SQL_SUCCESS_WITH_INFO))      
{           
  printf("Error SQLConnect %d\n",V_OD_erg);            
  SQLFreeHandle(SQL_HANDLE_ENV, V_OD_Env);       
  exit(0);        
}     
printf("Connected !\n");

相关文档