我們今天主要向大家描述的是在修改數據庫對象時最小化計劃內宕機 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 表
- CREATE TABLE CUSTOMER_INFO(
- customer_id INTEGER NOT NULL,
- first_name VARCHAR(128) NOT NULL,
- last_name VARCHAR(128),
- address_street VARCHAR(128),
- address_city VARCHAR(128),
- address_state VARCHAR(25),
- address_country VARCHAR(30),
- age VARCHAR(2),
- customer_type VARCHAR(10),
- CONSTRAINT customer_id_pk PRIMARY KEY (customer_id)
- )
- IN USERSPACE1;
使用以下命令,用來自系統目錄的虛構信息向 CUSTOMER_INFO 表填充數據:
清單 2. 填充 CUSTOMER_INFO 表
- INSERT INTO customer_info
- SELECT
- ROW_NUMBER() OVER () as customer_id ,
- RTRIM(a.tabschema) as first_name,
- RTRIM(a.tabname) as last_name,
- CAST(a.colno AS VARCHAR(3)) || ' ' ||
- RTRIM(a.colname) as address_street,
- RTRIM(a.tabname) as address_city,
- RTRIM(a.TYPENAME) as address_state,
- RTRIM(a.TABSCHEMA) as address_country,
- CAST(CAST(sysfun.rand()*50 AS INTEGER)+1 AS VARCHAR(2)) as age,
- CASE WHEN MOD(CAST(sysfun.rand()*50 AS INTEGER),3)=0 THEN 'New'
- ELSE 'Existing'
- END AS type
- FROM
- syscat.columns a
- ORDER BY
- sysfun.rand();
在最後一步中,您在 CUSTOMER_INFO 表的基礎上創建了一個視圖和函數。
注意創建對象時使用的順序。您首先創建 EXISTING_CUSTOMERS 視圖,然後創建視圖所依賴的 FULL_NAME 函數。這一點非常重要,因為在默認情況下,這將造成 CREATE OR REPLACE VIEW 語句失敗,並發生 SQL0440N 錯誤。
然而,從版本 9.7 開始,您可以配置 DB2 來允許創建具有某些錯誤類型比如缺失依賴對象)的對象。這個功能對於數據庫對象的創建、設計和修改都很有用,因為它允許您按照隨機的順序使用 CREATE 命令。您還可以檢查新的視圖和過程的語法,而不需要創建所依賴的對象。
要啟用這個特性,需要使用以下命令修改 AUTO_REVAL 動態數據庫配置參數,將值設置為 DEFERRED_FORCE。
清單 3. 設置 AUTO_REVAL 配置參數
- db2 update db cfg using AUTO_REVAL DEFERRED_FORCE
修改該參數後,在創建 EXISTING_CUSTOMER 視圖時,將收到一個 SQL20480W 警告,並且視圖最初被標記為無效。然而,如果視圖所依賴的函數在下一次使用視圖時仍然存在,那麼該視圖將被自動重新進行驗證。
使用以下命令創建新的視圖和函數。注意,這些命令利用了新的 CREATE OR REPLACE 語法,此語法適用於函數、過程、視圖、模塊、別名、觸發器、變量和昵稱。顧名思義,這個語法創建對象,如果對象已存在的話,那麼將替代對象。換言之,對於已經存在的對象,它將在同一個命令中結合使用 DROP 和 CREATE,並保留分配給該對象的已有特權。
清單 4. 創建函數和視圖
- CREATE OR REPLACE VIEW existing_customers AS
- SELECT full_name(customer_id) AS full_name, address_city, address_state
- FROM customer_info
- WHERE customer_type='Existing';
- CREATE OR REPLACE function full_name(p_customer_id INTEGER)
- RETURNS VARCHAR(100)
- return
- SELECT first_name || ', ' || last_name
- FROM customer_info
- WHERE customer_id=p_customer_id;
對表定義進行在線修改
DB2 9.7 新增的兩項重要增強均與在線修改表定義相關:
首先,可以以在線的方式重命名列,同時仍可以針對表運行工作負載,不會對用戶產生任何干擾。
其次,DB2 9.7 擴展了它修改已有表中的列數據類型的支持。
下面的示例演示了如何使用 ALTER TABLE 命令重命名一個列,同時保持表具有完整的可訪問性:
清單 5. 重命名列的示例
- 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. 修改列類型
- ALTER TABLE customer_info ALTER COLUMN customer_age SET DATA TYPE SMALLINT;
大多數情況下,ALTER SET DATA TYPE 需要對表執行重組reorg),因為它修改了物理行格式。可以使用 ADMIN_REVALIDATE_DB_OBJECTS 例程來自動判斷是否需要對表執行重組:
清單 7. 對表進行重新驗證
- CALL ADMIN_REVALIDATE_DB_OBJECTS('TABLE', 'DB2INST1', 'CUSTOMER_INFO');
如果需要在修改列數據類型期間對數據庫執行寫訪問,可以使用下一小節描述的 ADMIN_MOVE_TABLE 例程。
以上的相關內容就是對在修改數據庫對象時最小化計劃內宕機 DB2 9.7在線模式變更的介紹,望你能有所收獲。