歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux綜合 >> Linux資訊 >> 更多Linux >> 在SUSE Linux Server上配置DB2

在SUSE Linux Server上配置DB2

日期:2017/2/27 9:45:34   编辑:更多Linux
本文首先考察了 DB2 UDB for Linux®、UNIX® 和 Windows® 中的 IBM DB2® Universal Database™ 數據分區功能(Data Partitioning Feature,DPF)在性能和可伸縮性方面的優點。然後,完成在 SUSE Linux Enterprise Server 上安裝和配置具有 DPF 功能的 DB2 的步驟。您還將學習到一些重要的概念和設計方面的考慮,這些將幫助您快速掌握 SUSE Linux Enterprise 環境中 DPF 的安裝。

簡介

當一個數據庫由兩個或更多數據庫分區組成,並且每個數據庫分區存儲位於其中的每個表的一部分表數據時,就屬於數據庫分區的情況。不同分區可以在不同計算機上,也可以在相同的計算機上(即邏輯分區)。在這種類型的數據庫中,數據被根據存儲位置進行散列,以標識哪個數據庫分區將存儲數據。一個數據庫分區由它自己的數據、索引、配置文件和事務邏輯組成。在更舊版本的 DB2 中,數據庫分區被稱作節點(node)或數據庫節點。但是在本文中我們使用術語分區(partition)。邏輯分區共享它們所在的同一台計算機上的資源。

在分區數據庫中,一個表可以分布在一個或多個數據庫分區中。分區背後的思想就是將一個表的數據分布在多個分區中,將該表中的一部分行存儲在一個分區中,而將其他行存儲在其他分區中。數據庫管理器(DBM)通過自動地將 SQL 請求分解成子請求,來處理數據的檢索和更新。然後,這些子請求就在相應的數據庫分區中並行地執行。將表劃分到多個分區的這種行為對於用戶來說是透明的,這意味著雖然數據在物理上是存儲在多個數據庫分區上的,但是訪問起來就像是在一個地方一樣。

圖 1 展示了運行在一台機器上的單個分區,這類似於沒有使用 DPF:

圖 1. 單個機器上的單個分區

接下來的兩個圖展示了 DPF 真正起作用的情況。圖 2 說明了 DPF 被用於三台機器上的情況,其中每台機器上有一個分區。

圖 2. 每台機器上一個分區,使用高速通信

注意這裡使用的高速通信互連,這可以是各機器之間使用的一個 TCPIP 網絡。接下來的 圖 3 展示了同一台機器上的三個分區。這裡,分區間的通信是在內存中實現的,而不是通過一個網絡(在所有 Linux 平台上,默認情況下 DB2 _FORCE_FCM_BP 是啟用的)。

圖 3. 同一台機器上的三個分區,通過內存進行通信

特別要注意,在前面幾個圖中,對稱多處理器(SMP)也可以換成單處理器。但是,在 DPF 環境中 SMP 服務器更為常見。

分區鍵 由表中的一列或多列組成,用於使用戶可以選擇如何對他們的數據進行分區。用戶可以通過使用數據庫分區組和表空間,來確定將表數據分布到哪些數據庫分區上。

用戶交互通過一個數據庫分區,即用於該用戶的協調分區(coordinator partition)來進行。協調分區與應用程序運行在同一個數據庫分區上,或者,對於遠程應用程序,協調分區運行在應用程序所連接的那個數據庫分區上。任何數據庫分區都可以成為協調分區。

QQRead.com 推出數據恢復指南教程 數據恢復指南教程 數據恢復故障解析 常用數據恢復方案 硬盤數據恢復教程 數據保護方法 數據恢復軟件 專業數據恢復服務指南

理解 DB2 Data Partitioning Feature (DPF)

要對一個數據庫進行分區,需要 DB2 的 Database Partitioning Feature (DPF) 功能。這種可選的 Database Partition Feature 許可只對 DB2 Enterprise Server Edition (ESE) 可用,其費用按照分區數據庫中所使用的 CPU 的數量來計算。

何時分區,為何分區

具有 DPF 功能的 DB2 UDB ESE 是管理 OLAP、數據倉庫和數據挖掘工作負載的理想選擇。對於大型 OLTP 工作負載,它也是很好的選擇。最常見的分區環境由每個物理系統上的一個數據庫分區組成,這些物理系統組成數據庫分區集群。每個數據庫分區上的數據庫管理器使用每個系統上的處理器來管理數據庫中屬於該分區的那部分數據。

由於數據被劃分在多個數據庫分區上,因而可以使用多台計算機上的多個處理器的處理能力來滿足對信息的請求。數據檢索和更新請求被自動分解成一些子請求,然後這些子請求在相應的數據庫分區中並行地執行。每多一個服務器,就意味著將有更多的 CPU、內存和更多的磁盤用於分區數據庫。

性能的提升源於這樣的事實:大量的數據被劃分成更小的、更易管理的塊,每個分區/系統可以同時運行。如果要處理提取、轉換和載入操作(ETL),而批處理窗口又比較小,那麼可以考慮使用 DPF。例如,DB2 LOAD 可以在每個分區上同時運行,負載操作可以並行地分攤到多個服務器上。創建索引的性能也將顯著提升。而且,通過使用 DPF,可以顯著縮短備份和恢復時間,因為每台參與分區的機器需要處理的數據量更小了。

在 SUSE Linux Enterprise Server V9 上安裝 DB2 V8.2

下面我們來介紹在 SUSE Server(或多服務器)環境中安裝和運行 DB2 DPF 所需的步驟。

步驟 1. 檢驗其他軟件包

DB2 要求在 Linux 系統上安裝以下包:

Public domain korn shell (pdksh) Remote shell (rsh) 或 open source secure shell (OpenSSH) IBM Java™ 2 Java Run Time Network File Server (nfs)

使用 rpm 命令來檢驗這些包是否已安裝:

rpm -qa grep pdksh rpm -qa grep rsh 或 rpm -qa grep openssh rpm -qa grep IBMjava rpm -qa grep nfs

步驟 2. 檢驗內核參數

在安裝 Linux 之前,請確認目前所推薦的、適合 DB2 的 Linux 版本。鏈接 “http://www.ibm.com/software/data/db2/linux/validate/” 顯示了受支持的 Linux 發行版。確保安裝受推薦、受支持版本的 Linux。

在安裝 DB2 時,需要注意一些內核參數:

表 1. 對 DB2 有影響的內核參數 內核參數 描述 kernel.shmmax 定義系統范圍內允許的最大共享內存段大小,單位為字節 kernel.msgmni 定義在任何時刻系統上允許的最多消息隊列標識符個數 fs.file-max 定義 Linux 內核最多分配的文件句柄個數 kernel.sem 定義信號量限制: 每個數組的最多信號量個數(semmsl) 系統范圍內最多允許的信號量個數(semmns) 每次 semop 調用的最大操作數(semopm) 最多允許的數組個數(semmni)** 信號量提供了進程間的低級同步,使得只有一個進程可以訪問共享段,從而確保共享段的完整性。

在 Kernel 2.4.18 及以後版本中,file-max 參數的默認值是 8192,因此可能不需要修改它。可以使用以下命令來檢查 file-max 值:

cat /proc/sys/fs/file-max

使用 lpcs 命令顯示當前的 Linux 內核設置:

lpcs -l

從 DB2 UDB Version 8.2 以後,DB2 在啟動時將檢查 semmni、msgmni 和 shmmax 參數的值,如果當前值不是最佳的,則更新之。DB2 自動將內核參數設置如下:

semmni 被改為 1024。 msgmni 被改為 1024。 shmmax 被改為 268435456 (32-位) 或 1073741824 (64-位)。

注意,系統范圍內最多信號量個數(semmns)等於:

數組的最多個數 (semmni) * 每個數組的最多信號量個數 (semmsl)

在安裝 DB2 後,還可以通過 db2pd 命令檢驗 semni、msgmni、shmmax 參數:

db2pd -osinfo

在性能調優時,可能還需要調整其他內核參數。手冊上的規程如下:

以具有 root 權限的用戶登錄。 創建一個 /etc/sysctl.conf 文件,如果還沒有該文件的話。 在 /etc/sysctl.conf 文件中添加內核條目。 運行 sysctl -p 從默認文件 /etc/sysctl.conf 裝載 sysctl 設置。 添加 sysctl -p 到一個系統初始化文件中,以便在每次重新啟動時設置內核參數。

步驟 3. 檢驗網絡

文件 /etc/hosts 包含指定給主機名的地址(包括一個 IP 地址、全限定主機名和主機名)。為了得到最佳性能,應確保所有參與的服務器在 /etc/hosts 文件中都有定義。

步驟 4. 啟用遠程 shell 實用程序

對於數據分區環境,DB2 需要一個遠程 shell 實用程序來在遠程分區上執行命令。在 DB2 UDB V8.2.2 之前,rsh 實用程序被默認用作遠程 shell 機制,用於分區之間的通信。為了強認證和安全網絡通信的需要,DB2 UDB V8.2.2 現在允許在一個名為 DB2RSHCMD 的注冊表 profile 變量中指定遠程 shell 實用程序的完整路徑,從而增加了對備用遠程 shell 實用程序的支持。

OpenSSH (Open Source Secure Shell) 用於代替 rsh 實用程序,以便在不安全的通道上提供有安全保障的通信。OpenSSH 支持兩種類型的加密,即基於主機的認證和公鑰認證。關於在 DB2 中使用 OpenSSH 的詳細信息,請參考標題為 “配置 DB2 Universal Database for UNIX 以使用 OpenSSH” 的技術文章,這篇文章解釋了如何在 DB2 中啟用 OpenSSH。

為支持一個受安全保障的環境,在數據庫分區環境中,應該使用 OpenSSH,而不是 rsh。如果選擇啟用 rsh 服務,那麼只需去掉 /etc/inetd.conf 文件中與 in.rshd 服務對應的 "#" 字符。為了重新啟動 inetd 服務器,可以輸入:

/etc/init.d/inetd restart

步驟 5. 設置 Network File System (NFS)

對於一個數據分區配置,必須有一個可供所有參與分區數據庫系統的機器使用的文件系統。這個文件系統將用於 DB2 實例的 home 目錄。容納 DB2 實例的機器稱作 instance-owning 機器。為了共享該文件系統,必須配置 Network File System。對於 Linux,可以通過發出以下命令來檢驗 NFS 服務器是否正在運行:

showmount -e hostname

該命令顯示在一個 NFS 服務器中定義的文件系統的一個列表。如果 NFS 不在運行,那麼將收到以下消息:

showmount: hostname: RPC: Program not registered

可以通過選擇 Misc 和 Installation Server 來使用 YaST 配置 NFS。注意,應該以 root ID 登錄。

圖 4. YaST Installation Server:選擇服務器類型

在 instance-owning 機器上設置 NFS 服務器

您需要導出 instance-owner 目錄,該目錄將被其他數據庫分區服務器共享。

