返回首页

gbase数据、南大通用产品文档:GBase8sifx_lo_unlock() 函数

更新日期:2024年09月11日

ifx_lo_unlock() 函数允许您解锁由 ifx_lo_lock() 锁定了的智能大对象中的一些字节。


语法
mint ifx_lo_unlock(lofd, offset, whence, range)
mint lofd;
int8 *offset;
mint whence;

int8 *range;
LO_fd
表示要在其中解锁一些字节的智能大对象的 LO 文件描述符。
offset

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

指向在智能大对象之内指定开始解锁处的偏移量的 8 字节整数(INT8)的指针。
whence
指定从哪一点计算偏移量的整数常量:智能大对象的开头、智能大对象之内的当前位
置,或智能大对象的末尾。
range
指向指定要解锁的字节数的 8 位整数(INT8)的指针。
用法

对于由 LO_fd 指定的智能大对象,
ifx_lo_unlock() 函数解锁由 nbytes 指定的字节数,
从由 offset 和 whence 指定的偏移量处开始。在调用 ifx_lo_unlock() 之前,您必须通过调
用 ifx_lo_create() 来创建新的智能大对象,
或通过调用 ifx_lo_open() 来打开现有的智能大
对象,来取得有效的 LO 文件描述符。

返回代码
0
函数成功。
< 0
函数不成功。返回值为 sqlcode,其为 GBase 8s 错误消息的数目。

可以在冷恢复期间使用 ontape 重命名块。
如果需要将存储空间恢复到与完成备份的磁盘不
同的磁盘上,该选项很有帮助。可以重命名任意类型的块,包括关键块和镜像块。
ontape 重命名块恢复仅对冷恢复可用。
冷恢复时必须恢复关键的数据库空间(如 rootdbs)。 如果不指定要恢复的数据库空间列
表,那么服务器会恢复关键的数据库空间以及其他所有数据库空间。但如果指定了要恢复
的数据库空间列表,那么其中必须包括关键的数据库空间。

GBase 8s 备份与恢复指南
南大通用数据技术股份有限公司 - 157 -
有关使用 ontape 重命名块的语法,请参阅ontape 实用程序执行恢复的语法。
提示: 如果使用到块名称的符号链接,可以不需要重命名块;而只需编辑符号名称定义即可。
有关更多信息,请参阅《GBase 8s 管理员指南》。
您可以在外部冷恢复的过程中对块进行重命名。有关更多信息,请参阅重命名块。

重命名块的验证顺序
在冷恢复期间,ontape 执行以下验证来重命名块:

验证在归档保留页中是否存在旧块的路径名和偏移量。

验证各个新块之间或新块与现有块之间的路径名与偏移量是否相互重叠。

如果对主根块或镜像根块进行重命名,那么将更新 onconfig 文件参数
ROOTPATH 和 ROOTOFFSET,
或 MIRRORPATH 和 MIRROROFFSET。
旧版本
的 onconfig 文件将另存为 $ONCONFIG.localtime。

将旧块中的数据恢复到新块(如果新块存在)中。

将每个块的重命名信息写入到联机日志中。
如果任意一个验证步骤失败,剩余的进程停止并且 ontape 将一条错误消息写入到 ontape
活动日志中。
重要:

重命名块后请执行 0 级归档;否则下次恢复将失败。

如果在执行 0 级归档后添加了块,那么恢复期间无法重命名该块。同时也不能安
全地在映射列表中将该块指定为新路径。

为参与 HDR 的数据库服务器重命名块的操作中,
两个数据库服务器都要长时间地
脱机。有关更多信息,请参阅《GBase 8s 管理员指南》。

新块需求
要重命名块,请遵循以下新块的准则:

新块不是必须存在的
可以以后安装新块并对包含它的存储空间执行热恢复。
如果指定不存在的块,
ontape
将重命名信息记录在块的保留页中,但不恢复数据。已重命名(但未恢复)的块处
于脱机状态,在 onstat -d 块状态命令输出中由 D 指示。

新块必须有适当的权限。
除非新块有适当的权限,
否则重命名操作将失败。
有关更多信息,
请参阅
《GBase 8s
管理员指南》。

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

使用命令行选项重命名块
要通过提供命令行的信息来重命名块,请使用此命令:
ontape -r -rename -p /chunk1 -o 0 -n /chunk1N -o 20000
-rename -p /chunk2 -o 10000 -n /chunk2N -o 0
在重命名和恢复操作完成后执行 0 级归档。

使用文件重命名块
要通过提供名为 listfile 的文件来重命名块,请使用以下命令:ontape -r -rename -f listfile
listfile 文件的内容是:
/chunk1 0 /chunk1N 20000
/chunk2 10000 /chunk2N 0
在重命名和恢复操作完成后执行 0 级归档。

