返回首页

gbase数据、南大通用产品文档:GBase8s恢复到其他计算机

更新日期:2024年09月11日


GBase 8s 备份与恢复指南
南大通用数据技术股份有限公司 - 72 -
您可以备份一台计算机上的数据并在另一台计算机上恢复该数据。对于灾难恢复或升级数
据库服务器,导入恢复很有用。备份数据并移至存储管理器对象上之后,可以执行导入的
恢复。导入的恢复涉及将源计算机中的文件复制到目标计算机,以及以多种方式之一执行
恢复。
先决条件:

您的存储管理器必须支持导入的恢复。

整个系统的备份必须包含所有存储空间;逻辑日志是可选的。
0 级备份必须包含所有存储空间和逻辑日志。

源计算机和目标计算机都必须在相同的 LAN 或 WAN 上,并且必须具有以下属
性:

相同的硬件和操作系统

相同的数据库服务器版本

相同的配置和 ROOTPATH 信息,但服务器名称和数量可以不同。

相同的存储管理器版本

兼容的 XBSA 库
重要: 要完成导入恢复,源计算机和目标计算机上的每个块(包括镜像)的大小、位置和偏移
量都必须精确匹配。
要执行导入的恢复:
1. 在目标计算机上安装数据库服务器和存储管理器。
2. 在目标数据库服务器实例上安装存储管理器。
a. 设置必要的环境变量。
b. 定义与源实例上类型相同的存储设备。
c. 用正确的池名标记存储介质。
d. 安装存储设备。
e. 用存储管理器的版本更新目标计算机上的 sm_versions 文件。
3. 对于与源计算机上的设备和链接匹配的块,确保目标计算机已将这些设备和链接准
备就绪
4. 对源数据库服务器上的所有存储空间执行 0 级备份(onbar -b 或 onbar -b -w)。
限制: 不要执行增量备份。
5. 如果在使用 Storage Manager,请遵循以下步骤:
a. 关闭两台计算机上的存储管理器。

GBase 8s 备份与恢复指南
南大通用数据技术股份有限公司 - 73 -
b. 在源计算机上创建存储管理器目录的 tar 文件。
c. 将这个 tar 文件复制到目标计算机上并解包。
如果使用其他存储管理器,您可以使用备份磁带或通过网络导入存储管理器目录。
要了解更多信息,请参阅您的存储管理器文档。
6. 安装传送的存储卷。

如果备份文件在磁盘上,请将它们从源计算机复制到目标计算机上。

如果备份位于磁带上,请在连接到目标计算机的存储设备上安装传输的卷。
源计算机和目标计算机都必须使用相同类型的存储设备,
如 8 毫米磁带或磁
盘。

如果备份位于备份服务器上,请从该备份服务器检索该备份。
7. 使用存储管理器命令将源主机名作为客户机添加到目标计算机上。
8. 将以下文件从源计算机复制到目标计算机上。
表 1. 要复制的管理文件
文件
操作
紧急引导文件
用目标数据库服务器编号重命名紧急引导文件。例
如:将 ixbar.51 重命名为 ixbar.52。 紧急引
导文件只需要来自源计算机上 0 级备份的条目。
文件名为 ixbar.servernum。
oncfg 文件:
oncfg_servername.servernum
ON-Bar 需要让 oncfg 文件知道要检索哪些数据
库空间。用目标数据库服务器的名称和编号重命
名 oncfg 文件。例如:
将 oncfg_bostonserver.51 重命名
为 oncfg_chicagoserver.52。
该文件名必须与目标
计算机上的 DBSERVERNAME 和 SERVERNUM 相匹配。
onconfig 文件
在 onconfig 文件中,
使用目标数据库服务器名称
和编号更新 DBSERVERNAME 和 SERVERNUM 参数。
存储管理器配置文件,如果有该
文件
存储管理器配置文件可能需要更新。
9. 使用以下方法之一恢复数据:
表 2. 恢复数据选项

GBase 8s 备份与恢复指南
南大通用数据技术股份有限公司 - 74 -
选项
操作
如果未在目标服务器上启动 GBase
8s 实例
使用 onbar -r 命令来恢复数据。
如果要导入整个系统备份
使用 onbar -r -w -p 命令来恢复数据。
如果已在目标服务器上启动
了 GBase 8s 实例。
分阶段恢复数据:

使用 onbar -r -p 命令来恢复物理数
据。

使用 onbar -r -l 命令来恢复逻辑日
志。
此过程可避免回收日志和对实例的任何潜在破
坏。

10. 在您使用 onsmsync 实用程序使目标计算机和存储管理器上的对象到期之前,请执
行以下某个任务。
否则,onsmsync 将使错误对象到期。

手动编辑目标计算机上的 $GBASEDBTDIR/etc 目录中的紧急引导文件 viz
ixbar.servernum。将源计算机上使用的 GBase 8s 服务器名称替换为目标计算
机的 GBase 8s 服务器名称。

在目标计算机上以 gbasedbt 用户 身份运行 onsmsync -b 命令,以只
从 sysutils 数据库重新生成紧急引导文件。
重新生成的紧急引导文件反映了目
标计算机的服务器名称。

使用 ON-Bar 和 Storage Manager 执行导入的恢复的示例
此示例显示如何使用 ON-Bar、
Storage Manager 和归档的文件设备来设置实例的导入恢复。

有多种方式可执行导入的恢复。此示例显示的是 Storage Manager 目录复制方法。另一种
方法是引导程序恢复方法,该方法在《GBase 8s Storage Manager 管理员指南》中描述。
此示例的先决条件:

带有相同配置的源机器和目标机器。 但是,服务器名称和编号可以不同。

在两台机器上相同的 ROOTPATH。

GBase 8s 备份与恢复指南
南大通用数据技术股份有限公司 - 75 -

目标机器已为块准备好设备和链接,并且这些设备和链接与源机器上的设备和链接
相匹配。

Storage Manager 已在两台计算机上初始化。

设备目录路径、卷名称和池名称在两台机器上都相同。

