2. GBase 8s FAQ

问题知识库

2.1. 自定义TASK执行后,查询ph_run,执行结果run_retcode报-23197错误

数据库版本:ALL
操作系统:ALL
硬件平台:ALL
描述:
自定义TASK执行后,查询ph_run,执行结果run_retcode报-23197错误
解决方法:
-23197错误的函数是字符集错误。
原因是业务库的的字符集与sysadmin库的默认字符集en_US.819不匹配,在sysadmin库中创建不在sysadmin库中执行的TASK时,应在tk_dbs中指定具体的业务库名称(默认的tk_dbs为sysadmin),使TASK可以业务库的DB_LOCALE环境来执行。


2.2. 使用GBase MTK迁移数据后,使用ResultSetMetaData查询报java.sql.SQLException: Encoding or code set not supported.错误

数据库版本:ALL
操作系统:ALL
硬件平台:ALL
描述:
使用GBase MTK迁移数据后,使用ResultSetMetaData查询报java.sql.SQLException: Encoding or code set not supported.错误
解决方法:
原因是迁移的字段是lvarchar(20),DB_LOCALE使用的是utf8。此环境下每3个字节表示一个汉字,当这个表里有7个汉字时,第7个汉字只有三分之二迁移到了数据库中,使用ResultSetMetaData查询将会报错。
使用GB18030字符集代替,或者增大字段大小。使用IFX_USE_STRENC=true参数可避免报错。


2.3. Cannot Open Primary Chunk

数据库版本:ALL
操作系统:ALL
硬件平台:ALL
描述:
服务器异常断电重启后,数据库启动失败,检查日志报:
Warning:stat() failed for chunk file /data/dbs/rootdbs
Cannot Open Primary Chunk ‘/data/dbs/rootdbs’, errno = 2
解决方法:
原因比较明确,errno为2表示无法读取rootdbs,需要在操作系统层面上确认rootdbs所属的文件已经存在或者设备正常连接,且权限正确(660)。独立的目录,很有可能是磁盘阵列未能正确挂载。


2.4. no free disk space

数据库版本:ALL
操作系统:ALL
硬件平台:ALL
描述:
业务报插入数据到表中错误:
Could net insert new row into the table.
ISAM error: no free disk space
解决方法:
检查数据库空间,表所在的dbspace上仍有剩余空间;检查表,未达到各种上限(报的是无空间,仍需要检查表)。发现有blob字段,继续检查smartblobspace空间,发现显然有空间,但MetaData的free为0。增加一个chunk,并指定较大的-Ms空间,问题解决。


2.5. 创建表报错误261: Cannot create file for table table-name.

数据库版本:ALL
操作系统:ALL
硬件平台:ALL
描述:
创建表时第265行报261错误及102ISAM错误,该错误的原因是不能为表创建文件。
解决方法:
创建的表的语句如下:

create table tab1 (
  col1 varchar(40),
  col2 varchar(40),
  ...中间省略一些行...
  col263 date
);

从表结构上看,该表拥有大量的varchar/lvarchar类型的字段(大约240个),在当前的datadbs01(页大小为2KB)下创建失败,报上述错误。
在16KB页大小的其它dbspace上创建该表能成功,通过oncheck -pt 打印该表的信息,显示如下:

[gbasedbt@instance-ihbhwu9m ~]$ oncheck -pt myttdb:tab1

TBLspace Report for myttdb:gbasedbt.tab1

    Physical Address               7:2256
    Creation date                  07/02/2020 16:49:05
    TBLspace Flags                 902        Row Locking
                                              TBLspace contains VARCHARS
                                              TBLspace use 4 bit bit-maps
    Maximum row size               17550     
    Number of special columns      244  

特别注意到: Number of special columns 244 (特殊字段有244个)
继续通过oncheck -pP 打印该表的partition page页信息,显示如下:

[gbasedbt@instance-ihbhwu9m ~]$ oncheck -pP 7 2256
addr             stamp    chksum nslots flag type         frptr frcnt next     prev
7:2256           287175   6914   5      802  PARTN        2162  14198 0        0       
        slot ptr   len   flg
        1    24    136   0  
        2    160   40    0  
        3    200   1952  0  
        4    2152  0     0  
        5    2152  10    0 

特别注意到:frptr显示已经使用2162字节的空间。
这时问题可以明确了:在2KB页的空间里创建该表,partition page至少需要2162字节的空间,但2KB的大小只有2048,故无法创建该表。

至于为什么会需要这么多空间?
partition page的slot 3中需要8个字节来描述varchar/lvarchar/nvarchar等这样特殊字段。


2.6. 创建存储过程报错误282: Found a quote for which there is no matching quote.

数据库版本:ALL
操作系统:ALL
硬件平台:ALL
描述:
创建存储过程时第4行报282错误,该错误的原是说引号不匹配。
解决方法:
创建的存储过程语句如下:

drop procedure if exists proc1;
create procedure proc1(out p_cursor sys_refcursor)
  define v_sqlstr lvarchar(1024);
  let v_sqlstr = "select tabid,tabname 
                  from systables
                  where tabid > 99
                    and tabtype = 'T'";
  open p_cursor for v_sqlstr;
end procedure;

从let 语句上看,只有简单的双引号、单引号,且存在一一对应关系,不应存在引号不匹配的情况。
考虑到引号内存在换行,那么可能的原因就是数据库没有开启ALLOW_NEWLINE。
在没有开启ALLOW_NEWLINE的情况下,引号内的内容不允许换行。即:语句需要改为

  -- 单行
  let v_sqlstr = "select tabid,tabname from systables where tabid > 99 and tabtype = 'T'";
  -- 或者
  let v_sqlstr = "select tabid,tabname " || 
                 "from systables " ||
                 "where tabid > 99 " ||
                 "  and tabtype = 'T'";

为避免出现字符串换行出现的此类问题,可以在ONCONFIG配置文件中开启ALLOW_NEWLINE(默认为0,不开启),设置为1为开启允许换行
ALLOW_NEWLINE 1
如果临时仅仅是当前会话允许使用换行,那么可以先执行过程ifx_allow_newline('f')

execute procedure ifx_allow_newline('t');

然后,该会话在关闭前或者修改allow_newline参数前,将允许字符串换行。


2.7. 删除表记录时,报“692: Key value for constraint ( 主键约束名称 ) is still being referenced.”

数据库版本:ALL
操作系统:ALL
硬件平台:ALL
描述:
删除表记录时,报“692: Key value for constraint ( 主键约束名称 ) is still being referenced.”
解决方法:
1,报错信息明显的提示,删除的记录被外键引用了,故不能删除;
2,如果需要删除该记录,应当先删除外键所在表的该值所有记录,以下语句可获取外键参考所在的表的名称:

select t.tabname 
from sysconstraints c, systables t, sysreferences r
where c.tabid = t.tabid 
and   c.constrid = r.constrid
and   c.constrtype = 'R'
and   r.ptabid = (select tabid from systables where tabname = '主键表名');

3,使用外键时,我们有时还会用到 级联删除(ON DELETE CASCADE) 功能,使用该功能:删除主表记录时,外键参考表相应的记录均删除。示例:

create table dept (
  dept_id serial, 
  dept_name varchar(60) not null, 
  manager_id int, 
  primary key(dept_id) constraint pk_dept_dept_id
);

create table emp (
  emp_id serial, 
  dept_id int, 
  foreign key (dept_id) references dept(dept_id) on delete cascade constraint fk_emp_dept_id
);

2.8. 基于java的环境中,使用byte字段类型时,服务器上会产生IfxTmpFile_xxxxxxxxxxxxxx的文件。

数据库版本:ALL
操作系统:ALL
硬件平台:ALL
描述:
基于java的环境中,使用byte字段类型时,服务器上会产生IfxTmpFile_xxxxxxxxxxxxxx的文件。
解决方法:
该问题产生的原因是受到了JDBC的环境变量参数LOBCACHE的影响(如果未指定,使用缺省默认值4096)。
LOBCACHE参数确定从数据库服务器访存的大对象数据的缓冲区大小。大于 0 的数值时:
在内存中分配来保存数据的最大字节数。如果数据大小超过 LOBCACHE 值,则将数据存储在临时文件中;如果在创建此文件期间发生安全违规,则将数据存储在内存中;为零时:始终将数据存储在文件中。如果发生安全违规,则驱动程序不尝试在内存中存储数据。为负数时:始终将数据存储在内存中。如果得不到所需的内存量,则发生错误。
根据实际需要调整该参数即可。


2.9. 使用nvl2或者decode或者case时,报“800: Corresponding data types must be compatible in CASE expression or DECODE function.”错误。

数据库版本:3.5.x之前
操作系统:ALL
硬件平台:ALL
描述:
使用nvl2或者decode或者case时,报“800: Corresponding data types must be compatible in CASE expression or DECODE function.”错误。
解决方法:
800错误表示case或者decode的各个条件返回值需要一致或者是兼容的。 如下,col2为datetime year to second类型,两个条件的返回值:col2 + 1为datetime year to second,而to_date的返回值的类型是datetime year to fraction(5)。系统严格的认为两个并不一致,故而报800错误。

nvl2(col2, col1 + 1, to_date('2020-05-26 00:00:00','yyyy-mm-dd hh24:mi:ss'))

需将某改为一致:

nvl2(col2, 
to_date(to_char(col2 + 1,'yyyy-mm-dd hh24:mi:ss'),'yyyy-mm-dd hh24:mi:ss'), 
to_date('2020-05-26 00:00:00','yyyy-mm-dd hh24:mi:ss'))
-- 或者使用强制转换
nvl2(col2, 
col1 + 1, 
to_date('2020-05-26 00:00:00','yyyy-mm-dd hh24:mi:ss')::datetime year to second)
-- 注: '::'表示转换后的类型

2.10. insert into … select skip … first 报-201语法错误

数据库版本:ALL
操作系统:ALL
硬件平台:ALL
描述:
语句如下:

insert into t1 (col1)
select col1 from t2 order by col1 desc skip 0 first 5;

单独执行select能正常执行,但整个语句会报-201语法错误。
解决方法:
当前的数据库版本为了支持limit m,n语法,支持将skip m first n后置。但使用时还是尽量使用原始的写法。

insert into t1 (col1)
select skip 0 first 5 col1 from t2 order by col1 desc;

将skip紧接着select 关键字。


2.11. 执行ids_install安装时,报“The version file is not exist.”

数据库版本:ALL
操作系统:ALL
硬件平台:ALL
描述:
执行ids_install安装时,报“The version file is not exist.”
解决方法:
操作系统确少必要的unzip工具,需要安装unzip。CentOS系统中可通过yum install unzip安装。
如果安装目录下的隐藏文件 .gbase.properties 缺失,也会出现此问题。重新解压缩安装包后,再次安装。


2.12. 执行ids_install安装时,报“No Java virtual machine could be found from your PATH environment variable. You must install a VM prior to running this program.”

数据库版本:ALL
操作系统:ALL
硬件平台:ALL
描述:
执行ids_install安装时,报“No Java virtual machine could be found from your PATH environment variable. You must install a VM prior to running this program.”
解决方法:
提示信息为无Java虚拟机,按照提示安装JRE/JDK。支持的JRE/JDK版本为1.6及以上,如CentOS自带的java-1.8.0-openjdk。


2.13. 执行ids_install安装时,报“The parent directory of the user install path is not exists, please choose another one.”

数据库版本:ALL
操作系统:ALL
硬件平台:ALL
描述:
执行ids_install安装时,报“The parent directory of the user install path is not exists, please choose another one.”
解决方法:
提示信息为指定的目录上级目录不存在。默认的安装目录为:/opt/GBASE/gbase,如果/opt/GBASE目录不存在,则会报这个错误。需要在安装前创建/opt/GBASE目录。


2.14. 执行ids_install安装时,报“User install directory is not empty, please chooose another one.”

数据库版本:ALL
操作系统:ALL
硬件平台:ALL
描述:
执行ids_install安装时,报“User install directory is not empty, please chooose another one.”
解决方法:
提示信息为指定的目录非空。安装数据库需要在空目录或者不存在的目录下(上级目录需存在,系统会自动创建目录),手工指定其它非空目录或者不存在目录(上级目录需存在,系统会自动创建目录)。


2.15. 执行数据库初始化或者启动数据库时,报分配内存失败

数据库版本:ALL
操作系统:ALL
硬件平台:ALL
描述:
执行数据库初始化或者启动数据库时,报

