IBM®
跳转到主要内容
    中国 [选择]    使用条款
 
 
Select a scope:Search for:    
    首页    产品    服务与解决方案     支持与下载    个性化服务    
跳转到主要内容

developerWorks 中国  >  Information Management  >

Informix 数据库表迁移工具在实际中的应用,第 1 部分

developerWorks
文档选项

未显示需要 JavaScript 的文档选项


级别: 中级

李晓勤 (lxqdfdt@163.com), 软件工程师, 中国建设银行

2007 年 8 月 27 日

本文主要对 Informix 提供的 onunload/onload、unload/load 等表级迁移工具进行详细探讨:分析两者存在的差异,不同情况适用哪个工具,以及如何提高迁移效率等,同时给出一些具体实施步骤及实施脚本。

在实际应用中,数据库管理员经常需要对数据库表进行备份或迁移。Informix 提供了多种表级迁移工具,如 onunload/onload、unload/load、 dbunload/dbload。其中 dbunload/dbload 与 unload/load 较为相似,本文主要对前两种工具进行详细探讨:分析两者存在的差异,不同情况适用哪个工具,以及如何提高迁移效率等,同时给出一些具体实施步骤及实施脚本。

unload/load 与 dbunload/dbload 比较

描述

unload 语法简单、使用灵活、操作方便,是数据库管理员经常使用的表级迁移工具。其输出结果为一个以分隔符分隔各字段的 ASCII 文件。

dbunload 以二进制形式、磁盘页为单位将指定表的数据写入磁带或硬盘文件。

语法


清单 1. 语法
                Unload to 文件名
Select    col1, col2, …, coln {字段名列表}
From     tabnameWhere    条件子句
Order     by 排序子句

从语法上看,unload由于使用select语句作为检索工具,从而决定了unload工具的灵活、方便。通过指定字段列表、查询条件等,可完成下列操作:

  • 卸载所有列或特定列
  • 卸载所有行或特定行
  • 卸载多表连接字段及记录
  • 对取得的数据进行计算
  • 对取得的数据进行排序

装入表可使用 Load 命令:


清单 2.
                Load  from 文件名 insert  into tabname  values (col1,col2,..)
Onunload/onload语法:
onunload  [-l] [-t ] [-b] [-s] [-d] <databse>:table
onload  [-l] [-t ] [-b] [-s] [-d] [-i] [-fd] [-fi] [-c] <databse>:table

onload只能使用onunload生成的磁带设备文件或磁盘文件进行装载。

卸载内容

Unload 只卸载迁移表的数据,不包含表数据模式及索引数据。

Onunload 卸载迁移表数据模式、数据页、索引页信息。

卸载表的锁定状态

Unload 工具:

  1. 在数据库非日志状态下或脏读隔离级别下,可卸载表数据,即使迁移表被独占。
  2. 在日志数据库以非脏读隔离级卸载独占的表时,返回锁冲突错误。
  3. 对卸载表的加锁情况:在非日志数据库、或脏读、或提交读隔离级别下,对卸载表不锁定;在日志数据库中,以游标稳定读、重复读隔离级别卸载表,对表记录不同数据集加共享锁。

Onunload 工具:

  1. 不能对加有独占锁的表进行卸载,包括任意粒度的锁定:表级锁、行锁、页锁。
  2. 卸载时对卸载表加表级共享锁。

装载时对表的锁定状况

load 工具:

  1. 在日志数据库中,对装载表加排他锁。锁定粒度缺省情况下为行锁或页锁(建表时确定)。当装载数据量较大时,可显示将锁模式更改为表级锁。在装载过程中不能对表进行访问。
  2. 在非日志数据库中,对装载表不加锁,对装载成功的记录可随时访问。

Onload 工具:对装载表加互斥锁。

数据库日志状态

Unload/load 装卸载不受数据库日志状态的限制。

Onunload 不受数据库日志限制,onload 要求数据库必须无日志。

卸载粒度

unload 卸载粒度包括部分字段或全部字段,部分记录或全表记录,是迁移工具中粒度最小的,也是该工具灵活方便的原因之一。

