返回首页

gbase数据、南大通用产品文档:GBase8s使用标准 I/O 同时备份与恢复

更新日期:2024年09月11日


GBase 8s 备份与恢复指南
南大通用数据技术股份有限公司 - 161 -
为了克隆数据库服务器或快速建立高可用性数据复制 (HDR),您可以同时执行向标准输出
的备份和从标准输入的恢复。如果您执行备份与恢复只是为了复制数据库服务器,使
用 -F 选项以避免保存归档。
在 HDR 上,辅助服务器只能恢复 0 级的归档。
要使用标准 I/O 来执行备份与恢复,
请将 TAPEDEV 配置参数设置为 STDIO,
也可以从命
令行指定 -t STDIO。
例如,如果 TAPEDEV 配置参数设置为 STDIO,以下命令会将数据装入一个 HDR 对上的
辅助服务器(名为 secondary_host)。
ontape -s -L 0 -F | rsh secondary_host "ontape -p"
在下一个示例中,假设未设置 TAPEDEV 配置参数。以下命令将数据装入一个 HDR 对的
辅助服务器(名为 secondary_host):
ontape -s -L 0 -F -t STDIO | rsh secondary_host "ontape -t STDIO -p"
这些示例在本地计算机上执行数据库服务器的伪 0 级归档,使用 rsh 系统实用程序通过管
道将数据传输到远程计算机,
并直接从管道中读取数据从而在远程计算机上执行物理恢复。

重要: 先前的示例需要在执行该命令的远程计算机上用户的缺省环境中设置 GBASEDBTDIR、
GBASEDBTSERVER、GBASEDBTSQLHOSTS 和 ONCONFIG 环境变量。用户必须
是 gbasedbt 或 root。

函数说明
按照“YYYY-MM-DD”格式返回UTC日期,返回值的形式取决于该函数使用于字
符串还是数字上下文。
示例
示例1
以“YYYY-MM-DD”格式返回UTC日期。
gbase> SELECT UTC_DATE(), UTC_DATE() + 0 FROM t;
+------------+----------------+
| UTC_DATE() | UTC_DATE() + 0 |
+------------+----------------+
| 2013-10-12 | 2013-10-12 |
+------------+----------------+
1 row in set

虽然定位更新不适用于所有类型的应用程序,但尽可能使用定位更新和删除。
定位更新(使用 UPDATE WHERE CURRENT OF CURSOR)允许您通过将数据库游标定
位到要更改的行来更新数据,并通知驱动程序更改数据。您不必强制构建复杂的 SQL 语
句;提供要更改的语句。
除了要使代码更易于维护,定位更新通常会提高性能。由于数据库服务器已经在行上定位
(对于当前正在处理 SELECT 语句),因此定位要更改的行的多余查询是不必要的。如果
该行必须定位,则数据库服务器通常具有指向可用行的内部指针(例如 ROWID)。
要支持使用滚动游标定位的 UPDATE 和 DELETE 语句,GBase 8s ODBC Driver 从原始
的定位语句构造一个新的搜索的 UPDATE 或 DELETE 语句。
但是,
数据库服务器不能直
接更新滚动游标。相反,GBase 8s ODBC Driver 会构造一个 WHERE 子句,用于引用在

GBase 8s ODBC Driver 程序员指南
南大通用数据技术股份有限公司
- 197 -

WHERE CURRENT OF CURSOR 子句中引用的 SELECT 语句中访存的每个列。SELECT
语句的行集数据缓存中的值绑定到已经建立的 WHERE 子句中的每个值。
该定位方法比使用具有 FORWARD ONLY 游标的子句 WHERE CURRENT OF CURSOR
子句更慢,更容易出错。如果访存的行不包含唯一键值,则构建的 WHERE 子句可能标识
一行或多行,
这会导致许多行被删除和更新。
以这种方式删除行会影响定位的 UPDATE 和
DELETE 语句,和使用滚动游标的 SQLSetPos 语句。
使用 SQLSpecialColumns 确定在 WHERE 子句中用于更新数据的最佳列集。很多时候,
伪列提供了对数据的最快访问;您只能通过使用 SQLSpecialColumns 确定这些列。
许多应用程序不能设计为利用定位的更新和删除。
这些应用程序通常通过形成 WHERE 子
句来更新数据。该 WHERE 子句由结果集中返回的一部分列值组成。某些应用程序可能会
使用所有可搜索的结果列或通过调用 SQLStatistics 来查找可能属于唯一索引的列的
WHERE 子句。这些方法通常有效,但是会导致相当复杂的查询。
考虑以下示例:
rc = SQLExecDirect (hstmt, "SELECT first_name, last_name, ssn,
address, city, state, zip FROM emp", SQL_NTS);
// fetchdata

rc = SQLExecDirect (hstmt, "UPDATE EMP SET ADDRESS = ?
WHERE first_name = ? AND last_name = ? AND ssn = ? AND
address = ? AND city = ? AND state = ? AND zip = ?", SQL_NTS);
// fairly complex query
应用程序应该调用 SQLSpecialColumns/SQL_BEST_ROWID 检索标识任何给定记录的最
佳列集(可能是伪列)。许多数据库支持在表定义中没有显式用户定义的特定列,但是是
每个表的隐藏列(例如,ROWID 、TID 和其它列)。这些伪列总是提供对数据的最快访
问。因为它们通常指向记录的确切位置。因为伪列不是显式表定义的一部分,所以它们不
会从 SQLSpecialColumns 返回。确定伪列是否存在的唯一方法是调用 SQLSpecialColumns。

考虑之前的示例,这次使用 SQLSpecialColumns:

rc = SQLSpecialColumns (hstmt, ..... 'emp', ...);

rc = SQLExecDirect (hstmt, "SELECT first_name, last_name, ssn,
address, city, state, zip, ROWID FROM emp", SQL_NTS);
// fetch data and probably "hide" ROWID from the user

rc = SQLExecDirect (hstmt, "UPDATE emp SET address = ? WHERE
ROWID = ?", SQL_NTS);
// fastest access to the data!

GBase 8s ODBC Driver 程序员指南
南大通用数据技术股份有限公司
- 198 -

如果您的数据源不包含特定的伪列,则 SQLSpecialColumns的结果集由指定表上的最佳唯
一索引组成(如果唯一索引存在)。因此,您的应用程序不会另外调用 SQLStatistics 来查
找最小的唯一索引。