Allocating and attaching to shared memory…FAILED
WARNING: server initialization failed or timed out.
Check the message log, online.log, for errors.

解决方法:
出现问题,根据提示要求查看online.log,使用onstat -m命令可查看最近20行online.log日志信息。如果日志里包含类似以下信息:

19:03:42 shmget: [EEXIST][17]: key 52564801: shared memory already exists
19:03:42 mt_shm_init: can’t create resident segment,

表示数据库的内存段已经被占用,可能的情况是:
1,当前实例已经启动,即通过onstat -命令检查状态,如果已经是On-Line状态,即 GBase Database Server Version 12.10.FC4G1AEE On-Line Up 00:07:02 208516 Kbytes
表示数据库不需要再初始化或者重新启动,保持现有状态即可。
2,当前实例未启动,即通过onstat -命令检查状态,如果已经是未启动状态,即
shared memory not initialized for GBASEDBTSERVER 'ol_gbasedbt1210'
则表示之前的数据库关闭或者异常时,内存未能及时释放,执行onclean -ky命令强制清理内存,然后通过ipcs -m命令查看key中与报错信息中一致的0x52564801是否存在,如果不存在,可以重新启动数据库实例;如果存在,使用root用户执行ipcrm -M 0x52564801清理共享内存,同时清理0x525648XX 开头各个内存段,完成后可以重新启动数据库实例。


2.16. 执行数据库初始化或者启动数据库时,报打开主块失败

数据库版本:ALL
操作系统:ALL
硬件平台:ALL
描述:
执行数据库初始化或者启动数据库时,报

Opening primary chunks…FAILED
oninit: Fatal error in shared memory initialization
WARNING: server initialization failed or timed out.
Check the message log, online.log, for errors. 

解决方法:
出现问题,根据提示要求查看online.log,使用onstat -m命令可查看最近20行online.log日志信息。如果日志里包含类似以下信息:
1,19:07:08 The chunk '/opt/gbase/storage/rootdbs' must have READ/WRITE permissions for owner and group (660).
表示数据库使用的chunk对应的文件或者文件系统权限不对,按提示要求修改为属主及属组均为gbasbedbt,权限为660(即:chown gbasedbt:gbasedbt /opt/gbase/storage/rootdbs , chmod 660 /opt/gbase/storage/rootdbs),完成后重新启动数据库。
2,19:10:51 The chunk '/opt/gbase/storage/rootdbs' must have READ/WRITE permissions for owner (600).
数据库使用的chunk对应的文件或者文件系统权限应为属主及属组均为gbasbedbt,权限为660,这里提示需要600权限。说明oninit可执行文件的属主及权限不对,或者是非root用户安装的数据库。我们要求使用root用户来安装数据库。故在$GBASEDBTDIR目录下,使用root用户执行RUNasroot.installserver脚本以完成对所有已安装的文件的权限修正。同时修改chunk文件或者文件系统的属主及属组均为gbasbedbt,权限为660(即:chown gbasedbt:gbasedbt /opt/gbase/storage/rootdbs , chmod 660 /opt/gbase/storage/rootdbs),完成后重新初始化实例或者重启实例。


2.17. 连接数据库时,报 “908: Attempt to connect to database server (ol_gbasedbt1210) failed.”

数据库版本:ALL
操作系统:ALL
硬件平台:ALL
描述:
连接数据库时,报 “908: Attempt to connect to database server (ol_gbasedbt1210) failed.” 解决方法:
根据提示信息,表示当前无法连接到指定的数据库。对于此问题,需要从最底层往上排查。
首先,检查数据库的侦听是否正常,命令onstat -g ntt的输出结果中,thread name为soctcplst对应的address中应包括 主机名或IP地址|服务名称或者端口号|scotcp(如localhost.localdomain|ol_gbasedbt1210|soctcp),该信息来源地sqlhosts配置文件(建议在sqlhosts配置文件中指定IP地址及端口,而不是使用主机名或者服务名称)。如果不存在符合条件的soctcplst,则需要修改sqlhosts为正确配置,并重启数据库。如果存在soctcplst,但IP是本地loop地址(127.0.0.1),也需修改为实际物理IP,并重启数据库。
如果侦听正常,则继续检查操作系统防火墙设置,请关闭防火墙或者放通数据库使用的端口。