Onunload 卸载粒度为数据库级或表级。

输出结果

Unload 输出以分隔符分隔各字段的 ASCII 文件。分隔符可在卸载命令 delimiter 选项中显式指定。

Ononload 输出为二进制数据文件。

更改表数据模式

Unload/load 可更改表的数据模式。通过指定 select 语句的字段名列表,编辑 dbschema 的表结构输出 SQL 语句完成表数据模式的更改。

Onunload/onload 不能更改表数据模式。

迁移目的表所在数据库空间

Load 根据建表脚本,对非分片表不指定 dbspaces 时,缺省迁移到表所在数据库的 dbspaces,分片表迁移到同源表的数据库空间,均可重新指定。

onload 对非分片表不指定 dbspaces 时缺省迁移到 rootdbs,分片表迁移到同源表的数据库空间,均可重新指定。

迁移目的平台

Unload/load 卸载数据为 ASCII 文件,故为迁移提供了极大的灵活性,可迁移到异构的硬件平台、操作系统、数据库中。

Onunload/onload要求目的数据库服务器与源数据库服务器具有相同的页大小、相同或兼容数据库服务器版本。

效率

Unload/load由于卸载数据为文本数据,在卸载过程中需要将各字段转换为ASIIC字符,故卸载效率不很高。

Onunload/onload采用二进制装卸、以数据页为单位进行,所以运行速度更快。





回页首


迁移步骤

ONUNLOAD/ONLOAD 迁移步骤:

源主机:

  1. 准备磁带,若采用磁盘文件方式,则准备充足的磁盘空间,并创建一用于存放卸载数据的空文件。
  2. 采用onunload卸载表,结果存放在磁带或磁盘文件中。
  3. 磁带或磁盘文件移到目的主机上。

目的主机:

  1. 去掉目的数据库的日志。
  2. 采用onload创建表结构、装载表数据及索引数据。
  3. 目的数据库恢复日志。

UNLOAD/LOAD 迁移步骤:

源主机:

  1. 准备充足的磁盘空间。
  2. 采用unload工具卸载表数据,使用dbschema 工具卸载表的数据模式,生成建表SQL语句。
  3. 磁盘数据文件及数据模式SQL语句移到目的主机上。

源主机:

  1. 根据需要编辑生成的数据模式SQL语句,并创建空表。
  2. 采用load工具将的数据文件装载至数据库中。




回页首


两种工具的不同应用环境

以下论述对不同应用环境,应采用哪种迁移工具或采用哪种工具最佳。

更改数据模式的迁移

Onunload/onload工具不能更改迁移表的数据模式,而unload/load可更改,故采用unload/load工具。

实现方法:对 dbschem 卸出的 SQL 语句进行编辑,可改变:表的字段名、约束、权限、表名、封锁模式、初始 EXTENTS、后续 EXTENTS、索引名、分片信息等。

更改粒度的迁移

采用 unload/load 工具。

实现方法: 编辑 dbschem 卸出的 SQL 语句,增加或删除部分字段,结合 unload 的 select 语句,选择部分字段或多表连接产生更多字段,实现字段级粒度的更改;通过 select 语句中条件语句筛选符合的记录,实现记录级粒度的更改。

跨操作系统平台、不同INFORMIX数据库服务器版本、机器页大小不符等情况的表迁移

采用unload/load工具。

由于unload工具输出的文件是ASICC文件,为此提供了迁移的广阔途径。如将unix系统下卸出的文件,传至windows系统中,通过execl工具的“导入外部数据”功能,将文本数据通过电子表格形式展现给用户。

目的数据库带有日志

采用unload/load工具。Onload要求装载表所在的数据库必须无日志。

适用于数据日志不能停的数据库环境,如OLTP(联机事务处理)数据库环境。

分片表的迁移

Unload/load工具可实现表迁移过程中各种分片需求,如将分片表迁移为非分片表,非分片表迁移为分片表、更改分片策略等。在此不再详述其实施步骤,主要论述onunload/onload工具在分片表迁移中的应用。

目的表有聚簇索引

带有聚集索引的表的记录在物理存储上严格按聚集索引的顺序存放,也就是聚集索引记录与数据记录的存储顺序一致。采用聚集索引,查询时扫描的数据量较普通索引减少了。所以对于经常查询、很少增删的表可以充分利用聚集索引的优点提高查询速度。

有聚簇索引,且聚簇程度较高的表迁移:

卸载时:unload工具是以rowid顺序卸载数据,onunload是以表空间的表空间信息顺序卸载数据,即卸载的数据保持与源表相同的物理顺序。

装载时:load工具是以数据文件行的顺序装载记录,onload也是以二进制数据文件顺序装载数据页,从而保证目的表的记录物理顺序与源表保持一致,目的表与源表的聚簇程度相同。 所以,两种工具均可实现聚簇程度高的迁移。

源表无聚簇索引,或有聚簇索引但聚簇程序较低:

由于onload装载的目的表与源表的聚簇程度,对聚簇程序低或无聚族索引的表迁移只能在装载后使用alter index tabname to cluster 命令重建聚簇索引。创建聚簇索引,需要化费大量的时间及空间,如果是海量表,代价更大,性能较低。

故建议采用unload/load工具卸装,在卸载时将数据排序,即以聚簇索引顺序卸载数据,这样在装载数据后,无需再进行聚簇处理。

整理迁移表磁盘空间

提高数据库性能,最明显的方法莫过于优良的磁盘空间布局策略。在实际应用中,由于建表时对表的增长趋势估计不足,以及表经过频繁更新,造成表大量磁盘空间闲置,出现磁盘碎片等情况,为此,我们需要对表磁盘空间重新整理,提高数据库性能。

1)回收删除记录的磁盘空间

我们知道,INFORMIX数据库磁盘空间一旦分配给表,将永久被该表占用,即便页面上的记录被删空。只有当表被删除,IDS才回收表的磁盘空间。表的磁盘页包括以下类型:bitmap(位图页,用于跟踪页的使用情况)、数据页(存放数据,包括被删空记录的页)、索引页、未使用的页。

表在使用过程中,经过频繁更新操作,使得数据页中存有大量的删除记录,这些空间在插入新记录时可重新使用。但当删除操作远远大于插入操作时,这些空间大多数被闲置,不仅造成磁盘空间浪费,而且增加了磁盘I/O,降低缓冲命中率。这时我们需要对该表的磁盘空间进行整理。

那么采用哪种迁移工具可回收删除记录的磁盘空间呢?由于Onunload工具对分配给表已使用的磁盘页进行卸载,即便该页中所有的记录被删除。所以onunload/onload不能完成表磁盘空间整理工作。而unload工具只卸载当前有效记录,对已删除的记录并不卸载,所以采用unload/load对表重新卸装,回收磁盘已删除记录的空间。

2)消除表空间交错,防止Extnets超界

IDS以extnes为单位分配表磁盘空间,并且限制每个表的extents个数。表的初始extent及后续extent在建表时确定,后续extent大小可采用alter语句随时进行调整,但不能调整以前的extents分布情况。

在实际应用中,用户在建表初期往往无法准确估计表的增长趋势,对增长较快的表extent设置较小,由于并发等因素,形成同一数据库空间的多个表的表空间发生交错。表空间发生交错将引发以下问题:

  • 单个表的extents不连续,造成extents个数较多,严重时将超出IDS允许的数目,引发记录插入失败。
  • 表extents的物理不连续,在检索数据时造成磁盘臂动作较多,顺序读取数据搜索时间长,降低I/O性能。

对于这种情况,采用两种工具均可完成磁盘空间整理。

实现方法:

  1. 查找extents个数较多的表,见附录。
  2. 对extents个数较多的表,充分估计表的增长趋势,确定适当的extent大小,以防形成大量不连续extents;
  3. 使用unload/load工具:编辑建表sql,设置足够的初始extent、后续extent个数,重新装载数据。
  4. 使用onunload/onload工具:重新卸装表,装载后使用alter命令修改后续extents大小
  5. 释放未使用页中的磁盘空间,提高磁盘利用率。

