程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> DB2數據庫 >> DB2教程 >> DB2 9.7 中如何將數據庫管理表空間轉換為自動存儲表空間

DB2 9.7 中如何將數據庫管理表空間轉換為自動存儲表空間

編輯:DB2教程

簡介

IBM DB2 for Linux, Unix, and Windows 9.7 (DB2 9.7) 於 2009 年 6 月份正式發布。這版數據庫對 DB2 V9.5 的新特性進行了增強,同時增加許多激動人心的特性。這些增強和新特性概括起來主要表現在三方面:降低成本,可信賴,易用。DB2 9.7 在幫助客戶實現自身業務的同時可以大大節約維護成本和 IT 運營開銷。

為了簡化表空間的管理,從 DB2 V8.2.2 開始,DB2 引入了自動存儲的概念。自動存儲允許 DBA 在數據庫級別指定在創建表空間時使用的存儲路徑,在創建表空間時不必顯式地定義表空間的位置和大小,數據庫系統可以在使用過程中自動分配和調整表空間。在 DB2 V9 中,自動存儲已經變為數據庫的默認選項,數據庫在創建時會默認啟用自動存儲,除非顯式的改變該選項。自動存儲在保持了性能的同時大大的簡化了 DBA 的工作,DBA 可以在數據庫級別管理表空間的存儲,表空間容器選擇分配等工作由數據庫管理器自動完成。在 DB2 9.7 以前,自動存儲只能在數據庫創建時啟用,自動存儲表空間也只能在創建時確定,DBA 在運維過程中不能改變數據庫和表空間的類型。這個限制使已經建立的非自動存儲表空間不能享受到自動存儲特性所帶來的好處。在 DB2 9.7 中,對於原本不支持自動存儲的數據庫,DBA 可以用比較簡單的操作先將一個非自動存儲數據庫轉換為自動存儲數據庫,然後再將一個數據庫管理表空間轉換為自動存儲表空間。對於已經支持自動存儲的數據庫,可以直接將一個數據庫管理表空間轉換為自動存儲表空間。本文將通過實際操作介紹啟用自動存儲的方法。

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,但是在轉換期間如果是單個表空間轉換,會導致該表空間在轉換期間不可用。如果多個表空間需要轉換,在使用數據庫重定向恢復時會導致整個數據庫不可用。為了對比重定向前後的表空間情況,在進行轉換之前我們先來看看表空間的當前狀態。

清單 5. 重定向恢復前的表空間信息

 db2 get snapshot for tablespaces on testdb 
。。。。。。 
 Tablespace name = TS2 
 Tablespace ID = 5 
 Tablespace Type = Database managed space 
 Tablespace Content Type = All permanent data. Large table space. 
。。。。。。 
 Container Name = /db2/db6test/data3 
 Container ID = 0 
。。。。。。 
 Container Name = /db2/db6test/data4 
 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) 

TS2 表空間當前使用兩個用戶指定的容器用於 DMS 類型的表空間。在這個基礎上通過下面 4 個步驟我們可以將這個表空間轉換成自動存儲表空間。

第一步,做一個數據庫或表空間的備份。

第二步,使用 redirect 選項恢復數據庫或表空間。

 RESTORE DATABASE database_name TABLESPACE table_space_name REDIRECT 

第三步,在恢復過程中使用 SET TABLESPACE CONTAINERS 命令將 DMS 表空間改為自動存儲表空間。並繼續恢復數據庫或表空間。

 SET TABLESPACE CONTAINERS FOR tablespace_id USING AUTOMATIC STORAGE 
 RESTORE DATABASE database_name CONTINUE 

第四步,對數據庫進行前滾恢復。

 ROLLFORWARD DATABASE database_name TO END OF LOGS AND STOP 

清單 6. 使用數據庫重定向操作轉換表空間的實例

步驟一, 
 db2 backup db testdb tablespace ts2 online to /db2/backup 
 Backup successful. The timestamp for this backup image is : 20091102012416 
 
步驟二, 
 db2 "restore db testdb tablespace(ts2) from /db2/backup redirect" 
 
 SQL1277W A redirected restore Operation is being performed. Table space 
 configuration can now be vIEwed and table spaces that do not use automatic 
 storage can have their containers reconfigured. 
 
 DB20000I The RESTORE DATABASE command completed successfully. 
 
步驟三, 
 db2 set tablespace containers for 5 using automatic storage 
 DB20000I The SET TABLESPACE CONTAINERS command completed successfully. 
 
 db2 restore database testdb continue 
 DB20000I The RESTORE DATABASE command completed successfully. 
 
步驟四, 
 db2 rollforward db testdb to end of logs and stop 
 
 Rollforward Status 
 
 Input database alias = testdb 
 Number of nodes have returned status = 1 
 
 Node number = 0 
 Rollforward status = not pending 
 Next log file to be read = 
 Log files processed = - 
 Last committed transaction = 1970-01-01-00.00.00.000000 UTC 
 
 DB20000I The ROLLFORWARD command completed successfully. 

在執行完以上的步驟,下面來看看數據庫重定向以後的表空間情況。

清單 7. 使用數據庫重定向操作後的表空間

 db2 get snapshot for tablespaces on testdb 
。。。。。。 
 Tablespace name              = TS2 
 Tablespace ID = 5 
 Tablespace Type = Database managed space 
 Tablespace Content Type = All permanent data. Large table space. 
。。。。。。 
 Tablespace State = 0x'00000000' 
。。。。。。 
 Container Name = 
/db2/db6test/path1/db6test/NODE0000/TESTDB/T0000005/C0000000.LRG 
 
 Container ID = 0 
。。。。。。 
 Container Name = 
/db2/db6test/path2/db6test/NODE0000/TESTDB/T0000005/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 13 447 0 6 0 2 (0,1) 

在快照中,我們看到,自動存儲的兩個容器已經取代了 DMS 過去的兩個容器,因而表空間已經成功的被轉換成了自動存儲類型。

轉換表空間時的注意事項及使用技巧

我們已經了解到如何將非自動存儲表空間轉換為自動存儲表空間的兩種基本方法。在使用這兩種方法的時候應該注意以下幾點:

自動存儲一旦啟用就不能更改,因此,在轉換表空間前需要對使用需求進行全面考量;

對於分區數據庫,自動存儲的路徑必須存在於所有節點;

在線轉換表空間中的 REBALANCE 通常是一個比較耗時的過程,尤其是數據量比較大的表空間,所花費的時間會更長,系統資源消耗也很大。我們可以結合 throttling 功能來降低 REBANLANCE 對數據庫性能的影響;

由於以前建立的數據庫中需要轉換的表空間比較多,我們可以在 SQL 語句中結合 MON_GET_TABLESPACE 函數或者通過 SYSIBMADM.SNAPTBSP 表來找到 TBSP_USING_AUTO_STORAGE 不為 1,且 TBSP_TYPE 為 DMS 的表空間批量的進行在線轉換;

l在通過數據庫重定向恢復轉換表空間時,我們也可以結合 GENERATE SCRIPT 選項,先生成模板腳本,然後通過改寫模板腳本來實現批量轉換。

總結

自動存儲特性可以大大減少 DBA 的負擔,提高數據庫的性能。本文通過實際操作,介紹了在 DB2 9.7 中,將數據庫管理表空間轉換為自動存儲表空間的兩種方法,通過轉換,可以使更多的 DB2 數據庫表空間享受到自動存儲特性帶來的好處。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved