返回首页

gbase数据、南大通用产品文档:GBase8c

更新日期:2024年09月11日

Linux 下配置数据源
将GBase 8c 提供的ODBC DRIVER(psqlodbcw.so)配置到数据源中便可使用。配置数
据源需要配置“odbc.ini”和“odbcinst.ini”两个文件
(在编译安装unixODBC 过程中生成且默认
放在“/usr/local/etc”目录下),并在服务器端进行配置。
操作步骤
步骤1 获取unixODBC 源码包。
获取参考地址:https://sourceforge.net/projects/unixodbc/files/unixODBC/2.3.9/
unixODBC-2.3.9pre.tar.gz/download
步骤2 安装unixODBC。
如果机器上已经安装了其他版本的unixODBC,
可以直接覆盖安装。

GBase 8c V5 开发者手册
南大通用数据技术股份有限公司
90
目前不支持unixODBC-2.2.1 版本。以unixODBC-2.3.0 版本为例,在客户端执行如下命
令安装unixODBC。默认安装到“/usr/local”目录下,生成数据源文件到“/usr/ local/etc”目录
下,库文件生成在“/usr/local/lib”目录。
步骤3 替换客户端驱动程序。
(1)
解压tar 包。解压后会得到两个文件夹:lib 与odbc,在odbc 文件夹中还会有一个lib
文件夹。
/odbc/lib 中会有“psqlodbca.la”,“psqlodbca.so”,
“psqlodbcw.la”和“psqlodbcw.so”
四个文件,将这四个文件拷贝到“/usr/local/lib”目录下。
(2)
将lib 目录中的库拷贝到“/usr/local/lib”目录下。
步骤4 配置数据源。
(1)
配置ODBC 驱动文件。
在“/usr/local/etc/odbcinst.ini”文件中追加以下内容。
[GaussMPP] Driver64=/usr/local/lib/psqlodbcw.so setup=/usr/local/lib/psqlodbcw.so
odbcinst.ini 文件中的配置参数说明如表6-8 所示。
表6-8 odbcinst.ini 文件配置参数
参数
描述
示例
[DriverName]
驱动器名称,对应数据源
DSN 中的驱动名。
[DRIVER_N]
Driver64
驱动动态库的路径。
Driver64=/usr/local/lib/
psqlodbcw.so
setup
驱动安装路径,与Driver64
中动态库的路径一致。
setup=/usr/local/lib/
psqlodbcw.so
(2)
配置数据源文件。
在“/usr/local/etc/odbc.ini”文件中追加以下内容。
[MPPODBC]
Driver=GaussMPP
Servername=10.145.130.26
(数据库Server IP)Database=postgres(数
据库名)Username=gbase (数据库用户名)Password= (数据库用户密码)
Port=15432 (数据库侦听端口)
Sslmode=allow
odbc.ini 文件配置参数说明如表6-9 所示。

GBase 8c V5 开发者手册
南大通用数据技术股份有限公司
91
表6-9 odbc.ini 文件配置参数
参数
描述
示例
[DSN]
数据源的名称。
[MPPODBC]
Driver
驱动名,对应odbcinst.ini 中的
DriverName。
Driver=DRIVER_N
Servername
服务器的IP 地址。可配置多个
IP 地址。
Servername=10.145.130.2 6
Database
要连接的数据库的名称。
Database=postgres
Username
数据库用户名称。
Username=gbase
Password
数据库用户密码。
Password=
说明
ODBC 驱动本身已经对内存密码进
行过清理,
以保证用户密码在连接后
不会再在内存中保留。
但是如果配置了此参数,由于
UnixODBC 对数据源文件等进行缓
存,可能导致密码长期保留在内存
中。
推荐在应用程序连接时,
将密码传递
给相应API,而非写在数据源配置文
件中。同时连接成功后,应当及时清
理保存密码的内存段。
Port
服务器的端口号。
Port=15432
Sslmode
开启SSL 模式
Sslmode=allow
Debug
设置为1 时,将会打印psqlodbc
驱动的mylog,日志生成目录为
/tmp/。设置为0 时则不会生成。
Debug=1
UseServerSidePrep
are
是否开启数据库端扩展查询协
议。
可选值0 或1,默认为1,表示
UseServerSidePrepare=1

