返回首页

gbase数据、南大通用产品文档:GBase8a删除镜像

更新日期:2024年09月11日


删除单个表的镜像
删除表的镜像命令如下:
ALTER TABLE VC1.DB.T1 DELETE MIRROR;
或者
ALTER DATABASE VC1.DB.T1 SET DEFAULT MIRROR = NULL;
删除表的镜像后,VC1.DB.T1 和VC2.DB.T1 不再有镜像关系,但是两张表仍
然存在。对其中一张表的写操作将不再同步到另一张表。
删除表的镜像时要求VC1.DB.T1 和VC2.DB.T1 两张表都可用,即两张表解除
镜像关系后还是两张独立可用的表。

以库为单位删除表镜像
命令如下:
ALTER DATABASE VC1.DB DELETE MIRROR;
或者
ALTER DATABASE VC1.DB SET DEFAULT MIRROR = NULL;
该命令将删除VC1.DB 下所有表的镜像关系。
注意

删除镜像功能只删除表的镜像关系,
不删除表及表数据,
镜像表会在
集群层重建使表的tid 不同。比如VC1.DB.T1 和VC2.DB.T1 有镜像
关系,删除镜像后,两张表不再有镜像关系,两张表的tid 也不再相
同,但是两张表和表数据仍然存在;

含有镜像关系的两张表,删除任意一张,镜像关系也随之删除;

库中含有镜像关系的表,
该库不能直接删除,
需先删除库内所有镜像
关系,该库才可以删除。

GBase 8a MPP Cluster 产品手册
4 管理员指南
文档版本953(2022-04-10)
南大通用数据技术股份有限公司
215

本节提供有关以下主题的信息:
GBase 8s 通用库是什么?
esql 命令的哪些命令行选项与 GBase 8s ESQL/C 程序链接 GBase 8s 通用库的版
本?
如何使用 GBase 8s ESQL/C 程序链接可用于 UNIX™ 和 Windows™ 操作系统的静
态 GBase 8s 通用库?
如何使用 GBase 8s ESQL/C 程序链接共享 GBase 8s 通用库?

GBase 8s ESQL/C 编程指南
南大通用数据技术股份有限公司
- 383 -
您需要考虑哪些因素来确定要使用哪种类型的 GBase 8s 通用库?
GBase 8s 通用库
以下是GBase 8s ESQL/C 在 UNIX™ 操作系统上的 GBase 8s 通用库列表。
libgen
包含一般任务的函数。
libos
包含操作系统需要的任务的函数。
libsql
包含在客户端应用程序和数据库服务器之间发送 SQL 语句的函数。
libgls
包含为 GBase 8s 产品通过全球语言支持(GLS)的函数。
libasf
包含处理客户端应用程序和数据库服务器之间通信协议的函数。
GBase 8s 通用库位于 UNIX 操作系统的 $GBASEDBTDIR/lib/esql 和
$GBASEDBTDIR/lib 目录 中。
GBase 8s ESQL/C For Windows™ 的 GBase 8s 通用库只是一个名为的 isqlt09a.dll的
DLL。该文件在 %GBASEDBTDIR%\lib 目录中。
GBase 8s ESQL/C For Windows 的静态库名为 isqlt09s.lib。该文件在
$GBASEDBTDIR/lib 目录中。
在许多平台上有一个名为 libgen.a 的系统库。要避免编译错误,建议您不要使用
libgen.a GBase 8s 库。而是使用 libifgen.a GBase 8s 库,它包含一个到 libgen.a 的符号链
接。
esql 命令
要确定您 GBase 8s ESQL/C 应用程序的要链接的 GBase 8s 通用库的类型,
esql 命令
支持下表的命令行选项。
表 1. GBase 8s 通用库的 esql 命令行选项
要链接的 GBase
8s 库版本
esql 命令行选

请参阅
共享库
没有选项
(缺省)

链接共享 GBase 8s 通用库
静态库
-static
链接静态 GBase 8s 通用库.