与 2)中情况相反,建表时如果对表的初始 extent 及后续 extent 设置太大,而表的增长为缓慢,这将造成大量磁盘空间闲置,而这些空间又不能被其它表利用。为此,需要重新整理表磁盘空间,提高磁盘利用率。

onunload对未使用的页并不卸载,卸载二进制文件较小,但装载表的extents设置同源表,在装载时仍造成了大量闲置空间。这主要是因为onunload从系统目录表systoles中读取信息,将结果存放在onunload输出中,onload在装载表时使用这些信息创建表模式,包括初始及后续extents个数。而unload卸载有效记录数据,可通过调整表的初始及后续extents大小,对表重装以回收未使用磁盘空间。

实现方法:

  1. 统计源表已使用extents大小,将该值确定为初始extent值。
  2. 估计表的增长趋势,确定适当的后续extent大小,该值不要太大,以免造成大量磁盘空间长期闲置。
  3. 编辑表的数据模式脚本,设置初始extent、后续extent大小。
  4. 装载数据。

迁移日志数据库更新频繁的表

Onunload 在有日志的数据库卸载时,并发程度上比 onload 低:

1)对卸载表的锁定检查:

Onunload工具在卸载前判断表是否有排它锁,如果有,无论哪一粒度级排它锁定,都将导致卸载失败;而Unload工具在卸载过程中只检查当前检索到的数据锁定情况,如果有排它锁(页锁或行锁),才导致卸载失败;甚至可对onunload设置脏读模式,对锁定数据也可成功卸载。

2)对卸载表的加锁:

Onunload工具在卸载期间要对卸载表加共享锁;

Unload工具对卸载表根据需要设置四种不同读隔离级,在脏读、提交读(缺省)隔离级下,对表不加锁,在重复读、游标稳定读级别下,对数据集的不同范围加共享锁。

从上分析来看,onunload工具在卸载期间对迁移表加共享锁,影响其它进程对该表的并发更新操作。在并发较为重要的OLTP环境中,如果对更新频繁的表或有更新操作的海量表进行卸载,出现锁碰撞的几率很大,并发性能降低。

建议采用unload/load工具。unload在卸载期间不对表加锁(缺省情况),不会影响其他进程的并发操作;只对当前检索到的数据检查其锁定情况,所以锁碰撞的几率大大降低,在行锁模式下,出现锁碰撞的可能性非常小。在对卸出的表数据要求不很精确,如用于测试、开发、趋势统计等表迁移,还可通过设置脏读隔离级,在保证成功卸载的同时,不检查表及记录锁状况,减小了系统开销,进一步提高了性能。

海量表的迁移

如果表的数据量很大,如几十个G等,卸载及装载将很耗时。unload/load采用ASICC方式卸装数据,在数据量很大的情况下,性能较低,如果表有索引,就创建索引一项,也是很耗时的。而onload/onload工具采用二进制磁盘页方式卸载及装载数据,卸装数据中包含索引数据,所以效率更高。

对海量表迁移建议采用onunload/onload工具。

需要说明的是,onunload输出的二进制卸载的数据占用空间比unload工具大(见测试2),尤其表有大量删除记录、索引较多的时候,所以首先估计卸载数据空间大小,准备充足的磁带或磁盘空间,保证顺利地卸载。估计方法见附录。



参考资料



关于作者

李晓勤一直从事银行应用软件的开发工作,喜爱数据库,获得 IBM Certified Solutions Expert Informix Dynamic Server V9 System Administrator 证书。




对本文的评价

太差! (1)
需提高 (2)
一般;尚可 (3)
好文章 (4)
真棒!(5)

建议?




回页首


IBM 公司保留在 developerWorks 网站上发表的内容的著作权。未经IBM公司或原始作者的书面明确许可,请勿转载。如果您希望转载,请通过 提交转载请求表单 联系我们的编辑团队。
    关于 IBM 隐私条约 联系 IBM 使用条款