DB2 9.5 數(shù)據(jù)庫分區(qū)管理及應(yīng)用實(shí)踐
本文主要介紹什么是 DB2 數(shù)據(jù)庫分區(qū),為什么采用數(shù)據(jù)庫分區(qū),并以 Balanced Warehouse E7100 為例介紹數(shù)據(jù)庫分區(qū)管理的基本方法及應(yīng)用實(shí)踐。
DB2 數(shù)據(jù)庫分區(qū)是 DB2 企業(yè)版 DPF(Data Partitioning Feature)選件提供的,它主要用來為大規(guī)模數(shù)據(jù)處理、高并發(fā)數(shù)據(jù)訪問提供支持。DB2 數(shù)據(jù)庫分區(qū)采用 Share-nothing 體系結(jié)構(gòu),數(shù)據(jù)庫在一個(gè)非共享的環(huán)境中被分解為獨(dú)立的分區(qū),每個(gè)分區(qū)都具有自己的資源,例如內(nèi)存,CPU 和磁盤以及自己的數(shù)據(jù)、索引、配置文件和事務(wù)日志。數(shù)據(jù)庫分區(qū)有時(shí)稱為節(jié)點(diǎn)或數(shù)據(jù)庫節(jié)點(diǎn)。如下圖所示:
圖 1. DB2 數(shù)據(jù)庫分區(qū)示例圖
數(shù)據(jù)通過 Hash 算法均允地散列到不同的分區(qū)內(nèi),每個(gè)分區(qū)只負(fù)責(zé)處理自己的數(shù)據(jù)。當(dāng)用戶發(fā)出 SQL 操作后,被連接的分區(qū)被稱為 Coordinate Node,它負(fù)責(zé)處理用戶的請(qǐng)求,并根據(jù) Partition key 將用戶的請(qǐng)求分解成多個(gè)子任務(wù)交由不同分區(qū)并行處理,最后將不同分區(qū)的執(zhí)行結(jié)果經(jīng)過匯總返回給用戶,分區(qū)對(duì)應(yīng)用來說是透明的。
在 DB2 中,數(shù)據(jù)庫分區(qū)可以部署在集群或 MPP 環(huán)境下,也就是說數(shù)據(jù)庫分區(qū)分布在不同的機(jī)器上;數(shù)據(jù)庫分區(qū)也可以部署在同一臺(tái) SMP 機(jī)器上,在同一臺(tái)機(jī)器上的分區(qū)我們稱為邏輯分區(qū)。同時(shí),我們還可以在集群或 MPP 環(huán)境下部署多個(gè)分區(qū),在集群或 MPP 每一個(gè)節(jié)點(diǎn)上部署多個(gè)邏輯分區(qū)。
DB2 數(shù)據(jù)庫分區(qū)提供了強(qiáng)大的可擴(kuò)展能力。由于采用 Share-nothing 體系結(jié)構(gòu),每個(gè)分區(qū)(節(jié)點(diǎn))只處理它那一部分?jǐn)?shù)據(jù),分區(qū)之間盡可能獨(dú)立,這就減少了節(jié)點(diǎn)間共享資源的爭(zhēng)用,允許數(shù)據(jù)庫有效地伸縮以支持更大的數(shù)據(jù)規(guī)模及更多的用戶訪問。DB2 數(shù)據(jù)庫分區(qū)提供 scale up (垂直擴(kuò)展)及 scale out (水平擴(kuò)展)能力。垂直擴(kuò)展是通過增加機(jī)器的物理資源如 cpu、磁盤、內(nèi)存來實(shí)現(xiàn)的;水平擴(kuò)展是通過增加物理機(jī)器來實(shí)現(xiàn)的,DB2 中,最多可以支持 1000 個(gè)分區(qū)。在規(guī)劃 DB2 數(shù)據(jù)庫分區(qū)時(shí),我們需要考慮是通過增加邏輯分區(qū)還是物理分區(qū)來實(shí)現(xiàn)擴(kuò)展能力。如果一臺(tái)物理機(jī)器上有多個(gè) CPU,其物理資源可以允許多個(gè)分區(qū)共享該資源,我們可以通過增加邏輯分區(qū)來實(shí)現(xiàn)擴(kuò)展;如果一臺(tái)物理機(jī)器上的物理資源不能滿足應(yīng)用需求,我們就需要通過增加機(jī)器,也就是物理分區(qū)來實(shí)現(xiàn)擴(kuò)展能力。
DB2 數(shù)據(jù)庫分區(qū)還提供了強(qiáng)大的并行處理能力。首先,它提供了 inter-partition parallelism 分區(qū)間的并行機(jī)制,通過hash算法將數(shù)據(jù)庫請(qǐng)求分成多個(gè)任務(wù)在不同的分區(qū)上并行執(zhí)行,同時(shí),提供了 intra-partition parallelism 分區(qū)內(nèi)的并行機(jī)制,將任務(wù)分解成不同的子任務(wù),在不同的 CPU 上并行執(zhí)行,另外,我們還可以同時(shí)利用 inter-partition parallelism、intra-partition parallelism 來實(shí)現(xiàn)完全的并行處理能力。DB2 數(shù)據(jù)庫的查詢操作、backup/restore/load 等實(shí)用程序及 I/O 操作都可以通過上述的并行處理能力來顯著提高其性能。如下圖所示:
圖 2. DB2 數(shù)據(jù)庫分區(qū)并行處理示例圖
為什么采用數(shù)據(jù)庫分區(qū)
采用數(shù)據(jù)庫分區(qū),可以為您帶來如下好處:
查詢擴(kuò)展性
這是采用數(shù)據(jù)庫分區(qū)最主要的原因之一。將一個(gè)大的數(shù)據(jù)庫分成多個(gè)小的數(shù)據(jù)庫可以提高查詢的性能,因?yàn)槊總€(gè)數(shù)據(jù)庫分區(qū)擁有自己的一小部分?jǐn)?shù)據(jù)。假設(shè)您想掃描1億條記錄,對(duì)一個(gè)單一分區(qū)的數(shù)據(jù)庫來講,該掃描操作需要數(shù)據(jù)庫管理器獨(dú)立掃描一億條記錄,如果您將數(shù)據(jù)庫系統(tǒng)做成50個(gè)分區(qū),并將這1億條記錄平均分配到這50個(gè)分區(qū)上,那么每個(gè)數(shù)據(jù)庫分區(qū)的數(shù)據(jù)庫管理器將只掃描200萬記錄。
架構(gòu)限制
在DB2 V8和以前版本,非分區(qū)數(shù)據(jù)庫的最大的表取決于頁面大小,4K頁最大支持64 GB,32K頁最大支持512 GB數(shù)據(jù)量。表和表空間大小限制是每個(gè)分區(qū)上的限制,因此將數(shù)據(jù)庫分成N個(gè)分區(qū)可以將表的最大尺寸增加為單個(gè)分區(qū)表最大尺寸的N倍。內(nèi)存也可能是個(gè)限制,特別是在32為操作系統(tǒng)環(huán)境,因?yàn)槊總€(gè)數(shù)據(jù)庫分區(qū)管理并擁有自己的資源,因此通過數(shù)據(jù)庫分區(qū)可以克服這個(gè)限制。
數(shù)據(jù)庫裝載性能
數(shù)據(jù)庫分區(qū)可以并行裝載數(shù)據(jù)到所有數(shù)據(jù)庫分區(qū),極大減少單表的裝載時(shí)間,這對(duì)于像實(shí)時(shí)商業(yè)智能系統(tǒng)那樣對(duì)數(shù)據(jù)裝載的時(shí)間要求特別高的系統(tǒng)特別重要。
數(shù)據(jù)庫維護(hù)性能
將數(shù)據(jù)庫分散到多個(gè)數(shù)據(jù)庫分區(qū)服務(wù)器可以加快系統(tǒng)維護(hù),因?yàn)槊總€(gè)操作都運(yùn)行在分區(qū)所管理的一個(gè)數(shù)據(jù)子集上面,這樣可以通過數(shù)據(jù)庫分區(qū)進(jìn)一步減少創(chuàng)建索引的時(shí)間,減少搜集統(tǒng)計(jì)信息的時(shí)間,因?yàn)閞unstats僅運(yùn)行在一個(gè)數(shù)據(jù)庫分區(qū)上面,減少表重整(reorg)的時(shí)間。
備份/恢復(fù)性能
將數(shù)據(jù)庫分區(qū)到不同的數(shù)據(jù)庫服務(wù)器上可以大大減少數(shù)據(jù)庫備份的時(shí)間,這往往是決定是否使用數(shù)據(jù)庫分區(qū)很重要的一點(diǎn)。DB2 通過為每個(gè)表空間分配獨(dú)立的進(jìn)程或線程來實(shí)現(xiàn)備份和恢復(fù)操作的并行處理的。在分區(qū)數(shù)據(jù)庫環(huán)境的備份中,每個(gè)分區(qū)的備份是獨(dú)立的,通過并行備份數(shù)據(jù)庫分區(qū)可以大大減少備份整個(gè)數(shù)據(jù)庫的時(shí)間。
日志
在高度活動(dòng)的系統(tǒng)中,數(shù)據(jù)庫日志的性能可能會(huì)限制系統(tǒng)的整體吞吐量。在分區(qū)數(shù)據(jù)庫環(huán)境中,每個(gè)分區(qū)有自己一套日志。當(dāng)大量插入、更新、刪除操作時(shí),多個(gè)數(shù)據(jù)庫分區(qū)可以提高性能,因?yàn)槿罩臼窃诿總€(gè)數(shù)據(jù)庫分區(qū)上是并行寫的,且每個(gè)單一的分區(qū)需要記錄的日志更少。
DB2 隨數(shù)據(jù)量或處理器和分區(qū)的增加,提供近線性的擴(kuò)展能力,可是,數(shù)據(jù)庫分區(qū)是否提供最多的益處依賴于處理的工作負(fù)荷、最大表的大小及其他因素。
什么時(shí)候采用數(shù)據(jù)庫分區(qū)
設(shè)計(jì)數(shù)據(jù)庫分區(qū)的基本原則是,盡量將大表分布在所有的分區(qū)上,提高并行處理能力;將小表放置在盡量少的分區(qū)上,一般是建議放在單一分區(qū)上;盡量減少分區(qū)間的通信。對(duì)于是否采用數(shù)據(jù)庫分區(qū),除了考慮上一節(jié)提到的分區(qū)的優(yōu)勢(shì)之外,我們也要根據(jù)分區(qū)設(shè)計(jì)原則來考慮:
選擇數(shù)據(jù)庫分區(qū)的一個(gè)比較理想的場(chǎng)景是執(zhí)行一條像 ” select count(*) from big_table”這樣的語句。如果將這個(gè)表放在所有分區(qū)上,則每個(gè)分區(qū)都可以計(jì)算該表在其上的行數(shù),并將這個(gè)局部總數(shù)(subtotal)發(fā)送到協(xié)調(diào)分區(qū),以便計(jì)算總和,而這里的通信成本比起每個(gè)分區(qū)上所做的工作來可以忽略不計(jì)。
另一個(gè)非常合適的場(chǎng)景是, 一個(gè)大表與幾個(gè)非常小的很少更新的表相連接。大表是分區(qū)的,小表則被復(fù)制到每個(gè)分區(qū)上,這樣就可以并置連接。
不適合使用分區(qū)的是那些在連接時(shí)涉及很多大表和各種各樣的表和列的 ad hoc 查詢環(huán)境。在那些情況下, 很難或者不可能選擇表的分區(qū)鍵,使得所有大的查詢執(zhí)行起來沒有很多的分區(qū)間通信。
同樣不適合使用分區(qū)的是那些有多條不能在單個(gè)分區(qū)內(nèi)處理的非常小的語句。在這種情況下,分區(qū)間通信的開銷比起這些語句的本地執(zhí)行來就相當(dāng)高,而如果使用分區(qū)的話(尤其是跨多個(gè)物理系統(tǒng)),響應(yīng)時(shí)間就會(huì)大大惡化。
大多數(shù)工作負(fù)載和一些特定的任務(wù)都處于剛才討論的這兩種極端之間,這些地方都需要通過原型來研究使用分區(qū)所帶來的影響。
#p#數(shù)據(jù)庫分區(qū)實(shí)現(xiàn)
下邊,我們以 IBM InfoSphere Balanced Warehouse E7100 為例,介紹一下DB2 分區(qū)數(shù)據(jù)庫在AIX下的基本管理方法及應(yīng)用實(shí)踐。DB2 分區(qū)數(shù)據(jù)庫在 Windows 環(huán)境下的管理方法和 AIX 略有不同,具體請(qǐng)參閱相關(guān)手冊(cè)。
IBM InfoSphere Balanced Warehouse 是IBM針對(duì)客戶數(shù)據(jù)倉庫系統(tǒng)提出的一整套完整的解決方案。當(dāng)用戶實(shí)施一個(gè)數(shù)據(jù)倉庫系統(tǒng)時(shí),對(duì)用戶來說,一個(gè)非常大的挑戰(zhàn)就是未來的數(shù)據(jù)倉庫系統(tǒng)應(yīng)該選擇什么樣的服務(wù)器,服務(wù)器的配置是什么,選擇多少臺(tái)服務(wù)器;選擇什么樣的存儲(chǔ)設(shè)備,存儲(chǔ)容量要多大,存儲(chǔ)設(shè)備配置是什么;選擇什么樣的網(wǎng)絡(luò)設(shè)備,它的配置是什么才能保證系統(tǒng)性能高效、穩(wěn)定。同時(shí),隨著系統(tǒng)的應(yīng)用,數(shù)據(jù)量會(huì)急劇增長(zhǎng),如何在保證系統(tǒng)性能的前提下,提供更好的系統(tǒng)擴(kuò)展能力也是用戶非常關(guān)心的問題。為了解決上述問題,IBM 結(jié)合自己多年實(shí)施客戶數(shù)據(jù)倉庫系統(tǒng)的經(jīng)驗(yàn),并協(xié)同IBM軟件部門、服務(wù)器部門、存儲(chǔ)部門及實(shí)驗(yàn)室,共同推出了 InfoSphere Balanced Warehouse 解決方案,有時(shí)也稱為 BCU(Balanced Configuration Unit)。InfoSphere Balanced Warehouse 是一個(gè)包含服務(wù)器、存儲(chǔ)、數(shù)據(jù)倉庫軟件在內(nèi)的完整解決方案,它基于 IBM 最佳實(shí)踐并得到充分驗(yàn)證,是一個(gè)預(yù)先配置好的、可立即使用的解決方案,客戶無需靠猜測(cè)或假象去配置并驗(yàn)證,實(shí)現(xiàn)開箱即用。InfoSphere Balanced Warehouse 采用平衡的理念,每個(gè)組件(數(shù)據(jù)庫、服務(wù)器和存儲(chǔ))提供均衡的性能確保整體方案性能最優(yōu)。同時(shí),它采用可擴(kuò)展的模塊化設(shè)計(jì),數(shù)據(jù)倉庫系統(tǒng)在整個(gè)生命周期中,可以以增量的方式進(jìn)行擴(kuò)展,達(dá)到的性能可預(yù)見、可度量。
InfoSphere Balanced Warehouse主要由以下幾個(gè)模塊組成:如下圖:
圖 3. InfoSphere Balanced Warehouse 模塊組成
Foundation Module: 有時(shí)也稱為 administration BCU。該模塊主要包括編目分區(qū)、協(xié)調(diào)分區(qū)以及單分區(qū)表。系統(tǒng)必須要有 1 個(gè) Foundation Module。
Data Module: 有時(shí)也稱為 data BCU。該模塊主要保存分區(qū)表數(shù)據(jù)。根據(jù)數(shù)據(jù)量,可以有 1 個(gè)或多個(gè) Data Module。
User Module: 如果系統(tǒng)有大量用戶訪問,我們可以考慮增加 User Module。
Failover Module: 用于滿足 HA 的需求。
Application Module: 用于運(yùn)行應(yīng)用程序,比如說 ETL 應(yīng)用就可以配置在 Application Module 上。
本次配置環(huán)境包括一個(gè) administration BCU 和 2 個(gè) data BCU,如下圖所示:
圖 4. InfoSphere Balanced Warehouse 配置圖
創(chuàng)建實(shí)例及配置通信連接
使用db2icrt命令創(chuàng)建實(shí)例
/opt/IBM/db2/V9.1/instance/db2icrt -u bcufenc bcuaix |
配置TCPIP通信服務(wù)
db2set DB2COMM=tcpip |
修改DBM CFG 中的 SVCENAME參數(shù)
db2 update dbm config using svcename xbcuaix |
在實(shí)例級(jí)禁用fault monitor
db2fm -i instance_name -f no |
創(chuàng)建診斷文件目錄
缺省的情況下,db2diag.log 文件創(chuàng)建在 ~/sqllib/db2dump 目錄下,這個(gè)目錄是 NFS-mounted,我們一般建議要將 db2diag.log 文件放在非 NFS-mounted 目錄下。在 E7100 實(shí)施中,我們建議將該文件放到外部的存儲(chǔ)上。
Administration BCU:
mkdir -p /db2path/bcuaix/NODE0000/SQL00001/db2dump
Data BCU 1:
mkdir -p /db2path/bcuaix/NODE0001/SQL00001/db2dump
Data BCU 2:
mkdir -p /db2path/bcuaix/NODE0009/SQL00001/db2dump
Administration BCU:
ln -s /db2path/bcuaix/NODE0000/SQL00001/db2dump /db2path/bcuaix/db2dump
Data BCU 1:
ln -s /db2path/bcuaix/NODE0001/SQL00001/db2dump /db2path/bcuaix/db2dump
Data BCU 2:
ln -s /db2path/bcuaix/NODE0009/SQL00001/db2dump /db2path/bcuaix/db2dump
db2 update dbm config using diagpath /db2path/bcuaix/db2dump
定義數(shù)據(jù)庫分區(qū)
在數(shù)據(jù)庫分區(qū)環(huán)境下,數(shù)據(jù)庫被分為多個(gè)分區(qū),分區(qū)之間彼此獨(dú)立工作,實(shí)現(xiàn)并行操作。數(shù)據(jù)庫分區(qū)可以是物理分區(qū)也可以是邏輯分區(qū)。在一臺(tái)物理機(jī)器上部署的一個(gè)分區(qū),我們稱為物理分區(qū),如果是在一臺(tái) SMP 機(jī)器上部署多個(gè)分區(qū),這些分區(qū)我們稱為邏輯分區(qū)。我們可以選擇物理分區(qū),也可以選擇邏輯分區(qū)。通常,如果決定采用大的 SMP 機(jī)器,有更多的 CPU、內(nèi)存及硬盤,我們會(huì)采用邏輯分區(qū);如果決定采用多臺(tái)物理機(jī)器,我們會(huì)通過非共享的體系結(jié)構(gòu)采用物理分區(qū);如果決定采用多臺(tái) SMP 機(jī)器,我們則會(huì)采用物理分區(qū)和邏輯分區(qū)結(jié)合的方式。
在 DB2 數(shù)據(jù)庫分區(qū)環(huán)境中,執(zhí)行 CREATE DATABASE 語句所在的分區(qū)稱為編目分區(qū)(catalog partition)。編目分區(qū)保存系統(tǒng)編目表。編目分區(qū)只能創(chuàng)建在一個(gè)分區(qū)上。通常,在實(shí)際生產(chǎn)環(huán)境中,我們建議采用一個(gè)專用編目分區(qū),這個(gè)分區(qū)只包含編目表,不包含用戶數(shù)據(jù)。這對(duì) DB2 的一些實(shí)用程序運(yùn)行效率有較大的提高。比如說 BACKUP 和 RESTORE 命令,需要先在編目分區(qū)上運(yùn)行,之后才能在其他分區(qū)上執(zhí)行。由于編目分區(qū)上沒有用戶數(shù)據(jù),因此它的備份和恢復(fù)就可以很快完成,并且可以最小程度地延遲對(duì)其他分區(qū)的(并行)操作的開始。
在 DB2 數(shù)據(jù)庫分區(qū)環(huán)境中,應(yīng)用程序連接的分區(qū),我們稱為協(xié)調(diào)分區(qū)(coordinate partition)。它負(fù)責(zé)處理用戶的請(qǐng)求,并根據(jù) Partition key 將用戶的請(qǐng)求分解成多個(gè)子任務(wù)交由不同分區(qū)并行處理,最后將不同分區(qū)的執(zhí)行結(jié)果經(jīng)過匯總返回給用戶。任何一個(gè)數(shù)據(jù)庫分區(qū)都可以是協(xié)調(diào)分區(qū)。在實(shí)際生產(chǎn)環(huán)境中,我們建議采用一個(gè)或幾個(gè)專用協(xié)調(diào)分區(qū)。因?yàn)閼?yīng)用程序要通過一個(gè)或多個(gè)協(xié)調(diào)分區(qū)為用戶連接轉(zhuǎn)移大量的數(shù)據(jù)的話,那么就會(huì)消耗那些分區(qū)上的大部分 CPU,并降慢了數(shù)據(jù)訪問速度。如果讓分區(qū)什么也不做,只是充當(dāng)協(xié)調(diào)者(coordinator),就不會(huì)降低數(shù)據(jù)分區(qū)數(shù)據(jù)訪問速度。
在 InfoSphere Balanced Warehouse E7100 的設(shè)計(jì)中,我們?cè)?administration BCU 中,分別為編目分區(qū)和協(xié)調(diào)分區(qū)分配了專用的分區(qū),同時(shí),根據(jù)數(shù)據(jù)庫分區(qū)的基本原則,我們將系統(tǒng)中的小表創(chuàng)建在了一個(gè)單一分區(qū)上。用戶的數(shù)據(jù),我們創(chuàng)建在 data BCU 上,同時(shí),根據(jù)數(shù)據(jù)庫分區(qū)的基本原則,我們將系統(tǒng)中的大表盡量地分布到 data BCU 上的所有分區(qū)上。當(dāng)用戶數(shù)據(jù)增加后,我們可以通過增加更多的 data BCU 來實(shí)現(xiàn)增量的方式擴(kuò)展、提供均衡的性能。如下說明:
Database partition 0 (BPU 0) 包含:
Catalog function (only one database partition has the database catalog)
Coordinator function
Single-partition data function
Query Patroller server and control tables (if implemented)
Located on the administration BCU
Database partition 1 - n (BPU1 - BPUn) 包含:
Database partitions with partitioned data
Located on the data BCUs
DB2 節(jié)點(diǎn)配置文件(db2nodes.cfg)
用來定義數(shù)據(jù)庫分區(qū)。在創(chuàng)建分區(qū)數(shù)據(jù)庫之前,一定要先定義 db2nodes.cfg 文件。該文件放置在用戶實(shí)例主目錄下。系統(tǒng)中的每一個(gè)分區(qū)在該文件中都會(huì)有一項(xiàng)。
db2nodes.cfg 文件的基本格式如下:
dbpartitionnum hostname logical-port netnam |
其中:
dbpartitionnum
數(shù)據(jù)庫分區(qū)號(hào)唯一地定義數(shù)據(jù)庫分區(qū),可在 0 到 999 之間。數(shù)據(jù)庫分區(qū)號(hào)必須以升序順序排序。該順序中可以有間隔。一旦指定了數(shù)據(jù)庫分區(qū)號(hào),就不能對(duì)其進(jìn)行更改。否則,分布圖(它指定數(shù)據(jù)分發(fā)方式)中的信息可能不正確。
hostname
用作分區(qū)間通信的 IP 地址的主機(jī)名。
logical-port
它指定該數(shù)據(jù)庫分區(qū)的邏輯端口號(hào)。此號(hào)碼與數(shù)據(jù)庫管理器實(shí)例名一起用來標(biāo)識(shí) etc/services 文件中的 TCP/IP 服務(wù)名稱條目。 對(duì)于每個(gè)主機(jī)名,一個(gè)邏輯端口必須為 0(零) 。
netname
指定用于 FCM 高速互聯(lián)的主機(jī)名稱 。
下邊是包括一個(gè) administration BCU 和 2 個(gè) data BCU 環(huán)境的 db2nodes.cfg 文件內(nèi)容:
0 adminbcu001 0 adminbcu001_fcm
1 databcu001 0 databcu001_fcm
2 databcu001 1 databcu001_fcm
3 databcu001 2 databcu001_fcm
4 databcu001 3 databcu001_fcm
5 databcu001 4 databcu001_fcm
6 databcu001 5 databcu001_fcm
7 databcu001 6 databcu001_fcm
8 databcu001 7 databcu001_fcm
9 databcu002 0 databcu002_fcm
10 databcu002 1 databcu002_fcm
11 databcu002 2 databcu002_fcm
12 databcu002 3 databcu002_fcm
13 databcu002 4 databcu002_fcm
14 databcu002 5 databcu002_fcm
15 databcu002 6 databcu002_fcm
16 databcu002 7 databcu002_fcm
在分區(qū)號(hào)的分配上,我們建議,catalog partition 分區(qū)號(hào)分配為 0,因?yàn)橐粋€(gè)實(shí)例下只能有 1 個(gè) catalog partition,分區(qū)號(hào) 990-999 分配給另外需要增加的 coordinator partitions,分區(qū)號(hào) 980-989 分配給另外需要增加的單分區(qū)的表。
配置分區(qū)間通信
在 DB2 數(shù)據(jù)庫分區(qū)環(huán)境中,分區(qū)之間需要通過 DB2 Fast Communication
Manager 進(jìn)行通信。在 /etc/services 文件中,需要為 DB2 FCM 通信設(shè)置相應(yīng)的通信端口。
xbcuaix 50000/tcp xbcuaix_int 50001/tcp DB2_bcuaix 60000/tcp DB2_bcuaix_END 60016/tcp |
創(chuàng)建數(shù)據(jù)庫
我們?cè)?administration BCU 上創(chuàng)建數(shù)據(jù)庫testdb。
db2 "create database testdb automatic storage no on /db2path \ pagesize 16384 autoconfigure apply none" |
創(chuàng)建數(shù)據(jù)庫分區(qū)組(database partition groups)
數(shù)據(jù)庫分區(qū)組是一個(gè)或多個(gè)數(shù)據(jù)庫分區(qū)的集合。在 DB2 數(shù)據(jù)庫分區(qū)環(huán)境中,數(shù)據(jù)庫表空間創(chuàng)建在數(shù)據(jù)庫分區(qū)組中。
在設(shè)計(jì)數(shù)據(jù)庫分區(qū)組時(shí),我們一般建議:
幾乎總要為小的表創(chuàng)建至少一個(gè)單分區(qū)的數(shù)據(jù)庫分區(qū)組。
幾乎總要為大的表使用至少一個(gè)由所有分區(qū)組成的數(shù)據(jù)庫分區(qū)組。這個(gè)數(shù)據(jù)庫分區(qū)組可以是缺省的 IBMDEFAULTGROUP。
分區(qū)數(shù)越多,就越可能存在一些對(duì)單分區(qū)來說太大、而要展開到所有分區(qū)上又太小的表,那么就越需要?jiǎng)?chuàng)建包含數(shù)個(gè)分區(qū)、但不是全部分區(qū)的數(shù)據(jù)庫分區(qū)組。
當(dāng)我們創(chuàng)建一個(gè)數(shù)據(jù)庫后,系統(tǒng)會(huì)缺省創(chuàng)建 3 個(gè)數(shù)據(jù)庫分區(qū)組:
IBMCATGROUP:編目數(shù)據(jù)庫分區(qū)組,用來存儲(chǔ)系統(tǒng)編目表。它只包含一個(gè)數(shù)據(jù)庫分區(qū)。
SYSCATSPACE 表空間創(chuàng)建在這個(gè)分區(qū)組中。
在 BCU 設(shè)計(jì)中,IBMCATGROUP 創(chuàng)建在 0 號(hào)數(shù)據(jù)庫分區(qū)上。
IBMTEMPGROUP.:臨時(shí)數(shù)據(jù)庫分區(qū)組,tempspace1 系統(tǒng)臨時(shí)表空間創(chuàng)建在這個(gè)分區(qū)組中。它包含系統(tǒng)中的所有數(shù)據(jù)庫分區(qū)。
IBMDEFAULTGROUP:缺省數(shù)據(jù)庫分區(qū)組。用戶表空間缺省創(chuàng)建在該分區(qū)組中。USERSPACE1 表空間包含在 IBMDEFAULTGROUP 中。
在BCU設(shè)計(jì)中,建議不使用IBMDEFAULTGROUP,而是創(chuàng)建了2個(gè)新的數(shù)據(jù)庫分區(qū)組:
PDPG: 分布在data BCU分區(qū)上的數(shù)據(jù)包含在此數(shù)據(jù)庫分區(qū)組中。PDPG 只包括data BCU 上的分區(qū),但不包含administration BCU上的分區(qū)。它適用于中等數(shù)據(jù)規(guī)模到大數(shù)據(jù)規(guī)模的表。
SDPG:該數(shù)據(jù)庫分區(qū)只包含 administration BCU 分區(qū)上的數(shù)據(jù),它只包含一個(gè)數(shù)據(jù)庫分區(qū),即 0 號(hào)數(shù)據(jù)庫分區(qū)。系統(tǒng)中的一些小表保存在此數(shù)據(jù)庫分區(qū)組中,這些小表通常是一些維表(dimension tables)或 lookup tables。
CREATE DATABASE PARTITION GROUP PDPG ON DBPARTITIONNUMS (1 to 16) CREATE DATABASE PARTITION GROUP SDPG ON DBPARTITIONNUMS (0) |
創(chuàng)建 buffer pools
在本示例中,我們創(chuàng)建 2 個(gè) 16K 頁的 buffer pools:
CREATE BUFFERPOOL BP_16K ALL DBPARTITIONNUMS SIZE 53760 PAGESIZE 16K; CREATE BUFFERPOOL BPTMP_16K ALL DBPARTITIONNUMS SIZE 10752 PAGESIZE 16K; |
創(chuàng)建表空間
在本次實(shí)例中,我們將創(chuàng)建如下表空間:
db2tmp ---臨時(shí)表空間
ts_pd_data_001---分區(qū)表數(shù)據(jù)空間
ts_pd_idx_001---索引表空間
ts_sd_small---單分區(qū)表空間。如圖所示:
圖 5. 表空間創(chuàng)建示例圖:
在 data BCU 上創(chuàng)建如下表空間:
CREATE TEMPORARY TABLESPACE db2tmp
IN DATABASE PARTITION GROUP ibmtempgroup
PAGESIZE 16K
MANAGED BY DATABASE
USING (
FILE ’/db2fs1p $N /bcuaix/databasename/db2tmp’ 25G)
ON DBPARTITIONNUMS (0)
USING (
FILE ’/db2fs1p $N /bcuaix/databasename/db2tmp’ 25G,
FILE ’/db2fs2p $N /bcuaix/databasename/db2tmp’ 25G,
FILE ’/db2fs3p $N /bcuaix/databasename/db2tmp’ 25G,
FILE ’/db2fs4p $N /bcuaix/databasename/db2tmp’ 25G)
ON DBPARTITIONNUMS (1 to 16)
EXTENTSIZE 16
PREFETCHSIZE AUTOMATIC
BUFFERPOOL BPTMP_16K
OVERHEAD 5.75 TRANSFERRATE 0.4
AUTORESIZE YES MAXSIZE 400G
NO FILE SYSTEM CACHING;
CREATE TABLESPACE ts_pd_data_001
IN DATABASE PARTITION GROUP pdpg
PAGESIZE 16K
MANAGED BY DATABASE
USING (
FILE ’/db2fs1p $N /bcuaix/databasename/ts_pd_data_001’ 50G,
FILE ’/db2fs2p $N /bcuaix/databasename/ts_pd_data_001’ 50G,
FILE ’/db2fs3p $N /bcuaix/databasename/ts_pd_data_001’ 50G,
FILE ’/db2fs4p $N /bcuaix/databasename/ts_pd_data_001’ 50G)
EXTENTSIZE 16
PREFETCHSIZE AUTOMATIC
BUFFERPOOL BP_16K
OVERHEAD 5.75 TRANSFERRATE 0.4
AUTORESIZE YES MAXSIZE 400G
NO FILE SYSTEM CACHING;
CREATE TABLESPACE ts_pd_idx_001
IN DATABASE PARTITION GROUP pdpg
PAGESIZE 16K
MANAGED BY DATABASE
USING (
FILE ’/db2fs1p $N /bcuaix/databasename/ts_pd_idx_001’ 25G,
FILE ’/db2fs2p $N /bcuaix/databasename/ts_pd_idx_001’ 25G,
FILE ’/db2f3p $N /bcuaix/databasename/ts_pd_idx_001’ 25G,
FILE ’/db2fs4p $N /bcuaix/databasename/ts_pd_idx_001’ 25G)
EXTENTSIZE 16
PREFETCHSIZE AUTOMATIC
BUFFERPOOL BP_16K
OVERHEAD 5.75 TRANSFERRATE 0.4
AUTORESIZE YES MAXSIZE 200G
NO FILE SYSTEM CACHING;
在administration BCU上創(chuàng)建如下表空間:
CREATE TABLESPACE ts_sd_small_001 |
在創(chuàng)建分區(qū)數(shù)據(jù)庫表空間時(shí),我們經(jīng)常會(huì)使用數(shù)據(jù)庫分區(qū)表達(dá)式。它是由參數(shù) ' $N (注意在 $N 之前有一個(gè)空格)來指定的,DB2 會(huì)將 $N 替換成數(shù)據(jù)庫分區(qū)組中已定義的分區(qū)號(hào)。
創(chuàng)建表
當(dāng)創(chuàng)建數(shù)據(jù)庫分區(qū)組時(shí),每一個(gè)數(shù)據(jù)庫分區(qū)組都會(huì)對(duì)應(yīng)一個(gè)分區(qū)圖(partitioning map),它是一個(gè)包含 4096 個(gè)條目的數(shù)組,每個(gè)條目的值對(duì)應(yīng)于數(shù)據(jù)庫分區(qū)組中的某一個(gè)分區(qū)號(hào)。
分區(qū)鍵(partitioning key)是由一個(gè)表上的一個(gè)列或者多個(gè)列組成,用于確定某一行特定數(shù)據(jù)分布在哪個(gè)分區(qū)上。分區(qū)鍵是在 CREATE TABLE 語句來定義的。如果沒有指定分區(qū)鍵,缺省的分區(qū)鍵是主鍵的第一列,如果沒有這么一列,則選擇有適合數(shù)據(jù)類型的第一列。
當(dāng)向表中插入一條記錄時(shí),DB2 將該記錄的分區(qū)鍵值散列(hash)到分區(qū)圖中的一個(gè)條目上,并根據(jù)該條目找到要使用的分區(qū)號(hào)。
在定義分區(qū)表時(shí),分區(qū)鍵的定義對(duì)今后性能的影響非常大,因此,在選擇上一定要慎重。通常,在選擇分區(qū)鍵時(shí),要遵從如下原則:
選擇經(jīng)常用于連接的列作為分區(qū)鍵。
分區(qū)鍵應(yīng)該不包括經(jīng)常更新的列。
除非一個(gè)表不是很重要,或者不知道一個(gè)好的分區(qū)鍵選擇是什么,否則不應(yīng)該隨缺省情況選擇分區(qū)鍵。缺省的分區(qū)鍵是主鍵的第一列,如果沒有這么一列,則選擇有適合數(shù)據(jù)類型的第一列。
將一個(gè)表創(chuàng)建為分區(qū)表之后,就不能直接更改它的分區(qū)鍵。
通過 ALTER TABLE 可以添加或刪除分區(qū)鍵,但是這只對(duì)未分區(qū)表有效。
那些處于表上定義的惟一性約束或主鍵約束中的列必須是分區(qū)鍵的一個(gè)超集(superset)
數(shù)據(jù)類型:LOB 和 LONG 型的列不能作為分區(qū)鍵的一部分
就效率而言,整數(shù)類型的列是最可取的,其次是字符型,然后是小數(shù)。
選擇基數(shù)較大的分區(qū)鍵列,以避免表中的行在各分區(qū)上分布不均衡。
在 DB2 數(shù)據(jù)庫分區(qū)環(huán)境下,數(shù)據(jù)在不同分區(qū)的分布會(huì)影響表的連接策略。分區(qū)數(shù)據(jù)庫環(huán)境下表連接策略主要包括:
并置連接(Collocated joins)--采用該種連接方式,表的連接以本地方式在數(shù)據(jù)所在的數(shù)據(jù)庫分區(qū)上進(jìn)行,不會(huì)在分區(qū)之間傳輸數(shù)據(jù),這是效率最高的表連接方式。在分區(qū)數(shù)據(jù)環(huán)境下,應(yīng)盡量采用該種連接方式。
定向連接(Directed joins)--采用該種連接方式,一個(gè)表中的數(shù)據(jù)會(huì)按照連接對(duì)中的另一個(gè)表的分區(qū)鍵值重新分發(fā)到其他分區(qū)上來完成表連接操作。它會(huì)在分區(qū)之間移動(dòng)數(shù)據(jù),對(duì)性能會(huì)有一定影響。當(dāng)并置連接及未被采用,DB2優(yōu)化器會(huì)選擇定向連接方式。
廣播連接( Broadcast joins)--采用該種連接方式,一個(gè)表中的所有數(shù)據(jù)會(huì)廣播到另外表所在的所有分區(qū)上來完成表連接操作。如果在分區(qū)之間廣播的數(shù)據(jù)量較大,對(duì)性能影響也會(huì)很大。當(dāng)并置連接及定向表連接未被采用,DB2 優(yōu)化器會(huì)選擇廣播連接方式。
在 DB2 數(shù)據(jù)庫分區(qū)環(huán)境下,應(yīng)盡量采用并置連接方式。要使用并置連接方式,被并置的表必須:
在相同的數(shù)據(jù)庫分區(qū)組內(nèi)
分區(qū)鍵必須有相同數(shù)量的列。
分區(qū)鍵中相應(yīng)的列必須是分區(qū)兼容的。
分區(qū)兼容性是在分區(qū)鍵中相應(yīng)列的基本數(shù)據(jù)類型之間定義的。分區(qū)兼容的(partition-compatible)數(shù)據(jù)類型有一個(gè)特性,那就是對(duì)于兩種不同類型的兩個(gè)變量,假設(shè)變量有相同的值,則它們將通過相同的分區(qū)函數(shù)映射到相同的分區(qū)鍵索引。分區(qū)兼容性有以下特征:
內(nèi)部格式用于 DATE、TIME 和 TIMESTAMP。這些類型彼此不兼容,并且沒有哪一個(gè)與 CHAR 或 VARCHAR 兼容。
分區(qū)兼容性不受具有 NOT NULL 或 FOR BIT DATA 定義的列的影響。
對(duì)于兼容數(shù)據(jù)類型的 NULL 值是一致處理的。而不兼容數(shù)據(jù)類型的 NULL 值可能產(chǎn)生不同的結(jié)果。
可以使用 UDT 的基本數(shù)據(jù)類型來分析分區(qū)兼容性。
分區(qū)鍵中具有相同值的小數(shù)是一致處理的,即使它們的標(biāo)度(scale)和精度(precision)不一樣也是如此。
系統(tǒng)提供的散列函數(shù)將忽略字符串(CHAR、VARCHAR、GRAPHIC 或 VARGRAPHIC)的結(jié)尾空白。
不同長(zhǎng)度的 CHAR 或 VARCHAR 是兼容的數(shù)據(jù)類型。
相等的 REAL 或 DOUBLE 值,即使它們的精度不同,也將被一致處理。
另外,我們也經(jīng)常使用復(fù)制的具體化查詢表(replicated MQT)來實(shí)現(xiàn)并置連接。我們往往會(huì)選擇更新不多而又經(jīng)常與大表進(jìn)行連接的小表或中等大小的表來作為復(fù)制的具體化查詢表。
下面是對(duì)復(fù)制表的一個(gè)示例定義:
create table t1_rep as (select * from t1) data initially deferred \ refresh deferred in ts_pd_data_001 replicated |
下邊的例子,我們?cè)?ts_pd_data_001 表空間上創(chuàng)建一個(gè) LINEITEM 表:
CREATE TABLE "DB2INST1"."LINEITEM" (
"L_ORDERKEY" INTEGER NOT NULL ,
"L_PARTKEY" INTEGER NOT NULL ,
"L_SUPPKEY" INTEGER NOT NULL ,
"L_LINENUMBER" INTEGER NOT NULL ,
"L_QUANTITY" DECIMAL(15,2) NOT NULL ,
"L_EXTENDEDPRICE" DECIMAL(15,2) NOT NULL ,
"L_DISCOUNT" DECIMAL(15,2) NOT NULL ,
"L_TAX" DECIMAL(15,2) NOT NULL ,
"L_RETURNFLAG" CHAR(1) NOT NULL ,
"L_LINESTATUS" CHAR(1) NOT NULL ,
"L_SHIPDATE" DATE NOT NULL ,
"L_COMMITDATE" DATE NOT NULL ,
"L_RECEIPTDATE" DATE NOT NULL ,
"L_SHIPINSTRUCT" CHAR(25) NOT NULL ,
"L_SHIPMODE" CHAR(10) NOT NULL ,
"L_COMMENT" VARCHAR(44) NOT NULL )
DISTRIBUTE BY HASH("L_ORDERKEY")
IN " ts_pd_data_001"
#p#
數(shù)據(jù)庫分區(qū)管理相關(guān)命令
確定編目分區(qū)
在 DB2 數(shù)據(jù)庫分區(qū)環(huán)境中, ROLLFORWARD DATABASE 等命令需要在編目分區(qū)上執(zhí)行。我們可以通過 LIST DATABASE DIRECTORY 命令來確定編目分區(qū)。
db2 LIST DATABASE DIRECTORY |
分區(qū)切換
在 DB2 數(shù)據(jù)庫分區(qū)環(huán)境中,我們可以通過設(shè)置 DB2NODE 環(huán)境變量 或使用 set client 命令進(jìn)行分區(qū)間的切換。
export DB2NODE=2 |
增加數(shù)據(jù)庫分區(qū)
該命令會(huì)自動(dòng)在 db2nodes.cfg 中增加新定義的分區(qū)信息,并在新的數(shù)據(jù)庫分區(qū)上創(chuàng)建
TEMPSPACE1 表空間。
我們也可以用如下命令增加數(shù)據(jù)庫分區(qū):
export DB2NODE=4 |
使用該命令時(shí),必須事先修改 db2nodes.cfg 文件包含新定義的分區(qū)信息,并在新增加的數(shù)據(jù)庫分區(qū)上執(zhí)行該命令。
刪除數(shù)據(jù)庫分區(qū)
在刪除數(shù)據(jù)庫分區(qū)時(shí),只有那些不包含數(shù)據(jù)的分區(qū)才可以被刪除。因此,在刪除分區(qū)時(shí),必須要先執(zhí)行 DROP PARTITIONNUM VERIFY 命令檢查一下該分區(qū)是否可以被刪除。如果某一個(gè)分區(qū)正在被使用,要先執(zhí)行 REDISTRIBUTE DATABASE PARTITION GROUP 命令將該分區(qū)上的數(shù)據(jù)分布到其他分區(qū)上。
export DB2NODE=4 |
如果數(shù)據(jù)庫分區(qū) 4 上有數(shù)據(jù),則執(zhí)行下述命令:
redistribute database partition group pg123 uniform drop dbpartitionnum (4) |
查看數(shù)據(jù)庫分區(qū)組
db2 LIST DATABASE PARTITION GROUPS SHOW DETAIL |
重新分布數(shù)據(jù)庫分區(qū)組數(shù)據(jù)
db2 "REDISTRIBUTE DATABASE PARTITION GROUP pg123 UNIFORM" |
增加數(shù)據(jù)庫分區(qū)到數(shù)據(jù)庫分區(qū)組中
db2 "ALTER DATABASE PARTITION GROUP pg123 ADD DBPARTITIONNUMS (4) WITHOUT TABLESPACES" |
從數(shù)據(jù)庫分區(qū)組中刪除數(shù)據(jù)庫分區(qū)
db2 drop dbpartitionnum verify |
刪除數(shù)據(jù)庫分區(qū)組
db2 "DROP DATABASE PARTITION GROUP pg123" |
查看表中的數(shù)據(jù)在各分區(qū)的分布情況
SELECT DBPARTITIONNUM(distribution key), COUNT( * ) |
查看表中的數(shù)據(jù)在分區(qū)圖(partition map)中的分布情況
SELECT HASHEDVALUE(distribution key), COUNT( * ) |
DB2 分區(qū)數(shù)據(jù)庫相關(guān)實(shí)用程序
db2_all 命令
在 DB2 分區(qū)環(huán)境下,很多操作都需要在各個(gè)分區(qū)上分別執(zhí)行,如果每次都要到各個(gè)分區(qū)上單獨(dú)執(zhí)行,對(duì)用戶來說非常繁瑣。在 DB2 中,可以使用 db2_all 命令,它可以在指定的所有數(shù)據(jù)庫分區(qū)服務(wù)器上運(yùn)行該命令?!?/P>
db2_all "db2 UPDATE DB CFG FOR TESTDB USING LOGRETAIN ON" |
rah 命令
它指定在所有計(jì)算機(jī)上運(yùn)行該命令。
如果想為多臺(tái)物理機(jī)器創(chuàng)建一個(gè)目錄,那么可以發(fā)出下面的命令
rah ")mkdir /tmp/$USER“ |
數(shù)據(jù)庫備份
要備份分區(qū)數(shù)據(jù)庫,您必須要首先在編目分區(qū)上調(diào)用備份實(shí)用程序,然后在其他數(shù)據(jù)庫分區(qū)上調(diào)用備份實(shí)用程序。
db2_all "<<+0< db2 BACKUP DB testdb to /home/db2inst1/BACKUPS" |
其中,“+0”表示只在 0 號(hào)分區(qū)上執(zhí)行,“-0”表示在除了 0 號(hào)分區(qū)之外的所有分區(qū)上執(zhí)行。
在版本 9.5 之前,您必須一次一個(gè)數(shù)據(jù)庫分區(qū)地備份分區(qū)數(shù)據(jù)庫。一次一個(gè)數(shù)據(jù)庫分區(qū)地備份多個(gè)數(shù)據(jù)庫分區(qū)可能會(huì)出錯(cuò)并且費(fèi)時(shí)。如果一次一個(gè)數(shù)據(jù)庫分區(qū)地備份分區(qū)數(shù)據(jù)庫,那么您無法在備份映像中包括復(fù)原和恢復(fù)所需要的日志文件。在版本 9.5 中,您可以通過在 b 編目數(shù)據(jù)庫分區(qū)上執(zhí)行單一系統(tǒng)視圖(SSV)備份同時(shí)備份多個(gè)數(shù)據(jù)庫分區(qū)。您從編目數(shù)據(jù)庫分區(qū)執(zhí)行備份操作時(shí),可以使用 ON DBPARTITIONNUMS 選項(xiàng)來指定要在備份中包含哪些分區(qū)。它將同時(shí)備份指定的分區(qū),并且與指定的分區(qū)相關(guān)聯(lián)的備份時(shí)間戳記將相同。此外,您還可以在 SSV 備份中包含數(shù)據(jù)庫日志。
db2 BACKUP DATABASE testdb ON DBPARTITIONNUMS (1, 2) \ |
監(jiān)控?cái)?shù)據(jù)庫備份命令執(zhí)行情況
export DB2NODE=0 |
數(shù)據(jù)庫恢復(fù)
要恢復(fù)分區(qū)數(shù)據(jù)庫,您必須要首先在編目分區(qū)上調(diào)用恢復(fù)實(shí)用程序,然后在其他數(shù)據(jù)庫分區(qū)上調(diào)用恢復(fù)實(shí)用程序。
db2_all "<<+0< db2 RESTORE DATABASE testdb \ |
前滾恢復(fù)(ROLLFORWARD DATABASE)
在分區(qū)數(shù)據(jù)庫中,ROLLFORWARD DATABASE 命令只能在編目分區(qū)上運(yùn)行。如果需要前滾恢復(fù)數(shù)據(jù)庫或表空間到某一時(shí)間點(diǎn)(point in time ),則該命令會(huì)涉及到db2nodes.cfg 文件中定義的所有數(shù)據(jù)庫分區(qū)上的數(shù)據(jù)。如果需要根據(jù)整個(gè)事務(wù)日志(to the end of logs)來前滾恢復(fù)數(shù)據(jù)庫或表空間, 則該命令會(huì)涉及到所有指定的數(shù)據(jù)庫分區(qū)上的數(shù)據(jù)。如果沒有指定數(shù)據(jù)庫分區(qū),該命令會(huì)涉及到db2nodes.cfg 文件中定義的所有數(shù)據(jù)庫分區(qū)上的數(shù)據(jù)。如果某一分區(qū)不需要執(zhí)行前滾恢復(fù),則該分區(qū)會(huì)被忽略掉。
當(dāng)數(shù)據(jù)庫處于一致狀態(tài)時(shí)(當(dāng)數(shù)據(jù)庫目錄中列示的對(duì)象與磁盤中實(shí)際存在的對(duì)象匹配時(shí)),最小恢復(fù)時(shí)間是前滾期間的最早時(shí)間點(diǎn)。手動(dòng)確定要將數(shù)據(jù)庫前滾至的正確時(shí)間點(diǎn)比較困難,尤其是對(duì)于分區(qū)數(shù)據(jù)庫更是如此。在版本 9.5 中,通過在 ROLLFORWARD DATABASE 命令中使用 TO END OF BACKUP 參數(shù),可以將數(shù)據(jù)庫前滾至由數(shù)據(jù)庫管理器確定的最小恢復(fù)時(shí)間。
前滾恢復(fù)分區(qū) 0 及分區(qū) 2 上的表空間TBS1:
db2 rollforward db testdb to end of logs on dbpartitionnums (0, 2) tablespace(TBS1) |
前滾恢復(fù)分區(qū) 6 上的 6 個(gè)小表:
db2 rollforward database testdb to end of logs on dbpartitionnum (6) \ |
前滾至由數(shù)據(jù)庫管理器確定的最小恢復(fù)時(shí)間:
db2 rollforward db testdb to end of backup and complete |
EXPORT 命令
export 用于將表中的數(shù)據(jù)卸載到文件中。
db2 "EXPORT TO lineitem.del OF DEL SELECT * FROM db2inst1.lineitem" |
在分區(qū)數(shù)據(jù)庫環(huán)境下,import 或 LOAD 命令不支持 IFX 文件格式。
IMPORT 命令
用于將外部文件中的數(shù)據(jù)插入到表中。
db2 "IMPORT FROM lineitem.tbl OF DEL MODIFIED BY COLDEL| \ |
LOAD 命令
在多分區(qū)數(shù)據(jù)庫環(huán)境中,大量的數(shù)據(jù)放在多個(gè)數(shù)據(jù)庫分區(qū)中。分區(qū)鍵用來確定每部分?jǐn)?shù)據(jù)所在的數(shù)據(jù)庫分區(qū)。必須先分布數(shù)據(jù),然后才能將該數(shù)據(jù)裝入到正確的數(shù)據(jù)庫分區(qū)中。
在多分區(qū)數(shù)據(jù)庫中裝入表時(shí),load 實(shí)用程序可以:
并行地分布輸入數(shù)據(jù)
同時(shí)在各個(gè)相應(yīng)數(shù)據(jù)庫分區(qū)中裝入數(shù)據(jù)
將數(shù)據(jù)裝入到多分區(qū)數(shù)據(jù)庫中分兩階段完成:第一階段為設(shè)置階段,在此階段獲取數(shù)據(jù)庫分區(qū)資源(如表鎖定);第二階段為裝入階段,在此階段將數(shù)據(jù)裝入到數(shù)據(jù)庫分區(qū)中。在將數(shù)據(jù)裝入多分區(qū)數(shù)據(jù)庫時(shí),可以使用下列其中一種方式:
PARTITION_AND_LOAD
對(duì)數(shù)據(jù)進(jìn)行分布(有可能以并行方式進(jìn)行分布),并且同時(shí)在各個(gè)相應(yīng)數(shù)據(jù)庫分區(qū)上裝入數(shù)據(jù)。
PARTITION_ONLY
對(duì)數(shù)據(jù)進(jìn)行分布(有可能以并行方式進(jìn)行分布),并將輸出寫入每個(gè)裝入數(shù)據(jù)庫分區(qū)上指定位置中的文件。每個(gè)文件都包含分區(qū)頭,該分區(qū)頭指定數(shù)據(jù)在數(shù)據(jù)庫分區(qū)上的分布方式,并指定可以使用 LOAD_ONLY 方式將該文件裝入到數(shù)據(jù)庫中。
LOAD_ONLY
假定數(shù)據(jù)已分布在數(shù)據(jù)庫分區(qū)上;將跳過分布過程,并且在相應(yīng)的數(shù)據(jù)庫分區(qū)上同時(shí)裝入數(shù)據(jù)。
ANALYZE
生成最佳分布圖(在所有數(shù)據(jù)庫分區(qū)之間均勻地分布數(shù)據(jù))。
下邊是 LOAD 命令的一些示例:
要將 load.del 中的數(shù)據(jù)裝入到所有定義了 TABLE1 的數(shù)據(jù)庫分區(qū)中,請(qǐng)發(fā)出以下命令:
LOAD FROM LOAD.DEL of DEL REPLACE INTO TABLE1 |
要在數(shù)據(jù)分布在數(shù)據(jù)庫分區(qū) 3 和數(shù)據(jù)庫分區(qū) 4 上的位置執(zhí)行裝入操作,請(qǐng)發(fā)出以下命令:
LOAD FROM LOAD.DEL of DEL REPLACE INTO TABLE1 PARTITIONED DB \ |
在使用數(shù)據(jù)庫分區(qū) 3 和數(shù)據(jù)庫分區(qū) 4 的情況下,要將 load.del 分布(而不裝入)到所有定義 TABLE1 的數(shù)據(jù)庫分區(qū)中,請(qǐng)發(fā)出以下命令:
LOAD FROM LOAD.DEL of DEL REPLACE INTO TABLE1 PARTITIONED DB |
如果已經(jīng)以 PARTITION_ONLY 方式執(zhí)行了裝入操作,并且要將每個(gè)裝入數(shù)據(jù)庫分區(qū)的 /db2/data 目錄中的分區(qū)文件裝入到所有定義了 TABLE1 的數(shù)據(jù)庫分區(qū)中,請(qǐng)發(fā)出以下命令:
LOAD FROM LOAD.DEL OF DEL REPLACE INTO TABLE1 PARTITIONED |
要僅裝入到數(shù)據(jù)庫分區(qū) 4 中,請(qǐng)發(fā)出以下命令:
LOAD FROM LOAD.DEL OF DEL REPLACE INTO TABLE1 PARTITIONED |
REORG 命令
在分區(qū)數(shù)據(jù)庫中,同樣使用DB2 REORG 命令重組表及索引。
db2 "REORG INDEXES ALL FOR TABLE lineitem ALLOW WRITE ACCESS" |
RUNSTATS 命令
在分區(qū)數(shù)據(jù)庫中,同樣使用RUNSTATS命令收集統(tǒng)計(jì)信息。
db2 "RUNSTATS ON TABLE db2inst1.lineitem WITH DISTRIBUTION AND \ |
在分區(qū)數(shù)據(jù)庫中,RUNSTATS 命令運(yùn)行時(shí)所在分區(qū)的統(tǒng)計(jì)信息才會(huì)被收集,再對(duì)這些統(tǒng)計(jì)信息加以推斷(前提是行在各分區(qū)上是均勻分布的)以反映整個(gè)數(shù)據(jù)庫。這意味著,SYSCAT.TABLES 中的 CARD 列可能不包含該表中確切的行數(shù)。我們要盡量讓數(shù)據(jù)均勻地分布在各分區(qū)上。
結(jié)論
本文以 Balanced Warehouse E7100 為例,為大家介紹了數(shù)據(jù)庫分區(qū)設(shè)計(jì)、實(shí)現(xiàn)及管理的基本方法。希望大家能夠?qū)?DB2 數(shù)據(jù)庫分區(qū)技術(shù)及使用有一個(gè)比較全面的了解。另外,關(guān)于數(shù)據(jù)庫分區(qū)監(jiān)控及性能調(diào)優(yōu)等方面內(nèi)容,大家可以參考 DB2 信息中心相關(guān)內(nèi)容。
db2start DBPARTITIONNUM 4 ADD DBPARTITIONNUM HOSTNAME Clyde PORT 4 |
【編輯推薦】