db2表空間

wangzhensheng發表於2008-03-25
db2表空間[@more@]

增加表空間出錯~~~

我使用圖形方式增加表空間,
但是提示一下錯誤,請諸位幫我看看怎麼解決,
謝謝!!!

ALTER TABLESPACE USERSPACE1 ADD ('/app/testdb/db2inst2/tablespace/userspace1' )


[IBM][CLI Driver][DB2/AIX64] SQL0281N 不可用附加的容器改變表空間
"USERSPACE1",因為它是系統管理的表空間。 SQLSTATE=42921


解釋:

其它容器不可新增到系統管理的表空間。這條規則的例外是,當修改節點組
以新增無表空間的節點時,可使用 ALTER TABLESPACE
命令在新節點上新增一次容器。一般情況下,表空間必須由資料庫管理以便
新增其它容器。

不能處理該語句。

使用者響應:

要新增更多的容器至系統管理表空間,可刪除並重新建立有更多容器的表空
間,同時應確保每個容器大小相同且小於容器大小限制,或更改為 DMS
表空間。

sqlcode : -281

sqlstate : 42921

增加表空間出錯~~~

如果你增加的表空間容器是個目錄的話,應該不會報錯的,你檢查一下
userspace1是個目錄還是個檔案

增加表空間出錯~~~

你建立資料庫時使用者表空間(usrspace1)用的是SMS型別吧,沒必要,也不允許在改動了。alter只對DMS型別的表空間啟作用。

D:MyDbbak>;db2 "create db dbs on d: catalog tablespace managed by system using ('d:mydbdbscon0sys') user tablespace managed by database using (file 'd:mydbdbscon0usr' 20480) temporary tablespace managed by db using (file 'd:mydbdbscon0tmp' 10240)"
DB20000I CREATE DATABASE 命令成功完成。

D:MyDbbak>;db2 "alter tablespace con0usr add (file 'd:mydbdbscon1usr' 204
80)"
DB21034E 該命令被當作 SQL 語句來處理,因為它不是有效的“命令列處理器”命令。
在 SQL 處理期間,它返回:
SQL1024N 資料庫連線不存在。 SQLSTATE=08003

D:MyDbbak>;db2 connect to dbs

資料庫連線資訊

資料庫伺服器 = DB2/NT 7.2.1
SQL 授權標識 = ADMINIST...
本地資料庫別名 = DBS

D:MyDbbak>;db2 list tablespaces show detail

當前資料庫的表空間

表空間標識 = 0
名稱 = SYSCATSPACE
型別 = 系統管理的空間
內容 = 任何資料
狀態 = 0x0000
詳細說明:
正常
總頁數 = 1400
可用頁數 = 1400
已用頁數 = 1400
空閒頁數 = 不適用
高水位標記(頁) = 不適用
頁大小(位元組) = 4096
盤區大小(頁) = 32
預讀取大小(頁) = 16
容器數 = 1

表空間標識 = 1
名稱 = TEMPSPACE1
型別 = 資料庫管理的空間
內容 = 系統臨時資料
狀態 = 0x0000
詳細說明:
正常
總頁數 = 10240
可用頁數 = 10208
已用頁數 = 64
空閒頁數 = 10144
高水位標記(頁) = 64
頁大小(位元組) = 4096
盤區大小(頁) = 32
預讀取大小(頁) = 16
容器數 = 1

表空間標識 = 2
名稱 = USERSPACE1
型別 = 資料庫管理的空間
內容 = 任何資料
狀態 = 0x0000
詳細說明:
正常
總頁數 = 20480
可用頁數 = 20448
已用頁數 = 96
空閒頁數 = 20352
高水位標記(頁) = 96
頁大小(位元組) = 4096
盤區大小(頁) = 32
預讀取大小(頁) = 16
容器數 = 1


D:MyDbbak>;db2 "alter tablespace userspace1 add (file 'd:mydbdbscon1usr'
20480)"
DB20000I SQL 命令成功完成。

D:MyDbbak>;db2 list tablespaces show detail

當前資料庫的表空間

表空間標識 = 0
名稱 = SYSCATSPACE
型別 = 系統管理的空間
內容 = 任何資料
狀態 = 0x0000
詳細說明:
正常
總頁數 = 1400
可用頁數 = 1400
已用頁數 = 1400
空閒頁數 = 不適用
高水位標記(頁) = 不適用
頁大小(位元組) = 4096
盤區大小(頁) = 32
預讀取大小(頁) = 16
容器數 = 1

表空間標識 = 1
名稱 = TEMPSPACE1
型別 = 資料庫管理的空間
內容 = 系統臨時資料
狀態 = 0x0000
詳細說明:
正常
總頁數 = 10240
可用頁數 = 10208
已用頁數 = 64
空閒頁數 = 10144
高水位標記(頁) = 64
頁大小(位元組) = 4096
盤區大小(頁) = 32
預讀取大小(頁) = 16
容器數 = 1

表空間標識 = 2
名稱 = USERSPACE1
型別 = 資料庫管理的空間
內容 = 任何資料
狀態 = 0x0000
詳細說明:
正常
總頁數 = 40960
可用頁數 = 40896
已用頁數 = 96
空閒頁數 = 40800
高水位標記(頁) = 96
頁大小(位元組) = 4096
盤區大小(頁) = 32
預讀取大小(頁) = 16
容器數 = 2


D:MyDbbak>;db2 list tablespace containers for 2 show detail

表空間 2 的表空間容器

容器標識 = 0
名稱 = d:mydbdbscon0usr
型別 = 檔案
總頁數 = 20480
可用頁數 = 20448
可訪問 = 是
容器標識 = 1
名稱 = d:mydbdbscon1usr
型別 = 檔案
總頁數 = 20480
可用頁數 = 20448
可訪問 = 是


D:MyDbbak>;db2 connect reset
DB20000I SQL 命令成功完成。

D:MyDbbak>;db2 "create db dbs2 on d: catalog tablespace managed by system using ('d:mydbdbs2con0sys') user tablespace managed by system using ('d:mydbdbs2con0usr') temporary tablespace managed by system using ('d:mydbdbs2con0tmp')"
DB20000I CREATE DATABASE 命令成功完成。

D:MyDbbak>;db2 connect to dbs2

資料庫連線資訊

資料庫伺服器 = DB2/NT 7.2.1
SQL 授權標識 = ADMINIST...
本地資料庫別名 = DBS2


D:MyDbbak>;db2 "alter tablespace userspace1 add ('d:mydbdbscon1usr')"
DB21034E 該命令被當作 SQL 語句來處理,因為它不是有效的“命令列處理器”命令。
在 SQL 處理期間,它返回:
SQL0281N 不可用附加的容器改變表空間 "USERSPACE1",因為它是系統管理的表空間。
SQLSTATE=42921
D:MyDbbak>;db2 list tablespaces show detail

當前資料庫的表空間

表空間標識 = 0
名稱 = SYSCATSPACE
型別 = 系統管理的空間
內容 = 任何資料
狀態 = 0x0000
詳細說明:
正常
總頁數 = 1400
可用頁數 = 1400
已用頁數 = 1400
空閒頁數 = 不適用
高水位標記(頁) = 不適用
頁大小(位元組) = 4096
盤區大小(頁) = 32
預讀取大小(頁) = 16
容器數 = 1

表空間標識 = 1
名稱 = TEMPSPACE1
型別 = 系統管理的空間
內容 = 系統臨時資料
狀態 = 0x0000
詳細說明:
正常
總頁數 = 1
可用頁數 = 1
已用頁數 = 1
空閒頁數 = 不適用
高水位標記(頁) = 不適用
頁大小(位元組) = 4096
盤區大小(頁) = 32
預讀取大小(頁) = 16
容器數 = 1

