返回首页

gbase数据、南大通用产品文档:GBase8s执行定期的一致性检查

更新日期:2024年09月11日

要从一致性检查获取最大好处并确保数据库空间备份的完整性,必须定期执行以下操作:

验证所有数据和数据库服务器开销信息是一致的。

检查消息日志是否在您验证一致性时有断言失败。

在您验证一致性后创建 0 级数据库空间备份。
以下主题描述了其中每个操作。
验证一致性
由于此检查需要一定时间并且此检查可能导致争用,因此请将此检查调度为在活动最少的
时候执行。必须在创建 0 级备份之前执行此检查。
运行下表中显示的命令以作为一致性检查的一部分。
表 1. 检查数据一致性
验证类型
命令

GBase 8s 管理员指南
南大通用数据技术股份有限公司
- 340 -
系统目录表
oncheck -cc
数据
oncheck -cD dbname
扩展数据块数
oncheck -ce
索引
oncheck -cI dbname
保留页
oncheck -cr
逻辑日志和保留页
oncheck -cR
元数据和智能大对象
oncheck -cs
您可以在数据库服务器处于联机方式时运行这些命令中的每个命令。有关每个命令如何在
检查对象时锁定它们以及哪些用户可以执行验证的信息,请参阅 《GBase 8s 管理员参
考》 中的 oncheck。
在大多数情况下,如果这些验证过程中的一个或多个过程检测到错误,那么解决方案是从
数据库空间备份复原数据库。但是,错误的来源也可能是硬件或操作系统。
验证系统目录表
要验证系统目录表,使用 oncheck -cc 命令。
每个数据库包含它本身的系统目录,该目录包含有关数据库表、列、索引、视图、约束、
存储过程和特权的信息。
如果当验证完成时显示警告,那么该警告的唯一用途是提醒您找不到特定类型的记录。这
些警告并非指示您的数据、系统目录或甚至数据库设计有任何问题。该警告仅指示不存在
任何表的同义词;即,系统目录在表 syssyntable 中不包含记录。 例如,如果您为没有为任
何表定义同义词的数据库验证系统目录表,那么可能显示以下警告:
WARNING: No syssyntable records found.
但是,如果您在验证系统目录表时接收到错误消息,那么情况就完全不同了。请立即
与 GBase 8s 技术支持联系。
验证数据页
要确认数据页,请使用 oncheck -cD 命令。
如果数据页验证检测到错误,请尝试从指定表中卸载数据,删除该表,重新创建该表,并
重新装入该数据。有关装入和卸载数据的信息,请参阅《GBase 8s 迁移指南》。如果该过
程不成功,请从存储空间备份执行数据复原。
验证扩展数据块
要确认每个数据库中的扩展数据块,请使用 oncheck -ce 命令。
扩展数据块一定不能重叠。如果该命令检测到错误,请从存储空间备份执行数据复原。

GBase 8s 管理员指南
南大通用数据技术股份有限公司
- 341 -
验证索引
如果索引已损坏,那么数据库服务器在查询中将无法使用索引。
可以通过使用 oncheck -cI 命令来验证数据库中每个表上的索引。
此外,调度程序任务 bad_index_alert 将查找已被服务器标记为已损坏的索引。此任务在每
晚运行。
对于此任务找到的每个已损坏索引,
都会在 sysadmin:ph_alert 表中建立一个条目。

如果索引已损坏,请将其删除,然后重新创建。
验证逻辑日志
要确认逻辑日志和保留页,请使用 oncheck -cR 命令。
验证保留页
要确认保留页,请使用 oncheck -cr 命令。
保留页是位于根数据库空间初始块开始处的页。这些页包含主数据库服务器开销信息。如
果该命令检测到错误,请从存储空间备份执行数据复原。
该命令可能会提供警告。在大多数情况下,这些警告让您注意的是您已经知道的情况。
验证元数据
对每个数据库运行 oncheck -cs 以验证数据库中所有智能大对象的元数据。
如有必要,
从数
据库空间备份复原数据。
监视数据不一致性
如果一致性检查代码在数据库服务器操作期间检测到不一致,将向数据库服务器消息日志
报告断言失败。(请参阅《GBase 8s 管理员参考》中的消息日志主题。)
消息日志和转储文件中的读断言失败
以下示例显示断言失败在消息日志中采用的格式。
Assert Failed: Short description of what failed
Who: Description of user/session/thread running at the time
Result: State of the affected database server entity
Action: What action the database server administrator should take
See Also: file(s) containing additional diagnostics
See Also: 行中包含以下一个或多个文件名:

af.xxx

shmem.xxx

gcore.xxx

gcore.xxx

/path name/core