root 用户和 gbasedbt 用户 是两台机器上的 Storage Manager 管理员。
在此示例中,数据库空间和日志备份的目录如下:
<目录路径>/dbspaces1
<目录路径>/logfiles1
源环境中设置的其他环境参数如下:
ISM_server = source computer
export IDS_server
目标机器上设置的其他环境参数如下:
ISM_client = source computer
export IDS_client
SM_server = target computer
export ISM_server
1. 以 gbasedbt 用户 身份,在源机器上执行 0 级备份。
2. 以 root 用户身份,通过运行以下命令来停止两台计算机上的 Storage
Manager:%ism_shutdown
3. 以 root 用户身份,压缩源机器上的相应 Storage Manager 目录,如下所示:
%cd /nsr
%tar -cvf nsr.tar index mm
4. 将上一步中的 nsr.tar 文件以二进制方式通过 FTP 传输至目标机器。
5. 以 root 用户身份,解压缩目标机器上的 nsr.tar 文件,如下所示:
%cd /nsr
%tar -xvf nsr.tar
6. 以 root 用户身份,在源机器上以 tar 格式压缩备份目录(设备),如下所示:
%tar -cvf logfiles1.tar logfiles1
%tar -cvf dbspaces1.tar dbspaces1
7. 将上一步中的归档目录以二进制方式通过 FTP 传输至目标机器。
8. 以 root 用户身份,在目标机器上将现有日志和归档目录覆盖为源机器中的目录,如
下所示:

GBase 8s 备份与恢复指南
南大通用数据技术股份有限公司 - 76 -
%tar -xvf logfiles1.tar
%tar -xvf dbspaces1.tar
9. 以 root 用户身份,在目标机器上
通过运行以下命令来启动 Storage Manager:ism_startup
运行 ism_show -devices 命令以将设备显示为已安装。
10. 在目标机器上,使用以下内容创建一个文件(例如,nsr.txt):
create type: NSR client; name: source_machine;
remote access: root@target_machine, gbasedbt@target_machine;
11. 以 gbasedbt 用户 身份,在目标机器上运行以下命令:
%nsradmin -s target_machine -i nsr.txt
该命令返回以下输出:created resource id
12. 以 gbasedbt 用户 身份,将源机器上 $GBASEDBTDIR/etc 目录中的以下文件通过
FTP 传输至目标机器上的 $GBASEDBTDIR/etc 目录
ixbar,servernum
oncfg_servername,servernum
13. 在目标机器上,将上一步中的文件的文件名更改为本地服务器的对应名称。
14. 运行恢复命令。




gunload 实用程序支持磁带或文件目标选项。
以下语法图分段显示 gunload 目标参数


元素
用途
重要注意事项
-b blocksize
指定磁带设备的块大小
(以千字节计)
要求:blocksize 必须
是整数。
其他信息:
此选项覆盖了
TAPEBLK 或 LTAPEBLK
中的缺省值。
-l
指示 gunload 分别从
LTAPEDEV、LTAPEBLK 和
LTAPESIZE 读取磁带设
备、
块大小和磁带大小的

无。
-s tapesize
指定存储在磁带上的数
据量(以千字节计)
要求:
tapesize 必须是
整数。要写到磁带的末
尾,请将磁带大小指定
为 0。
如果您不指定 0,那么
最大的 tapesize 是



2 097 151 KB。
其他信息:此选项覆盖
TAPESIZE 或 LTAPESIZE
中的缺省值。
-t source
指定磁盘上文件的路径
名或安装输入磁带的磁
带设备的路径名
其他信息:此选项覆盖
TAPEDEV 或 LTAPEDEV
指定的磁带设备。
路径名
必须是有效的路径名。

使用 CREATE EXTERNAL TABLE 语句定义不属于您的数据库的外部源以加载
和卸载您数据库的数据。
CREATE EXTERNAL TABLE 语句是实施是 SQL ANSI/ISO 标准的扩展。
语法


GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 225
元素
描述
限制
语法
table 存储外部数据的表的
名称
在当前数据库中的表、视图和同
义词的名称中必须是唯一的
标识符
用法
使用外部表从您的数据库加载和卸载数据或者加载和卸载数据到数据库中。还可
以使用外部表查询不在 GBase 8s 数据库文本文件中的数据。
语法图的第一部分声明了表的名称并定义了它的列。
The portion that 随 USING 关键字之后的部分标识了当您使用外部表时数据库服
务器打开的外部文件,并指定该外部表特征的其它选项。
在执行 CREATE EXTERNAL TABLE 语句后,可以使用 INSERT INTO ...
SELECT 语句从外部源移动数据,或者移动数据到外边源。有关将查询结果加载
到外部表中的更多信息,请参阅 INTO EXTERNAL 子句 章节。
在高可用集群的辅助服务器上不支持 CREATE EXTERNAL TABLE 语句。
如果您包含 IF NOT EXISTS 关键字,而指定名称的外部表已经在当前数据库的
systables 系统目录表中注册过,或者指定的名称是当前数据库中数据库表、视
图、顺序对象、或者同义词的标识符时,数据库服务器不采取任何操作(而不是
向应用程序发送异常)。
列定义
使用 CREATE EXTERNAL TABLE 已经的列定义段声明新外部表的单个列的名
称和数据类型。
列定义

其它选项子句

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

元素
描述
限制
语法
column
外部表的每一列的列

对于每一列,必须指定
内置数据类型
标识符
data_type
列的数据类型
data_type 可以是任何
GBase 8s 支持的数据类

数据类型
template
具有与外部表相同结
构的现有表
不能是列的子集且与任
一列数据类型不同
数据库对象

size
列大小(以字节表
示)。缺省为 1
整数; 1 ≤ size ≤
32,767
精确数值
null_string 代表 NULL 的值
请参阅定义 NULL 值
引用字符串
使用 SAMEAS 子句
SAMEAS template 子句使用在新表的定义中 template 表的所有的列名称及其数
据类型。
您不能对固定格式的文件使用 SAMEAS 子句。
示例
考虑将定界的 ASCII 文本文件加载到具有以下结构的表中:
TABLE employee (
name CHAR(18) NOT NULL,
hiredate DATE DEFAULT TODAY,
address VARCHAR(40),
empno INTEGER);
SQL 语句可使用以下方法将数据加载到 employee 表:
CREATE EXTERNAL TABLE emp_ext

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 227
SAMEAS employee
USING (
DATAFILES ("DISK:/work2/mydir/emp.dat"),
REJECTFILE "/work2/mydir/emp.rej"
);
INSERT INTO employee SELECT * FROM emp_ext;
外部表都具有与源表每一列相同的名称、类型和缺省值,因为 CREATE 语句包
含 SAMEAS 关键字。缺省的格式是定界的,因此不需要任何格式化关键字。
定义在数据库表中列上的检查约束不会为外部表继承。然而,NOT NULL 约束会
被外部表继承。
定界文件缺省为 ASCII 。缺省的行定界符是行结束字符,除非您在创建外部表时
使用 RECORDEND 关键字定义不同的定界符。(RECORDEND 关键字只对定界
格式有效。)
使用 EXTERNAL 关键字
使用 EXTERNAL 关键字给您的拥有一个不同于内部表数据类型的外部表的每一
列指定 CHAR 数据类型。
例如,内部表中有一 VARCHAR 列,您想要将其映射到外部表中的 CHAR 列。
必须以固定格式为每一列指定外部类型。除了 BYTE 和 TEXT 列(它们的指定
是可选的),您不能为分隔的列指定外部类型。
定义 NULL 值
当从外部源加载或卸载数据时,您可以定义一个解释为 NULL 的值。
对固定格式的外部表,数据库服务器使用 NULL 表示法作为数据加载到数据库中
时的解释值,也使用 NULL 表示法作为数据卸载到外部表时将 NULL 值格式为
合适的数据类型。
NULL 表示法必须适合外部字段的长度。
操纵固定格式文件中数据
固定格式文件是所有行都具有一样长度的文件。

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 228
对于 FIXED 格式的文件,您必须为每一列声明列名和 EXTERNAL 项来设置属
性的名称和数目。对于固定格式文件,只允许的数据类型是 CHAR。您可以使用
NULL 关键字指定哪个字符串被诠释为 NULL 值。
DATAFILES 子句
DATAFILES 子句指定当您使用外部表时打开的操作系统文件或管道。
DATAFILES 子句