GBase 8s ESQL/C 编程指南
南大通用数据技术股份有限公司
- 384 -
线程安全共享库
-thread
UNIX 系统上将线程安全 GBase 8s 通用库链接
到 ESQL/C 模块和将线程安全的 GBase 8s 通用库链
接到 Windows 环境中的 ESQL/C 模块
线程安全静态库
-thread -static
在 UNIX 操作系统上创建动态线程库
链接静态 GBase 8s 通用库
从 GBase 8s Client Software Development Kit 版本 3.0 开始,Windows™ 和 UNIX™
操作系统上提供了静态版本的 GBase 8s 通用库。
静态 GBase 8s 通用库保留其 Version 7.2 的名称,静态库名称具有以下格式:
非程序安全的静态 GBase 8s 通用库的名称 libxxx.a。
线程安全的静态 GBase 8s 通用库的名称为 libthxxx.a。
在这些静态库名称中,
xxx 标识了特定的静态 GBase 8s 通用库。
对于 Version 7.2 和
更高版本,静态和线程安全的静态 GBase 8s 通用库将使用此格式的名称作为其实际名称。
以下示例输出显示 libos 静态(libos.a)和线程安全静态(libthos.a)库:
% cd $GBASEDBTDIR/lib/esql
% ls -l lib*os.a
-rw-r--r-- 1 gbasedbt 145424 Nov 8 01:40 libos.a
-rw-r--r-- 1 gbasedbt 168422 Nov 8 01:40 libthos.a
esql 命令将与静态 GBase 8s 通用库的实际名称相关联的代码链接到 GBase 8s
ESQL/C 应用程序。运行时,您的 GBase 8s ESQL/C 程序可以直接从它的可执行文件访问
这些 GBase 8s 通用库函数。
将静态 GBase 8s 通用库链接到 ESQL/C 模块中
要使用 GBase 8s ESQL/C 模块链接 GBase 8s 通用库,
请使用 -static 命令行选项编
译您的程序。
以下命令使用 file.exe 可执行文件链接非线程安全 GBase 8s 库:
esql -static file.ec -o file.exe
esql 命令还可以将线程安全的 GBase 8s 通用库的代码与 GBase 8s ESQL/C 应用程
序链接。
提示: Version 7.2 之前的 GBase 8s ESQL/C esql 命令链接了 GBase 8s 通用库的静
态版本。因为 esql 命令缺省链接这些库的共享版本。您必须指定 -static 选项将静态版本
与 GBase 8s ESQL/C 应用程序链接。
链接共享 GBase 8s 通用库
GBase 8s ESQL/C 可以自动链接共享库,它将此库放置到共享内存中。当共享库在共
享内存中时,其它 GBase 8s ESQL/C 应用程序也会使用它。共享库在多用户环境中最为有
用,其中所有应用程序只需要一个库副本。
重要: 要在 GBase 8s ESQL/C 应用程序中使用共享库,您的操作系统必须支持共享

GBase 8s ESQL/C 编程指南
南大通用数据技术股份有限公司
- 385 -
库。
支持共享库的操作系统包括 Sun 和 HP 版本的 UNIX™ 和 Windows™。
您应该熟悉
创建共享库以及 C 编程器需要构建它们的编译选项。
链接共享库(UNIX)的符号名称
当 esql 命令使用 GBase 8s ESQL/C 应用程序链接共享或线程安全共享 GBase 8s 库
时,它使用这些函数的 symbolic 名称。
非线程安全共享 GBase 8s 通用库具有 libxxx.yyy. 格式的符号名称。
线程安全共享 GBase 8s 通用库具有 libthxxx.yyy 格式的符号名称。
在这些静态库名称中,xxx 标识特定的库,yyy 是一个特定于平台的文件扩展名,用
于标识共享库文件。
提示: 要引用指定的共享库文件,此版本经常使用 Sun UNIX™ 操作系统的文件扩
展名,.so 文件扩展名。对于 UNIX 操作系统使用的共享库文件扩展名,请参阅 UNIX 操
作系统文件。
当您安装 GBase 8s ESQL/C 产品时,安装脚本将实际共享成品库名称与符号名称的
文件进行符号链接。下图显示了 GBase 8s 库的共享和线程安全共享版本的实际名称格式。

图: GBase 8s 共享库名称的格式


以下示例输出显示了 libos.a 静态库和 libos.so 共享库(在 Sun 平台上)的符号以
及实际名称:
%ls -l $GBASEDBTDIR/esql/libos*
-rw-r--r-- 1 gbasedbt 145424 Nov 8 01:40 libos.a
lrwxrwxrwx 1 root 11 Nov 8 01:40 libos.so -> iosls07a.so*
esql 命令使用 GBase 8s ESQL/C 应用程序链接符号共享库名称。运行期间,当程序
需要 GBase 8s 通用库函数时,GBase 8s ESQL/C 动态链接共享 GBase 8s 通用库的代码。

将共享 GBase 8s 通用库链接到 ESQL/C 模块中
要将共享 GBase 8s 通用库链接到 ESQL/C 模块中:
在运行时设置指定库搜索路径的环境变量,以便它在 UNIX™ 操作系统上包含
$GBASEDBTDIR/lib 和 $GBASEDBTDIR/lib/esql 路径;在 Windows™ 环境中包
含 %GBASEDBTDIR%lib。
在许多 UNIX 操作系统上,
LD_LIBRARY_PATH 环境变量指定库搜索路径。
以下命
令在 C shell 中设置 LD_LIBRARY_PATH:
setenv LD_LIBRARY_PATH $GBASEDBTDIR/lib:$GBASEDBTDIR/