指定其他选项时重命名块
要在 dbspace1 和 dbspace2 上执行恢复时使用命令行选项来重命名块,并且其中 rootdbs 是
rootdbs 的名称,请使用以下命令:
ontape -r -rename -p /chunk1 -o 0 -n /chunk1N -o 20000
-rename -p /chunk2 -o 10000 -n /chunk2N -o 0
-D rootdbs dbspace1 dbspace2
此外,要在 dbspace1 和 dbspace2 上执行恢复时使用文件重命名块,请使用以下命令:
ontape -r -rename -f listfile -D rootdbs dbspace1 dbspace2
在重命名和恢复操作完成后执行 0 级归档。

将块重命名到不存在的设备上
要将块重命名到还不存在的设备上,首先指定新的路径名,但直到您安装了该物理设备后,
才能恢复它的存储空间。该选项在您需要重命名块时很有用,便于您在安装新设备前执行
冷恢复。当新块设备就绪后,您可以在它上面执行存储空间的热恢复。
可以在同一个重命名操作中将重命名块与现有设备结合在一起,以及将重命名块与不存在
的设备结合在一起。本示例显示如何将单个块重命名到不存在的设备名上。
下表列出本示例中使用的块的示例值。
存储空间
旧块的路径
旧偏移
新块的路径 新偏移量

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

sbspace1
/chunk3
0
/chunk3N
0

将块重命名到不存在的设备上
要将块重命名到不存在的设备上:
1. 重命名块:使用以下命令:ontape -r -rename -p /chunk3 -o 0 -n /chunk3N -o 0
2. 当以下提示出现时,请输入 y 以继续:
块 /chunk3N 不存在。如果继续,那么对包含该块
的数据库空间的恢复操作稍后可能会失败。
在不创建该块的情况下,是否继续?(y/n)
块 /chunk3 被重命名为 /chunk3N,但数据还未恢复到 /chunk3N 上。
3. 执行 0 级归档。
4. 为 /chunk3N 添加物理设备。
5. 使用 ontape -r -D sbspace1 命令来执行 sbspace1 的热恢复。
6. 执行 0 级归档。

对于在系统目录中定义的命名的行类型,
ClassGenerator 实用程序生成 Java™ 类。
该实用程
序是对 JDBC 规范的 GBase 8s 扩展。
创建了的 Java 类实现 java.sql.SQLData 接口。对于命名的行中每一字段,该类都有成员。
按照出现在数据库中命名的行类型定义中的顺序,readSQL()、
writeSQL() 和 SQLData.readSQL() 方法读取属性。类似地,writeSQL() 按该顺序将数据写至
流。
将 ClassGenerator 打包在 ifxtools.jar 文件中,因此,CLASSPATH 环境变量必须指
向 ifxtools.jar。
使用 ClassGenerator 的语法如下:
java ClassGenerator rowtypename [-u URL] [-c classname]
classname 的缺省值是 rowtypename 的值。
如果未指定 URL 参数,则从 home 目录中的 setup.std 文件检索所需的信息。
setup.std 的结构如下:
URL jdbc:host-name:port-number

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

gbasedbtserver gbasedbtservername
database database
user user
passwd password
简单命名的行示例
要使用 ClassGenerator,请首先在数据库服务器上创建命名的行,如此示例中所示:
create row type employee (name char (20), age int);
接下来,运行 ClassGenerator:
java ClassGenerator employee
该类生成器生成 employee.java,如后所示,并从 setup.std 检索数据库 URL 信息,其有下
列内容:
URL jdbc:davinci:1528
database test
user scott
passwd tiger
gbasedbtserver picasso_ius
下列为生成了的 .java 文件:
import java.sql.*;
import java.math.*;
public class employee implements SQLData
{
public String name;
public int age;
private String sql_type;

public String getSQLTypeName() { return "employee"; }

public void readSQL (SQLInput stream, String type) throws
SQLException
{
sql_type = type;
name = stream.readString();
age = stream.readInt();
}


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

public void writeSQL (SQLOutput stream) throws SQLException
{
stream.writeString(name);
stream.writeInt(age);
}
}
嵌套的命名的行示例
对于嵌套的行,要使用 ClassGenerator,请首先在数据库服务器上创建命名的行:
create row type manager (emp employee, salary int);
接下来,运行 ClassGenerator。在此情况下,不查询 setup.std 文件,因为您在命令行提供了
所有需要的信息:
java ClassGenerator manager -c Manager -u "jdbc:davinci:1528/test:user=scott;
password=tiger;gbasedbtserver=picasso_ius"
-c 选项定义您正在创建的 Java™ 类,其为 Manager(带有大写的 M)。
前面的命令生成下列 Java 类:
import java.sql.*;
import java.math.*;
public class Manager implements SQLData
{
public employee emp;
public int salary;
private String sql_type;

public String getSQLTypeName() { return "manager"; }

public void readSQL (SQLInput stream, String type) throws
SQLException
{
sql_type = type;
emp = (employee)stream.readObject();
salary = stream.readInt();
}

public void writeSQL (SQLOutput stream) throws SQLException
{
stream.writeObject(emp);

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

stream.writeInt(salary);
}
}