在线数据重组与重定义
当企业变得更多地基于 web 和电子商务时,由于极高成本的应用程序停机时间,高可用性计算解决方案变得越来越重要。根据最近的 Gartner Group 研究,对涉及电子商务的企业而言,停机的成本可以轻易达到每小时数百万美元。因此,在当今众多的关键任务环境中,数据库可用性和可管理性变得日趋重要。增强可用性和可管理性的一种方式是,允许用户在数据重组操作期间完全访问数据库。
Oracle 数据库 10g 中的在线重组和重定义特性为管理员修改表物理属性并转换数据和表结构提供了前所未有的灵活性,同时允许用户完全访问数据库。该功能改善了数据可用性、查询性能、响应时间和磁盘空间利用率(所有这些在关键任务环境中都非常重要),并且它可以使应用程序升级过程更加容易、安全和快速。
当在线重定义某个表时,在重定义过程中,可对该表执行所有的读写操作。在应用程序升级期间,管理员可以启动重定义过程,然后周期性地同步临时表,以使临时表包含对原始表所做的最新更改。这将缩短完成最终重定义步骤的时间。管理员在完成重定义过程之前还可以验证和使用临时表中的数据。这对管理员而言是一种非常有用的特性,管理员必须确保升级过程顺利进行,然后控制何时从原始表切换到刚刚重定义的表中。切换过程非常简单,并且与表的大小或重定义的复杂度无关。重定义过程可以有效地创建新表并改善其数据块布局的效率。
当分区表和索引时,这允许管理员在这些对象上进行维护 — 一次一个分区 — 同时其它的分区仍保持在线。
Oracle 在线数据重组可以使用 Oracle 企业管理器 (OEM) 或 SQL*Plus 命令行界面完成。根据所需的在线重组的类型,可以使用 DBMS_REDEFINITION 程序包或 SQL CREATE/ALTER TABLE 和 INDEX 命令来执行,如下表所示。
数据重组特性比较
|
操作 |
Oracle 9i |
Oracle 数据库 10g |
Oracle 数据块 10g 版本 2 |
|
使用 DBMS_REDEFINITION 程序包进行在线重组 |
- 修改表存储参数
- 将表转移到不同的表空间中
- 添加对并行查询的支持
- 添加或删除分区支持
- 重新创建表以避免碎片
- 从表转换成 IOT 或相反
- 添加或删除一列
- 使用函数转换一列
|
- 克隆权限、约束和触发器
- 将 LONG 转换成 LOB
- 利用唯一键进行重组
- 指定表排序所依赖的列
|
- 重组单个分区
- 高级队列和集群表
- 包含 ADT 的表
- 保留和克隆统计信息
- 克隆检查和非空约束
- 为嵌套表复制相关的对象
|
|
回收未使用的空间 |
|
在以下语句中使用 SHRINK SPACE 子句:
- ALTER TABLE
- ALTER INDEX
- ALTER MATERIALIZED VIEW
- ALTER MATERIALIZED VIEW LOG
|
|
|
在线索引创建 |
CREATE INDEX emp.ename.idx ON emp(ename) ONLINE;
|
|
|
|
在线索引重建 |
ALTER INDEX emp.ename_idx REBUILD ONLINE;
|
|
|
|
在线索引聚集 |
ALTER INDEX emp.ename_idx COALESCE;
|
|
|
|
索引编排表的在线移动 |
ALTER TABLE emp MOVE ONLINE;
|
|
|
在线表操作
表可以利用 DBMS_REDEFINITION 程序包进行在线重组。利用这种方法,可以创建一个包含所有期望属性的临时表。重组通过调用 START_REDEF_TABLE 过程开始,在该过程中描述了表的当前版本和新版本之间的列映射。所有的相关对象(例如触发器、约束和索引)都利用 COPY_TABLE_DEPENDENTS 过程自动复制到临时表中。在重组期间,对原始表所作的任何修改都将通过调用 SYNC_INTERIM_TABLE 过程添加到临时表中。重组在调用 FINISH_REDEF_TABLE 过程时完成,临时表被重命名为主表。整个过程都在用户对表具有完全的访问权(从而确保了系统可用性)时进行。
在线索引操作
Oracle 提供了在线创建索引的功能。在在线索引创建操作期间,允许在基表上进行并发查询和更新。在在线索引创建操作期间,所作更改都记录在一个临时的日志表中。在索引创建结束时,该日志表将被合并到新的索引中。在线索引创建操作分为三个阶段:
准备阶段:简要地在表上获取锁,以创建索引结构并将条目放入数据字典中。
构建阶段:大多数工作都在这个涉及到填充索引的阶段中完成。当构建阶段进行时,对表所作的更改都放在日志表中。该日志表将自动创建并被结构化为 B 树,以便可以轻松检测到相同表数据上的多个操作,并将其解析成最新的更改。
合并阶段:日志表中的行将被迭代合并到索引中。大多数的合并操作都在表仍在线时进行。当日志表中的行被合并时,如果它们没有锁定,则会被删除。在合并阶段,将继续在日志表中跟踪对基表进行的编辑。如果在合并过程可以完成之前对日志表的更改继续发生,那么 Oracle 将通过日志表进行额外的传递。在进行了一些传递之后,如果合并仍然没有完成,那么 Oracle 将简单地锁住表,并应用日志表的剩余部分。整个过程对用户是透明的,一旦完成,新的索引将变为在线状态。
索引重建(移动)
Oracle 支持在线索引重建。在线索引重建操作期间,允许在基表上进行并发查询和更新。索引重建操作需要在构建过程中为新创建的索引提供额外的磁盘空间,但产生的重建后的索引可能将更节省空间。因此,该操作可能释放额外的磁盘空间。
在线索引重建的算法与在线索引创建的算法类似,并且执行同样的基本步骤。在在线索引重建操作期间,所作更改都记录在一个临时的日志表中。在索引重建结束时,该日志表将被合并到新的重建后的索引中。
在线索引碎片整理
Oracle 还提供了在线索引聚集或碎片整理的功能。在在线索引聚集操作期间,允许在基表上进行并发查询和更新。
在线索引聚集与在线索引重建操作类似。两者都将重组索引并提高空间利用率和查询性能。主要的差异是索引聚集是一种就地的重组,不需要额外的磁盘空间。如果可能的话,仅合并相邻的树叶块。B 树索引的高度没有降低。
索引聚集操作将折叠为单个树叶块,该树叶块紧邻其中包含少于一个数据块的索引块。自索引聚集操作开始以来被修改的块和包含未提交行的块将被跳过。索引聚集不需要为索引副本或日志表提供额外的磁盘空间 — 而在索引重建的情况下则需要为二者提供额外的磁盘空间。
在线回收未使用的空间
在数据库的生命周期内,数据将被插入、修改和删除,这将导致数据库内部的空间得不到有效利用。这种空间可以通过在 ALTER TABLE、ALTER INDEX、ALTER MATERIALIZED VIEW 和 ALTER MATERIALIZED VIEW LOG 上使用 SHRINK SPACE 子句来在线回收。
当空间被回收时,索引将被自动维护,如果使用 CASCADE 子句,那么所有相关对象上的空间也将被回收。
其他的数据重组注意事项
在线操作期间在表上进行的并发活动。在在线操作期间,Oracle 建议用户将基表上的活动数量降至最低。当在线操作进行时,数据库活动将影响 10% 以下的表。此外数据库管理员可以利用数据库资源管理器为用户分配足够的资源,以将数据重组对用户的影响降至最低。
Oracle 不建议在高峰时间运行在线操作,或在在线数据重组期间运行修改大量数据的批量作业。实际上,并行的 DML、直接加载和导入/导出不能在在线操作期间执行。
在线操作期间的 DML 操作的性能损失。Oracle 估计在线操作期间的 DML 操作的性能开销可以和维护一个额外索引的性能损失相比。
在线重建索引与在线删除索引然后重新创建新的索引。在线重建索引需要在操作期间为新的索引提供额外的磁盘空间,而删除索引然后重新创建索引则不需要额外的磁盘空间。不过,当索引被删除且在新的索引创建之前,数据库性能在此期间可能会受到影响。
在线聚集索引与在线重建索引。在线索引聚集是就地的数据重组操作,因此不像索引重建那样需要额外的磁盘空间。索引重建需要的临时磁盘空间大小,等于操作期间索引大小加上排序空间。索引聚集不会降低 B 树的高度。它仅试图减少树叶块的数量。聚集操作不会为用户释放空间,但的确能够提高索引扫描性能。
如果用户需要将索引转移到一个新的表空间中,那么建议采用在线索引重建。索引重建还能够提高空间利用率,但索引重建操作比索引聚集操具有更高的开销。
本地索引和全局索引。Oracle 数据库 10g 利用在线操作支持本地和全局分区索引。
有关的详细信息
白皮书