还原需求和限制

如果使用新的数据库服务器,那么必须查看还原需求和限制的列表,然后在还原之前完成所有先决条件任务。如果还原限制指出必须删除数据库中的所有对象,那么可以卸载数据,然后将其重新装入到先前的数据库服务器。

下表列出了在还原到数据库服务器的任何版本时适用的需求和限制。

表 1. 还原到服务器的任何版本时的需求和限制
还原需求或限制
仅还原到从其迁移的源版本:如果需要还原,那么必须还原到作为在迁移到 V8.5 之前的源版本的 GBase 8s 版本。
服务器的新版本中创建的新数据库:如果已在服务器的新版本中创建数据库,那么无法将该数据库还原到较早版本的服务器。如果需要该数据,那么您可以卸载该数据并将其重新装入到先前的服务器版本。
新过程、基于表达式的分段表、基于表达式的分段索引、检查约束和触发器:这些项不能还原。必须除去所有新过程、分段表、基于表达式的分段索引、检查约束和触发器。
注: 基于表达式的分段存储包括按表达式分段、按时间间隔分段和按列表分段。
新的内置例程:这些项不能还原。
新的配置参数:这些项不能还原。
新的或待处理的定点变更:在服务器的新版本中执行的定点 ALTER TABLE 语句不能针对任何表处于待处理状态。

如果某张表具有未完成的新定点 ALTER 操作,那么您必须通过对该表运行哑元 UPDATE 语句来确保定点 ALTER 操作已完成。如果还原过程因定点 ALTER 操作而没有成功完成,那么还原过程将列出需要进行虚拟更新的所有表。您必须对列表中的每个表执行虚拟更新,然后才能还原到较旧的数据库服务器。有关更多信息,请参阅运行哑元 UPDATE 语句

要点: 在早于当前版本的版本中完成的所有定点变更都将成功还原,并且对它们而言哑元更新不必要。

下表列出了在还原到服务器的特定版本时适用的其他需求和限制。

表 2. 还原到服务器的特定版本时的需求和限制
还原需求或限制 还原到此服务器或较早版本的服务器时
压缩的 B 型树索引:还原之前,必须解压缩或删除压缩的 B 型树索引。 11.70
数据库空间中压缩的简单大对象:还原之前,必须解压缩或删除数据库空间中压缩的简单大对象。 11.70
Enterprise Replication“仅发送”复制:如果在 V12.10 中创建了“仅发送”复制,那么必须先将它们移除,然后才能进行还原。 11.70
通过带 --enablegridcopy 选项的 cdr modify grid 命令启用的网格:如果还原之前已将网格中的服务器从 V11.70 升级到更高版本,那么必须禁用通过带 --disablegridcopy 选项的 cdr modify grid 命令复制外部文件的能力。 11.70
部分列索引:如果在创建的表上定义了一个或多个部分列索引,那么必须先删除部分列索引,然后才能还原到较早版本的服务器。如果创建的 UDR 包含用于定义部分列索引的 CREATE INDEX 语句,那么必须先删除这些 UDR,然后才能进行还原。

另外,在还原时,数据库服务器会从 sysindices 系统目录表中删除 indexattr 列。

11.70xC2
页大小较大的时间序列容器和表:无法还原其页大小不是缺省大小的时间序列表和容器。在还原之前,必须删除页大小较大的所有时间序列表和容器。(可以在还原之前卸载表并删除表和容器,然后稍后重新创建容器并重新装入表。) 11.70xC2
时间序列容器和时间序列数据类型名称长度大于 18 个字节:无法还原名称长度大于 18 个字节的时间序列容器和时间序列数据类型。在还原之前,必须删除其时间序列数据类型名称较长的所有表,并删除具有长名称的所有时间序列容器。(可以在还原之前卸载表并删除表和容器,然后稍后重新创建容器并重新装入表。) 11.70xC2
时间序列虚拟表:在还原之前,必须删除由 TSCreateExpressionVirtualTab 过程创建并由此查询返回的所有时间序列虚拟表。
SELECT a.tabname FROM systables a, systabamdata b
 WHERE LENGTH(b.am_param) > 256 AND a.tabid = b.tabid; 
11.70xC2
GBase 8s Warehouse Accelerator 还原需求:如果使用 GBase 8s Warehouse Accelerator 并需要还原,请参阅 GBase 8s Warehouse Accelerator Administration Guide 中的 11.70xC2
已创建为 NLSCASE INSENSITIVE 的数据库:无法还原已创建为 NLSCASE INSENSITIVE 的数据库。 在还原之前,必须删除使用 NLSCASE INSENSITIVE 属性创建的所有数据库。 11.70xC1
森林树索引:如果已创建森林树索引,那么在还原之前必须将其删除。 11.50
超过 2147483647 页的数据库空间:如果数据库空间的总大小超过 2147483647 个基页(例如,页大小为 2K 时超过 4 太字节,页大小为 4K 时超过 8 太字节),从 V11.70 还原将失败。如果发生此情况,必须重组数据库空间和块,使得单个数据库空间的总大小不超过 2147483647 个基页。 11.50
时间间隔和列表分段存储策略:在还原之前,必须删除使用时间间隔或列表分段存储策略的所有表或索引。 11.50
sysfragdist 表和相关模式更改:还原期间,将删除 sysfragdist 系统目录表以及为支持分段级别统计信息和分段存储策略而对模式或对其他系统目录表编码的更改。 11.50
序列对象:除非服务器没有空间可用于为新的序列对象分配扩展数据块,否则可以还原这些对象。如果服务器因这些对象无法还原而对其进行了相应标记,那么必须使用 DROP SEQUENCE 语句从数据库中删除数据库服务器所标记的所有序列对象。 11.50
外部表:如果已创建新的外部表,那么在还原之前必须将其删除。(还原期间将删除 SYSEXTERNAL、SYSEXTCOLS 和 SYSEXTDFILES 系统目录表。) 11.50
外部表和空表:除非服务器没有空间可用于为新的外部表和空表分配扩展数据块,否则可以还原这些表。如果服务器无法还原这些对象,那么在还原之前必须将其删除。

如果要还原到早于 V11.50xC6 的服务器版本,那么在还原之前必须删除所有外部表。还原期间还将删除 SYSEXTERNAL、SYSEXTCOLS 和 SYSEXTDFILES 系统目录表。

11.50
已禁用外键索引:必须删除这些外键索引,并在不使用禁用索引的选项的情况下重新创建受影响的约束,然后才能还原。 11.50
MULTI_INDEX、STAR_JOIN 和相关查询优化器伪指令:还原后不再支持这些伪指令。 11.50
已禁用复制服务器:在还原之前,必须启用或删除该复制服务器。 11.50
用于数据质量的主服务器:在还原之前,必须停止监视数据质量或者为数据质量定义新的主服务器。 11.50
网格成员:在还原之前,必须从网格中除去该服务器。 11.50
ERKEY 影子列:在还原之前,必须通过运行带 DROP ERKEY 子句的 ALTER TABLE 语句来删除 ERKEY 影子列。 11.50
使用 SET ENVIRONMENT RETAINUPDATELOCKS 语法的 UDR:在还原之前,必须删除这些 UDR。 11.50xC5
包含 Delete 子句的 MERGE 语句:在还原之前,必须删除这些例程。 11.50xC5
具有高可用性集群时的还原:在还原之前,请参阅还原集群 11.50xC5
MERGE 语句:在还原之前,必须删除使用 MERGE 语句的所有例程。 11.50xC4
包含 CONNECT BY 子句的 SELECT 语句:在还原之前,必须删除使用包含了 CONNECT BY 子句的查询或子查询的所有例程,并删除由包含 CONNECT BY 子句的 SELECT 语句所定义的所有视图。还原之后,SYS_CONNECT_BY_PATH( ) 不会作为内置例程而受到支持。 11.50xC4
ifx_replcheck 影子列:还原之前,必须删除 ifx_replcheck 影子列。 11.50xC4
压缩的表和压缩的表分段:在还原之前,必须解压缩或删除压缩的表和分段。 11.50xC3
使用方法的 UDR 或引用保存点的 SQL 语句:因为这些 UDR 包含较早 GBase 8s 版本不支持的新 SQL 语法,所以必须除去这些 UDR。(必须先重写这些 UDR 错误处理代码,以便不会引用任何保存点对象,才可以编译这些 UDR。) 11.50xC2
智能大对象空间中的新索引:如果在智能大对象空间中构建了索引,以使用 Basic Text Search DataBlade® 模块搜索智能大对象空间,那么必须在还原之前除去索引。 11.50xC2
表中的版本列:如果表中存在版本列,那么必须将其除去。 11.10
BIGINT 和 BIGSERIAL 列:如果拥有任何 BIGINT 或 BIGSERIAL 列,那么您必须修改或除去它们。 11.10
基于 BIGINT 和 BIGSERIAL 数据类型的扩展数据类型或属性:如果您拥有这些项,那么必须将其除去。 11.10
基于 BIGINT 和 BIGSERIAL 数据类型的强制转型:如果您拥有这些项,那么必须将其除去。 11.10
通过定制安装选项安装的组件:如果通过定制安装选项安装了组件,只有在不违反任何组件依赖性的情况下才能卸载组件。 11.10
已使用较新版本 JDK 编译的 JAVA UDR:必须使用较旧的 JDK 版本对其进行重新编译。有关详细信息,请参阅重新编译已使用 JDK 5.0 编译的任何 Java UDR 11.10
DELETE 和 UPDATE 语句中的子查询:如果 DELETE 或 UPDATE 的 WHERE 子句中带有子查询的某个条件引用了该 DELETE 或 UPDATE 语句所修改的表,那么在还原之前,必须将 INSERT 或 DELETE 操作重写为两个单独的 SQL 语句:
  • SELECT 语句,其将原始表符合条件的行返回到临时表
  • DELETE 或 INSERT 语句,其通过插入或删除与临时表中的行相符的行来修改原始表