創建 instance-owner 目錄,確保該目錄被掛載。使用如下命令: mkdir /db2home mount /db2home 修改 /etc/fstab 中的文件系統表(fstab),使之包括新的文件系統,以便在啟動時掛載新的文件系統。條目格式如下:

<device> <mountpoint> <filesystemtype> <options> <dump> <fsckorder>

您的條目看上去可能類似於:

清單 1. 示例 instance-owning /etc/fstab 清單

/dev/had7 /db2home ext3 defaults 1 2

該條目使用一個 ext3 文件系統,這種文件系統在 2.4.16 版或更高版本的 Linux 內核中均受支持,文件系統檢查(fsck)程序的順序被設為 2。

設置好 instance-owning 文件系統後,通過在 /etc/eXPorts 文件中添加以下條目,可以在啟動時通過一個 NFS 服務導出這個文件系統:

清單 2. 示例 /etc/exports 清單

db2home InstanceOwnerServer (rw,sync,no_root_squash) db1(rw,sync,no_root_squash)

其中 InstanceOwnerServer 是 instance-owner 服務器的名稱,db1 是另一個數據庫服務器的名稱。

表 2 中列出了導出文件選項:

表 2. 導出文件選項 選項 描述 rw 使用讀寫權限來導出文件系統 sync 服務器必須等文件被寫入到磁盤後才能開始下一次讀操作 no_root_squash 使 root 權限有效 執行 exportfs 命令,使將掛載的 NFS 客戶機能使用 instance-owner 目錄

/usr/sbin/exportfs -a

其中選項 a 用於導出 /etc/exports 文件中列出的所有目錄。

設置參與機器上的 NFS 客戶機

instance-owner 目錄可用之後,便可以將該目錄導入其他數據庫分區服務器。

用以下命令在其他服務器中創建共享目錄:

mkdir /db2home

添加一個條目到 /etc/fstab 文件,使 NFS 在啟動時自動掛載文件系統:

清單 3. 參與機器的 /etc/fstab 示例

server1:/db2home /db2home nfs rw,timeo=300,retrans=5,hard,intr,bg,suid

其中 server1 是 instance-owner 服務器名稱,下表列出了其他一些選項:

表 3. NFS 掛載選項 選項 描述 rw 使用讀寫權限來導出文件系統。 timeo 這個值的單位是十分之一秒,表示 RPC 超時後進行第一次重傳之前所需等待的時間。默認值是7/10。 retrans 在重大操作被中止或者控制台上顯示 “server not responding” 消息之前必須重傳的次數。 hard 如果NFS文件操作超時較多,則在控制台上報告“server not responding”,並一直重新嘗試。這是默認情況 intr 如果 NFS 文件操作超時較多,並且是硬(hard)掛載,那麼允許由信號中斷文件操作,使操作中斷。 bg 如果第一次 NFS 掛載嘗試超時,則在後台重試掛載。 suid 這個值允許 set-user-identifier 位 (SUID) 或 set group-identifier 位 (SGID) 生效。 用以下命令在其他數據庫分區服務器上掛載導出的文件系統:

mount server1:/db2home /db2home

檢驗 NFS 鎖監控程序

DB2 需要一個 NFS 鎖監控程序來在集群中所有參與機器之間共享 instance-owner 目錄。可以通過使用 chkconfig 命令來檢驗 NFS 鎖監控程序是否已啟用:

chkconfig nfslock

可以通過以下命令啟用 NFS 鎖監控程序和重新啟動 nfslock:

chkconfig nfslock on /etc/rc.d/nfslock restart

檢驗 NFS 鎖和 NSM (Network Status Monitor) 服務

NSM 服務 rpc.statd 實現了一個重啟通知服務,NFS 文件鎖服務(rpc.lockd)將用到這個服務。可以使用以下命令檢驗這些服務的狀態:

ps -ef grep rpc.statd ps -ef grep rps.lockd

步驟 6. 創建所需的組和用戶

在數據庫分區環境中,需要為 DB2 創建三個組和用戶 ID,如下表所示:

表 4. 所需的 DB2 組和用戶 用戶 ID 組 ID 描述 db2inst1 db2iadm1 DB2 實例用戶 ID 和組 ID db2fenc1 db2fadm1 DB2 fenced 用戶 ID 和組 ID dasusr1 dasadm1 DB2 Administration Server 用戶 ID 和組 ID

在所有參與機器上的 DB2 instance owner ID 和密碼應該是一致的,而且,它的 home 目錄應該在 NFS 共享目錄中。fenced ID 應該配置為與 DB2 instance owner ID 相同。DAS 用戶 ID 和密碼在所有參與機器上可以各不相同;但是,為了簡化配置和維護,可能需要使 DAS 用戶 ID 和密碼一致。

例如,您可以用以下命令在所有機器上創建 DB2 組,創建 DB2 用戶 ID 以及設置初始密碼:

groupadd -g 999 db2iadm1 groupadd -g 998 db2fadm1 groupadd -g 997 dasadm1 useradd -u 1100 -g db2iadm1 -m -d /db2home/db2inst1 db2inst1 -p passWord1 useradd -u 1101 -g db2fadm1 -m -d /db2home/db22fenc1 db2fenc1 -p password2 useradd -u 1102 -g dasadm1 -m -d /home/dasadm1 dasusr1 -p password3 passwd db2inst1 passwd db2fenc1 passwd dasusr1

步驟 7. 在 instance-owning 機器和所有參與機器上安裝 DB2 UDB

可以使用 db2_install 腳本通過 RPM 安裝實用程序在 Linux 系統上安裝所有的 DB2 ESE 包。您可以使用該腳本首先在 instance-owning 機器上安裝 DB2,然後在參與機器上安裝 DB2。

