DB2 9.7數(shù)據(jù)庫在線模式變更指南
我們今天主要向大家描述的是在修改數(shù)據(jù)庫對象時最小化計劃內(nèi)宕機 DB2 9.7數(shù)據(jù)庫在線模式變更,我們大家都知道IBM® DB2® 9.7 引入了新的增強,允許您更改數(shù)據(jù)庫對象,同時確保在修改數(shù)據(jù)庫期間用戶可以完全訪問這些對象。
這些增強允許數(shù)據(jù)庫管理員在不影響用戶的情況下動態(tài)地對數(shù)據(jù)庫模式進行重要修改。本文提供了若干示例,演示如何使用 ALTER TABLE 命令重命名列、修改列數(shù)據(jù)類型,以及使用 ADMIN_MOVE_TABLE 例程移動表。其他示例演示了如何使用 ADMIN_MOVE_TABLE 例程移動和修改表,同時保持可訪問性。
概述
本文提供了有關(guān)使用 DB2 9.7 新增強的指南,使您能夠?qū)?shù)據(jù)庫模式進行在線 更改。在線更改意味著被修改的對象仍然可以進行讀寫訪問,甚至在修改期間也是這樣。
其中一些特定的新功能包括:
使用 ALTER TABLE 語句在線重命名列。
OR REPLACE 作為選項被添加到多個 CREATE 語句中。
為視圖和內(nèi)聯(lián) SQL 函數(shù)添加了帶有錯誤支持的 CREATE。
擴展了 ALTER COLUMN SET DATA TYPE 支持。
可以使用 ADMIN_MOVE_TABLE 例程在線修改和移動表。
先決條件和系統(tǒng)需求
本文專門為 DB2 數(shù)據(jù)庫管理員編寫。您應(yīng)當(dāng)理解表空間、表和列的基本概念。
要使用本文的示例,您必須安裝 DB2 9.7 for Linux, UNIX, and Windows。使用 參考資料 小節(jié)提供的鏈接下載 DB2 9.7 for Linux, UNIX, and Windows 的免費試用版。
為使用示例做準(zhǔn)備
要使用演示 DB2 的新的在線模式變更功能的示例,首先需要創(chuàng)建一個用作必要基礎(chǔ)設(shè)施的樣例數(shù)據(jù)庫。示例使用了 DB2 SAMPLE 數(shù)據(jù)庫。如果尚未創(chuàng)建 DB2 SAMPLE 數(shù)據(jù)庫,那么請按照 DB2 Information Center 的 “The SAMPLE database” 一文中的說明創(chuàng)建數(shù)據(jù)庫(見 參考資料 小節(jié)獲得鏈接)。
一旦創(chuàng)建了 SAMPLE 數(shù)據(jù)庫后,遵循這些步驟創(chuàng)建必要的表和數(shù)據(jù),供示例使用:
使用以下命令,根據(jù)模擬客戶信息的系統(tǒng)目錄創(chuàng)建一個表:
清單 1. 創(chuàng)建 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;
使用以下命令,用來自系統(tǒng)目錄的虛構(gòu)信息向 CUSTOMER_INFO 表填充數(shù)據(jù):
清單 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 表的基礎(chǔ)上創(chuàng)建了一個視圖和函數(shù)。
注意創(chuàng)建對象時使用的順序。您首先創(chuàng)建 EXISTING_CUSTOMERS 視圖,然后創(chuàng)建視圖所依賴的 FULL_NAME 函數(shù)。這一點非常重要,因為在默認(rèn)情況下,這將造成 CREATE OR REPLACE VIEW 語句失敗,并發(fā)生 SQL0440N 錯誤。
然而,從版本 9.7 開始,您可以配置 DB2 來允許創(chuàng)建具有某些錯誤類型(比如缺失依賴對象)的對象。這個功能對于數(shù)據(jù)庫對象的創(chuàng)建、設(shè)計和修改都很有用,因為它允許您按照隨機的順序使用 CREATE 命令。您還可以檢查新的視圖和過程的語法,而不需要創(chuàng)建所依賴的對象。
要啟用這個特性,需要使用以下命令修改 AUTO_REVAL 動態(tài)數(shù)據(jù)庫配置參數(shù),將值設(shè)置為 DEFERRED_FORCE。
清單 3. 設(shè)置 AUTO_REVAL 配置參數(shù)
- db2 update db cfg using AUTO_REVAL DEFERRED_FORCE
修改該參數(shù)后,在創(chuàng)建 EXISTING_CUSTOMER 視圖時,將收到一個 SQL20480W 警告,并且視圖最初被標(biāo)記為無效。然而,如果視圖所依賴的函數(shù)在下一次使用視圖時仍然存在,那么該視圖將被自動重新進行驗證。
使用以下命令創(chuàng)建新的視圖和函數(shù)。注意,這些命令利用了新的 CREATE OR REPLACE 語法,此語法適用于函數(shù)、過程、視圖、模塊、別名、觸發(fā)器、變量和昵稱。顧名思義,這個語法創(chuàng)建對象,如果對象已存在的話,那么將替代對象。換言之,對于已經(jīng)存在的對象,它將在同一個命令中結(jié)合使用 DROP 和 CREATE,并保留分配給該對象的已有特權(quán)。
清單 4. 創(chuàng)建函數(shù)和視圖
- 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 新增的兩項重要增強均與在線修改表定義相關(guān):
首先,可以以在線的方式重命名列,同時仍可以針對表運行工作負(fù)載,不會對用戶產(chǎn)生任何干擾。
其次,DB2 9.7 擴展了它修改已有表中的列數(shù)據(jù)類型的支持。
下面的示例演示了如何使用 ALTER TABLE 命令重命名一個列,同時保持表具有完整的可訪問性:
清單 5. 重命名列的示例
- ALTER TABLE customer_info RENAME COLUMN age TO customer_age ;
ALTER TABLE 語句中的 ALTER COLUMN SET DATA TYPE 選項進行了擴展,可以支持所有兼容的類型。例如,現(xiàn)在可以修改一個數(shù)據(jù)類型為 INTEGER 的列,從而擁有一個 VARCHAR 數(shù)據(jù)類型,或者將數(shù)據(jù)類型從 TIMESTAMP 修改為 DATE。參考 DB2 Information Center 中的 “Casting between data types” 一文,獲得兼容數(shù)據(jù)類型的完整列表(見 參考資料 小節(jié)獲得鏈接)。
在使用 ALTER COLUMN SET DATA TYPE 選項執(zhí)行 ALTER TABLE 操作期間,DB2 將執(zhí)行一次完整的驗證,確保列數(shù)據(jù)與新數(shù)據(jù)類型兼容,并且沒有發(fā)生截斷、外溢或任何其他類型的錯誤。列默認(rèn)值也進行了驗證,確保它們遵守新的數(shù)據(jù)類型。如果列類型和數(shù)據(jù)內(nèi)容是兼容的,那么就能夠成功更改數(shù)據(jù)類型。否則,ALTER 命令將返回一個錯誤。
以下示例演示了如何將名為 customer_age from VARCHAR(2) 的列的數(shù)據(jù)類型修改為 SMALLINT:
清單 6. 修改列類型
- ALTER TABLE customer_info ALTER COLUMN customer_age SET DATA TYPE SMALLINT;
大多數(shù)情況下,ALTER SET DATA TYPE 需要對表執(zhí)行重組(reorg),因為它修改了物理行格式??梢允褂?ADMIN_REVALIDATE_DB_OBJECTS 例程來自動判斷是否需要對表執(zhí)行重組:
清單 7. 對表進行重新驗證
- CALL ADMIN_REVALIDATE_DB_OBJECTS('TABLE', 'DB2INST1', 'CUSTOMER_INFO');
如果需要在修改列數(shù)據(jù)類型期間對數(shù)據(jù)庫執(zhí)行寫訪問,可以使用下一小節(jié)描述的 ADMIN_MOVE_TABLE 例程。
以上的相關(guān)內(nèi)容就是對在修改數(shù)據(jù)庫對象時最小化計劃內(nèi)宕機 DB2 9.7在線模式變更的介紹,望你能有所收獲。
【編輯推薦】