上午剛剛上班,突然被拉到一個客戶群里,咨詢DB2數據庫怎么關閉表空間自動增長,看到這個問題,我想簡單啊,和一樣,一條命令就行了,然后我就把這個命令發給客戶了,過了一個客戶說執行成功了,但是增加表空間大小還是不行,我就想到了DB2數據庫空間的特殊性,根據不通類型的表空間增加表空間大小的方式也不一樣db2 查看表空間大小,下面請跟著我的步伐一起了解下DB2表空間的類型,及如何維護管理。
DB2表空間簡介:
管理方式:SMS,DMS,自動存儲管理
存儲類型:系統表空間,數據表空間,系統臨時表空間,用戶臨時表空間。
DB2數據庫在建庫的時候會自動創建三個表空間
系統表空間( ),用來存儲系統表,也就是數據字典的信息,一個數據庫只能有一個系統表空間;
臨時表空間(),用來保存語句執行時產生的中間臨時數據,如join,排序等操作都可能產生一些臨時數據;
用戶表空間(user ),用來存儲表,索引,大對象等數據;
下面我們就詳細的看看怎么對DB2的表空間進行管理。
創建表空間
在創建表空間前,還需要創建一個緩沖池
db2" BP32K SIZE 10000 32K"
問:什么是緩沖池呢?
答:緩沖池(),是數據庫最重要的內存區,用來緩存數據,提高性能。創建緩沖池時,size表示頁數,表示大小,size*就是緩沖池的內存大小。
在建庫的時候,DB2會自動創建一個名為的緩沖池,如果在建庫時候沒有指定那么的默認是4K。
每個表空間都有一個與之對應,多個表空間可以共享一個,但要求的大小必須與表空間的匹配,否則無法創建。緩沖池創建完成過后,再繼續創建表空間。
創建DMS管理的數據表空間
db2 " LARGE 32K BY USING (FILE '/data1/data/cont0' 5M,FILE '/data1/data/cont1' 5M)
32 BP32K NO FILE "
表示表空間的分配和管理由DB2負責,即DMS(-),Using指定表空間的容器,DMS支持的容器類型是文件(file)和裸設備()。
DMS類型的表空間在創建時即分配空間,創建后可通過命令對表空間容器進行增刪改。對于數據來說,建議用DMS管理。
該選項的目的是關閉文件系統緩存原因是DB2使用緩存數據,為了減小額外的開銷,不必使用文件緩存,這個選項是DB29.5 版本的默認選項。
注意:大對象()數據的獲取直接通過磁盤,無法通過緩存,因為可以考慮將大對象創建在獨立的表空間上,并使用 選項。
創建SMS管理的臨時表空間
db2" 32K USING('/data1/data/') BP32K"
系統臨時表空間用來存儲DB2產生的一些臨時數據。
表示空間的分配和管理由操作系統負責db2 查看表空間大小,即SMS(-)Using指定表空間的容器,
SMS支持的容器類型只能是目錄,無需指定大小,只要路徑所屬的文件系統有空間,就可以被表空間使用。
SMS的優點是比較容易管理,缺點是性能比DMS差一些,大概差5%~10%左右,對于臨時表空間來說,建議使用SMS管理。
創建SMS管理的用戶臨時表空間
db2" USER BY USING ('/data1/data/') "
與系統表空間類似,用戶臨時表空間也用保存臨時數據,但他存儲的是用戶自定義的臨時表,對于用戶臨時表空間來說,建議使用SMS管理。
創建自動存儲管理( )的表空間
創建數據頁為32kb的自動存儲管理表空間
32k bp32k
創建初始大小為100MB,增量為100MB,最大大小為100GB的自動存儲管理表空間
100M 100M 100G
上面這種直接創建的自動存儲的表空間,他的容器路徑在哪里呢,我們查看下
db2" (,1,30) as , FROM table (('', -2))"
db2" (, 30) AS ,, (, 40) AS (THS('',-1)) AS T"
可以看出不指定自動存儲的group情況下,會使用系統默認的自動存儲空間,如果在創建數據庫的時候沒有指定自動存儲的路徑,默認路徑就會在實例用戶的文件下。
那該如何把自動存儲的表空間放在規劃好的空間呢
需要我們先創建一個
db2" sg ON '/data1/path1', '/data1/path2' "
在添加表空間的時候指定對應的組就行了
db2" by sg"
注意:以上兩個命令在V9.7版本中是不存在的
修改表空間
上面扯了一堆,把DB2的表空間類型和創建方式講了一下,然后我們回到最開始的問題,客戶的問題,如何關閉表空間自動增長的問題,看著這個問題,直接一條命令發給了客戶,客戶執行后說沒有關閉啊,我擴展表空間還是擴展不了啊。
db2"alter no"
通過上面的命令就可以把表空間的自動增長關了,但是客戶說沒起效果,就讓客戶查了下表殼空間的信息。
通過查看發現對應表空間的自增長已經是NO了啊,然后就看到這個表空間的AS類型是自動存儲的表空間。然后客戶通過非自動存儲表空間擴展的方式來的增加表空間大小的,這肯定不對啊。那下面我們就詳細說下DMS管理的表空間在自動存儲和非自動存儲下怎么擴展表空間。
自動存儲表空間
DB2是個很有意思的數據庫,不同版本之間一些函數,命令等會有差異。在V9.7版本中自動存儲的表空間通過以下命令來擴展。
db2 "alter add on '/home//test'"
db2 "alter "
擴展好自動存儲路徑后,通過對表空間進行重新平衡,使表空間使用新的路徑,在V10以上的版本中,通過一下命令擴展。
db2"alter sg add '/data1/path2'"
找到對應表空間所在存儲組,然后對該組進行空間添加。
非自動存儲表空間
非自動擴展的表空間,在擴展的時候需要添加容器或者擴展容器,容器類型也分為文件和裸設備兩種:
DMS+文件
如果表空間容器已經沒有剩余空間,可通過add選項增加容器,當然必要的情況下也可以通過drop選項刪除容器。對于add和drop操作會在容器間發生數據重新平衡()。如果數據量很大,時間有可能很久,對系統可能造成很大影響。
add(file '///cont2' 100m)
如果使用 strip set選項則會在現有容器空間用完時使用新增容器,該選項使數據不會在容器間做,但會造成數據偏移。
begin new set (file'///cont3' 100m)
擴展:
如果DMS表空間對應的存儲中還有未分配空間,可通過的、或選項擴展已有表空間容器的大小。其中用來擴展容器大小,用來縮減已有容器大小,重新設定容器大小。對于和,需確保更改后的表空間有足夠空間,否則DB2拒絕操作。
(file '///cont0' 10M)
DMS+裸設備
新增
db2 "alter ADD ( '/dev/' 8190M ) "
db2 "alter begin new set ( '/dev/' 8190M)"
擴展
db2"alter ( '/dev/'8190M )"
以上就是我對DB2表空間在運維過程中總結的一些經驗,希望可以幫助到大家,如有疑問歡迎一起討論。