由於必須在每個參與機器上安裝 DB2,所以最好將安裝代碼放在一個共享的盤(例如在我們這個例子中是 /db2home)上。也可以將您的設置記錄到一個響應文件中,然後使用該文件來配置其他的機器。

首先,為了安裝 DB2,必須以 root 用戶登錄:

輸入 db2_install 命令啟動 db2_install 腳本,該腳本存放在 CD-ROM 的根目錄下。 當 db2_install 提示輸入產品關鍵字時,輸入 DB2.ESE。

步驟 8. instance-owning 機器的配置

這台機器將被視作 instance-owning 機器,因為它存儲和共享 instance owner 的 home 目錄。sqllib 目錄正是位於這個目錄中,此外在此目錄中的還有 Database Manager Configuration 文件 (DBM CFG)、Instance Profile Registry、Node 目錄和 System Database 目錄。由於這些文件是共享的,所以對任何一個文件的更新在所有參與機器上都可以看到。為了配置 instance-owning 機器,需要執行以下步驟:

創建一個 DB2 實例

您應該使用 DB2 instance owner ID 登錄到系統,然後在 /opt/IBM/db2/V8.2/instance 下執行 db2icrt 創建一個供所有機器共享的 DB2 實例:

cd /opt/IBM/db2/V8.1/instance ./db2icrt -u db2fenc1 db2inst1

其中 -u 指定 fenced ID。

需要注意的是,一個 DPF Instance 實際上存在於每個參與機器上,它們都使用相同的實例名、密碼和共享 home 目錄。當使用 DPF 時,被分區的是數據庫,而不是實例。

啟用 FCM

所有參與機器必須通過一個通信設施互連,例如一個高速 TCPIP 網絡。Fast Communications Manager (FCM) 被設計用來處理數據庫分區服務器之間的通信。為了啟用 FCM,在所有參與機器上的 /etc/services 文件中必須預留一個端口范圍。DB2 提供在 /etc/services 文件中已經被預留的一個默認的端口范圍;默認情況下,DB2 會修改 /etc/services 文件,以便將端口 60000-60003 用於分區之間的通信,端口 50000 用於應用程序通信。DB2 在創建實例時會為此預留一些端口。每個邏輯分區需要一個端口,並且每台機器需要預留相同的端口。每個條目包含一個端口名和端口號。

除了基本的配置外,FCM 端口看上去應該如下所示:

清單 4. /etc/services 中的 FCM 端口

DB2c_db2inst1 50000/tcp #Add FCM port information # DB2_db2inst1 60000/tcp DB2_db2inst1_1 60001/tcp DB2_db2inst1_2 60002/tcp DB2_db2inst1_END 60003/tcp

從 清單 4 中可以看出,端口名是由實例名加上前綴 "DB2_" 得到的。最後一個端口名由實例名加上前綴 "DB2_" 和後綴 "_END" 得到。第一個端口名與最後一個端口名之間的端口名以 "_<序列號>" 為後綴。 端口號後面必須跟上 "/tcp"。

更新 DB2 實例參數

使用 instance owner ID 登錄到機器,並指定 DB2 將使用哪些協議。為了初始化協議,需要使用以下命令更新 DB2COMM profile 注冊表變量:

db2set DB2COMM=TCPIP

此外,需要在數據庫管理器(DBM)配置參數中更新服務名,以指示哪些端口名將用於與 DB2 服務器和遠程客戶機的通信。這可以通過使用以下命令來完成:

db2 update dbm cfg using SVCENAME db2c_db2inst1

創建 DB2 Administration Server (DAS)

如果要使用諸如 Configuration Assistant、Control Center、Replication Center 或 Development Centermust 之類的 GUI 工具,則必須讓 DAS 處於運行狀態。您可以作為 DAS 用戶登錄,然後使用以下命令創建一個 DAS 服務器:

cd /opt/IBM/db2/V8.1/instance ./dascrt -u dasusr1

其中選項 -u 指定 DAS 的用戶 ID。

可以用 DAS 管理用戶 ID 登錄,並執行命令 db2admin start 來啟動 DAS 服務器。若要自動啟動 DAS 服務器,則需要使用 DAS 管理用戶 ID 並執行以下命令:

cd /opt/IBM/db2/V8.1/instance ./dasauto -on

為了顯示 autostart 狀態,可以執行:

./dasauto ?

更新 db2nodes.cfg 文件

最後,需要更新 $HOME/sqllib/db2nodes.cfg 文件。db2nodes.cfg 文件包含配置信息,告訴 DB2 哪個服務器上的哪個分區參與了該實例。該文件有四列:

數據庫分區號 服務器主機名 邏輯端口號 用於分區之間通信的網絡接口(可選)

每個條目表示一個特定服務器上的一個數據庫分區,該分區參與了該實例的數據庫分區。例如,下面的 db2nodes.cfg 文件定義了四個數據分區。數據分區 0 和 1 在 server1 上,數據分區 2 和 3 在 server2 上。每個服務器有兩個邏輯端口(每個邏輯分區對應一個),即端口 0 和 1。

清單 5. 示例 db2nodes.cfg

0 server1 0 1 server1 1 2 server2 0 3 server2 1 更新 .rhosts 文件以允許遠程命令

為了允許執行遠程命令,每個數據庫分區必須有在所有其他參與服務器上執行遠程命令的權限。因此,必須在 /db2home/db2inst1/.rhosts 文件中為每個服務器提供一個條目。.rhosts 文件應該有兩列,分別為主機名和 instance owner ID。例如, .rhosts 文件中的下列條目表示參與一個實例的兩個服務器。