2.18. 执行ids_install安装时,报”./ids_install: line 3319: /tmp/install.dir.15072/Linux/resource/jre/jre/bin/java: cannot execute binary file”

数据库版本:ALL
操作系统:ALL
硬件平台:ALL
描述:
执行ids_install安装时,报

./ids_install: line 3319: /tmp/install.dir.15072/Linux/resource/jre/jre/bin/java: cannot execute binary file
./ids_install: line 3319: /tmp/install.dir.15072/Linux/resource/jre/jre/bin/java: Success

解决方法:
提示信息是数据库安装包里自带的java命令是不能执行的二进制文件,原因是:当前的平台与数据库安装包使用的平台不同(如x86平台上使用了其它平台(飞腾、龙芯、Power等)的安装包)。X86平台对应的文件名后缀是x86_64.tar,飞腾平台对应的文件名后缀是FT.tar,龙芯平台对应的文件名后缀是Loongson3B.tar。


2.19. 执行ids_install时,报“java.lang.Error: java.io.FileNotFoundException: /tmp/install.dir.4858/Linux/resource/jre/jre/lib/tzdb.dat (没有那个文件或目录)”

数据库版本:ALL
操作系统:ALL
硬件平台:ALL
描述:
执行ids_install时,报“java.lang.Error: java.io.FileNotFoundException: /tmp/install.dir.4858/Linux/resource/jre/jre/lib/tzdb.dat (没有那个文件或目录)”
解决方法:
tzdb.dat是一个链接文件,链接到 tzdb.dat -> /usr/share/javazi-1.8/tzdb.dat,若发现不存在这个目录和文件,可以创建链接至系统的tzdb.dat。
如:mkdir -p /usr/share/javazi-1.8 && ln -s /usr/lib/jvm/java-8-openjdk-amd64/jre/lib/tzdb.dat /usr/share/javazi-1.8/tzdb.dat
或者操作系统没有安装jdk,安装jdk(如openjdk1.8)即可。


2.20. 执行ids_install时,报“libjvm.so preloadLibrary(/tmp/install.dir.33990/Linux/resource/jre/jre/lib/amd64/libjava.so): libnsl.so.1: 无法打开共享对象文件: 没有那个文件或目录”

数据库版本:ALL
操作系统:Kylin V10Sp2或者UOS20(1021a)
硬件平台:ALL
描述:
执行ids_install时,报“libjvm.so preloadLibrary(/tmp/install.dir.33990/Linux/resource/jre/jre/lib/amd64/libjava.so): libnsl.so.1: 无法打开共享对象文件: 没有那个文件或目录”
解决方法:
安装libnsl: yum -y install libnsl


2.21. 安装过程中报“One or more prerequisite system libraries are not installed on your computer. Install libncurses.so.5 and then restart the installation program.”

数据库版本:ALL
操作系统:USO20(1021a)
硬件平台:ALL
描述:
安装过程中报“One or more prerequisite system libraries are not installed on your computer. Install libncurses.so.5 and then restart the installation program.”
解决方法:
1,安装ncurses-devel:yum -y install ncurses-devel
2,创建相应的链接文件为so.5

cd /usr/lib64
ln -s libncurses.so.6.1 libncurses.so.5
ln -s libtinfo.so.6.1 libtinfo.so.5

2.22. java addbatch时,每批行数多时,会报java.net.SocketException:Socket closed。

数据库版本:ALL
操作系统:ALL
硬件平台:ALL
描述:
java addbatch时,每批行数多时,会报java.net.SocketException:Socket closed。
解决方法:
增加以下参数 IFX_SOC_TIMEOUT=600000;IFX_SOC_KEEPALIVE=true;SOCKET_REC_BUF=1073741824


2.23. PDO_GBASEDBT 返回的元数据为大写

数据库版本:ALL
操作系统:ALL
硬件平台:ALL
描述:
PDO_GBASEDBT 返回的元数据为大写,需要返回小写
解决方法:
PDO::ATTR_CASE默认为PDO::CASE_UPPER,需设置为PDO::CASE_NATURAL
PDO_GBASEDBT 默认返回的元数据为大写,连接的属性上增加

$dbh->setAttribute(PDO::ATTR_CASE, PDO::CASE_NATURAL);