GBase 8s ESQL/C 编程指南
南大通用数据技术股份有限公司
- 386 -
lib/esql:/usr/lib
在 Windows 环境中,使用以下命令:
set LIB = %GBASEDBTDIR%\lib\;%LIB%
使用 esql 命令编译程序。
要使用 GBase 8s ESQL/C 模块链接 GBase 8s 通用库,您不需要指定命令行选项。
GBase 8s ESQL/C 缺省链接共享库。以下命令使用共享 GBase 8s 库编译 file.ec 源文件:
esql file.ec -o file.exe
当 esql 命令使用 GBase 8s ESQL/C 应用程序链接线程安全共享 GBase 8s 通用库时,
还会使用信号名称。
在共享和静态库版本之间选择
从 GBase 8s Client Software Development Kit 版本 3.0 开始,GBase 8s 通用库的静态
版本适用于 Windows™ 和 UNIX™ 操作系统。
共享库在多用户环境中十分有用,其中所有应用程序只需要一个库副本。共享库为您
的 GBase 8s ESQL/C 应用程序带来以下好处:
共享库减少可执行文件的大小,因为这些库函数是在需要的基础上动态链接的。
运行时,共享库的单个副本会链接到多个程序,这导致更少的内存使用。
GBase 8s ESQL/C 可执行文件中共享库的效果对用户来说是透明的。
尽管共享库保存磁盘和内存空间,但是当 GBase 8s ESQL/C 应用程序使用它们时,
它必须执行以下所有任务:
首次将共享库动态加载到内存中
执行链接编辑操作
执行库位置无关代码
这些开销任务可能会导致运行时迟缓,并且在使用静态库时不是必需的。但是,一旦
操作系统语句加载并映射了 GBase 8s 共享库,输入/输出(I/O)访问时间就可以抵消这些
成本。
重要: 当第一次执行应用程序加载共享库时,可能会对应用程序的客户端的性能造
成一次性负面影响。有关更多信息,请参阅操作系统文档。
由于操作系统需要加载程序及其库的真实 I/O 时间,
通常不会超过保存的 I/O 时间,
所以使用共享库的查询的性能明显与使用静态库的程序一样好或更好。但是,如果应用程
序不进行共享,或者如何您的处理器在应用程序调用共享库例程时饱和,则可能无法实现
这些节省。
还可以使用 GBase 8s ESQL/C 应用程序链接静态和共享 GBase 8s 通用库的线程安
全版本。

demo1.ec 程序演示了本节呈现的大多数概念,例如:include 文件、标识符、主机变量以
及嵌入式 SQL 语句。
它演示如何使用头文件、
声明以及使用主机变量和嵌入式 SQL 语句。

重要: 如果使用 UNIX™,可以在 $GBASEDBTDIR/demo/esqlc 目录下找到本版的联机
以及其它演示程序。
如果使用 Windows™,
可以在 %GBASEDBTDIR%\demo\esqldemo 目
录下找到此程序。
编译 demo1 程序
使用下列命令编译 demo1 程序:esql demo1.ec
在 UNIX™ 中,可执行程序的名称缺省为 a.out。
在 Windows™ 环境中,可执行程序的名称缺省为 demo.exe。
可以使用 -o 选项对可执行程序指定不同的名称。
demo1.ec 文件指南
GBase 8s ESQL/C 程序样本 demo1.ec 使用静态 SELECT 语句。
这意味着在编译时程序可
以获得它需要运行 SELECT 语句的所有信息。
1. #include
2. EXEC SQL define FNAME_LEN 15;
3. EXEC SQL define LNAME_LEN 15;
4. main()

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