元素
描述
限制
语法
fixed_path
在外部表的定义中的输
入或输出文件的路径名
请参阅随该表之后
的注意事项
必须遵循
操作系统
规则
formatted_path
使用模式匹配字符的格
式化的路径名
请参阅随该表之后
的注意事项
必须遵循
操作系统
规则
T 数据库服务器不会验证存在于指定的 fixed_path 或 formatted_path 上的任何文
件或管道,此指定的管道是打开的,且用户具有存取该文件系统的权限。然而,
如果当数据库服务器尝试读或写到外部表时,指定的管道正在被使用,即是打开
的,随后外部表上的操作会失败,除非该路径是有效的。
有关 DATAFILES 子句的示例,请参阅外部表示例。
关键字 描述
CLOBDIR 指定存储 CLOB 文件的服务器的目录。

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 229
BLOBDIR 指定存储 BLOB 文件的服务器的目录。当创建查询时,在
CLOBDIR 之后的 BLOBDIR 之后,指定 DISK 。如果省略了
BLOBDIR ,则 BLOB 文件存储于 DISK 子句指定的相同的目
录。如果 BLOBDIR 和 CLOBDIR 都被省略,则会为 BLOB
或 CLOB 列创建一个新的文件,并将其存储于 DISK 子句指定
的目录下。
以下示例中,存储在 /work1/exttab1.dat 中的行拥有位于
/work1/blobdir1 的 BLOBs 和位于 /work1/clobdir1 目录下的
CLOBs 。
存储在 /work1/exttab2.dat 中的行拥有位于 /work1 目录中的 BLOBs 和
位于 /work1/clobdir2 目录中的 CLOBs。因为省略了 BLOBDIR 子句,所
以 BLOBs 存储在存储 exttab2.dat 的目录中。
存储在 /work1/exttab3.dat 中的行拥有位于 /work1 目录中的 BLOBs 和
CLOBs ,因为 BLOBDIR 和 CLOBDIR 都被省略了。
CREATE EXTERNAL TABLE exttab (
id SERIAL,
lobc CLOB,
lobb BLOB)
USING (DATAFILES(

"DISK:/work1/exttab1.dat;BLOBDIR:/work1/blobdir1;CLOBDIR:/work1/clobdir1",
"DISK:/work1/exttab2.dat;CLOBDIR:/work1/clobdir2",
"DISK:/work1/exttab3.dat"),
DELIMITER '|');
在外部表中使用格式化字符
可以使用格式化的路径名称来指定文件名,通过使用替代字符 %r(first ..last)。
格式化字符串 作用
%r(first ..last) 在 GBase 8s 服务器上对外部表指定多个文件。
first 和 last 参数代表语句运行时代替的表达式中的值的范围。例如:指定
my_file.%r(1..3) 可展开为:
my_file.1

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 230
my_file.2
my_file.3
GBase 8s 仅支持的格式字符是 %r 。
Table 选项
这些选项指定定义外部表的其它特征,并定义该表上加载或卸载操作的属性。
Table 选项

元素
描述
限制
语法
field_delimiter
用来分隔字段的字
符。缺省值为管道
( | )字符
对于非打印字
符,使用八进
制符号
引用字符串

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 231
元素
描述
限制
语法
filename
用来转换错误消息的
完整路径名
请参阅 拒绝文

必须遵循操作系
统规则
num_errors
终止加载操作之前的
错误数目
除非设置
REJECTFILE
值,否则该值
被忽略
精确数值
num_rows
外部表中包含的行的
近似数目
必须为正数
精确数值
record_delimiter
用来分隔记录的字
符。缺省为换行符
( \n )
对于非打印字
符,使用八进
制符号
引用字符串
num_errors 规范在 unload 任务期间被忽略。
如果未指定 RECORDEND 值,record_delimiter 缺省值为换行符(\n)。要将非
打印字符指定为记录定界符或字段定界符,您必须将它编码为 ASCII 字符的八进
制表示法。例如 \006 可表示 CTRL-F 。
在 Windows™ 系统上,如果您使用 DB-Access 实用程序或者 dbexport 实用程
序加载数据库表到文件中,然后计划使用该文件作为外部表数据文件,则您应当
在 CREATE EXTERNAL TABLE 语句中将 RECORDEND 定义为 '\012' 。
按照下表描述使用 table 选项关键字。除非指定了两种方式其中一种,否则只要
计划 load 或 unload 数据,就可以使用每个关键字。
关键字
描述
DBDATE
当读取或写入外部表时指定数据格式。在从外部表加载和卸装操作期间,使用
DBDATE 子句转换数据。在以下示例中,DBDATE 设置为 DMY2-。如果数据库
表中的日期值存储为 06/24/2009 ,则该值写入外部表后为 24-06-09 。
CREATE EXTERNAL TABLE ext_date (dob date)

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 232
USING (
DATAFILES ("DISK:/tmp/datedisk"),
REJECTFILE "/tmp/datereject",
DBDATE "DMY2-",
FORMAT "delimited");