GBase 8c V5 开发者手册
南大通用数据技术股份有限公司
92
打开扩展查询协议。
UseBatchProtocol
是否开启批量查询协议(打开可
提高DML 性能)

可选值0 或
者1,默认为1。
当此值为0 时,不使用批量查询
协议(主要用于与早期数据库版
本通信兼容)。
当此值为1 ,并且数据库
support_batch_bind 参数存在且
为on 时,将打开批量查询协议。
UseBatchProtocol=1
ForExtensionConn
ect or
这个开关控制着savepoint 是否
发送,
savepoint 相关问题可以注
意这个开关。
ForExtensionConnector=1
UnamedPrepStmtT
hr eshold
每次调用SQLFreeHandle 释放
Stmt 时,
ODBC 都会向server 端
发送一个Deallocate plan_name
语句,业务中存在大量这类语
句。为了减少这类语句的发送,
我们将stmt->plan_name 置空,
从而使得数据库识别这个为
unamed stmt。增加这个参数对
unamed stmt 的阈值进行控制。
UnamedPrepStmtThresho ld=100
ConnectionExtraIn
fo
GUC 参数connection_info
(参见
connection_info)中显示驱动部
署路径和进程属主用户的开关。
ConnectionExtraInfo=1
说明
默认值为0。当设置为1 时,ODBC
驱动会将当前驱动的部署路径、
进程
属主用户上报到数据库中,记录在
connection_info





connection_info )里;同时可以在

GBA-02-600
错误码
错误标识
错误信息
GBA-02-600
ER_INTERNAL
Gbase internal error: %s
错误出现原因
内部错误码,如因被Kill 而异常终止查询;内部数据结构错误等;数据发送异
常等
分析与建议
一般情况下不会出现此错误,一旦出现该错误,请根据错误信息联系技术支持
获得帮助

使用 LOCK TABLE 语句来控制通过其他进程访问表。xzzz
语法

元素
描述
限制
语法
owner
synonym 或
table 的所有者
必须为指定的对象的所有者
所有者名称
synonym 要被锁定的表的
同义词
同义词以及指向它的表必须存在 标识符
table
要被锁定的表
请参阅 用法 的第一段。
标识符
用法
此语句是对 SQL 的 ANSI/ISO 标准的扩展。
如果下列任一为真,则您可使用 LOCK TABLE 来锁定表:

您是该表的所有者。

您有对该表或对该表中列的 Select 权限,或通过直接授权,或通过授权
给 PUBLIC 或给您的当前角色。
如果该表已被另一进程在 EXCLUSIVE 模式下锁定,或如果您请求 EXCLUSIVE
锁而另一用户已经以 SHARE 模式锁定了同一张表,则 LOCK TABLE 语句失
败。
SHARE 关键字以共享模式锁定表。共享模式允许其他进程对该表的读访问,但
拒绝写访问。如果以共享模式锁定表,则其他进程不可更新或删除数据。

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 734
EXCLUSIVE 关键字以排他模式锁定表。此模式拒绝其他进程对表进行读访问,也
拒绝写访问。 在下列语句期间,排他模式锁定自动地发生:

ALTER FRAGMENT

ALTER INDEX

ALTER TABLE

CREATE INDEX

DROP INDEX

RENAME COLUMN

RENAME TABLE

START VIOLATIONS TABLE

STOP VIOLATIONS TABLE

TRUNCATE
在一些 DDL 操作中的 ONLINE 关键字
在某些 ALTER FRAGMENT、DROP INDEX 和 CREATE INDEX 操作期间,包
括 ONLINE 关键字在内,当并发的会话尝试访问同一表时,可减低运行时出错的
风险。要获取更多关于支持 ONLINE 关键字选项的那些 DDL 语句的锁定行为
的信息,请参阅这些主题:

在 ATTACH 操作中使用 ONLINE 关键字

在 DETACH 操作中使用 ONLINE 关键字