表空間標識 = 2
名稱 = USERSPACE1
型別 = 系統管理的空間
內容 = 任何資料
狀態 = 0x0000
詳細說明:
正常
總頁數 = 1
可用頁數 = 1
已用頁數 = 1
空閒頁數 = 不適用
高水位標記(頁) = 不適用
頁大小(位元組) = 4096
盤區大小(頁) = 32
預讀取大小(頁) = 16
容器數 = 1


=====================================

表空間是資料庫及儲存在該資料庫中的表之間的邏輯層。表空間在資料庫中建立,表在表空間中建立。

使用表空間的一個明顯的好處是能夠把資料合理的分佈儲存在不同的磁碟上或者儲存在磁碟的不同位置上,有助於提高資料存取的效率。

DB2 的表空間按管理方式分為兩種:系統管理空間(System Management Space,SMS)和資料庫管理空間(Database Management Space,DMS)。

按型別分為:規則表空間、大物件表空間、系統臨時表空間、使用者臨時表空間。

規則表空間中包含使用者資料的表。預設使用者表空間名為USERSPACE1,索引也儲存在規則表空間中,另外系統目錄表也放在規則表空間中。預設的系統目錄表空間名為SYSCATSPACE。

臨時表空間分為系統臨時表空間和使用者臨時表空間。
系統臨時表空間用來儲存各種資料操作(排序、重組表、建立索引、連線表)中所需的內部臨時資料,雖然可以建立任意多個系統臨時表空間,但建議使用者只使用大多數表所使用的頁大小建立一個,預設系統臨時表空間名為TEMPSPACE1。
使用者臨時表空間用來儲存已說明全域性臨時表(已說明全域性臨時表儲存的是應用程式臨時資料)。使用者臨時表空間不是在資料庫建立時預設建立的。

SMS每個容器是作業系統的檔案空間中的一個目錄;DMS每個容器是一個固定的、預分配的檔案,或是物理裝置。

SMS的管理比較簡單,由作業系統自動管理,空間的大小隨資料量的變化系統自動調整。

DMS是由資料庫管理的,空間大小在建立時確定,空間不夠時要手工新增或刪除部分資料以釋放空間。

大多數情況下,DMS的效能比SMS好。

用命令列方式建立SMS表空間的簡單語法:
CREATE TABLESPACE ; MANAGED BY SYSTEM USING (';')

例一:在Windows上建立一個SMS表空間:
CREATE TABLESPACE RESOURCE MANAGED BY SYSTEM USING ('d:acc_tbsp','e:acc_tbsp','f:acc_tbsp')
完成的結果為在D、E、F三個磁碟上建立了三個名稱為acc_tbsp的資料夾,每個資料夾下面都有一個名為SQLTAG.NAM的檔案。

例二:刪除例一所建立的SMS表空間。
DROP TABLESPACE RESOURCE
執行完這條命令,相應的表空間會從DB2登錄檔中刪除,但是磁碟上的三個資料夾仍然存在,需要手工刪除。