GBase 8s 管理员指南
南大通用数据技术股份有限公司
- 342 -
在所有情况中,
xxx 对与单个线程的断言失败相关联的所有文件而言是一个公共的十六进制
数。文件 af.xxx、shmem.xxx 和 gcore.xxx 位于 ONCONFIG 参数 DUMPDIR 指定的目录
下。
文件 af.xxx 包含发送到消息日志的断言失败消息的副本以及当前相关结构和数据缓冲区的
内容。
仅当 ONCONFIG 参数 DUMPSHMEM 设置为 1 或 2 时,文件 shmem.xxx 才包含断言失
败时数据库服务器共享内存的完整副本。
仅限 UNIX:
在 UNIX™ 上,
仅当 ONCONFIG 参数 DUMPGCORE 设置为 1 且您的操作
系统支持 gcore 实用程序时,gcore.xxx 才包含数据库服务器虚拟进程(线程此时在其上运
行)的核心转储。仅当 ONCONFIG 参数 DUMPCORE 设置为 1 时,core 才包含数据库服
务器虚拟进程(线程此时在其上运行)的核心转储。core 文件的路径名是上次调用数据库
服务器的目录。
验证表和表空间数据
要验证表和表空间数据,请对数据库或表使用 oncheck -cD 命令。
大多数的一般断言失败消息后面均跟随其他信息,
其他信息通常包含检测到错误的表空间。
如果此检查确认存在不一致情况,请从表中卸载数据,删除该表,重新创建该表,并重新
装入该数据。否则,无需执行其他任何操作。
在许多情况中,数据库服务器当断言失败时会立即停止。但是,当失败看起来是特定于某
个表或较小实体时,数据库服务器会继续运行。
当断言是由于数据库服务器代表用户访问的数据页上的不一致而失败时,还会将错误发送
至应用程序进程。SQL 错误取决于正在进行的操作。但是,ISAM错误几乎始终是 -105 或
-172,如下所示:
-105 ISAM error: bad isam file format
-172 ISAM error: Unexpected internal error
有关消息的目标和内容的更多详细信息,请参阅《GBase 8s 管理员参考》中有关消息日志
消息的主题。
保留一致的 0 级备份
在您执行验证一致性中描述的检查而不出错之后,请创建 0 级备份。保留该存储空间备份
和所有后续的逻辑日志备份磁带,直至您完成下一次一致性检查。请在每次 0 级备份之前
执行一致性检查。如果不这样做,那么至少保留所有从存储空间备份恢复所需的磁带,该
备份是在验证数据库服务器一致之后立即创建的。

当您访问 GBase 8s ESQL/C 程序中的数据库列时,必须声明适当的 C 或 GBase 8s
ESQL/C 数据类型的主机变量以保存该数据。表 1 列出了 GBase 8s 的 SQL 数据类型以
及您可以为主机变量声明的对应的 GBase 8s ESQL/C 数据类型。表 2 列出了 GBase 8s
可用的其它 SQL 数据类型和 GBase 8s ESQL/C 数据类型,可用作这些类型的列的主机变
量。这两个表都包括对本书中的章节或章节的引用,您可以在其中获取有关主机变量数据
类型之间的更多信息。
表 1. 对应 SQL 的主机变量数据类型
SQL 数据类型
ESQL/C 预定
义的数据类型
C 语言
类型
请参阅
BIGINT
BIGINT
8 字节
整数
Numeric 数据类型
BIGSERIAL
BIGINT
8 字节
整数
Numeric 数据类型
BOOLEAN
boolean

表 2
BYTE
ifx_loc_t or
loc_t

简单大对象
CHAR(n)
CHARACTER(
n)
fixchar [n] or
string [n+1]
char [n
+ 1] 或
char *
字符和字符串数据类型
DATE
date
4 字节
整数
时间数据类型
DATETIME
datetime or
dtime_t

时间数据类型
DECIMAL
DEC
NUMERIC
MONEY
decimal or
dec_t

Numeric 数据类型
FLOAT
DOUBLE

double
时间数据类型

GBase 8s ESQL/C 编程指南
南大通用数据技术股份有限公司
- 75 -

PRECISION
INT8
int8 or
ifx_int8_t

Numeric 数据类型
INTEGER
INT

4 字节
整数
Numeric 数据类型
INTERVAL
interval or
intrvl_t

时间数据类型
LVARCHAR
lvarchar
char [n
+ 1] 或
char *
字符和字符串数据类型
NCHAR(n)
fixchar [n] or
string [n+1]
char [n
+ 1]或 char
*
字符和字符串数据类型
NVARCHAR(m
)
varchar[m+1]
or string [m+1]
char
[m+1]
字符和字符串数据类型
SERIAL

