返回首页

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

更新日期:2024年09月11日

常用功能示例代码
// 此示例演示如何通过ODBC 方式获取GBase 8c 数据库中的数据。
// DBtest.c (compile with: libodbc.so) #include
#include #include #ifdef WIN32 #include #endif
SQLHENV
V_OD_Env;
// Handle ODBC environment SQLHSTMT
V_OD_hstmt;
// Handle statement SQLHDBC
V_OD_hdbc;
// Handle connection
char
typename[100]; SQLINTEGER value = 100;
SQLINTEGER V_OD_erg,V_OD_buffer,V_OD_err,V_OD_id; int main(int argc,char *argv[])
{
// 1. 申请环境句柄
V_OD_erg = SQLAllocHandle(SQL_HANDLE_ENV,SQL_NULL_HANDLE,&V_OD_Env);
if ((V_OD_erg != SQL_SUCCESS) && (V_OD_erg != SQL_SUCCESS_WITH_INFO))
{
printf("Error AllocHandle\n"); exit(0);
}
// 2. 设置环境属性(版本信息)
SQLSetEnvAttr(V_OD_Env, SQL_ATTR_ODBC_VERSION, (void*)SQL_OV_ODBC3, 0);
// 3. 申请连接句柄
V_OD_erg = SQLAllocHandle(SQL_HANDLE_DBC, V_OD_Env, &V_OD_hdbc);
if ((V_OD_erg != SQL_SUCCESS) && (V_OD_erg != SQL_SUCCESS_WITH_INFO))
{
SQLFreeHandle(SQL_HANDLE_ENV, V_OD_Env); exit(0);
}
// 4. 设置连接属性
SQLSetConnectAttr(V_OD_hdbc, SQL_ATTR_AUTOCOMMIT, SQL_AUTOCOMMIT_ON,
0);
// 5. 连接数据源,这里的“userName”与“password”分别表示连接数据库的用户名和用
户密码,请根据实际情况修改。
// 如果odbc.ini 文件中已经配置了用户名密码,那么这里可以留空("");但是不建议这
么做,因为一旦
odbc.ini 权限管理不善,将导致数据库用户密码泄露。
V_OD_erg = SQLConnect(V_OD_hdbc, (SQLCHAR*) "gaussdb", SQL_NTS,
(SQLCHAR*) "userName", SQL_NTS, (SQLCHAR*) "password", SQL_NTS); if
((V_OD_erg != SQL_SUCCESS) && (V_OD_erg != SQL_SUCCESS_WITH_INFO))
{
printf("Error SQLConnect %d\n",V_OD_erg); SQLFreeHandle(SQL_HANDLE_ENV,
V_OD_Env); exit(0);
}

GBase 8c V5 开发者手册
南大通用数据技术股份有限公司
271
printf("Connected !\n");
// 6. 设置语句属性
SQLSetStmtAttr(V_OD_hstmt,SQL_ATTR_QUERY_TIMEOUT,(SQLPOINTER *)3,0);
// 7. 申请语句句柄
SQLAllocHandle(SQL_HANDLE_STMT, V_OD_hdbc, &V_OD_hstmt);
// 8. 直接执行SQL 语句。
SQLExecDirect(V_OD_hstmt,"drop table IF EXISTS customer_t1",SQL_NTS);
SQLExecDirect(V_OD_hstmt,"CREATE TABLE customer_t1(c_customer_sk INTEGER,
c_customer_name
VARCHAR(32));",SQL_NTS);
SQLExecDirect(V_OD_hstmt,"insert into customer_t1 values(25,li)",SQL_NTS);
// 9. 准备执行
SQLPrepare(V_OD_hstmt,"insert into customer_t1 values(?)",SQL_NTS);
// 10. 绑定参数
SQLBindParameter(V_OD_hstmt,1,SQL_PARAM_INPUT,SQL_C_SLONG,SQL_INTEGER,
0,0, &value,0,NULL);
// 11. 执行准备好的语句
SQLExecute(V_OD_hstmt);
SQLExecDirect(V_OD_hstmt,"select id from testtable",SQL_NTS);
// 12. 获取结果集某一列的属性
SQLColAttribute(V_OD_hstmt,1,SQL_DESC_TYPE,typename,100,NULL,NULL);
printf("SQLColAtrribute %s\n",typename);
// 13. 绑定结果集
SQLBindCol(V_OD_hstmt,1,SQL_C_SLONG, (SQLPOINTER)&V_OD_buffer,150,
(SQLLEN *)&V_OD_err);
// 14. 通过SQLFetch 取结果集中数据
V_OD_erg=SQLFetch(V_OD_hstmt);
// 15. 通过SQLGetData 获取并返回数据。
while(V_OD_erg != SQL_NO_DATA)
{
SQLGetData(V_OD_hstmt,1,SQL_C_SLONG,(SQLPOINTER)&V_OD_id,0,NULL);
printf("SQLGetData
ID = %d\n",V_OD_id);
V_OD_erg=SQLFetch(V_OD_hstmt);
};
printf("Done !\n");
// 16. 断开数据源连接并释放句柄资源
SQLFreeHandle(SQL_HANDLE_STMT,V_OD_hstmt); SQLDisconnect(V_OD_hdbc);
SQLFreeHandle(SQL_HANDLE_DBC,V_OD_hdbc); SQLFreeHandle(SQL_HANDLE_ENV,
V_OD_Env); return(0);
}
批量绑定示例代码

GBase 8c V5 开发者手册
南大通用数据技术股份有限公司
272
/**********************************************************************
*请在数据源中打开UseBatchProtocol,同时指定数据库中参数support_batch_bind
*为on
*CHECK_ERROR 的作用是检查并打印错误信息。
*此示例将与用户交互式获取DSN、模拟的数据量,忽略的数据量,并将最终数据入库到
test_odbc_batch_insert 中
***********************************************************************/
#include
#include #include #include #include
#include "util.c"
void Exec(SQLHDBC hdbc, SQLCHAR* sql)
{
SQLRETURN retcode;// Return status
SQLHSTMT hstmt = SQL_NULL_HSTMT; // Statement handle SQLCHAR loginfo[2048];
// Allocate Statement Handle
retcode = SQLAllocHandle(SQL_HANDLE_STMT, hdbc, &hstmt); CHECK_ERROR(retcode,
"SQLAllocHandle(SQL_HANDLE_STMT)",
hstmt, SQL_HANDLE_STMT);
// Prepare Statement
retcode = SQLPrepare(hstmt, (SQLCHAR*) sql, SQL_NTS); sprintf((char*)loginfo,
"SQLPrepare log: %s", (char*)sql); CHECK_ERROR(retcode, loginfo, hstmt,
SQL_HANDLE_STMT);
// Execute Statement
retcode = SQLExecute(hstmt);
sprintf((char*)loginfo, "SQLExecute stmt log: %s", (char*)sql); CHECK_ERROR(retcode,
loginfo, hstmt, SQL_HANDLE_STMT);
// Free Handle
retcode = SQLFreeHandle(SQL_HANDLE_STMT, hstmt); sprintf((char*)loginfo,
"SQLFreeHandle stmt log: %s", (char*)sql); CHECK_ERROR(retcode, loginfo, hstmt,
SQL_HANDLE_STMT);
}
int main ()
{
SQLHENV henv = SQL_NULL_HENV; SQLHDBC hdbc = SQL_NULL_HDBC;
int batchCount = 1000; SQLLEN rowsCount = 0; int ignoreCount = 0;
SQLRETURN retcode; SQLCHAR
dsn[1024] = {'\0'};
SQLCHAR
loginfo[2048];
// 交互获取数据源名称
getStr("Please input your DSN", (char*)dsn, sizeof(dsn), 'N');
// 交互获取批量绑定的数据量getInt("batchCount", &batchCount, 'N', 1); do
{

GBase 8c V5 开发者手册
南大通用数据技术股份有限公司
273
// 交互获取批量绑定的数据中,不要入库的数据量
getInt("ignoreCount", &ignoreCount, 'N', 1); if (ignoreCount > batchCount)
{
printf("ignoreCount(%d) should be less than batchCount(%d)\n", ignoreCount, batchCount);
}
}while(ignoreCount > batchCount);
retcode = SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &henv);
CHECK_ERROR(retcode, "SQLAllocHandle(SQL_HANDLE_ENV)",
henv, SQL_HANDLE_ENV);
// Set ODBC Verion
retcode = SQLSetEnvAttr(henv, SQL_ATTR_ODBC_VERSION,
(SQLPOINTER*)SQL_OV_ODBC3, 0);
CHECK_ERROR(retcode, "SQLSetEnvAttr(SQL_ATTR_ODBC_VERSION)", henv,
SQL_HANDLE_ENV);
// Allocate Connection
retcode = SQLAllocHandle(SQL_HANDLE_DBC, henv, &hdbc); CHECK_ERROR(retcode,
"SQLAllocHandle(SQL_HANDLE_DBC)",
henv, SQL_HANDLE_DBC);
// Set Login Timeout
retcode = SQLSetConnectAttr(hdbc, SQL_LOGIN_TIMEOUT, (SQLPOINTER)5, 0);
CHECK_ERROR(retcode, "SQLSetConnectAttr(SQL_LOGIN_TIMEOUT)",
hdbc, SQL_HANDLE_DBC);
// Set Auto Commit
retcode = SQLSetConnectAttr(hdbc, SQL_ATTR_AUTOCOMMIT,
(SQLPOINTER)(1), 0);
CHECK_ERROR(retcode, "SQLSetConnectAttr(SQL_ATTR_AUTOCOMMIT)", hdbc,
SQL_HANDLE_DBC);
// Connect to DSN
sprintf(loginfo, "SQLConnect(DSN:%s)", dsn);
retcode = SQLConnect(hdbc, (SQLCHAR*) dsn, SQL_NTS,
(SQLCHAR*) NULL, 0, NULL, 0);
CHECK_ERROR(retcode, loginfo, hdbc, SQL_HANDLE_DBC);
// init table info.
Exec(hdbc, "drop table if exists test_odbc_batch_insert");
Exec(hdbc, "create table test_odbc_batch_insert(id int primary key, col varchar2(50))");
// 下面的代码根据用户输入的数据量,构造出将要入库的数据:
{
SQLRETURN retcode;
SQLHSTMT hstmtinesrt = SQL_NULL_HSTMT; int
i;
SQLCHAR
*sql = NULL; SQLINTEGER *ids = NULL; SQLCHAR
*cols = NULL;

GBase 8c V5 开发者手册
南大通用数据技术股份有限公司
274
SQLLEN
*bufLenIds = NULL; SQLLEN
*bufLenCols = NULL; SQLUSMALLINT
*operptr = NULL; SQLUSMALLINT *statusptr = NULL; SQLULEN
process = 0;
// 这里是按列构造,每个字段的内存连续存放在一起。
ids = (SQLINTEGER*)malloc(sizeof(ids[0]) * batchCount); cols =
(SQLCHAR*)malloc(sizeof(cols[0]) * batchCount * 50);
// 这里是每个字段中,每一行数据的内存长度。
bufLenIds = (SQLLEN*)malloc(sizeof(bufLenIds[0]) * batchCount); bufLenCols =
(SQLLEN*)malloc(sizeof(bufLenCols[0]) * batchCount);
// 该行是否需要被处理,SQL_PARAM_IGNORE 或SQL_PARAM_PROCEED operptr =
(SQLUSMALLINT*)malloc(sizeof(operptr[0]) * batchCount); memset(operptr, 0,
sizeof(operptr[0]) * batchCount);
// 该行的处理结果。
// 注:
由于数据库中处理方式是同一语句隶属同一事务中,
所以如果出错,
那么待处理数
据都将是出错的,并不会部分入库。
statusptr = (SQLUSMALLINT*)malloc(sizeof(statusptr[0]) * batchCount); memset(statusptr,
88, sizeof(statusptr[0]) * batchCount);
if (NULL == ids || NULL == cols || NULL == bufLenCols || NULL == bufLenIds)
{
fprintf(stderr, "FAILED:\tmalloc data memory failed\n"); goto exit;
}
for (int i = 0; i < batchCount; i++)
{
ids[i] = i;
sprintf(cols + 50 * i, "column test value %d", i); bufLenIds[i] = sizeof(ids[i]);
bufLenCols[i] = strlen(cols + 50 * i);
operptr[i] = (i < ignoreCount) ? SQL_PARAM_IGNORE : SQL_PARAM_PROCEED;
}
// Allocate Statement Handle
retcode = SQLAllocHandle(SQL_HANDLE_STMT, hdbc, &hstmtinesrt);
CHECK_ERROR(retcode, "SQLAllocHandle(SQL_HANDLE_STMT)",
hstmtinesrt, SQL_HANDLE_STMT);
// Prepare Statement
sql = (SQLCHAR*)"insert into test_odbc_batch_insert values(?, ?)"; retcode =
SQLPrepare(hstmtinesrt, (SQLCHAR*) sql, SQL_NTS); sprintf((char*)loginfo, "SQLPrepare
log: %s", (char*)sql); CHECK_ERROR(retcode, loginfo, hstmtinesrt, SQL_HANDLE_STMT);
retcode = SQLSetStmtAttr(hstmtinesrt, SQL_ATTR_PARAMSET_SIZE,
(SQLPOINTER)batchCount, sizeof(batchCount));
CHECK_ERROR(retcode, "SQLSetStmtAttr", hstmtinesrt, SQL_HANDLE_STMT);
retcode = SQLBindParameter(hstmtinesrt, 1, SQL_PARAM_INPUT, SQL_C_SLONG,
SQL_INTEGER, sizeof(ids[0]), 0,&(ids[0]), 0, bufLenIds);
CHECK_ERROR(retcode, "SQLBindParameter for id", hstmtinesrt, SQL_HANDLE_STMT);

GBase 8c V5 开发者手册
南大通用数据技术股份有限公司
275
retcode = SQLBindParameter(hstmtinesrt, 2, SQL_PARAM_INPUT, SQL_C_CHAR,
SQL_CHAR, 50, 50,
cols, 50, bufLenCols);
CHECK_ERROR(retcode, "SQLBindParameter for cols", hstmtinesrt,
SQL_HANDLE_STMT);
retcode = SQLSetStmtAttr(hstmtinesrt, SQL_ATTR_PARAMS_PROCESSED_PTR,
(SQLPOINTER)&process, sizeof(process));
CHECK_ERROR(retcode, "SQLSetStmtAttr for SQL_ATTR_PARAMS_PROCESSED_PTR",
hstmtinesrt, SQL_HANDLE_STMT);
retcode = SQLSetStmtAttr(hstmtinesrt, SQL_ATTR_PARAM_STATUS_PTR,
(SQLPOINTER)statusptr, sizeof(statusptr[0]) * batchCount);
CHECK_ERROR(retcode, "SQLSetStmtAttr for SQL_ATTR_PARAM_STATUS_PTR",
hstmtinesrt, SQL_HANDLE_STMT);
retcode = SQLSetStmtAttr(hstmtinesrt, SQL_ATTR_PARAM_OPERATION_PTR,
(SQLPOINTER)operptr, sizeof(operptr[0]) * batchCount);
CHECK_ERROR(retcode, "SQLSetStmtAttr for SQL_ATTR_PARAM_OPERATION_PTR",
hstmtinesrt, SQL_HANDLE_STMT);
retcode = SQLExecute(hstmtinesrt);
sprintf((char*)loginfo, "SQLExecute stmt log: %s", (char*)sql); CHECK_ERROR(retcode,
loginfo, hstmtinesrt, SQL_HANDLE_STMT);
retcode = SQLRowCount(hstmtinesrt, &rowsCount);
CHECK_ERROR(retcode, "SQLRowCount execution", hstmtinesrt, SQL_HANDLE_STMT);
if (rowsCount != (batchCount - ignoreCount))
{
sprintf(loginfo, "(batchCount - ignoreCount)(%d) != rowsCount(%d)", (batchCount -
ignoreCount), rowsCount);
CHECK_ERROR(SQL_ERROR, loginfo, NULL, SQL_HANDLE_STMT);
}
else
{
sprintf(loginfo, "(batchCount - ignoreCount)(%d) == rowsCount(%d)", (batchCount -
ignoreCount), rowsCount);
CHECK_ERROR(SQL_SUCCESS, loginfo, NULL, SQL_HANDLE_STMT);
}
// check row number returned if (rowsCount != process)
{
sprintf(loginfo, "process(%d) != rowsCount(%d)", process, rowsCount);
CHECK_ERROR(SQL_ERROR, loginfo, NULL, SQL_HANDLE_STMT);
}
else
{

GBase 8c V5 开发者手册
南大通用数据技术股份有限公司
276
sprintf(loginfo, "process(%d) == rowsCount(%d)", process, rowsCount);
CHECK_ERROR(SQL_SUCCESS, loginfo, NULL, SQL_HANDLE_STMT);
}
for (int i = 0; i < batchCount; i++)
{
if (i < ignoreCount)
{
if (statusptr[i] != SQL_PARAM_UNUSED)
{
sprintf(loginfo, "statusptr[%d](%d) != SQL_PARAM_UNUSED", i, statusptr[i]);
CHECK_ERROR(SQL_ERROR, loginfo, NULL, SQL_HANDLE_STMT);
}
}
else if (statusptr[i] != SQL_PARAM_SUCCESS)
{
sprintf(loginfo, "statusptr[%d](%d) != SQL_PARAM_SUCCESS", i, statusptr[i]);
CHECK_ERROR(SQL_ERROR, loginfo, NULL, SQL_HANDLE_STMT);
}
}
retcode = SQLFreeHandle(SQL_HANDLE_STMT, hstmtinesrt); sprintf((char*)loginfo,
"SQLFreeHandle hstmtinesrt"); CHECK_ERROR(retcode, loginfo, hstmtinesrt,
SQL_HANDLE_STMT);
}
exit:
printf ("\nComplete.\n");
// Connection
if (hdbc != SQL_NULL_HDBC) { SQLDisconnect(hdbc);
SQLFreeHandle(SQL_HANDLE_DBC, hdbc);
}
// Environment
if (henv != SQL_NULL_HENV) SQLFreeHandle(SQL_HANDLE_ENV, henv);
return 0;
}


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. 运行恢复命令。

增量物化视图可以对物化视图增量刷新,
需要用户手动执行语句完成对物化视图在一段
时间内的增量数据刷新。
与全量创建物化视图的不同在于目前增量物化视图所支持场景较小。
目前物化视图创建语句仅支持基表扫描语句或者UNION ALL 语句。