5. {
6. EXEC SQL BEGIN DECLARE SECTION;
7. char fname[ FNAME_LEN + 1 ];
8. char lname[ LNAME_LEN + 1 ];
9. EXEC SQL END DECLARE SECTION;
第 1 行
#include 语句告诉 C 预处理程序包含来自 /usr/include 目录下的 stdio.h 系统头文。
stdio.h 文件使 demo1 使用标准 C 语言 I/O 库。
第 2 - 3 行
GBase 8s ESQL/C 处理预处理阶段 1 中的 define 指令。该指令定义定义 FNAME_LEN
和 LNAME_LEN 常量,程序在主机变量的声明中使用它们。
第 4 - 9 行
第 4 行开始 main() 函数,该程序的入口点。EXEC SQL 块声明 main() 函数本地的主机
变量,它从 customer 表的 fname 和 lname 列接收数据。每个数组的长度大于其接收
数据的字符列的长度的 1 个字符。额外的字节存储空终止符。
10. printf( "DEMO1 Sample ESQL Program running.\n\n");
11. EXEC SQL WHENEVER ERROR STOP;
12. EXEC SQL connect to 'stores7';
13. EXEC SQL DECLARE democursor cursor for
14. select fname, lname
15. into :fname, :lname
16. from customer
17. where lname < 'C';
18. EXEC SQL open democursor;
第 10 - 12 行
printf() 函数显示用于标识的文本,并在程序开始执行时通知用户。WHENEVER 语句实现
最少的错误处理,导致程序显示错误编号,并在数据库服务器处理 SQL 语句后返回错误
时终止。CONNECT 语句发起与缺省数据库服务器的连接,并打开 stores7 演示数据库。
您可以在 GBASEDBTSERVER 环境变量中指定缺省数据库服务器,必须在应用程序连接
任何数据库服务器之前设置。
第 13 - 17 行
DECLARE 语句创建名为 democursor 的游标,
来管理数据库服务器从 customer 表读
取的行。DECLARE 语句中的 SELECT 语句确定数据库服务器从该表读取的数据的类型。
此 SELECT 语句读取姓氏(lname)以小于 'C' 的字母开头的那些客户的第一个和家族
姓名。
第 18 行
OPEN 语句打开 democursor 游标并开始执行 SELECT 语句。
19. for (;;)

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

20. {
21. EXEC SQL fetch democursor;
22. if (strncmp(SQLSTATE, "00", 2) != 0)
23. break;
24. printf("%s %s\n",fname, lname);
25. }
26. if (strncmp(SQLSTATE, "02", 2) != 0)
27. printf("SQLSTATE after fetch is %s\n", SQLSTATE);
28. EXEC SQL close democursor;
29. EXEC SQL free democursor;
第 19 - 25 行
本节代码在循环中执行 FETCH 语句并重复,
直到 SQLSTATE 不等于 "00"。
该条件表示
数据结束条件或发生运行错误。在此循环中每个迭代中, FETCH 语句使用游标
democursor 检索 SELECT 语句返回的下一行并将选择的行放到主机变量 fname 和
lname中。数据库服务器每次成功获取行后都将 SQLSTATE 的状态变量设置为 "00" 。
如果数据结束的条件发生,则数据库服务器将 SQLSTATE 设置为 "02";如果发生错误,
则将 SQLSTATE 设置为比 "02" 大的值。
第 26 - 27 行
如果 SQLSTATE 中的类代码是除了 "02" 的任何值,则此用户的 SQLSTATE 值通过
printf() 显示。该输出在运行错误的事件中很有用。
第 28 - 29 行
CLOSE 和 FREE 语句释放为数据库服务器此游标分配的资源。该游标将不再使用。
30. EXEC SQL disconnect current;
31. printf("\nDEMO1 Sample Program over.\n\n");
32. }
第 30 - 32 行
DISCONNECT CURRENT 语句关闭数据库并终止当前对数据库服务器的连接。最后的
printf() 告诉用户程序结束。32 行的右括号(})标识程序 main() 函数的结束。
OPEN 语句打开 democursor 游标并开始执行 SELECT 语句。
19. for (;;)
20. {
21. EXEC SQL fetch democursor;
22. if (strncmp(SQLSTATE, "00", 2) != 0)
23. break;
24. printf("%s %s\n",fname, lname);
25. }
26. if (strncmp(SQLSTATE, "02", 2) != 0)
27. printf("SQLSTATE after fetch is %s\n", SQLSTATE);
28. EXEC SQL close democursor;
29. EXEC SQL free democursor;

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

第 19 - 25 行
本节代码在循环中执行 FETCH 语句并重复,
直到 SQLSTATE 不等于 "00"。
该条件表示
数据结束条件或发生运行错误。在此循环中每个迭代中, FETCH 语句使用游标
democursor 检索 SELECT 语句返回的下一行并将选择的行放到主机变量 fname 和
lname中。数据库服务器每次成功获取行后都将 SQLSTATE 的状态变量设置为 "00" 。
如果数据结束的条件发生,则数据库服务器将 SQLSTATE 设置为 "02";如果发生错误,
则将 SQLSTATE 设置为比 "02" 大的值。
第 26 - 27 行
如果 SQLSTATE 中的类代码是除了 "02" 的任何值,则此用户的 SQLSTATE 值通过
printf() 显示。该输出在运行错误的事件中很有用。
第 28 - 29 行
CLOSE 和 FREE 语句释放为数据库服务器此游标分配的资源。该游标将不再使用。
30. EXEC SQL disconnect current;
31. printf("\nDEMO1 Sample Program over.\n\n");
32. }
第 30 - 32 行
DISCONNECT CURRENT 语句关闭数据库并终止当前对数据库服务器的连接。最后的
printf() 告诉用户程序结束。32 行的右括号(})标识程序 main() 函数的结束。