4 字节
整数
Numeric 数据类型
SERIAL8
int8 or
ifx_int8_t

Numeric 数据类型
SMALLFLOAT
REAL

float
Numeric 数据类型
SMALLINT

2 字节
整数
Numeric 数据类型
TEXT
loc_t

简单大对象
VARCHAR(m,x
)
varchar[m+1]
or string [m+1]
char
d[m+1]
字符和字符串数据类型



GBase 8s ESQL/C 编程指南
南大通用数据技术股份有限公司
- 76 -

表 2. 对应于 GBase 8s 特定的 SQL 和主机变量数据类型
SQL 数据类型
ESQL/C 预定义
类型
请参阅
BLOB
ifx_lo_t
智能大对象
CLOB
ifx_lo_t
智能大对象
LIST(e)
collection
智能大对象
MULTISET(e)
collection
复杂数据类型
Opaque data type
lvarchar,
fixed binary, or var
binary
不透明数据类型
ROW(...)
row
复杂数据类型
SET(e)
collection
复杂数据类型
数据类型常量
GBase 8s ESQL/C sqltypes.h 头文件常量包含 SQL 和 GBase 8s ESQL/C 数据类型。
一些 GBase 8s ESQL/C 库函数要求数据类型常量作为参数。还可以在动态 SQL 程序中比
较这些数据类型常量,以确定描述 DESCRIBE 语句的列的类型。下图中的 GBase 8s
ESQL/C 代码摘录将 sqlvar 的 sqltype 元素与一系列 SQL 数据类型常量进行比较,以
确定 DESCRIBE 语句返回的列的类型。
图: 带有 SQL 数据类型常量的代码摘录
for (col = udesc->sqlvar, i = 0; i < udesc->sqld; col++, i++)
{
switch(col->sqltype)
{
case SQLSMFLOAT:
col->sqltype = CFLOATTYPE;
break;

case SQLFLOAT:
col->sqltype = CDOUBLETYPE;
break;

case SQLMONEY:
case SQLDECIMAL:
col->sqltype = CDECIMALTYPE;

GBase 8s ESQL/C 编程指南
南大通用数据技术股份有限公司
- 77 -

break;

case SQLCHAR:
col->sqltype = CCHARTYPE;
break;

default:
/* The program does not handle INTEGER,
* SMALL INTEGER, DATE, SERIAL or other
* data types. Do nothing if we see
* an unsupported type.
*/
return;
}
SQL 数据类型常量
表 1 显示了 GBase 8s 的 SQL 数据类型常量。表 2 显示了其它可用于 GBase 8s
的数据类型的 SQL 数据类型常量。
表 1. GBase 8s SQL 类数据类型的常量
SQL 数据类型
定义的常量
整数值
CHAR
SQLCHAR
0
SMALLINT
SQLSMINT
1
INTEGER
SQLINT
2
FLOAT
SQLFLOAT
3
SMALLFLOAT
SQLSMFLOAT
4
DECIMAL
SQLDECIMAL
5
SERIAL
SQLSERIAL
6
DATE
SQLDATE
7
MONEY
SQLMONEY
8
DATETIME
SQLDTIME
10
BYTE
SQLBYTES
11
TEXT
SQLTEXT
12

GBase 8s ESQL/C 编程指南
南大通用数据技术股份有限公司
- 78 -

VARCHAR
SQLVCHAR
13
INTERVAL
SQLINTERVAL
14
NCHAR
SQLNCHAR
15
NVARCHAR
SQLNVCHAR
16
INT8
SQLINT8
17
BIGSERIAL
SQLBIGSERIAL
53
LVARCHAR
SQLLVARCHAR
43
BOOLEAN
SQLBOOL
45
BIGINT
SQLINFXBIGIN
T
52
BIGSERIAL
SQLBIGSERIAL
53

表 2. 特定于 GBase 8s 的 GBase 8s SQL 列数据类型的常量
SQL 数据类型
定义的常量
整数值
SET
SQLSET
19
MULTISET
SQLMULTISET
20
LIST
SQLLIST
21
ROW
SQLROW
22
可变长度的不透明类型
SQLUDTVAR
40
固定长度的不透明类型
SQLUDTFIXED
41
SENDRECV(仅限于客户
端)
SQLSENDRECV
44
重要: SENDRECV 数据类型具有 SQL 常量但是只能在 GBase 8s ESQL/C 程序中
使用。不能将数据库列定义为类型 SENDRECV。
ESQL/C 数据类型常量
在 GBase 8s ESQL/C 中给主机变量指定 GBase 8s ESQL/C 数据类型。下表显示了这

GBase 8s ESQL/C 编程指南
南大通用数据技术股份有限公司
- 79 -

些常量。
表 1. ESQL/C 主机变量数据类型的常量
ESQL/C 数据类型
常量
整数值
char
CCHARTYPE
100
short int
CSHORTTYPE
101
int4
CINTTYPE
102
long
CLONGTYPE
103
float
CFLOATTYPE
104
double
CDOUBLETYPE
105
dec_t 或 decimal
CDECIMALTYPE
107
fixchar
CFIXCHARTYPE
108
string
CSTRINGTYPE
109
date
CDATETYPE
110
dec_t 或 decimal
CMONEYTYPE
111
datetime 或 dtime_t
CDTIMETYPE
112
ifx_loc_t 或 loc_t
CLOCATORTYPE
113
varchar
CVCHARTYPE
114
intrvl_t 或 interval
CINVTYPE
115
char
CFILETYPE
116
int8
CINT8tYPE
117
collection
CCOLTYPE
118
lvarchar
CLVCHARTYPE
119

GBase 8s ESQL/C 编程指南
南大通用数据技术股份有限公司
- 80 -

fixed binary
CFIXBINTYPE
120
var binary
CVARBINTYPE
121
boolean
CBOOLTYPE
122
row
CROWTYPE
123
可以使用这些 GBase 8s ESQL/C 数据类型作为 GBase 8s ESQL/C 库中某些函数的
参数的数据类型。例如:rtypalign() 和 rtypmsize() 函数都要求数据类型值作为参数。
X/Open 数据类型常量
如果您的程序符合 X/Open 标准
(使用 -xopen 选项编译)

那么必须使用下表显示
的数据类型值。GBase 8s 为 sqlxtype.h 头文件中的这些值定义常量。
表 1. X/Open 环境中 GBase 8s SQL 列数据类型的常量
SQL 数据类型
定义的常量
X/Open 整数值
CHAR
XSQLCHAR
1
DECIMAL
XSQLDECIMAL
3
INTEGER
XSQLINT
4
SMALLINT
XSQLSMINT
5
FLOAT
XSQLFLOAT
6
头文件的数据类型
要使用 SQL 数据类型,您的程序必须包括适当的 GBase 8s ESQL/C 头文件。表 1
显示了使用数据库服务器主机变量和 GBase 8s ESQL/C 头文件之间的关系。
表 2显示了主
机变量数据类型和特定于 GBase 8s Universal Data Option 的 GBase 8s ESQL/C 头文件之
间的关系。
表 1. SQL 数据类型和 ESQL/C 头文件
SQL 数据类型
ESQL/C 或 C 数据类型
ESQL/C 头文件
BLOB
ifx_lo_t
locator.h
BOOLEAN
boolean
自动定义
BYTE
ifx_loc_t 或 loc_t
locator.h

GBase 8s ESQL/C 编程指南
南大通用数据技术股份有限公司
- 81 -

CHAR(n)
CHARACTER(n)
fixchar array[n] 或
string array[n+1]
自动定义
DATE
date
自动定义
DATETIME
datetime 或 dtime_t
datetime.h
DECIMAL
DEC
NUMERIC
MONEY
decimal 或 dec_t
decimal.h
FLOAT
DOUBLE PRECISION
double
自动定义
INT8
int8
int8.h
INTEGER
INT
4 字节整数
自动定义
INTERVAL
interval or intrvl_t
datetime.h
LVARCHAR
lvarchar array[n + 1]
( n 是可能存储在
LVARCHAR 自动中的长字符
串的长度)
自动定义
MULTISET(e)
collection
自动定义
NCHAR(n)
fixchar array[n] or
string array[n+1]
自动定义
NVARCHAR(m)
varchar[m+1] or string
array[m+1]
自动定义
SERIAL
4 字节整数
自动定义
SERIAL8
int8
int8.h
BIGINT
BIGINT
自动定义

GBase 8s ESQL/C 编程指南
南大通用数据技术股份有限公司
- 82 -

BIGSERIAL
BIGINT
自动定义
SMALLFLOAT
REAL
float
自动定义
SMALLINT
short int
自动定义
TEXT
loc_t
locator.h
VARCHAR(m,x)
varchar[m+1] 或 string
array[m+1]
自动定义

表 2. 特定于 GBase 8s 的 SQL 数据类型和 ESQL/C 头文件
SQL 数据类型
ESQL/C 或 C 数据类型
ESQL/C 头文件
BLOB
ifx_lo_t
locator.h
CLOB
ifx_lo_t
locator.h
LIST(e)
collection
自动定义
Opaque 数据类型
lvarchar 或 fixed
binary 或 var binary
包含内部结构或不透明类
型定义的常量的用户定义的头
文件
ROW(...)
row
自动定义
SET(e)
collection
自动定义

设置查询选项
.........................................
157