DB2 9.7数据库在线模式变更指南


  本文标签:DB2

  我们今天主要向大家描述的是在修改数据库对象时最小化计划内宕机 DB2 9.7数据库在线模式变更,我们大家都知道IBM® DB2® 9.7 引入了新的增强,允许您更改数据库对象,同时确保在修改数据库期间用户可以完全访问这些对象  。

  这些增强允许数据库管理员在不影响用户的情况下动态地对数据库模式进行重要修改  。本文提供了若干示例,演示如何使用 ALTER TABLE 命令重命名列、修改列数据类型,以及使用 ADMIN_MOVE_TABLE 例程移动表  。其他示例演示了如何使用 ADMIN_MOVE_TABLE 例程移动和修改表,同时保持可访问性  。

  概述

  本文提供了有关使用 DB2 9.7 新增强的指南,使您能够对数据库模式进行在线 更改  。在线更改意味着被修改的对象仍然可以进行读写访问,甚至在修改期间也是这样  。

  其中一些特定的新功能包括:

  使用 ALTER TABLE 语句在线重命名列  。

  OR REPLACE 作为选项被添加到多个 CREATE 语句中  。

  

  为视图和内联 SQL 函数添加了带有错误支持的 CREATE  。

  

  扩展了 ALTER COLUMN SET DATA TYPE 支持  。

  

  可以使用 ADMIN_MOVE_TABLE 例程在线修改和移动表  。

  

  先决条件和系统需求

  

  本文专门为 DB2 数据库管理员编写  。您应当理解表空间、表和列的基本概念  。

  要使用本文的示例,您必须安装 DB2 9.7 for Linux, UNIX, and Windows  。使用 参考资料 小节提供的链接下载 DB2 9.7 for Linux, UNIX, and Windows 的免费试用版  。

  为使用示例做准备

  要使用演示 DB2 的新的在线模式变更功能的示例,首先需要创建一个用作必要基础设施的样例数据库  。示例使用了 DB2 SAMPLE 数据库  。如果尚未创建 DB2 SAMPLE 数据库,那么请按照 DB2 Information Center 的 “The SAMPLE database” 一文中的说明创建数据库(见 参考资料 小节获得链接)  。

  一旦创建了 SAMPLE 数据库后,遵循这些步骤创建必要的表和数据,供示例使用:

  使用以下命令,根据模拟客户信息的系统目录创建一个表:

  清单 1. 创建 CUSTOMER_INFO 表

  

  1. CREATE TABLE CUSTOMER_INFO(   
  2. customer_id INTEGER NOT NULL,   
  3. first_name VARCHAR(128) NOT NULL,   
  4. last_name VARCHAR(128),  
  5. address_street VARCHAR(128),   
  6. address_city VARCHAR(128),  
  7. address_state VARCHAR(25),   
  8. address_country VARCHAR(30),  
  9. age VARCHAR(2),  
  10. customer_type VARCHAR(10),  
  11. CONSTRAINT customer_id_pk PRIMARY KEY (customer_id)  
  12. )   
  13. IN USERSPACE1; 

  使用以下命令,用来自系统目录的虚构信息向 CUSTOMER_INFO 表填充数据:

  

  清单 2. 填充 CUSTOMER_INFO 表

  

  1. INSERT INTO customer_info  
  2. SELECT   
  3. ROW_NUMBER() OVER () as customer_id ,   
  4. RTRIM(a.tabschema) as first_name,   
  5. RTRIM(a.tabname) as last_name,   
  6. CAST(a.colno AS VARCHAR(3)) ||   ||   
  7. RTRIM(a.colname) as address_street,   
  8. RTRIM(a.tabname) as address_city,  
  9. RTRIM(a.TYPENAME) as address_state,   
  10. RTRIM(a.TABSCHEMA) as address_country,   
  11. CAST(CAST(sysfun.rand()*50 AS INTEGER)+1 AS VARCHAR(2)) as age,   
  12. CASE WHEN MOD(CAST(sysfun.rand()*50 AS INTEGER),3)=0 THEN New   
  13. ELSE Existing   
  14. END AS type  
  15. FROM   
  16. syscat.columns a  
  17. ORDER BY   
  18. sysfun.rand();  

  在最后一步中,您在 CUSTOMER_INFO 表的基础上创建了一个视图和函数  。

  

  注意创建对象时使用的顺序  。您首先创建 EXISTING_CUSTOMERS 视图,然后创建视图所依赖的 FULL_NAME 函数  。这一点非常重要,因为在默认情况下,这将造成 CREATE OR REPLACE VIEW 语句失败,并发生 SQL0440N 错误  。

  然而,从版本 9.7 开始,您可以配置 DB2 来允许创建具有某些错误类型(比如缺失依赖对象)的对象  。这个功能对于数据库对象的创建、设计和修改都很有用,因为它允许您按照随机的顺序使用 CREATE 命令  。您还可以检查新的视图和过程的语法,而不需要创建所依赖的对象  。

  要启用这个特性,需要使用以下命令修改 AUTO_REVAL 动态数据库配置参数,将值设置为 DEFERRED_FORCE  。

  

  清单 3. 设置 AUTO_REVAL 配置参数

  1. db2 update db cfg using AUTO_REVAL DEFERRED_FORCE  

  修改该参数后,在创建 EXISTING_CUSTOMER 视图时,将收到一个 SQL20480W 警告,并且视图最初被标记为无效  。然而,如果视图所依赖的函数在下一次使用视图时仍然存在,那么该视图将被自动重新进行验证  。

  

  使用以下命令创建新的视图和函数  。注意,这些命令利用了新的 CREATE OR REPLACE 语法,此语法适用于函数、过程、视图、模块、别名、触发器、变量和昵称  。顾名思义,这个语法创建对象,如果对象已存在的话,那么将替代对象  。换言之,对于已经存在的对象,它将在同一个命令中结合使用 DROP 和 CREATE,并保留分配给该对象的已有特权  。

  

  清单 4. 创建函数和视图

  1. CREATE OR REPLACE VIEW existing_customers AS  
  2. SELECT full_name(customer_id) AS full_name, address_city, address_state   
  3. FROM customer_info   
  4. WHERE customer_type=Existing;  
  5. CREATE OR REPLACE function full_name(p_customer_id INTEGER)   
  6. RETURNS VARCHAR(100)   
  7. return   
  8. SELECT first_name || ,  || last_name   
  9. FROM customer_info   
  10. WHERE customer_id=p_customer_id;  

  对表定义进行在线修改

  

  DB2 9.7 新增的两项重要增强均与在线修改表定义相关:

  首先,可以以在线的方式重命名列,同时仍可以针对表运行工作负载,不会对用户产生任何干扰  。

  其次,DB2 9.7 扩展了它修改已有表中的列数据类型的支持  。

  

  下面的示例演示了如何使用 ALTER TABLE 命令重命名一个列,同时保持表具有完整的可访问性:

  

  清单 5. 重命名列的示例

  

  1. ALTER TABLE customer_info RENAME COLUMN age TO customer_age ;  

  ALTER TABLE 语句中的 ALTER COLUMN SET DATA TYPE 选项进行了扩展,可以支持所有兼容的类型  。例如,现在可以修改一个数据类型为 INTEGER 的列,从而拥有一个 VARCHAR 数据类型,或者将数据类型从 TIMESTAMP 修改为 DATE  。参考 DB2 Information Center 中的 “Casting between data types” 一文,获得兼容数据类型的完整列表(见 参考资料 小节获得链接)  。

  

  在使用 ALTER COLUMN SET DATA TYPE 选项执行 ALTER TABLE 操作期间,DB2 将执行一次完整的验证,确保列数据与新数据类型兼容,并且没有发生截断、外溢或任何其他类型的错误  。列默认值也进行了验证,确保它们遵守新的数据类型  。如果列类型和数据内容是兼容的,那么就能够成功更改数据类型  。否则,ALTER 命令将返回一个错误  。

  以下示例演示了如何将名为 customer_age from VARCHAR(2) 的列的数据类型修改为 SMALLINT:

  清单 6. 修改列类型

  

  1. ALTER TABLE customer_info ALTER COLUMN customer_age SET DATA TYPE SMALLINT;  

  大多数情况下,ALTER SET DATA TYPE 需要对表执行重组(reorg),因为它修改了物理行格式  。可以使用 ADMIN_REVALIDATE_DB_OBJECTS 例程来自动判断是否需要对表执行重组:

  

  清单 7. 对表进行重新验证

  

  1. CALL ADMIN_REVALIDATE_DB_OBJECTS(TABLE, DB2INST1, CUSTOMER_INFO);  

  如果需要在修改列数据类型期间对数据库执行写访问,可以使用下一小节描述的 ADMIN_MOVE_TABLE 例程  。

  

  

  以上的相关内容就是对在修改数据库对象时最小化计划内宕机 DB2 9.7在线模式变更的介绍,望你能有所收获  。