用命令列方式建立DMS表空間的簡單語法:
CREATE TABLESPACE ; MANAGED BY DATABASE USING (FILE ';'
或者
CREATE TABLESPACE ; MANAGED BY DATABASE USING (DEVICE ';'

例三:在Windows上建立一個DMS表空間,使用各自有5000頁的兩個檔案容器:
CREATE TABLESPACE RESOURCE MANAGED BY DATABASE USING (FILE 'd:db2dataacc_tbsp' 5000, FILE 'e:db2dataacc_tbsp' 5000)
執行結果為:在D、E磁碟的db2data資料夾下面各建立了一個名為acc_tbsp的檔案,大小都為20000K(預設情況下每頁大小為4K)。

例四:在例三所建立的表空間中新增一個容器。
ALTER TABLESPACE RESOURCE ADD(FILE 'f:db2dataacc_tbsp' 5000)
執行的結果為在RESOURCE表空間中包含了三個容器(檔案):d:db2dataacc_tbsp、 e:db2dataacc_tbsp、 f:db2dataacc_tbsp。

例五:用RESIZE子句更改例三所建立的表空間的容器的大小。
ALTER TABLESPACE RESOURCE RESIZE (file 'd:db2dataacc_tbsp' 8000, file 'e:db2dataacc_tbsp' 8000, file 'f:db2dataacc_tbsp' 8000)
每個容器(檔案)的大小變為8000頁。把容器的容量變大不會出錯,但是如果容器中的資料已經充滿,再把容器的容量縮小,則會引起錯誤。

例六:用EXTEND子句更改例三所建立的表空間的容器的大小。
ALTER TABLESPACE RESOURCE EXTEND (file 'd:db2dataacc_tbsp' 1000, file 'e:db2dataacc_tbsp' 1000, file 'f:db2dataacc_tbsp' 1000)
該命令的執行結果為在原有容量的基礎之上,每個容器再增加1000頁。

例七:刪除例三中建立的DMS表空間。
DROP TABLESPACE RESOURCE
執行的結果為在DB2的登錄檔中把RESOURCE表空間刪除,同時在磁碟上把相對應的資料夾和檔案都一起自動刪除。

例八:在UNIX上建立一個DMS表空間,使用各有10000頁的3個邏輯卷:
CREATE TABLESPACE RESOURCE MANAGED BY DATABASE USING (DEVICE '/dev/rdblv6' 10000, DEVICE '/dev/rdblv7' 10000, DEVICE '/dev/rdblv8' 10000)
上面語句中提到的UNIX裝置必須已經存在,且例項擁有者和SYSADM組必須能夠寫入它們。

SMS與DMS的對比
特性 SMS DMS
能夠在表空間中動態增加容器的數目嗎 N Y
能夠把索引資料存放到不同表空間的表中嗎 N Y
能夠把大物件資料存放到不同表空間的表中嗎 N Y
表可以分散存放到多個表空間中嗎 N Y
僅在需要時才分配空間嗎 Y N
表空間可以被放在不同的磁碟中嗎 Y N
建立之後,區段大小能夠改變嗎 N N

例九:建立系統臨時表空間。
CREATE SYSTEM TEMPORARY TABLESPACE tmp_tbsp MANAGED BY SYSTEM USING(‘d:tmp_tbsp’,’e:tmp_tbsp’)
系統臨時表只能儲存在系統臨時表空間中,所以資料庫必須始終至少有一個系統臨時表空間。

例十:建立使用者臨時表空間。
CREATE USER TEMPORARY TABLESPACE usr_tbsp MANAGED BY DATABASE USING(FILE ‘d:db2datauser_tbsp’ 5000, FILE ‘e:db2datauser_tbsp’ 5000)
使用者臨時表空間用於儲存已說明的臨時表(用 DECLARE GLOBAL TEMPORARY TABLE 語句定義)

例十一:用RENAME語句給表空間重新命名
RENAME TABLESPACE RESOURCE TO RES1
用該語句給表空間重新命名之後,將自動更改所有引用該表空間的目錄記錄,所以無須關心該表空間中的個別物件。

例十二:在RESOURCE表空間中建立一張名為T1的表
CREATE TABLE T1(ABC INT) IN RESOURCE

===========================================

表空間

資料庫中的所有資料都儲存在許多表空間中。可以認為表空間是孩子而資料庫是其父母,其中表空間(孩子)不能有多個資料庫(父母)。由於表空間有不同用途,因此根據它們的用途和管理方式將它們分類。根據用途有五種不同的表空間:

目錄表空間
每個資料庫只有一個目錄表空間,它是在發出 CREATE DATABASE 命令時建立的。目錄表空間被 DB2 命名為 SYSCATSPACE,它儲存了系統目錄表。總是在建立資料庫時建立該表空間。
常規表空間
常規表空間儲存表資料和索引。它還可以儲存諸如大物件(Large Object,LOB)之類的長資料,除非這些資料顯式地儲存在長表空間中。如果某些表空間是資料庫管理的空間(Database Managed Space,DMS),則可以將表及其索引分別放到單獨的常規表空間中。我們將在本文後面定義 DMS 和系統管理的空間(System Managed Space,SMS)之間的區別。每個資料庫中必須至少有一個常規表空間。建立資料庫時指定該表空間的預設名為 USERSPACE1。
長表空間
長表空間用於儲存長型或 LOB 表列,它們必須駐留在 DMS 表空間中。它們還可以儲存結構化型別的列或索引資料。如果沒有定義長表空間,那麼將把 LOB 儲存在常規表空間中。長表空間是可選的,預設情況下一個都不建立。
系統臨時表空間
系統臨時表空間用於儲存 SQL 操作(比如排序、重組表、建立索引和連線表)期間所需的內部臨時資料。每個資料庫必須至少有一個系統臨時表空間。隨資料庫建立的系統臨時表空間的預設名為 TEMPSPACE1。
使用者臨時表空間
使用者臨時表空間儲存已宣告的全域性臨時表。建立資料庫時不存在使用者臨時表空間。至少應當建立一個使用者臨時表空間以允許定義已宣告的臨時表。使用者臨時表空間是可選的,預設情況下一個都不建立。
表空間管理

可以用兩種不同的方式管理表空間:

系統管理的空間(SMS)
SMS 表空間由作業系統進行管理。容器被定義成常規作業系統檔案,並且是透過作業系統呼叫訪問的。這意味著所有的常規作業系統功能將處理以下內容:作業系統將緩衝 I/O;根據作業系統約定分配空間;如有必要就自動擴充套件表空間。但是,不能從 SMS 表空間刪除容器,並且僅限於將新的容器新增到分割槽的資料庫。前一節中所說明的那三個預設表空間都是 SMS。
資料庫管理的空間(DMS)
DMS 表空間是由 DB2 管理的。可以將容器定義成檔案(在建立表空間時將把給定的大小全部分配給它們)或裝置。分配方法和作業系統允許多少 I/O,DB2 就可以管理多少 I/O。可以透過使用 altER TABLESPACE 命令來擴充套件容器。還可以釋放未使用的那部分 DMS 容器(從 V8 開始)。
下面是一個示例,向您說明該如何增大容器大小(V7 和 V8 都支援此功能):


ALTER TABLESPACE TS1
RESIZE (FILE '/conts/cont0' 2000,
DEVICE '/dev/rcont1' 2000,
FILE 'cont2' 2000)

請注意,只有 V8 才支援將原始容器的大小調整得更小。

如何建立和檢視錶空間

當您建立資料庫時,將建立三個表空間(SYSCATSPACE、TEMPSPACE1 和 USERSPACE1)。透過使用 DB2 命令視窗(Command Window)或 UNIX 命令列,建立一個名為 testdb 的資料庫,連線至該資料庫,然後列出表空間:


CREATE DATABASE testdb
CONNECT TO testdb
LIST TABLESPACES

下面的 清單 1顯示了 LIST TABLESPACES 命令的輸出。

清單 1. LIST TABLESPACES 命令的輸出


Tablespaces for Current Database
Tablespace ID = 0
Name = SYSCATSPACE
Type = System managed space
Contents = Any data
State = 0x0000
Detailed explanation:
Normal
Tablespace ID = 1
Name = TEMPSPACE1
Type = System managed space
Contents = System Temporary data
State = 0x0000
Detailed explanation:
Normal
Tablespace ID = 2
Name = USERSPACE1
Type = System managed space
Contents = Any data
State = 0x0000
Detailed explanation:
Normal

上面所示的這三個表空間是透過 CREATE DATABASE 命令自動建立的。使用者可以透過在該命令中包含表空間說明來覆蓋預設的表空間建立,但是在建立資料庫時必須建立一個目錄表空間和至少一個常規表空間,以及至少一個系統臨時表空間。透過使用 CREATE DATABASE 命令或以後使用 CREATE TABLESPACE 命令,可以建立更多的所有型別的表空間(目錄表空間除外)。

容器

每個表空間都有一個或多個容器。重申一次,您可以認為容器是孩子,而表空間是其父母。每個容器只能屬於一個表空間,但是一個表空間可以擁有許多容器。可以將容器新增到 DMS 表空間,或者從 DMS 表空間中刪除容器,而且可以更改容器的大小。只能將容器新增到某個分割槽中分割槽資料庫上的 SMS 表空間,在新增之前該分割槽還未給表空間分配容器。新增新的容器時,將啟動一個自動的重新均衡操作以便將資料分佈到所有容器上。重新均衡操作不會妨礙對資料庫的併發訪問。

表空間設定

可以在建立表空間時給它們指定許多設定,或者也可以稍後使用 altER TABLESPACE 語句時指定其設定。

頁大小(Page size)
定義表空間所使用的頁大小。所支援的大小為 4K、8K、16K 和 32K。頁大小根據下表限定了可放到表空間中的表的行長度和列數:
表 1. 頁大小的含義 頁大小 行大小限制 列數限制 最大容量
4 KB 4 005 500 64 GB
8 KB 8 101 1 012 128 GB
16 KB 16 293 1 012 256 GB
32 KB 32 677 1 012 512 GB


表空間最多可包含 16384 個頁,因此選擇較大的頁大小可以增加表空間的容量。

擴充套件塊大小(Extent size)
指定在跳到下一個容器之前將寫到當前容器中的頁數。儲存資料時資料庫管理器反覆迴圈使用所有容器。該引數只有在表空間中有多個容器時才起作用。
預取大小(Prefetch size)
指定當執行資料預取時將從表空間讀取的頁數。預取操作在查詢引用所需的資料之前讀入這些資料,這樣一來查詢就不必等待執行 I/O 了。當資料庫管理器確定順序 I/O 是適當的,並且確定預取操作可能有助於提高效能時,它就選擇預取操作。
開銷(Overhead)和傳送速率(Transfer rate)
這些值用於確定查詢最佳化期間的 I/O 成本。這兩個值的測量單位都是毫秒,而且它們應當分別是所有容器開銷和傳送速率的平均值。開銷是與 I/O 控制器活動、磁碟尋道時間和旋轉延遲時間相關聯的時間。傳送速率是將一個頁讀入記憶體所必需的時間量。它們的預設值分別是 24.1 和 0.9。可以根據硬體規格計算這些值。
CREATE TABLESPACE 語句的示例

下列語句將建立一個常規表空間。所討論的所有設定都是為了進行說明。


CREATE TABLESPACE USERSPACE3
PAGESIZE 8K
MANAGED BY SYSTEM
USING ('d:usp3_cont1', 'e:usp3_cont2', 'f:usp3_cont3')
EXTENTSIZE 64
PREFETCHSIZE 32
BUFFERPOOL BP3
OVERHEAD 24.1
TRANSFERRATE 0.9

如何檢視錶空間的屬性和容器

指定 LIST TABLESPACES 命令的 SHOW DETAIL 選項將顯示其它資訊:


LIST TABLESPACES SHOW DETAIL

清單 2顯示了 USERSPACE1 表空間的輸出。預設情況下,將列出建立資料庫時所建立的那三個表空間。

清單 2. LlST TABLESPACES SHOW DETAIL 命令的輸出


Tablespaces for Current Database
Tablespace ID = 2
Name = USERSPACE1
Type = System managed space
Contents = Any data
State = 0x0000
Detailed explanation:
Normal
Total pages = 336
Useable pages = 336
Used pages = 336
Free pages = Not applicable
High water mark (pages) = Not applicable
Page size (bytes) = 4096
Extent size (pages) = 32
Prefetch size (pages) = 16
Number of containers = 1

要列出容器,我們需要使用以上輸出中的 Tablespace ID:


LIST TABLESPACE CONTAINERS FOR 2

清單 3. LIST TABLESPACE CONTAINERS 命令的輸出


Tablespace Containers for Tablespace 2
Container ID = 0
Name = C:DB2NODE0000SQL00004SQLT0002.0
Type = Path

該命令將列出指定表空間中的所有容器。如上所示的路徑指向容器物理上所在的位置。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/8806316/viewspace-1001428/,如需轉載,請註明出處,否則將追究法律責任。

相關文章