清單 6. 示例 .rhosts

server1 db2inst1 server2 db2inst1

應該使用以下命令來確保只有 root 擁有讀和寫的訪問權:

chmod 600 /db2home/db2inst1/.rhosts

QQread.com 推出各大專業服務器評測 Linux服務器的安全性能 SUN服務器 HP服務器 DELL服務器 IBM服務器 聯想服務器 浪潮服務器 曙光服務器 同方服務器 華碩服務器 寶德服務器

步驟 9. 參與機器上的配置

為了配置參與機器,需要執行以下步驟:

啟用 FCM

必須作為 root 用戶登錄到每台參與機器上,並將用於 FCM 定義的相同的端口名和端口號添加到 /etc/services 文件中。

創建 DB2 Administration Server

必須在所有參與機器上安裝 DAS。關於詳細信息,請參考在配置 instance-owning 機器時創建 DB2 Administration Server 的方法。

步驟 10. 檢驗

完成所有更新後,可能需要重新啟動服務器,並在所有參與服務器上執行命令 db2_all date 來確保成功完成。

重要概念

下面是關於具有 DPF 功能的 DB2 的一些重要的概念,您應該清楚這些概念。

編目分區

DB2 編目是由數據庫管理器維護的一組表和視圖。這些表和視圖包含元數據,也就是關於數據庫和它的對象的信息,例如對表、視圖和索引的描述和關於用戶在這些對象上所擁有的權限的安全信息。

編目分區是存放數據庫編目表的數據庫分區。在分區數據庫環境中,每個數據庫可以在一個不同的數據庫分區服務器上有它的編目分區。數據庫的編目分區是在運行 CREATE DATABASE 命令的數據庫分區服務器上自動創建的。

協調分區

用戶與分區數據庫的交互是通過一個數據庫分區,即用於那個用戶的協調分區創建的。協調分區與應用程序運行在同一個數據庫分區上,或者,對於遠程應用程序,協調分區運行在應用程序所連接的那個數據庫分區上。任何數據庫分區都可以用作協調節點,或者被變成協調節點。

協調分區之所以被這樣稱呼,是因為運行在它上面的、與應用程序通信的協調代理。您可以控制將哪個分區用作協調分區。例如,為了連接到分區 3,可以發出:

set client connect_dbpartitionnum 3 connect to SAMPLE

數據庫分區組

數據庫分區組是由一個或多個數據庫分區組成的一個組。在為數據庫創建表之前,首先創建用於存儲表空間的數據庫分區組,然後創建用於存儲表的表空間。

可以在一個數據庫中定義包含一個或多個數據庫分區的有名稱的子集。每個子集稱作一個數據庫分區組。每個包含不止一個數據庫分區的子集稱作多分區數據庫分區組。多分區數據庫分區組只能用屬於相同實例的數據庫分區來定義。一個數據庫分區可以屬於不止一個分區組。

例如,圖 5 展示了一個由 5 個分區組成的數據庫分區組:

圖 5. 3 個示例數據庫分區組

在這種情況下,Database Partition Group 1 橫跨除一個數據庫分區外的所有數據庫分區。它還包含一個名為 'Database Partition Group 2' 的單分區數據庫分區組。另外,'Database Partition Group 3' 也與 Database Partition Group 1 共享了一個數據庫分區。

可以用 CREATE DATABASE PARTITION GROUP 語句創建新的數據庫分區,用 ALTER DATABASE PARTITION GROUP 語句修改數據庫分區。

數據被劃分到一個數據庫分區組中的所有分區上,可以為數據庫分區組添加一個或多個數據庫分區,或者從中去掉數據庫分區。屬於數據庫系統配置一部分的每個數據庫分區都必須在一個名為 db2nodes.cfg 的分區配置文件中定義。一個數據庫分區組最多可以包含為數據庫系統定義的所有數據庫分區。

當創建或修改一個數據庫分區組時,就會有一個與之關聯的分區映射。數據庫管理器可以通過將分區映射與分區鍵和散列算法相結合,來確定數據庫分區組中的哪些數據庫分區將存儲給定的數據行。在一個非分區數據庫中,不需要分區鍵或分區映射。過一會兒我們將詳細討論這些概念。

一個數據庫分區是數據庫的一部分,其中具有用戶數據、索引、配置文件和事務日志。有一些默認的數據庫分區組是在數據庫創建時被創建的:

IBMCATGROUP - 用於包含系統編目的表空間的默認數據庫分區組。 IBMTEMPGROUP - 用於系統臨時表空間的默認數據庫分區組。 IBMDEFAULTGROUP - 用於包含用戶表的表空間的默認數據庫分區組。

用於已聲明的臨時表的用戶臨時表空間可以在 IBMDEFAULTGROUP 或任何用戶創建的數據庫分區組中創建,但不能在 IBMTEMPGROUP 中創建。

為了創建一個新的由 db2nodes.cfg 中所有分區組成的分區組,可以發出以下命令:

create database partition group ALLPART on all dbpartitionnums

如果您想創建一個新的分區組,且這個分區組只包含分區 1 和 2,可以發出如下命令:

create database partition group PART12 on dbpartitionnums (1,2)

分區兼容性

可對分區鍵的對應列的基本數據類型進行比較,並可將它們聲明為是分區兼容的(partition compatible)。分區兼容的數據類型具有如下屬性:具有相同值但有不同類型的兩個變量會按相同的分區算法映射至同一個分區號。 分區兼容性具有下列特征:

基本數據類型與另一個相同的基本數據類型兼容。 內部格式用於 DATE、TIME 和 TIMESTAMP 數據類型。它們彼此都不兼容,且都不與 CHAR 兼容。 分區兼容性不受帶有 NOT NULL 或 FOR BIT DATA 定義的列的影響。 對兼容數據類型的 NULL 值的處理是完全相同的;對不兼容數據類型的 NULL 值的處理可能不相同。 用戶定義的類型的基本數據類型用於分析分區兼容性。 對分區鍵中相同值的小數的處理是完全相同的,即使它們的標度和精度不同。 字符串中(CHAR、VARCHAR GRAPHIC 或 VARGRAPHIC)的尾部空格會被散列算法忽略。 BIGINT、SMALLINT 和 INTEGER 是兼容的數據類型。 REAL 和 FLOAT 是兼容的數據類型。 不同長度的 CHAR 和 VARCHAR 是兼容的數據類型。 GRAPHIC 和 VARGRAPHIC 是兼容的數據類型。 分區兼容性不適用於 LONG VARCHAR、LONG VARGRAPHIC、CLOB、DBCLOB 和 BLOB 數據類型,因為它們不能作為分區鍵。

並置

並置(collocation)是安置同一個數據庫分區中包含相關數據的不同表中的行。並置的表使 DB2 可以更有效地使用連接策略。

您可能會發現,作為對特定查詢的響應,兩個或多個表頻繁地提供數據。在此情況下,您會希望這樣的表中的相關數據的位置盡可能地靠近。在數據庫被物理地劃分為兩個或多個數據庫分區的環境中,必須有一種方法可將劃分的表的相關碎片盡可能地靠近。完成此過程的功能稱為表並置。

當存取用於連接或子查詢的多個表時,DB2(R) 通用數據庫(DB2 UDB)能夠識別要連接的數據是否位於相同數據庫分區上。於是 DB2 就可以在存儲數據的數據庫分區上執行連接或子查詢,而不必在數據庫分區之間移動數據。這種局部地執行連接或子查詢的能力具有顯著的性能優點。

要發生並置,表必須:

在相同數據庫分區組中,且這個數據庫分區組不能處在再分配期間。(在再分配期間,數據庫分區組中的表可能使用不同的分區映射 —— 它們不是並置的。) 有包含相同數量的列的分區鍵。 分區鍵的相應列是分區兼容的。

如果一個表在一個單分區數據庫分區組中,且該分區組是在另一個表所在的同一個分區上定義的,那麼也可以發生並置。

緩沖池

緩沖池是處理期間用於存放數據頁和從中讀取、修改數據頁的一個內存區域。默認情況下,當創建一個緩沖池時,在每個分區上都會創建這樣的緩沖池。為了容易管理,通常最好的做法是使每個分區上的緩沖池大小一致。但是,也可以改變特定分區上的緩沖池大小。例如,若要將分區 4 的 'BUF8K' 緩沖池改為 400MB,可以發出命令:

alter bufferpool BUF8K dbpartitionnum 4 size 51200

還可以通過指定一個數據庫分區組來選擇在哪幾個分區上創建緩沖池,在此情況下,只有在數據庫分區組中的那些分區上才會創建緩沖池。

表空間

表空間是存儲數據庫對象的容器集合的抽象。表空間在數據庫與存儲在數據庫中的表之間提供了一個間接層。對於每個表空間,在存儲設備上都有一個空間與之對應。一個表中的數據、索引、long 字段和 LOB 部分可以存儲在相同的表空間中,也可以分別放到不同的表空間中,以提高性能。

數據庫分區表達式

當定義一個橫跨同一台機器上多個邏輯數據庫分區的表空間的容器時,為了避免一個以上的邏輯分區具有相同的路徑/設備名稱,通常使用數據庫分區表達式(Database Partition Expression)。通過使用數據庫分區號作為容器名稱的一部分,可以確保容器名稱在各分區當中是惟一的。這可以作為手動地為每個分區指定位置的替代方法。

可以使用參數 " $N" ([blank]$N) 來表示一個數據庫分區表達式,它可以用在容器名稱的任何地方,而且可以指定多個數據庫分區表達式。數據庫分區表達式以一個空格字符結束;數據庫分區表達式計算完畢後,空格後的內容附在容器名稱的後面。 如果容器名稱中在數據庫分區表達式後面沒有空格字符,則認為剩下的字符串是表達式的一部分。

參數的使用只能以如下一種格式出現(在這個例子中,假設分區號是 5):

表 5. 常見數據庫分區表達式 語法 例子 值 [blank]$N " $N" 5 [blank]$N+[number] " $N+1011" 1016 [blank]$N%[number] " $N%3" (% 是模塊) 2 [blank]$N+[number]%[number] " $N+12%13" 4 [blank]$N%[number]+[number] " $N%3+20" 22

如果使用類似於上面的字符串,並且分區號仍然是 5,那麼將看到:

表 6. 數據庫分區表達式的使用 例子 容器名稱 '/dbdir/node $N /cont1' '/dbdir/node5/cont1' '/ $N+1000 /file1' '/1005/file1' ' $N%10 /container' '5/container' '/dir/ $N%5+2000 /dmscont' '/dir/2000/dmscont'

如果在一個由兩個分區組成的數據庫上發出以下語句:

CREATE TABLESPACE TBSP1 MANAGED BY DATABASE USING (device '/dev/container $N' 10000)

那麼將看到下列容器被創建:

/dev/container0 - on DATABASE PARTITION 0 /dev/container1 - on DATABASE PARTITION 1