在 MODIFY 操作中使用 ONLINE 关键字

CREATE INDEX 的 ONLINE 关键字

DROP INDEX 的 ONLINE 关键字.
在辅助服务器上的 LOCK TABLE 语句行为
在高可用性集群中,您可从可更新的辅助服务器上设置表的排他锁。对于来自辅
助服务器的排他模式锁请求,会话可读该表但不可更新它。此行为类似于辅助服
务器上的共享访问模式;即,当一会话在给定的表上有排他锁时,其他会话不可
获取那个表上的共享或排他锁。
在只读的辅助服务器上,发出 LOCK TABLE 语句的会话不锁定该表,且数据库
服务器不向客户端返回错误。

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 735
集群中的共享模式锁的行为与单独服务器的相同。在成功地运行 LOCK TABLE
语句之后,用户可读该表但不可改变它,直到释放该锁为止。
对带有共享锁的表的并发访问
在成功地执行指定 IN SHARE MODE 关键字的 LOCK TABLE 语句之后,其他
用户可读该表,但不可改变他的数据,直到释放该锁为止。在支持事务日志记录
的数据库中,SELECT 语句可在罗列在 FROM 子句中的每一表上隐式地放置一
共享锁,以便防止其他用户修改那些表,直到提交或回滚该查询为止。
对带有排他锁的表的并发访问
成功地执行带有 IN EXCLUSIVE MODE 选项的 LOCK TABLE 语句之后,其他
用户不可获得对该指定表的锁。然而,当您尝试对那个表进行 DDL 操作时,如
果一并发的会话(例如,通过打开游标)正在访问同一表,则您可能收到 RSAM
error -106。此错误还可影响某些 DDL 语句自动地在这些表上放置的隐式的锁。
这可能是因为表锁不排除表访问。排他锁防止其他用户获得锁,但不防止那些等
待释放该排他锁的写操作打开该表,或对该表的 Dirty Read 操作。您可设置
IFX_DIRTY_WAIT 环境变量来指定 DDL 等待指定的秒数,以便 Dirty Read 操
作提交或回滚。
当表中的一行或多行被排他锁锁定时,对其他用户的影响部分地取决于他们的事
务隔离级别。除了 Dirty Read 隔离级别之外的所有其他隔离级别中的其他用户可
能遇到锁定错误,比如,由于在指定的时间限制内未释放锁,或由于发生死锁情
况,导致事务失败。
在行级锁定影响一些行的表上,通过启用事务来在行级锁定的表中读取数据的最
近提交的版本,可降低锁定冲突的风险,而不是等待提交或回滚在那行上持有该
锁的事务。这可通过几种不同的方法实现,包括:

从单个事务发出此 SQL 语句
SET ISOLATION TO COMMITTED READ LAST COMMITTED;

对于使用 Committed Read 或 Read Committed 隔离级别的所有会话,请
将 USELASTCOMMITTED 配置参数设置为 'ALL' 或 'COMMITTED
READ',或者另发出带有 'ALL' 或 'COMMITTED READ' 作为会话环
境选项的 SET ENVIRONMENT USELASTCOMMITTED 语句。

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 736

对于使用 Dirty Read 或 Read Uncommitted 隔离级别的所有会话,请将
USELASTCOMMITTED 配置参数设置为 'ALL' 或 'DIRTY READ',
或者另发出带有 'ALL' 或 'DIRTY READ' 作为会话环境选项的 SET
ENVIRONMENT USELASTCOMMITTED 语句。

对于在数据库中为其定义 user.sysdbopen( ) 过程的用户,DBA 可定义那
个过程来包括 SET ENVIRONMENT USELASTCOMMITTED 语句,此语
句带有 'ALL' 或 'COMMITTED READ' 作为会话环境选项,且还发出
SET ISOLATION 语句来设置 Committed Read 作为隔离级别。