11.10
从 CONCAT 和其他 SQL 字符串操作函数返回的数据类型:因为这些内置函数现已支持将其返回值提升到长度更长的数据类型,所以还原之后对 VARCHAR 或 NVARCHAR 值执行的某些操作可能会失败,且出现溢出错误 -881。 11.10
Automatic Update Statistics 功能部件:早于 V11.10.xC1 的 GBase 8s 版本不支持调度程序。因此,由调度程序实施的 Automatic Update Statistics 功能部件的功能在还原之后不可用。要强制执行任何想要应用到数据库的 Automatic Update Statistics 策略,必须在还原到 V10.00 或较早版本之后手动发出相应的 UPDATE STATISTICS 语句。 10.00

分布式查询中的 ANSI 连接:在 V10.00.UC4 中,使用符合 ANSI 的 LEFT OUTER 语法以指定连接表和嵌套循环连接的分布式查询的运行效率高于较早发行版。在向每个参与的数据库服务器发送查询以对这些服务器的本地表执行操作时,会出现这种情况。如果从 V10.00.UC4 或更高版本还原到不支持实施符合 ANSI 的语法的较早发行版,那么因为发起该查询的数据库服务器实例会在本地执行连接,所以此类查询可能会表现为性能下降。

10.00.xC4

INDEX_SJ 和 AVOID_INDEX_SJ 优化器伪指令:查询显式使用新的 INDEX_SJ 和 AVOID_INDEX_SJ 优化器伪指令时,这些伪指令在查询运行时不起作用。必须对存储过程运行 UPDATE STATISTICS 以强制对存储过程执行重新编译。

此外,还原会除去 SAVE EXTERNAL DIRECTIVES 语句中以及 SET EXPLAIN 语句的输出中这些伪指令的所产生的影响。如果您还原到一个支持 sysdirectives 系统目录表但不支持 AVOID_INDEX_SJ 或 INDEX_SJ 伪指令的数据库服务器版本,那么用户 gbasedbt 必须删除 sysdirectivesdirectives 列中包含 AVOID_INDEX_SJ 或 INDEX_SJ 的所有活动行。

10.00
sysdbopen( ) 和 sysdbclose( ) 过程:较早版本的数据库服务器不支持这些过程,并且具有这些名称的任何 UDR 都不会自动启动。 10.00
在查询的 FROM 子句中,UDR 包含集合派生的表:在还原到较早的发行版后,这些 UDR 无法正常运行。 10.00
表或视图中的同一 INSERT、UPDATE、DELETE 或 SELECT 事件的多个 BEFORE、FOR EACH ROW 和 AFTER 触发器,以及触发器例程 UDR:如果在数据库中存在任何以下的触发器和 UDR,那么在还原之前必须将其删除:
  • 对同一个表或对视图定义为另一个删除触发器的那些删除触发器
  • 对同一表或对对视图定义为另一个插入触发器的那些插入触发器
  • 对同一个表或视图(或列的同一个子集)定义为另一个更新触发器的那些更新触发器
  • 对同一个表或列的同一子集定义为另一个选择触发器的那些选择触发器
  • 用 FOR TRIGGER 关键字定义的触发器例程
  • 在触发的操作中使用 DELETING、INSERTING、SELECTING 或 UPDATING 运算符的触发器
