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

