INSERT INTO ext_date SELECT * FROM basetab;
DBDATE 子句还在从外部表表插入数据到数据库表时使用。在以下示例中,外部
表中的数据被转换为基于由 CREATE EXTERNAL TABLE 语句设置的 DBDATE
值的内部二进制格式。
INSERT INTO basetab SELECT * FROM ext_date;
如果在 CREATE EXTERNAL TABLE 的 USING 子句中未指定 DBDATE 关键
字,则日期格式由 DBDATE 环境变量的设置决定。如果未指定 DBDATE 环境
变量,则日期格式由 GL_DATE 环境变量的设置决定。DBDATE 子句指定的值
优先于 DBDATE 环境变量指定的值。DBDATE 变量设置的值优先于 GL_DATE
环境变量。有关 DBDATE 和 GL_DATE 值的信息,请参阅 GBase 8s SQL 参考
指南。
DBMONEY
当正在读取或写入外部表时,指定货币格式。在从外部表加载和卸装操作期间,
使用 DBMONEY 子句转换数据。在以下示例中,DBMONEY 设置为 DM, 。货
币格式化为 DM(德国马克)单位,使用货币符号 DM 和逗号(,)。如果在数据
库表中的存储的货币值为 100.50,则写入外部表的值为 100,50 。
CREATE EXTERNAL TABLE ext_money (sales money)
USING ( DATAFILES ( "DISK:/tmp/moneydisk" ),
REJECTFILE "/tmp/moneyreject",
DBMONEY "DM,",
FORMAT "delimited");

INSERT INTO ext_money SELECT * FROM basetab;
当将外部表中的数据读到数据库表中时,外部表不需要货币符号。例如,如果外
部表包含值 1000,78 且 DBMONEY 设置为 DM, ,则该数据不会被拒绝且该
行会正确存储。

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 233
如果十进制符号在外部表中且设置的 DBMONEY 值不符合,那么该行被拒绝。
例如:如果外部表包含值 1000,78 (使用逗号代替小数点)且将 DBMONEY
子句设置为 DM.,则该行被拒绝。如果数据文件包含一个货币符号并且该货币符
号不符合 DBMONEY 货币符号,则该行被拒绝。
当从数据库表写入数据到外部表时,货币符号不会写入到外部表中。
如果没有指定 DBMONEY 子句,则通过设置 DBMONEY 环境变量决定数据格
式。DBMONEY 子句指定的值优先于 DBMONEY 环境变量指定的值。如果没有
指定 DBMONEY 子句且也没有设置 DBMONEY 环境变量,则使用数据库语言
环境指定的十进制分隔符。有关 DBMONEY 值的信息,请参阅 GBase 8s SQL
参考指南。
DEFAULT (load only)
指定用列缺省值(如果已定义)而不是 NULL 值来替换定界输入文件中缺少的
值,这样就可以稀疏地填充输入文件。在缺省值是要装入的值的文件中,文件不
需要每一列都有一个条目。
DELIMITED
指定数据文件是一个定界文本文件。可以使用可选的 DELIMITER 表选项指定定
界符。
DELIMITER
指定在定界文本文件分隔字段的字符。如果表选项不包含 DELIMITER 规范,则
管道符(|)是缺省的字符分隔符。
DELUXE (load only)
请求使用 DELUXE 方式加载数据(而不是 EXPRESS 方式)时,数据库服务器
会忽略该关键字,并内部选择 DELUXE 或 EXPRESS 方式。如果您指定
DELUXE 关键字,但数据库服务器内部选择 EXPRESS 方式,则向联机日志中
写入一条警告:"Switching load on target table .

to
EXPRESS".
DELUXE 方式将更改索引、执行约束检查以及评估触发器的数据插入到该表。
DELUXE 方式加载不如 EXPRESS 方式加载快,但是它更灵活。在 DELUXE
方式,您可以存取并更改正在加载的表。数据库服务器在加载数据到使用事务日

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 234
志记录的数据库的 STANDARD 表和任何定义索引的表中时,总是选择
DELUXE 方式。
ESCAPE
在 DELIMITER 指定任何 field_delimiter 分隔符的实例之前,立即插入缺省转义
字符,该字符是数据的字面值而不是分隔符。无论您包含或者省略该 ESCAPE 关
键字,缺省启用该功能,或者您可以指定 ESCAPE ON 关键字使它清晰地认识到
人类读者的您启用了此功能的 SQL 代码。要阻止数据中的 field_delimiter 字面
分隔符被转义,您必须指定 ESCAPE OFF 关键字。
缺省情况下,在 field_delimiter 字符之前 ESCAPE 关键字插入的转义字符是反斜
杠(\)。但是如果 DEFAULTESCCHAR 配置参数设置为单符号值,则当指定了
ESCAPE 或 ESCAPE ON 后,用此符号代理反斜杠(\)作为定界符。
注:
在 GBase 8s 中 ESCAPE 缺省的设置是 OFF 。
EXPRESS (load only)
请求使用 EXPRESS 方式加载数据(而不是 DELUXE 方式)时,数据库服务器
会忽略该关键字,并内部选择 DELUXE 或 EXPRESS 方式。如果您指定
EXPRESS 关键字,但数据库服务器内部选择 DELUXE 方式,则向联机日志中
写入一条警告:"Switching load on target table .
to
DELUXE" 。
数据库服务器仅在以下情景中内部地选择 EXPRESS 方式:

数据库是非日志记录的且目标表(任一表类型)没有索引。

数据库是日志记录的且目标表是 RAW 并没有索引。
对于其它情况,数据库服务器内部选择 DELUXE 方式。
EXPRESS 方式加载(使用轻量级追加)比 DELUXE 方式加载明显快很多,但
是不太灵活。在 EXPRESS 方式,直到加载完毕,您才能更新该表或读取新数据
项。

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 235
如果指定 EXPRESS 方式,而表 BLOB 、BYTE 、CLOB 或 TEXT 类型的对
象,则加载停止,产生错误消息。
当使用 EXPRESS 方式加载数据时,目标表不能位于 Enterprise Replication (ER)
复制中。此外,目标数据库服务器必须没有启用高可用数据复制(HDR)。
FIXED
指定数据文件是固定宽度的。当在外部表中使用 EXTERNAL 数据类型时,必须
使用 FIXED 格式。
FORMAT
指定数据文件中数据的格式。
GBASEDBT
指定数据文件的格式是内部 GBase 8s 格式。从以 GBase 8s 格式保存的外部表加
载数据比从固定或者定界外部文件中加载数据的速度快。当从一个 GBase 8s 数
据库移动到另一个数据库时,使用 GBase 8s 格式。
MAXERRORS
设置在数据库服务器停止加载数据之前所允许的错误数目。
MAXERRORS 的最小值为 1 。将 MAXERRORS 值设置为小于 1 的值会产生
错误。MAXERRORS 的最大值为 2,147,483,647 。
RECORDEND
指定已定界的文本文件中分隔记录的字符。
REJECTFILE
设置数据库服务器写入数据转换错误的完整路径名。如果未指定或者文件不能打
开,则任何错误均会异常结束装入作业。另见拒绝文件 。
NUMROWS 或 SIZE
外部表中的大约行数。
在连接查询中使用外部表时,指定 NUMROWS(或者它的同义词 SIZE)可以提
高性能。该值不能为 NULL 。

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 236
拒绝文件
在加载期间发生转换错误的行或违反外部表上检查约束的行将写入到拒绝文件
中。REJECTFILE 子句声明了该拒绝文件的路径和文件名称。
如果您在同一会话中对同一个表执行另一个装入,则任何先前相同名称的拒绝文
件将被覆盖。
拒绝文件条目具有以下格式:
filename, record, reason-code,
field-name: bad-line
下表描述拒绝文件中的这些元素:
元素 描述
filename 输入文件的名称
record 输入文件中记录号,在该文件中检测到错误
reason-code 错误的描述
field-name 外部字段名称,其中行中发生第一个错误;如果拒绝不是特
定于某个列,则为
bad-line 造成错误的行(仅限于定界或固定位置字符文件)
拒绝文件以 ASCII 格式写 filename, record 、field-name 和 reason-code。
bad-line 信息随输入文件类型不同而变化。