10.00
对 BOOLEAN、LVARCHAR 或 DISTINCT 列的跨服务器操作:如果还原到不支持对数据库中 BOOLEAN、LVARCHAR 或 DISTINCT 列的跨服务器操作的数据库服务器版本,那么使用该功能的应用程序会失败。 10.00
sysadmin 数据库:还原期间将自动删除此数据库。 10.00
使用 SKIP 和 LIMIT 的查询:V10.00xc3 支持使用关键字 SKIP 和 LIMIT 的查询。还原到数据库服务器的任何较早版本后,使用其中任意一个关键字的查询都将失败并返回错误。 10.00
带有 ORDER BY 子句的 FIRST 子句:V10.00xc3 支持在其结果集为集合派生表 (CDT) 的子查询中使用 SELECT 语句的 ORDER BY 子句,但是仅在与同一 SELECT 语句的 Projection 子句中的 SKIP 关键字或 FIRST 关键字(或其关键字同义词 LIMIT)联合使用的情况下才支持。在还原到较早版本的数据库服务器后,使用此语法的查询将失败并返回错误。 10.00
基于标号的访问控制 (LBAC):还原之前,必须停止来自表的任何安全策略。此外,因为 IDSSECURITYLABEL 是 V11.10 的新内置类型,所以必须除去该类型的所有列,然后才能还原到早于 V11.10 的版本。 10.00
支持 Distributed Relational Database Architecture™ (DRDA)GBase 8s 将删除数据库服务器自动创建的元数据存储过程。无法手动删除这些内置存储过程。 10.00
使用 TRUNCATE 关键字或 am_truncate() 方法的 UDR 和应用程序:无法将这些项还原到 GBasedbt V10.00 之前的版本。在还原期间,必须删除或修改使用 TRUNCATE 语句的所有例程,包括所有新注册的虚拟表接口或用作虚拟索引接口的函数。 9.40
列级别加密:如果表中包含加密数据,请不要还原到不包含加密支持的服务器版本(V10.0 之前的任何版本),因为在不编写定制 DataBlade 模块(等同于数据库服务器提供的工具)的情况下,将无法解释列数据。GBase 8s 不会记录加密数据是否已存储在数据库中。 9.40
XA 数据源和 XA 数据源类型:如果已创建任何 XA 数据源和 XA 数据源类型,那么必须将其删除。 9.40
包含 EXTERNAL 子句的 DataBlade 用户定义的例程 (UDR):缺省情况下,数据库服务器管理员 (DBSA)、用户 gbasedbt 必须对已授予“extend”角色的所有用户撤销该角色。 9.40
新的或更改的内置 UDR:很多系统目录表使用内置 UDR。 如果您更改了内置 UDR 的定义,还原之前必须删除 UDR。 9.40
多 INOUT 参数支持:必须删除使用 INOUT 参数创建的所有新 UDR。 9.40
缺省角色:还原期间,defrole 列将从 sysusers 表中删除。还原之前您必须撤销用户的缺省角色。 9.40

使用分段分区语法的表和索引:如果您使用新的分段分区语法创建了表,那么在还原到数据库服务器 V10.00 之前的版本前,必须删除这些表,或者必须使用 ALTER FRAGMENT INIT 语句来更改语法。还原期间,GBase 8s 将从 sysfragments 表中删除 partition 列。

9.40
外部优化器伪指令:如果已创建外部优化器伪指令,那么无法还原。 9.40
非缺省页大小:如果为标准或临时数据库空间指定了页大小,而不是使用缺省的数据库空间页大小,那么在还原到 GBasedbt V10.00 之前的版本前,必须删除所有非缺省大小的数据库空间。 9.40
IPv6 地址:如果还原期间在 SQLHOSTS 文件中使用的是 IPv6 地址,那么必须使用机器名称或分配给机器的 IPv4 地址替换该 IPv6 地址。 9.40
使用新版本创建的过程、函数和触发器:还原之前,必须删除使用新版本创建的所有触发器、过程和函数。 9.40
最大块大小:数据库空间不能有大于 2 GB 或新的块格式的块、扩展到其设备或文件的大于 2 GB 的块或包含多于 2047 个块。 9.40
B 型树索引的键长度:所有索引都必须为总键长度小于或等于 390 的 B 型树索引。 9.40(不适用于 7.31)
最大文件大小:数据库服务器中不应存储或使用大于 2 GB 的文件。 9.30
TAPESIZE 和 LTAPESIZE 限制:不能将 TAPESIZE 或 LTAPESIZE 配置参数设置为 0 9.30
ALARMPROGRAM 限制:不能将 ALARMPROGRAM 配置参数设置为 alarmprogram.sh 文件。 9.30
LRU_MAX_DIRTY 和 LRU_MIN_DIRTY 限制:如果还原,请将这些配置参数设置为整数。(V10.0 中已除去这些配置参数。) 9.30
具有多个 IN 或 OUT 参数的 UDR:UDR 不能使用多个 IN 或 OUT 参数。还原前删除所有这样的 UDR。 9.30
具有指定返回参数的 UDR:UDR 和存储过程不能使用指定的返回参数。 9.30
序列对象:不能使用序列对象。还原前删除所有序列。 9.30
使用 INSTEAD OF 子句创建的触发器:不能使用通过 INSTEAD OF 子句创建的触发器。还原前删除所有这样的触发器。 9.30
多个整理:不能使用索引、存储过程、触发器及约束间的多个整理。 9.30
函数索引限制:函数索引包含的参数不能多于 16 个。 9.30
同一服务器上的 High-Data Availability Replication 和 Enterprise Replication:High-Data Availability Replication 和 Enterprise Replication 不能共存于同一数据库服务器上。 9.30
LVARCHAR 限制:如果 LVARCHAR (n) 数据类型中的 n 不等于 2042,那么不能使用这些数据类型。 9.30
已添加到服务器的扩展:对于已添加扩展的数据库服务器,除非除去这些扩展,否则无法从该数据库服务器还原到更早版本的数据库服务器。