QQread.com 推出各大專業服務器評測 Linux服務器的安全性能 SUN服務器 HP服務器 DELL服務器 IBM服務器 聯想服務器 浪潮服務器 曙光服務器 同方服務器 華碩服務器 寶德服務器

分區鍵

分區鍵是用於確定特定一行數據存儲在哪個分區的一個列(或一組列)。

分區鍵是在一個表上用 CREATE TABLE 語句定義的。如果沒有提供分區鍵,則默認地從主鍵的第一個列創建分區鍵。如果沒有主鍵,則默認的分區鍵是表上第一個非 long/非 LOB 型的列。如果沒有列能滿足作為默認分區鍵的條件,則表在創建後就沒有分區鍵,也就意味著這個表不能橫跨一個以上的分區。

在選擇分區鍵時,應該注意以下幾點:

表是如何被訪問的。 查詢工作負載的性質。 數據庫系統所采用的連接策略。

如果不需要特別考慮並置,那麼能使數據均勻地散布在數據庫分區組中所有數據庫分區上的分區鍵就是好的分區鍵。在與一個數據庫分區組相關聯的表空間中,每個表的分區鍵可以確定表是否是並置的。

不恰當的分區鍵可能導致數據分布不均勻。具有分布不均勻的數據的列和具有少量 distinct 值的列都不應該被選作分區鍵。distinct 值的數量必須多到足以確保數據行均勻地分布在數據庫分區組中的所有數據庫分區上。應用分區散列算法的代價與分區鍵的規模成比例。分區鍵不能多於 16 個列,列數越少導致的性能就越好。分區鍵中不應該包括不必要的列。

在定義分區鍵時,應考慮以下幾點:

只包含 long 數據類型(LONG VARCHAR、 LONG VARGRAPHIC、BLOB、CLOB 或 DBCLOB)的多分區的表的創建是不受支持的。 分區鍵的定義不能修改。 分區鍵應該包括最頻繁參與連接的列。 分區鍵應該由經常出現在 GROUP 子句中的列組成。 任何惟一鍵或主鍵都必須包含分區鍵中的所有列。 在在線事務處理(OLTP)環境中,分區鍵中的所有列出現在事務中時應該使用等號(=)加常量或主機變量。例如,假設在事務中經常用到雇員號 emp_no:

UPDATE emp_table SET ... WHERE emp_no = host-variable

在此情況下,EMP_NO 列可以作為 EMP_TABLE 的由單列組成的分區鍵。

散列分區是用於確定每一行在分區表中的位置的方法。該方法工作原理如下:

散列算法應用於分區鍵的值,產生 0 到 4095 之間的一個分區號。 當創建數據庫分區組時,同時會創建分區映射。每個分區號按循環的方式順序地填充分區映射。 分區號用作分區映射的索引。分區映射中的號碼就是表所在的數據庫分區的分區號。

分區映射

在分區數據庫環境中,數據庫管理器必須有方法知道表的哪些行存儲在哪個數據庫分區上,以便發現它需要的數據。數據庫管理器使用一個稱作分區映射的映射來發現數據。

分區映射是內部生成的數組,對於多分區的數據庫分區組,這個數組包含 4,096 個條目,對於單分區的數據庫分區組,這個數組只包含一個條目。

對於單分區的數據庫分區組,分區映射只有一個條目,其中包含數據庫表中所有的行所在的數據庫分區的分區號。對於多分區數據庫分區組,數據庫分區組中的分區號是以循環的方式指定的。就像城市地圖按網格分成一些區一樣,數據庫管理器使用分區鍵來確定數據所存儲在的位置(數據庫分區)。

例如,假設您在 5 個數據庫分區(分區號為 0-4)上有一個數據庫。那麼,這個數據庫的 IBMDEFAULTGROUP 數據庫分區組的分區映射為:

0 1 2 3 4 0 1 2 3 4 0 1 2...

如果在使用數據庫分區 1 和 2 的數據庫中創建了一個數據庫分區組,那麼這個數據庫分區組的分區映射為:

1 2 1 2 1 2 1 2...

如果數據庫中所裝載的表的分區鍵是 1 到 500,000 之間的整數,則分區鍵被散列到 0 到 4 095 之間的一個分區號。這個號碼將用於作為分區映射的一個索引,以選擇那一行所在的數據庫分區。

分區映射是在分區數據庫中控制數據存儲位置的一種靈活的方式。另外還有一種再分配(redistribution)實用程序,通過它可以改變數據在數據庫中的數據庫分區上的分布(使之平衡或偏斜),不過這超出了本文的范圍。

DB2NODE 環境變量

DB2NODE 環境變量用於指定想要連接到的目標邏輯分區。如果沒有設置該變量,那麼它將默認地等於用機器上的端口 0 定義的那個分區(在 db2nodes.cfg 文件中)。

如果要連接到邏輯分區 2,那麼可以輸入以下命令:

DB2NODE=2 export DB2NODE db2 terminate

為了確保更改生效,必須用 terminate 命令。

為了識別當前活動邏輯節點,可以發出以下命令:

db2 "values (current dbpartitionnum)"

發出橫跨多個機器和分區的命令

這兩個工具使跨所有機器或所有分區執行命令變得容易。兩個工具使用相同的一組有用的選項,這些選項可以在 DB2 Command Window 中通過 "rah ?" 或 "db2_all ?" 命令顯示出來。

db2_all

db2_all 用於在所有指定的分區上運行命令。

db2_all ";db2 update db cfg for SAMPLE using NEWLOGPATH /db2_db/logs"

分號用於作為一個前綴,表明該命令將在各分區上並發地運行。

rah