对于在数据库中不存在为其定义 user.sysdbopen( ) 过程的用户,DBA 可
定义 PUBLIC.sysdbopen 过程,该过程指定相同的 SET
ENVIRONMENT USELASTCOMMITTED 和 SET ISOLATION 语句。
仅当行级锁定有效时,而不是当另一会话持有对整个表的排他锁时,此 LAST
COMMITTED 隔离特性才有用。当 LOCK TABLE 应用表级锁时,此特性对于指
定的表不可用。要了解更多关于此 LAST COMMITTED 特性,为了并发访问有
些行被排他锁锁定的表,且为了在可支持此特性的表的种类上的限制的信息,请
参阅 Committed Read 的 LAST COMMITTED 选项。
带有事务日志记录的数据库
如果您以事务日志记录创建的数据库,则 LOCK TABLE 语句成功,仅当在事务
之内执行它。在您可执行 LOCK TABLE 语句之前,必须发出 BEGIN WORK 语
句。
在符合 ANSI 的数据库中,事务是隐式的。如果指定的表尚未被另一进程锁定,
则 LOCK TABLE 语句成功。
下列准则适用于在事务内使用 LOCK TABLE 语句:

您不可锁定系统目录表。

您不可在事务内在共享的和排他的表锁之间切换。例如,一旦您在共享模
式下锁定该表,不可将该锁定模式升级为排他。

如果在访问表中的一行之前,您发出 LOCK TABLE 语句,且 PDQ 为
生效,则不为该表设置行锁。以此方式,您可覆盖行级锁定并避免超过在
数据库服务器配置中定义的锁定的最大数目。(但如果 PDQ 生效,则您
可能用尽锁,发生错误 -134,除非您的 ONCONFIG 文件的 LOCKS 参
数指定足够大的锁定数。)

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 737

在完成事务之后,自动地释放所有行和表锁。 在使用事务日志记录的数
据库中,UNLOCK TABLE 语句失败。

同一用户可显式地使用 LOCK TABLE 来并发地锁定最多 32 个表。
(使用 SET ISOLATION 来指定适当的隔离级别,诸如 Repeatable
Read,如果在单个事务期间您需要从多于 32 个表锁定行的话。)
下列示例展示如何在以事务日志记录创建了的数据库中更改表的锁定模式:
BEGIN WORK;
LOCK TABLE orders IN EXCLUSIVE MODE;
...
COMMIT WORK;
BEGIN WORK;
LOCK TABLE orders IN SHARE MODE;
...
COMMIT WORK;
警告: 建议您在事务中不要使用无日志记录的表。如果您需要在事务中使用无日
志记录的表,或在排他模式下锁定该表,或设置隔离级别为 Repeatable Read,以
防并发问题。
无事务日志记录的数据库
在无事务日志记录(通过省略 CREATE DATABASE 语句中的 WITH LOG 关键
字)创建了的数据库中,在任一下列事件之后,释放通过 LOCK TABLE 语句设
定了的表锁:

执行 UNLOCK TABLE 语句。

用户关闭该数据库。

用户从应用程序退出。
要更改对表的锁定模式,请以 UNLOCK TABLE 语句释放该锁,然后发出新的
LOCK TABLE 语句。
下列示例展示如何在无日志记录的表中更改锁定模式:
LOCK TABLE orders IN EXCLUSIVE MODE;
. . .
UNLOCK TABLE orders;
. . .
LOCK TABLE orders IN SHARE MODE;

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 738
锁定粒度
锁定表的缺省的粒度是在页级,或者您在 IFX_TABLE_LOCKMODE 环境变量
中指定的任何级别(或 PAGE 或 ROW),若未设定,则通过 ONCONFIG 文件
中的 DEF_TABLE_LOCKMODE 设置。CREATE TABLE 或 ALTER TABLE 语
句的 LOCK MODE 子句可通过指定 PAGE 或 ROW 覆盖缺省的锁定粒度。仅
行级锁支持 GBase 8s 的 LAST COMMITTED 特性。
然而,LOCK TABLE 语句通常锁定整个表,覆盖对该表的所有其他锁定粒度规
范。
在所有这些上下文中,数据“锁模式”都表示锁定粒度。然而,在 SET LOCK
MODE 语句的上下文中,“锁模式”指的是当进程尝试访问另一进程已经锁定的行
或表时,数据库服务器的行为。