您必须除去显式创建,或通过注册不同版本的 DataBlade 模块创建的所有新数据类型或例程。

为了能够还原,请将任何 DataBlade 模块降级为在还原之前注册的版本,并显式删除在任何 DataBlade 注册过程之外创建的所有数据类型和例程。有关如何使用 DataBlade 模块的信息,请参阅 DataBlade 文档。

9.30
UDR 限制:在新数据库中不能(无论隐式还是显式)创建新的用户定义例程或 SPL 例程。如果计划使用 dbexport 来导出包含现有用户定义例程或 SPL 例程的数据库,那么在还原之前必须删除这些例程。 9.30
新触发器限制:不能在升级的数据库中定义新的触发器。 9.30
新分段表达式和检查约束:数据库中不能存在新的分段表达式和检查约束。要还原,请通过拆离分段表达式将已分段表转换为未分段表。

不能使用 ALTER TABLE 或 ALTER INDEX 语句来更改在迁移到 GBasedbt 9.40 之前已存在的分段策略。

9.30
item_nvarchar 限制:对于索引,如果 item_nvarchar 的值等于或大于 255,还原会失败。 7.31
新的日志文件:如果 GBase 8s 使用新添加的日志文件,那么在还原到较早版本的数据库服务器之后,不能将该文件的状态重置为“新添加”。 7.31
DataBlade 模块中的 PER_STMT_EXEC 或 PER_STMT_PREP:无法将使用 PER_STMT_EXEC 或 PER_STMT_PREP 内存持续时间的 DataBlade 模块用于较早版本的数据库服务器。 7.31
选择触发器:不能使用选择触发器。 7.31
用户定义的统计信息:不能使用用户定义的统计信息。 7.31
长标识:不能使用长标识或长用户名。

还原前,请确保 R 型树索引未使用长标识作为索引的列名、运算符类 (opclass) 名称或运算符类功能名称。

另外,确保以下磁盘结构未使用长标识:

  • 数据库空间表空间(所有者及数据库名称长度)
  • 表空间(所有者及表空间名称长度)
  • 数据库空间(所有者及数据库空间名称长度)和块(路径长度)
7.31
存储空间名称:每个存储空间的名称长度不得超过 18 个字符。 7.31
新例程语言:不能在升级的数据库中定义新例程语言。此外,不能在已升级的数据库中完成新语言授权。 7.31
新运算符类、强制转型和扩展类型:不能在新数据库服务器中定义新运算符类、强制转型或扩展类型。 7.31
表限制
  • 数据库不能有主存取方法是用户定义的存取方法的表。
  • 数据库不能有类型表。
  • 表不能有任何用户定义类型的列。
  • 表不能有已用缺省值命名行类型。
7.31
索引限制
  • 无法将已拆离的索引还原到 V7.31。要允许还原到 V7.31,可通过设置应用程序环境中的环境变量 DEFAULT_ATTACH 保留 V7.31 已连接索引的行为。
  • 所有索引必须为总键长度小于或等于 255 的 B 树索引。
  • 表不能有任何函数或虚拟索引接口 (VII) 索引。
  • 数据库中不能有半拆离的索引。
  • 使用 GBase 8s 10.00 创建的索引以及支持最近邻居搜索的 opclass 不能被还原到较早的数据库服务器。
7.31
可扩展性功能:数据库不能使用任何可扩展性功能,包括用户定义的访问方法、用户定义的类型、聚集、例程语言、语言授权、跟踪消息、跟踪消息类、运算符类、错误、类型以及强制转型。 7.31