2.24. 使用druid时,数据库内存不断增加

数据库版本:ALL
操作系统:ALL
硬件平台:ALL
描述:
使用druid连接池时,数据库内存不断增加
解决方法:
预编译的SQL缓存(poolPreparedStatements(PSCache))在当前会话的持有者中,且不被其他连接所共享。导致数据库内存不断增加。
该参数默认是关闭的,但有时从Oracle环境(一般会设置为打开)迁移时,需要显式指定关闭。
druid.poolPreparedStatements值设置为false,且druid.maxPoolPreparedStatementPerConnectionSize值不设置或者设置为小于等于0。


2.25. 数据库压缩备份

数据库版本:ALL
操作系统:ALL
硬件平台:ALL
描述:
数据库如何进行压缩备份?
解决方法:
方法一:
1,在ONCONFIG配置文件中设置参数

BACKUP_FILTER /bin/gzip     # 调用操作系统压缩命令  
RESTORE_FILTER /bin/gunzip  # 调用操作系统对应解压缩命令  
LTAPESIZE 1024000000        # 如果需要逻辑日志备份,需要指定该大小(当BACKUP_FILTER配置时,LTAPESIZE不能是0(当然太小也不行))

2,正常执行备份恢复

ontape -s -L 0  
ontape -r

方法二:
1,正常执行备份

ontape -s -L 0  

2,使用操作系统命令压缩备份文件

gzip 主机名_0_L0

3,数据库恢复时,先解压再恢复

gunzip 主机名_0_L0.gz
ontape -r

注:方法二可脚本实现


2.26. UTF8字符集库导入GBK编码的文本

数据库版本:ALL
操作系统:ALL
硬件平台:ALL
描述:
字符集utf8的库如何导入gbk编码/8859-1编码的文本文件?
解决方法:
方法一、
1,设置DB_LOCALE为utf8,CLIENT_LOCALE为GB18030-2000
2,在dbaccess中直接导入

方法二、
1,将文本文件转码,如使用iconv

iconv -f ISO-8859 -t UTF-8 inputfile -o outputfile

2,使用DB_LOCALE/CLIENT_LOCALE均为utf8导入


2.27. 如何判断表是在哪个模式下创建的?

数据库版本:3.5.x及更新的版本(支持SQLMODE=Oracle的版本)
操作系统:ALL
硬件平台:ALL
描述:
如何判断表是在哪个模式下创建的?
解决方法:
通过systables中的flags(SMALLINT类型)标识来判断:
用于对永久表分类的代码:

类型 16进制值 说明
STANDARD 0 0x0 标准表
ROWID 1 0x1 已定义行标识列
UNDER 2 0x2 在超表之下创建的表
VIEWREMOTE 4 0x4 视图基于远程表
CDR 8 0x8 已定义 CDRCOLS
RAW 16 0x10 RAW 表
EXTERNAL 32 0x20 外部表
AUDIT 64 0x40 审计表属性 - FGA
AQT 128 0x80 视图是用于卸载 DWA 的 AQT
VIRTAQT 256 0x100 视图是虚拟 AQT
ORAMODE 16384 0x4000 Oracle模式下表

需要注意的是,该值应当使用bitand()来计算。


2.28. 导出正常,导入报-1264错误

数据库版本:3.5.x及更新的版本(支持SQLMODE=Oracle的版本)
操作系统:ALL
硬件平台:ALL
描述:
unload正常,load时报”1264: Extra characters at the end of a datetime or interval or timestamp with time zone.” 错误
解决方法:
提示很明确,导入时的日期时间数据格式不匹配,应当是设置了GL_DATETIME环境变量。关闭GL_DATETIME环境变量再导出及导入即可。
注:dbexport/dbimport有同样的问题,请注意环境变量的差异。


2.29. PDO_GBASEDBT中大对象返回”resource(4) of type (stream)”

数据库版本:ALL
操作系统:ALL
硬件平台:ALL
描述:
PHP使用PDO_GBASEDBT访问数据库时,大对象(如text类型)返回的类型是resource(4) of type (stream)而不是string
解决方法:
连接属性中增加:

$dbh->setAttribute(PDO::ATTR_STRINGIFY_FETCHES, true);   

最后更新日期:2025-10-28