rah 用於在組成分區環境的所有機器上運行一個命令。

QQread.com 推出各大專業服務器評測 Linux服務器的安全性能 SUN服務器 HP服務器 DELL服務器 IBM服務器 聯想服務器 浪潮服務器 曙光服務器 同方服務器 華碩服務器 寶德服務器

數據庫備份

當執行離線數據庫備份時,需要單獨備份編目分區。但是,在線備份時就不需要這樣,因為日志是包括在備份鏡像中的。例如,我們有一個名為 sample 的數據庫和一個 /dev/backup 目錄,從所有分區那裡都可以訪問這個目錄。

首先需要備份位於分區 0 上的編目分區,這裡只需指定 "<<+0<"" (在這個例子中)

db2_all '<<+0< db2 BACKUP DATABASE sample TO /dev/backup'

接著備份其他分區(除了分區 0),方法是指定 "<<-0<":

db2_all '<<-0< db2 BACKUP DATABASE sample TO /dev/backup'

注意,前綴 "" 將導致依次運行 BACKUP 命令。現在,在 /dev/backup 目錄中可以找到每個分區的備份鏡像。

表中行的分布

DBPARTITIONNUM 函數可用於確定一個行所在的分區。例如,如果用在一個 SELECT 子句中,那麼該函數將返回表中組成 SELECT 語句結果的每一行的分區號。

該函數的參數必須是一個表中某一列的全限定或非限定列名。結果的數據類型是 INTEGER,並且不會為 null。由於只返回行這一級的信息,所以不管指定表的哪一列,結果總是相同的。如果沒有 db2nodes.cfg 文件,則結果為 0。

例如:

select lastname, dbpartitionnum(lastname) as part_num from employee order by 1

清單 7. 使用 dbpartitionnum 函數的結果集

LASTNAME PART_NUM --------------- ----------- ADAMSON 0 BROWN 2 GEYER 1 GOUNOT 1 HAAS 1 HENDERSON 0 JEFFERSON 1 JOHNSON 1 JONES 3

節點和數據庫目錄

節點(node)目錄包含在建立從客戶機工作站到所有合適的數據庫服務器的通信時所需的信息。

數據庫(database)目錄包含客戶機所連接到的所有數據庫的數據庫訪問信息。

設計上的考慮

DB2 Design Advisor 是獲得有效的分區建議的最直接的工具,可以通過 Control Center GUI 或 db2advis 命令行工具來使用它。通過一個可更新的分區映射,結合一個散列算法,可以指定分區鍵與數據庫分區的映射,這個映射可用於確定每個數據行的位置和檢索。

於是,對於大型的表,工作負載可以分布在多個分區上,而更小的表也可以存儲在一個或多個數據庫分區上。由於每個數據庫分區都有它的數據上的本地索引,因此提高了本地數據訪問的性能。

DB2 還支持部分分塊(de-clustering),在此情況下,表和表空間可以分布在可用分區的一個子集上。取決於數據庫分區的數量,您可以有一個或多個單分區的數據庫分區組,以及一個或多個多分區的數據庫分區組。每個分區必須使用一個惟一的分區號,而同一個數據庫分區可以屬於一個或多個數據庫分區組中。

為了確保包含系統編目表的分區能夠快速恢復,應避免將用戶表也放在那個數據庫分區上。為此,可以將用戶表放在不包括 IBMCATGROUP 數據庫分區組中的數據庫分區的數據庫分區組中。

除非想要利用與更大的表的並置,否則應該將小型的表放在單分區的數據庫分區組中。應避免使中等規模的表橫跨太多的數據庫分區。例如,對於一個 100 MB 的表,將它放在包含 16 個分區的數據庫分區組上可能比將它放在包含 32 個分區的數據庫分區組上得到的性能要好。

您可以使用數據庫分區組來將在線事務處理(OLTP)表與決策支持(DSS)表隔離開來,以確保 OLTP 事務的性能不受負面影響。

在多分區數據庫分區組中,如果索引是分區鍵的超集,那麼只能創建一個惟一的索引。

在創建數據庫時,應確保在用於數據庫位置的 "ON" 子句中指定一個本地(非共享)目錄。例如,

CREATE DATABASE SAMPLE ON /db2_db

其中 /db2_db is 是一個預先存在的本地目錄。

在默認情況下,數據庫管理器配置中的默認數據庫路徑(DBTDBPATH)參數是 instance owner(被 NFS 共享)的 home 目錄的位置。如果在不指定數據庫位置的情況下創建數據庫,那麼將使用 DBTDBPATH 創建數據庫,這裡 DBTDBPATH 指向共享的 instance-owner 目錄。這樣將降低性能。

創建數據庫之後,應該確保每個數據分區還有它自己的日志本地目錄。您可以使用以下命令:

db2_all ";db2 update db cfg for SAMPLE using NEWLOGPATH /db2_db/logs"

節點號被自動附加在路徑的後面。這樣做是為了維護多邏輯節點配置中路徑的惟一性。

結束語

本文講解了在 DB2 UDB 中使用 Data Partitioning Feature (DPF) 的理論基礎,詳細解釋了 DPF 的安裝過程和一些重要概念,並且談到在 SUSE Linux Enterprise 環境中啟用 DPF 時在設計上的一些考慮。更好地理解了 SUSE Linux 環境中的 DB2 DPF 之後,就可以很快地掌握如何在 SUSE Linux 環境中啟用 DPF。

原文鏈接:http://www-128.ibm.com/developerworks/cn/db2/library/techarticles/dm-0601poon/index.Html




Copyright © Linux教程網 All Rights Reserved