对于定界文件或固定位置字符文件,错误行有多达 80 个字符被直接复制
到拒绝文件中。

对于 GBase 8s 内部数据文件,错误行选项不放在拒绝文件中,因为您不
能在文件中编辑二进制表示法;但 filename 、record 、reason-code 和
field-name 仍在拒绝文件中报告,这样您可以隔离该问题。请使用 Table
Options 子句指定外部数据的格式。
以下错误可导致行被拒绝。
错误文本 说明
CONSTRAINT constraint name 违反了该约束。

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 237
CONVERT_ERR 有字段遇到转换错误。
MISSING_DELIMITER 找不到定界符。
MISSING_RECORDEND 找不到记录结尾。
NOT NULL 在 field-name 中找到 NULL 值。
ROW_TOO_LONG 输入记录超过 32 千字节。
虚拟处理器
GBase 8s 外部表使用 FIFO 虚拟处理器。当初始化服务器时,创建一个 FIFO 虚
拟处理器。可使用 onmode -p 命令添加其它 FIFO 虚拟处理器。例如,使用以下
语句添加三个 FIFO 虚拟处理器:
onmode -p +3 fifo
无法删除 FIFO 虚拟处理器。
FIFO 虚拟处理器用来处理与使用 PIPE 子句定义的管道相关的 I/O 。
有关使用 FIFO 虚拟处理器的更多信息,请参阅 GBase 8s 管理员指南。
外部表示例
本节中的示例显示使用外部表加载和卸装数据的不同方法。
以下是 CREATE EXTERNAL TABLE 语法的示例。在本示例中,创建带有两列
且名为 empdata 的外部表。DATAFILES 子句指示数据文件的位置,指定该文件
是定界的,指示拒绝文件的位置并指定该拒绝文件包含的错误不能多于 100 个。
CREATE EXTERNAL TABLE empdata
(
empname
char(40),
empdoj date
)
USING
(DATAFILES
(
"DISK:/work/empdata.unl"
),
FORMAT "DELIMITED",
REJECTFILE "/work/errlog/empdata.rej",

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 238
MAXERRORS 100);
使用 SAMEAS 子句创建外部表
SAMEAS template 子句在新表的定义中使用来自 template 表所有的列名称和数
据类型。以下示例使用 empdata 表的列名及其数据类型来创建外部表:
CREATE EXTERNAL TABLE emp_ext SAMEAS empdata
USING
(DATAFILES
(
"DISK:/work/empdata2.unl"
),
REJECTFILE "/work/errlog/empdata2.rej",
DELUXE
);
向外部表中卸装数据
以下示例显示将数据库表的数据加载到外部表所使用的语句。
CREATE EXTERNAL TABLE ext1( col1 int )
USING
(DATAFILES
(
"DISK:/tmp/ext1.unl"
)
);

CREATE TABLE base (col1 int);
INSERT INTO ext1 SELECT * FROM base;
还可以按照以下示例使用 SELECT...INTO EXTERNAL 语法卸装数
据:
SELECT * FROM base
INTO EXTERNAL emp_target
USING
(DATAFILES
(
"DISK:/tmp/ext1.unl"

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 239
)
);
从外部表查询数据将其加载到数据库表
以下示例从外部表查询,且显示了将查询到的数据加载到数据库表的各种方法。
CREATE EXTERNAL TABLE ext1( col1 int )
USING
(DATAFILES
(
"DISK:/tmp/ext1.unl"
)
);

CREATE TABLE target1 (col1 int);
CREATE TABLE target2 (col1 serial8, col2 int);

SELECT * FROM ext1;
SELECT col1,COUNT(*) FROM ext1 GROUP BY 1;
SELECT MAX(col1) FROM ext1;
SELECT col1 FROM ext1 a, systables b WHERE a.col1=b.tabid;

INSERT INTO target1 SELECT * FROM ext1;
INSERT INTO target2 SELECT 0,* FROM ext1;
从数据库表中的将数据卸装到一个使用 FIXED 格式的文本文件中
以下示例创建了一个名为 emp_ext 的外部表,定义了列名及其数据类型,并从使
用固定格式的数据库卸装数据。
CREATE EXTERNAL TABLE emp_ext
( name CHAR(18) EXTERNAL CHAR(20),
address VARCHAR(40) EXTERNAL CHAR(40),
empno INTEGER EXTERNAL CHAR(6)
)
USING (
FORMAT 'FIXED',
DATAFILES
(
"DISK:/work2/mydir/emp.fix"

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

INSERT INTO emp_ext SELECT * FROM employee;
从数据文件将数据加载到使用 FIXED 格式的数据库表中
下一示例创建了名为 emp_ext 的外部表,并从固定格式文件将数据加载到数据库
中。
CREATE EXTERNAL TABLE emp_ext
( name CHAR(18) EXTERNAL CHAR(18),
address VARCHAR(40) EXTERNAL CHAR(40),
empno INTEGER EXTERNAL CHAR(6)
)
USING (
FORMAT 'FIXED',
DATAFILES
(
"DISK:/work2/mydir/emp.fix"
)
);

INSERT INTO employee SELECT * FROM emp_ext;
在 DATAFILES 子句中使用格式化字符
要处理三个文件,请按照以下示例创建 DATAFILES 子句。
DATAFILES
(
"DISK:/work2/extern.dir/mytbl.%r(1..3)"
)
下列显示了当运行语句时列表是如何展开的:
DATAFILES
(
"DISK:/work2/extern.dir/mytbl.1",
"DISK:/work2/extern.dir/mytbl.2",
"DISK:/work2/extern.dir/mytbl.3"
)

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 241
将外部表中的加载到 GBase 8s
要加载数据,请定义该外部数据为外部表然后将数据插入到数据库中。
数据库服务器执行 express 方式加载和 deluxe 方式加载。您只能当表类型是
RAW 且不拥有活动的索引时,才能执行 express 方式加载。数据库服务器对这
两种加载方式都允许约束检查。
Express 方式在加载期间提供最高的性能。
Deluxe 方式将快速并行加载和索引及唯一约束的评估结合,并且在以下情况中,
更有效率:

对于您正在加载的数据量,重建索引的开销太高。

您想要使用从您正在加载表中的已删除行的空的空间。
如果接收外部表的行的表是 STANDARD 表(即,不是由 CREATE TEMP
TABLE 或 CREATE RAW TABLE 语句创建的数据库表),则 EXPRESS 关键
字没有作用,且该表以 DELUXE 方式加载。当数据库服务器忽略加载操作中的
EXPRESS 关键字时(此处正在接收数据的表不是 RAW 表),它不会发出异
常。
以 Express 方式加载数据
Express® 方式支持数据快递加载到没有索引的表中。在日志记录的数据库中,只
有 RAW 表能使用此方式。
警告: 支持事务日志记录的数据库中的 STANDARD 表不允许 Express 方式加
载。
注:
Express 方式加载使用轻量级追加,它绕过缓冲池。轻量级追加消除与缓冲管理器
相关的开销但不日志记录数据。在 express 方式,数据库服务器会自动排他锁定
该表。其它用户不能存取该表。
无论您是否使用DELUXE 关键字,数据库服务器使用 express 方式,除非目标表
有索引或者目标表是 STANDARD 表。

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 242
如果您定义了 RAW 类型表并在加载数据后没有定义任何索引,则可以对此没有
数据的新建的表使用 express 方式。如果您不希望在支持事务日志记录的数据库
中使用,请选择 RAW 表。
要为现有的表准备 express 方式加载,请删除所有的索引,并确保表类型是
RAW 。
从外部表加载数据到 raw 表不会被日志记录;因此,您必须在删除数据库之前执
行零级备份。如果您在执行零级备份之前尝试删除数据库,则数据库服务器发出
ISAM 错误error -197,如下所示:
Partition recently appended to; can't open for write or logging
考虑具有以下结构的表:
TABLE employee (
name CHAR(18),
hiredate DATE,
address CHAR(40),
empno INTEGER);
在现有表上使用 express 方式加载
1.
更改表类型从而允许快速加载。
ALTER TABLE employee TYPE (RAW);
2.
创建外部表描述。
CREATE EXTERNAL TABLE emp_ext
SAMEAS employee
USING (
FORMAT 'DELIMITED',
DATAFILES
("DISK:/work2/mydir/emp.dat"),
REJECTFILE "/work2/mydir/emp.rej",
EXPRESS
);
3.
加载该表。
INSERT INTO employee SELECT * FROM emp_ext;
如果数据库服务器选择 express 方式,当目标表包含索引、约束或者任意
其它问题条件时,加载停止并发出错误消息。

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 243
4.
创建零级备份。
因为数据是未日志记录的,您必须执行零级备份以允许数据复原。如果磁
盘失败,则您无法自动恢复数据。需要使用最近的零级备份文件。
如果表类型是 RAW (未日志记录),则忽略 BEGIN WORK 和 COMMIT
WORK 语句。
注: 如果您删除表中的很多行,然后以 EXPRESS 方式向表加载很多新行,则该
表大小增加,因为轻量级追加在表的末尾插入行,并且它不拒绝表内的空白。
(不管您是否指定 EXPRESS 方式,如果表由很多已删除的行,则该加载可能选择
DELUXE 方式填充到该空间。)
以 DELUXE 方式加载数据
DELUXE 方式将快速并行加载与索引评估和唯一约束评估结合起来。数据库服务
器对所有数据库中的被索引的目标表和在日志记录的数据库中 STANDARD 目标
表的选择这种方式。
注:
DELUXE 方式通常使用单行插入,可以向包含索引的表添加行。在加载期间,该
插入修改每行的每个索引。该插入还会检查每一行的约束。DELUXE 方式加载允
许您在加载期间将表保持为未锁定的状态,因此其它用户可以继续使用它。
您还可以在不包含索引的表上使用 DELUXE 方式;例如,您希望在加载期间可
以完成恢复或持续存取表。
要准备表以 DELUXE 方式加载,请创建内部表的类型为 STANDARD ,并用
DELUXE 关键字创建内部表。
在表上使用 DELUXE 方式加载:
1. 如果您希望行锁定,请在 CREATE TABLE 语句中指定行锁定。(缺省情况
下时页面锁定。)如果您想要其它用户在加载期间可以读取该表,那么将锁
定方式设置为 share 。否则,设置为 exclusive 。
BEGIN WORK;
LOCK TABLE employee IN SHARE MODE;

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 244
2. 定义外部表。
CREATE EXTERNAL TABLE emp_ext
SAMEAS employee
USING (
DATAFILES ("DISK:/work2/mydir/emp.dat"),
REJECTFILE "/work2/mydir/emp.rej",
DELUXE
);
3. 加载该表。
INSERT INTO employee SELECT * FROM emp_ext;
4. 提交该加载,释放行或页面锁定。
COMMIT WORK;
重要: 配置逻辑日志以允许最大并发 DELUXE 加载事务完成。
使用相同的结构将定界文件中的数据加载到数据库表中
如果外部表与数据库表具有相同的结构,则可以不用定义外部表的结构。
考虑将定界 ASCII 文本文件加载到具有以下结构的表中:
TABLE employee (
name CHAR(18) NOT NULL,
hiredate DATE DEFAULT TODAY,
address VARCHAR(40),
empno INTEGER);
以下 SQL 语句可以用来将数据加载到 employee 表中:
CREATE EXTERNAL TABLE emp_ext
SAMEAS employee
USING (
DATAFILES ("DISK:/work2/mydir/emp.dat"),
REJECTFILE "/work2/mydir/emp.rej"
);
INSERT INTO employee SELECT * FROM emp_ext;

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 245
外部表的每一列具有与源表列相同的名称、类型和缺省值,因为 CREATE 语句
包含了 SAMEAS 关键字。缺省格式为定界,因此不需要格式关键字。
定界文件缺省为 ASCII 。除非您在创建外部表时使用 RECORDEND 关键字定义
不同的定界符,否则缺省的行定界符是行结束符。(RECORDEND 关键字仅对定
界格式有效。)
从固定文本文件加载
固定文本文件是一种数据驻留在文件中固定位置的文件。
以下 SQL 语句将 emp_exp 外部表中的数据加载到固定位置表(employee):
CREATE EXTERNAL TABLE emp_ext
( name CHAR(18) EXTERNAL CHAR(18),
hiredate DATE EXTERNAL CHAR(10),
address VARCHAR(40) EXTERNAL CHAR(40),
empno INTEGER EXTERNAL CHAR(6) )
USING (
FORMAT 'FIXED',
DATAFILES ("DISK:/work2/mydir/emp.fix")
);
INSERT INTO employee SELECT * FROM emp_ext;
枚举的列使用 EXTERNAL 关键字描述在外部文件中存储数据的格式。
在拥有相同结构的表之间加载数据
如果表具有相同的结构,则您能轻松地将外部表的数据移动到数据库表。
您可以使用简单的 INSERT 语句将一个表的数据加载到另一个具有相同结构的表
中(例如:worldemp)。
INSERT INTO worldemp SELECT * FROM emp_ext;
将值装入 Serial 列
您可以在在 Serial 列中插入连续数字或显式值。
数据库服务器将使用原始数据文件中的值或数据库服务器自动生成的值装入到
Serial 列。

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 246
如果您希望该 serial 列值为来自数据文件的值,那么 INSERT 语句不需要进行
special 处理。如果您希望数据库服务器自动生成该值,那么忽略来自 INSERT
语句的 serial 列。例如:在表 col1 中第一列是 serial 列,使用以下语句,
缺省机制提供 serial 值:
INSERT INTO mytable (col2, ...) SELECT ...
如果该表被装入到多个分区,则 serial 值的以与表分片相同的顺序递增。
加载数据仓库表
对数据仓库应用程序,您可以使用外部表加载每一个大表。
本节讨论加载非常大的表的各种场景:

最初加载

定期刷新

从数据库服务而不是 GBase 8s 加载 OLTP 数据
最初加载
以下场景使用外部表创建并加载一个数据仓库表。
最初加载表
1. 创建 RAW 类型的表以便从轻量级追加中获利并避免在加载期间日志记录
的开销。
CREATE RAW TABLE tab1 ...
2. 对数据库服务器使用 CREATE EXTERNAL TABLE 语句描述外部数据文
件,在 USING 子句中指定 EXPRESS 语句。
3. 加载该表。
INSERT INTO tab1 SELECT * FROM ext_tab
该表加载很快,并且该操作用了非常小的日志空间。
4. 验证数据的完整性。
5. 在该表上创建索引以致于查询运行更快。
6. 如果必要,执行零级备份以便您之后可以恢复该表。如果在有问题的情况
下,从原始源重新加载表也很容易的话,则不需要执行此零级备份。

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 247
定期刷新
该场景定期从其它源加载新数据到数据仓库表。
该场景假设在正常操作期间该表的类型是 STANDARD ,之前执行过 CREATE
EXTERNAL TABLE 语句,并且在 USING 子句中指定了 EXPRESS 关键字。
要定期刷新表
1. 删除表上所有的索引。
2. 更改表类型为 RAW。
ALTER TABLE tab1 TYPE(RAW);
3. 向表加载新数据。
INSERT INTO tab1 SELECT * FROM ext_tab
此 insert 语句很快在该表的末尾追加了新数据,且该操作用了很小的日
志空间。
4. 验证数据的完整性。
5. 更改表类型为 STANDARD 。
ALTER TABLE tab1 TYPE(STANDARD);
6. 重新创建表上的索引以致于查询运行更快。
7. 如果必要,执行零级备份以便您之后可以恢复该表。如果在有问题的情况
下,从原始源重新加载表也很容易的话,则不需要执行此零级备份。
从其它数据库服务器初始加载 OLTP 数据
该场景是首次加载数据到 GBase 8s 中,当您从另一个数据库服务迁移是,您可
能会执行此操作。
在此场景。要加载的表将被用于 OLTP,因此您需要日志记录事务、回滚和恢复
能力。
使用 CREATE EXTERNAL TABLE 语句从不同的数据服务器使用最初加载
OLTP 数据:

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 248
1. 创建 RAW 类型的表以便从轻量级追加中获利并避免在加载期间日志记录
的开销。
CREATE RAW TABLE tab1 ...
2. 对数据库服务器使用 CREATE EXTERNAL TABLE 语句描述外部数据文
件,在 USING 子句中指定 EXPRESS 语句。
3. 加载该表。
INSERT INTO tab1 SELECT * FROM ext_tab
该表加载很快,并且该操作用了非常小的日志空间。
4. 验证数据的完整性。
5. 执行零级备份,提供一个恢复点。
6. 更改表的类型为 STANDARD。
ALTER TABLE tab1 TYPE(STANDARD);
7. 在表上创建的索引以便查询运行更快。
8. 启用表上的约束以保留数据的完整性。
将数据从 GBase 8s 卸装到外部表
通过创建外部表并将数据插入到该表中,或者从内部表查询数据并将数据插入到
外部文件,来卸装数据。
要并行地卸装数据,启动并行运行的查询,并将其输出结果写到多个文件中。该
卸装任务使用循环技术均衡输出文件汇总的行数。
卸载到定界文件
您可以将表中的数据卸载到定界的 ASCII 文本文件中,如下所示:
CREATE EXTERNAL TABLE emp_ext
SAMEAS employee
USING (
DATAFILES ("DISK:/work2/mydir/emp.dat")
);

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 249
INSERT INTO emp_ext SELECT * FROM employee;
定界文件缺省为 ASCII 。
卸载到 GBase 8s 数据文件
要将 employee 表卸载到 GBase 8s 内部格式的表,请使用类似的下列语句:
SELECT * FROM employee
WHERE hiredate > "1/1/1996"
INTO EXTERNAL emp_ext
USING (
FORMAT 'GBASEDBT',
DATAFILES ("DISK:/work2/mydir/emp.dat")
);
因为输出文件使用 GBase 8s 内部表示法,所以您需要在 USING 子句中指定
FORMAT 'GBASEDBT' 选项。(缺省为定界 ASCII 格式。)
卸载到固定文本文件
可将数据库的数据卸载到固定格式文件。
以下 SQL 语句将以固定文本格式的 employee 表卸载到 emp_ext 外部表中:
CREATE EXTERNAL TABLE emp_ext
( name CHAR(18) EXTERNAL CHAR(20),
hiredate DATE EXTERNAL CHAR(10),
address VARCHAR(40) EXTERNAL CHAR(40),
empno INTEGER EXTERNAL CHAR(6) )
USING (
FORMAT 'FIXED',
DATAFILES ("DISK:/work2/mydir/emp.fix")
);
INSERT INTO emp_ext SELECT * FROM employee;
这些语句创建了有 20 个字符位置的第一个字段,10 个字符位置的第二字段等等
的固定文本文件。因为通过 SELECT 语句选择行,所以您可以任何您希望的方式
格式化该 SELECT 列表。
向固定文本文件添加行结束符
您可以向固定文本文件的每行添加行结束符,以将文件用于其它应用程序。

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 250
如果您以固定文本格式写文本,一行写一个记录是有帮助的。行结束符使得数据
更清晰易读。如果您使用缺省的定界格式,则会自动添加行结束符。然而,对于
固定格式卸载,需要在您的记录中添加行结束符。例如:考虑具有以下结构的
表:
TABLE sample (
lastname CHAR(10),
firstname CHAR(10),
dateofbirth DATE);
该表包含以下值:
Adams Sam 10-02-1957
Smith John 01-01-1920
接下来,考虑以下结构的外部表:
CREATE EXTERNAL TABLE sample_ext (
lastname CHAR(10) EXTERNAL CHAR(10),
firstname CHAR(10) EXTERNAL CHAR(10),
dateofbirth DATE EXTERNAL CHAR(12));
不带行结束符卸载 sample_ext 会产生以下输出:
Adams Sam 10-02-1957 Smith John 01-01-1920
您可以通过使用程序或脚本添加行结束符,或者在 SELECT 语句中添加换行字
段。
使用程序或脚本
要添加行结束符,您可以将固定长度的记录写到数据文件中,然后用程序或脚本
修改该数据文件。
例如:您可以用 C 程序查找每一记录的长度,定位每一行的末尾,然后添加行结
束符。
在 SELECT 语句中添加换行字段
您可以使用外部表卸载在您内部表中的换行符。
要添加行结束符,请从含有换行符的表中查询最终值,如下所示:
1. 创建一个只包含换行字符的文件。
echo "" > /tmp/cr.fixed

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 251
2. 创建一个存储该换行值的内部表,在卸载数据时使用该表。
CREATE TABLE dummyCr (cr CHAR(1));
3. 创建外部表以卸载换行值。
CREATE EXTERNAL TABLE x_cr (cr CHAR(1) EXTERNAL CHAR(1))
USING (DATAFILES ("DISK:/tmp/cr.fixed"), FORMAT 'FIXED');
4. 加载该外部表到内部表 dummyCr 中。
INSERT INTO dummyCr SELECT * FROM x_cr;
该内部表,dummyCr ,现在包含一个行结束符,您可以在 SELECT 语句中既使
用它进行卸载。
1. 要将内部表的数据卸载到外部表,请创建带有行结束符 EXTERNAL CHAR 的
外部表。
CREATE EXTERNAL TABLE sample_ext
(
lastname CHAR(10) EXTERNAL CHAR(10),
firstname CHAR(10) EXTERNAL CHAR(10),
dateofbirth DATE EXTERNAL CHAR(12),
eol CHAR(1) EXTERNAL CHAR(1))
USING (DATAFILES ....), FORMAT 'FIXED');
2. 将从内部表和 dummyCr 表的查询用于创建拥有被行结束符分隔的行的输出
文件。
INSERT INTO sample_ext(lastname, firstname, dateofbirth, eol)
SELECT a.lastname, a.firstname, a.dateofbirth, b.cr
FROM mytable a, dummyCr b;
外部表的限制
确定外部表上不支持或具有限制范围的操作。
表 1 比较了支持数据库表和外部表的表操作。
表操作
数据库表
外部表
支持索引和:

否,使用顺序扫描

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 252
表操作
数据库表
外部表

主键

外键

唯一和非唯一索引

索引扫描

在执行查询时自动索
引(autoindex)

索引连接
支持触发器


MERGE 语句中表可以是目标

否。不允许作为目标允许
作为源。请参阅 MERGE 示

支持表分片


在 FROM 子句中允许多个数
据库表

否。请参阅 查询示例
支持 DB-Access LOAD
FROM ... INSERT INTO 语句


清除表的 TRUNCATE TABLE
语句

否。使用 TRUNCATE 语句
不会清除外部表中的数
据。将数据库表中的数据
卸载到外部表时会自动删
除此外部表。
复制表数据


支持 UPDATE STATISTICS 语



支持 UPDATE 和 DELETE 语



支持 ALTER TABLE 语句



GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 253
表操作
数据库表
外部表
支持 LBAC


支持压缩


支持 START 和 STOP
VIOLATIONS 语句


支持 TEMP 表


表列支持 EXTERNAL 数据类



支持 DEFAULT 子句


支持 BLOB 和 CLOB 类型的
PUT 子句

否。可以使用 DATAFILES
指定 BLOBDIR 和
CLOBDIR。
SERIAL 、SERIAL8 和
BIGSERIAL 数据类型生成的
serial 数

否。这些数据类型被转换
为等价的整型且不会生成
serial 值
使用 Enterprise
replication (ER)时可以
复制表


表的更改可被日志记录且可
以复制

否。外部表是非日志记录
的且不能被复制;然而系
统目录表可以被复制。
支持 ACID (原子性、一致
性、隔离性、持久性)属性


支持 ETL (提取、转换、加
载)
SQL 接口 不支持
ETL 操作的;然
而,例如
dbload 、
onload 、
onunload 实用程
支持使用简单的 SQL 接
口,对高性能的数据加载
和卸载,使用INSERT ...
SELECT 语句。

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 254
表操作
数据库表
外部表
序和 LOAD 、
UNLOAD 语句支
持。
确定不支持高可用集群操作(请参阅 GBase 8s 管理员指南 中的高可用集群环境
中的外部表)。
要从外部表加载 BLOB 或者 CLOB 对象,您必须重建临时 sbspace ,并在那个
空间中创建临时智能大对象来存储来自外部表 BLOB 或 CLOB 数据。不支持从
只读的辅助服务器加载 BLOB 或 CLOB 数据,因为您不能在只读的辅助服务器
上创建临时智能大对象。
MERGE 示例
外部表不能是 MERGE 语句中的目标。例如:如果 ext 是一个外部表,以下将
ext 作为源表的 MERGE 语句是有效的:
MERGE INTO t1
USING ext ON t1.c1 = ext.c1
WHEN MATCHED THEN UPDATE
SET t1.c2 = ext.c2
WHEN NOT MATCHED THEN INSERT VALUES (99, '999');
然而,以下语句因为把 ext 作为目标表而失败:
MERGE INTO ext
USING t1 ON ext.c1 = t1.c1
WHEN MATCHED THEN UPDATE
SET ext.c2 = t1.c2
WHEN NOT MATCHED THEN INSERT VALUES (99, '999');
查询示例
只有最外层的查询才能有外部表引用。在任何查询中只允许一个外部表。例如:
以下语句是允许的:
SELECT * FROM ext, t2 WHERE ext.c1 = t2.c1;
然而,以下语句是不允许的:

一个查询中不能指定多个外部表:

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 255
SELECT * FROM ext, ext3 WHERE ext.c1 = ext3.c1;

在子查询中不能使用外部表:
SELECT * FROM t1 WHERE t1.c1 IN (SELECT c1 FROM ext);