DB2 表空間類型
在介紹如何將數據庫管理表空間轉換為自動存儲表空間之前,我們先來回顧一下 DB2 表空間的各種類型以及各自的特點。
系統管理表空間 (System-Managed Space,SMS):這種類型的表空間由操作系統的文件管理系統分配和管理空間。在 DB2 V9 之前,SMS 表空間是默認選項,如果不帶任何選項創建數據庫或表空間,數據庫管理器會自動將表空間建成系統管理表空間。創建 SMS 時,可以指定多個路徑做為表空間的容器,空間的大小隨數據量的變化由數據庫管理器自動調整。這種類型的表空間比較便於管理,但空間大小受到一定限制,性能在大多數情況下不如數據庫管理表空間。
數據庫管理的空間 (Database-Managed Space,DMS):這種表空間由 DB2 數據庫管理器負責管理存儲空間。表空間容器可使用文件系統或裸設備。在定義 DMS 表空間時,可以指定多個文件名以及每個文件的大小,數據庫管理器建立並使用這些文件作為表空間容器。表空間大小在創建時確定,空間不夠時要手工添加容器,對於以文件作為容器的表空間可以指定 AUTORESIZE,從而在容器空間不夠時由數據庫管理器自動增加容器大小。這種表空間性能比較好,但需要在維護容器方面花費一些工作量。DMS 在需要經常關注和調整底層容器分配的場合有很大的靈活性。
自動存儲表空間 (Automatic Storage Spaces):自動存儲看起來是一種不同類型的表空間,但實際上是 DMS 和 SMS 的擴展。因為數據庫管理的空間 DMS 需要比較多的維護,在 DB2 V8.2.2 中引入了 DMS 自動存儲,以簡化表空間管理。這種類型的表空間既保持了 DMS 的高性能又具有 SMS 表空間易於管理的特點,可以大大簡化 DBA 的管理工作。自動存儲需要首先在數據庫級別啟用,在 DB2 V9 以后,自動存儲已經成為了 DB2 的默認設置,在建立數據庫時,DBA 可以提供一組路徑,在建立表空間時,數據庫管理器會在這些提供的路徑中建立需要的容器,容器的大小根據情況由數據庫管理器負責分配和管理。相比 DMS 而言,自動存儲表空間在容器管理方面十分簡便,可以滿足大多數表空間的使用需求。
讓數據庫支持自動存儲
使用自動存儲表空間的前提條件是要求數據庫需要支持自動存儲,在 DB2 9.7 以前,如果建立數據庫時沒有啟用自動存儲支持,那么除了重建數據庫以外,沒有別的辦法可以再讓數據庫支持自動存儲了。在 DB2 9.7 我們直接使用 ALTER DATABASE 命令就可以使數據庫支持自動存儲。
清單 1. 讓數據庫支持自動存儲
ALTER DATABASE < 數據庫名 > ADD STORAGE ON < 路徑 1>[,< 路徑 2>,...,< 路徑 n>] 例如: db2 "alter database testdb add storage on '/db2/db6test/path1', '/db2/db6test/path2'"
我們從上述命令中可以看出,通過給數據庫增加存儲路徑就可以使數據庫支持自動存儲。我們需要注意:
- 我們不能刪除全部存儲路徑,因而也就意味着自動存儲一旦啟用就不能停止,如果我們試圖這樣做會出現 SQLSTATE 428HH 錯誤;
- 在增加存儲路徑以后,新路徑可能不會立刻被使用,需要手動重新分布數據;
- 對於分區數據庫需要保證這些新添件的路徑在每個節點都存在並且有全部權限。
將 DMS 轉換成自動存儲表空間
使數據庫支持自動存儲並不會自動把過去存在數據庫中的數據庫管理表空間轉換成為自動存儲表空間,我們還需要進行一些操作才能實現表空間的轉換。但 DB2 9.7 中只支持將 DMS 轉換為自動存儲表空間,還不能把系統管理表空間變為自動存儲表空間。轉換 DMS 的方法目前有兩種:
- 通過發出 ALTER TABLESPACE 命令,在線的將 DMS 轉換成自動存儲表空間;
- 通過數據庫恢復重定向離線的將 DMS 轉換成自動存儲表空間。
轉換自動存儲的在線方式
在線轉換表空間會保持表空間可用,但需要數據重新分布,在轉換前我們可以通過 GET SNAPSHOT 命令查看表空間的類型。
清單 2. 轉換前的表空間信息
db2 get snapshot for tablespaces on testdb 。。。。。。 Tablespace name = TS1 Tablespace ID = 3 Tablespace Type = Database managed space Tablespace Content Type = All permanent data. Large table space. 。。。。。。 Container Name = /db2/db6test/data1 Container ID = 0 。。。。。。 Container Name = /db2/db6test/data2 Container ID = 1 。。。。。。 Table space map: Range Stripe Stripe Max Max Start End Adj. Containers Number Set Offset Extent Page Stripe Stripe [ 0] [ 0] 0 13 447 0 6 0 2 (0, 1) 。。。。。。
表空間 TS1 為例,現在可以看到該表空間現在為 DMS 類型,有兩個表空間容器,這兩個表空間容器在一個 stripe set 里。
第一步,使用 ALTER TABLESPACE 命令,在命令選項中指定 MANAGED BY AUTOMATIC STORAGE 來轉換表空間。
在我們發出 ALTER TABLESPACE 命令以后,表空間的發生了變化。
清單 3. 轉換后的表空間信息
db2 alter tablespace ts1 managed by automatic storage DB20000I The SQL command completed successfully. db2 get snapshot for tablespaces on testdb 。。。。。。 Tablespace name = TS1 Tablespace ID = 3 Tablespace Type = Database managed space Tablespace Content Type = All permanent data. Large table space. 。。。。。。 Container Name = /db2/db6test/data1 Container ID = 0 。。。。。。 Container Name = /db2/db6test/data2 Container ID = 1 。。。。。。 Container Name = /db2/db6test/path1/db6test/NODE0000/TESTDB/T0000004/C0000000.LRG Container ID = 2 。。。。。。 Container Name = /db2/db6test/path2/db6test/NODE0000/TESTDB/T0000004/C0000001.LRG Container ID = 3 。。。。。。 Table space map: Range Stripe Stripe Max Max Start End Adj. Containers Number Set Offset Extent Page Stripe Stripe [ 0] [ 0] 0 13 447 0 6 0 2 (0,1) [ 1] [ 1] 7 15 511 7 7 0 2 (2,3)
從數據快照中我們看出,TS1 中又增加了兩個容器,它是由數據庫管理器根據數據庫級別的存儲路徑新創建的。同時又新生成了一個 sctripe set,包含了新增加的兩個容器。在數據庫沒有重新分布以前,新增加的容器並不會馬上被使用。
第二步,使用 ALTER TABLESPACE 命令,在命令選項中制定 REBALANCE。
通過第一步我們已經將 DMS 轉換為自動存儲表空間,但用戶以前定義的容器和自動存儲生成的容器是並存的,這並不是我們想要得結果。如果用戶忽略第二步,今后在使用 ALTER TABLESPACE 加 REDUCE 選項時,數據庫可能會刪除掉未使用的新增加的兩個自動存儲容器。所以我們在轉換表空間以后必須執行第二步。第二步通常是個比較耗時的操作,這也是在線轉換表空間的代價。
清單 4. REBALANCE 后的表空間信息
db2 alter tablespace TS1 rebalance DB20000I The SQL command completed successfully. db2 get snapshot for tablespaces on testdb 。。。。。。 Tablespace name = TS1 Tablespace ID = 3 Tablespace Type = Database managed space Tablespace Content Type = All permanent data. Large table space. 。。。。。。 Rebalancer Mode = No Rebalancing 。。。。。。 Container Name = /db2/db6test/path1/db6test/NODE0000/TESTDB/T0000003/C0000000.LRG Container ID = 0 。。。。。。 Container Name = /db2/db6test/path2/db6test/NODE0000/TESTDB/T0000003/C0000001.LRG Container ID = 1 。。。。。。 Table space map: Range Stripe Stripe Max Max Start End Adj. Containers Number Set Offset Extent Page Stripe Stripe [ 0] [ 0] 0 5 191 0 2 0 2 (0,1)
從運行完 rebalance 的表空間快照中我們看到,過去的兩個數據庫管理表空間的容器消失了,只剩下了自動存儲的兩個容器,stripe set 也變為了一個。我們還應該注意快照中的 Rebalancer Mode,當前是 No Rebalancing,表示表空間的 rebalance 已經完成了。
通過以上的步驟,我們已經成功的把一個數據庫管理表空間在線的轉換為了自動存儲表空間。
轉換表空間時的注意事項及使用技巧
我們已經了解到如何將非自動存儲表空間轉換為自動存儲表空間的兩種基本方法。在使用這兩種方法的時候應該注意以下幾點:
- 自動存儲一旦啟用就不能更改,因此,在轉換表空間前需要對使用需求進行全面考量;
- 對於分區數據庫,自動存儲的路徑必須存在於所有節點;
- 在線轉換表空間中的 REBALANCE 通常是一個比較耗時的過程,尤其是數據量比較大的表空間,所花費的時間會更長,系統資源消耗也很大。我們可以結合 throttling 功能來降低 REBANLANCE 對數據庫性能的影響;
- 由於以前建立的數據庫中需要轉換的表空間比較多,我們可以在 SQL 語句中結合 MON_GET_TABLESPACE 函數或者通過 SYSIBMADM.SNAPTBSP 表來找到 TBSP_USING_AUTO_STORAGE 不為 1,且 TBSP_TYPE 為 DMS 的表空間批量的進行在線轉換;
l
在通過數據庫重定向恢復轉換表空間時,我們也可以結合 GENERATE SCRIPT 選項,先生成模板腳本,然后通過改寫模板腳本來實現批量轉換。