1. 程式人生 > >DB2基本概念——例項,資料庫,模式,表空間

DB2基本概念——例項,資料庫,模式,表空間

DB2支援以下兩種型別的表空間:  
  1、 系統管理儲存器表空間(SMS-SYSTEM   MANAGED   STORAGE)  
  2、 資料庫管理儲存器表空間(DMS-DATABASE   MANAGED   STORAGE)  
   
  SMS、DMS使用者表空間的特性對照  
  特性                                                                       SMS                       DMS  
  能夠在表空間中動態的增加容器數量                         n                     y            
  能夠把索引資料存放到不同的表空間                         n                     y  
  能夠把長型(LOB)資料存放到單獨的表空間               n                     y        
  表可以分散存放到多個表空間                                     n                     y  
  只在需要的時候才分配空間                                         y                     n        
  表空間可以被定向到不同型別的磁碟空間                 y                     n    
  建立之後,區段大小(extent   size)能夠改變       n                   n  
   
  預設表空間:  
  當建立資料庫的時候,DB2將按照預設方式建立三個表空間:這些表空間預設是SMS模式。他們是:  
  SYSCATSPACE:   包含系統編目  
  TEMPSPACE1:儲存臨時表  
  USERSPACE1:包含使用者資料  





DB2 基本概念
  在DB2中由上至下的幾個概念:
  例項(Instance),
  資料庫(Database),
  表空間(TableSpace),
  容器(Container)
  在一個作業系統中,DB2資料服務可以同時執行多個例項(有別於Oracle在一個系統內只能起一個例項).
  資料庫定義在例項中,一個例項可以包含多個數據庫。在同一個例項中的不同資料庫是完全獨立的,分別擁有自己獨立的系統編目表。
  表空間有2種管理方式:
  DMS(Database management Space)方式
  SMS(System manegement Space)方式
  DMS與SMS方式在表空間建立時指定,建好後不能轉換。對於DMS方式,一個表空間對應了一個或多個容器(Container),容器指定了資料的物理儲存位置。對於SMS方式,只能夠指定一個目錄,不能夠增加。
  表空間具有以下型別:
  系統編目表空間(SysCatSpace)
  系統臨時表空間(SysTempSpace)
  使用者表空間(UserSpace)
  使用者臨時表空間(UserTempSpace)
  一個數據庫中必須存在兩個系統基本的表空間,分別是系統編目表空間與系統臨時表空間。在資料庫中建立的任何物件都以在系統編目表空間中增加記錄的方式體現,對於臨時表空間,其佔用磁碟大小是根據使用情況動態伸縮的,即僅在需要時才分配磁碟空間,並在使用後進行回收。此外,若使用者需要建立表,則需要建立使用者表空間,若需要使用臨時表,則需要建立使用者臨時表空間。
  容器分為三種類型:
  Files 檔案
  Devices 裝置
  Directory 目錄
  檔案與裝置,用於DMS方式的表空間;
  目錄,用於SMS方式的表空間,此種方式不需要人工管理資料儲存檔案,DB2可根據情況在目錄中自動增加儲存檔案,只要磁碟空間允許。
  實質上,表空間是資料儲存的邏輯位置定義,容器則是資料儲存的物理位置定義。
  資料庫的效能
  影響一個數據庫的效能主要有以下因素:
  磁碟(Disk)
  記憶體(Memory)
  處理器(CPU)
  網路(Network)
  其中以磁碟最為顯著,90%的效能瓶頸可能來自於磁碟的IO競爭;
  其次是記憶體,一方面是指實體記憶體的總量要滿足需求,另一方面是指與記憶體相關的配置引數應正確配置;
  當然處理器的效能也很重要,多路CPU會對哪些依賴計算能力的複雜SQL查詢起到顯著的效果;
  網路不屬於主要因素,屬於客觀的環境因素,是指過慢的網速會對資料的傳輸造成影響。以下列出一些對於提高資料庫效能有效的方法:
  對於執行資料庫服務的伺服器可以儘可能的配置多塊物理磁碟,每塊的容量不必太大,這樣可以有效的分擔資料儲存與讀取操作過程的磁碟IO競爭。即採用多塊小容量的磁碟在效能上要優於僅採用一塊大容量的磁碟。
  如果條件允許,儘量使資料儲存服務與作業系統分別執行在物理分開的磁碟上。
  採用DMS(Database Management Space)管理方式的表空間。
  在物理不同的磁碟上建立多個表空間。然後可以將資料和索引分別存放在不同的表空間,這樣可以顯著的提高效能。還可以把一個使用頻繁的大表縱向拆成多個小表,分別存放在不同的表空間中,然後用一個檢視進行聯合。
  DB2伺服器可以管理裸裝置,即除系統以及DB2服務執行磁碟以外,為DB2資料存放單獨準備磁碟,可以是多塊,分割槽後不需要格式化,建立裸裝置後直接交給DB2進行管理,用於儲存資料。
  系統的臨時表空間對資料庫效能影響很大,當由管理的實體記憶體不能滿足資料庫操作的需要時,DB2便會把臨時資料寫到磁碟上,這時便用到了系統臨時表空間,並且這種情況會經常發生。
  儘量在磁碟靠近最內層磁軌的位置安放資料,因為此處磁碟的訪問速度較快。
  與效能相關的主要引數
  DB2的引數配置分為兩個級別,一個是例項級別,另一個是資料庫級別。對資料服務效能影響較大的引數主要在資料庫級別配置。以下是三個比較重要的記憶體配置引數:
  bufferpagelocklistsortheap
  bufferpage: 由同一個資料庫中的所有物件共享。
  sortheap: 用於排序的記憶體交換區,非共享,不宜設定太大,否則,很容易引起記憶體耗盡,因為每一個事務都會申請獨立的記憶體用於排序。

  locklist: 共享記憶體,用於記錄資料服務執行中建立的鎖。建議設定20Mb左右,需要時根據實際情況進行調整。DB2預設使用行級鎖,如果設定太小,當鎖的記錄太多時,則會導致記憶體不足,此時DB2會把多個行鎖升級為一個表鎖,這樣就會大大降低應用程式的併發效能。如果設定太大,則多分配的記憶體很少會被用到,導致浪費。

在DB2中有關例項(Instance), 資料庫(Database),表空間(TableSpace),容器(Container)等概念:

其他的一些配置引數:

numdb: 同時可以啟動的例項數目


DB2的常用命令:

db2ilist 列出當前系統中定義的DB2例項
daslist 列出系統中的DAS
db2 list database directory 列出當前例項中定義的資料庫
db2 list tablespaces 列出當前資料庫中定義的表空間
db2 list tabses [for all] 列出當前資料庫中的表
db2 list active db 列出活動的資料庫

db2 get dbm config
get db cfg for databasename
db2 update db cfg for databasename using bufferpage 600M
db2 alter bufferpool IABMDEFAULTBP size =1
db2 list applications show detail

以上命令可以在後面加 ” show detail” 引數,顯示詳細資訊。


DB2資料儲存的頁大小隻能在表空間級別統一指定(區別於Oracle,可以定義在表級別), 並且建好後不能修改。

可以手工建立一個頁大小為4K的DMS使用者臨時表空間,然後把系統預設的SMS系統臨時表空間刪除。為滿足應用需求,一般還應再建立一個頁大小在8K以上的使用者臨時表空間。

DB2 UDB V8.1 對RedHat Linux 9 的支援不好,預設情況下無法啟動GUI安裝程式(可以通過設定環境LD_ASSUME_KERNEL=2.2.5解決),並且不會安裝Sample資料庫,控制中心也無法正常啟動。


當使用COUNT()函式時,如果表中的記錄數 > 2 147 483 647行,則函式可能返回錯誤的結果,這時可以使用返回型別為DECIMAL(31, 0)的COUNT_BIG()函式。

DISTINCT 關鍵字可以用在COUNT()函式中,如:SELECT COUNT(DISTINCT id) FROM TABLE,這代表將不對id列的重複值進行計數。

ORDER BY子句後面如果寫了多個列名,需要分別指定升序或是降序。

可以在load大量資料時,暫時關閉表的日誌選項。使用:ALTER TABLE … ACTIVATE NOT LOGGED INITIALLY

DB2的幾個特殊暫存器:CURRENT DATE, CURRENT TIME, CURRENT TIMESTAMP, USER(使用者ID).

有關日期的操作:CURRENT TIMESTAMP + 2 DAYS(or HOURS, SECONDS, MONTHS, YEARS, etc.)

case 語句的使用:case when 條件一 then 動作一 else 動作二 end; 可以欠套使用。

在檢視的建立語句中無法使用order by 子句與 fetch n rows 子句。但對於order by可以用如下方法替代實現,不過會影響效率。
create view v_name1(c1, c2, c3) as
select * from (
select column1, column2, column3
from t1
order by column1 ) as t1;

表空間型別分為SMS和DMS,分別是system management space, database management space. SMS使用方便,簡單,無需手工建立和維護資料儲存檔案。DMS需要手動指定container和儲存資料的檔名,並保證有足夠磁碟空間可用。
對於一個數據庫,至少存在一個page size為4K的系統臨時表空間,可以額外建立具有更大page size的使用者臨時表空間,系統會自動進行使用。

無法用alter語句更改一個欄位的資料型別,對某些欄位可以更改資料長度,這一點上相對於Oracle,DB2的限制要多一些。
可以使用: select 表示式 from sysibm.sysdummy; 替代的,以下語句是等價的:values 表示式;


表和檢視的建立、更新、刪除操作,都寫日誌,因此可以commit或rollback。

在update語句中,如果沒有對定義了預設值的某個欄位顯式賦值,則更新時,此欄位不會重新執行預設值中定義的表示式。為了讓其重新執行預設值定義的表示式,可以採用以下方式:
create table t1 (c1 varchar(32), lastupdatetime with default current timpstamp);
update t1 set c1 = ‘new string’, lastupdatetime = default;


對於DB2資料庫可以在建立時指定codepage引數,建立後不可修改。當應用程式訪問資料庫時,DB2會比較兩者的codepage是否一致,不一致則進行內碼表的自動轉換。為了減少轉換所帶來的開銷,應儘量保證應用程式所採用的內碼表與資料庫一致。

可以對DB2 CLP工具的codepage進行設定,使用:db2set DB2CODEPAGE= 1386,本例中設定的是中文GBK字符集在Windows平臺對應的值。注意,這個數字值是由DB2自己定義的。有關各種字符集在相應平臺所對應的內碼表值可在IBM網站查詢。

在DB2 CLP中,對遠端資料庫編目的操作:
DB2 CATALOG TCPIP NODE local_node_name REMOTE hostname|ip SERVER service_name 首先把遠端主機對映為本地節點,節點名自己指定,本例採用TCPIP連線。service_name一般定義在遠端主機的/etc/services檔案中。
DB2 CATALOG DATABASE db_name AS local_alias AT local_node_name USER username USING password 然後把已知的遠端主機的資料庫對映到本地別名,注意本地別名在主機級別不能重複。節點名指定上面剛編目的節點。
DB2 CONNECT TO local_alias USER username USING password 用剛才編目中定義的別名連線遠端主機資料庫
DB2 GET CONFIGURATION SHOW DETAIL 獲取資料庫詳細配置資訊

對於DB2返回的錯誤號,可以用以下方法查閱說明(以sql 10008為例):
db2 ? sql10008


資料庫的備份與恢復:

使用備份與恢復工具可以完成在不同的伺服器見完整的轉移資料庫的工作,命令列方式如下:

備份
DB2 BACKUP DATABASE db_name USER user_name USING password to backup_dir_name
DB2 BACKUP DATABASE dlhdb USER dlh USING admindlh TO d:\backups

恢復
DB2 RESTORE DATABASE source_db_name USER user_name USING password FROM backup_dir_name TAKEN AT backup_file_create_time TO driver_letter INTO new_db_name
DB2 RESTORE DATABASE dlhdb USER dlh USING admindlh FROM d:\backups TAKEN AT 20031209141056 TO d: INTO newdb

有關例項的操作:
設定預設例項環境變數
DB2 SET DB2INSTANCE=inst_name
啟動當前例項
DB2START
停止當前例項
DB2STOP [FORCE]
連線到某個例項
DB2 ATTACH TO ANSTANCE inst_name
獲取例項的配置引數
DB2 GET DBM CFG SHOW DETAIL


匯出資料庫完整的定義到指令碼檔案,包括表,檢視,函式,資料庫引數等
db2look -d sample(資料庫) -a -e -l -x -m -f -o(引數)samplesql.out(輸出檔案)


load 一個表的資料時,有可能導致表空間處於backup pending(0x0020)狀態。比如把整形資料load到double型的欄位中。
處於backup pending狀態的表空間不能被訪問。
可以通過對此表空間執行一次backup操作,恢復到正常狀態(0x0)。

對於自增欄位,可以通過兩種方式指定:
generated by default as identity
generated always as identity
區別是,第一種方式在插入資料時允許手工指定自增欄位的值,只要不重複即可,並且資料庫會自動設定下一個值;
第二種方式則不允許指定,只能由資料庫自動分配並插入。


DB2 sql語句中轉義符的使用:
select * from t1 where a like ‘%abc\%def’ escape ‘\’;

建立資料庫時,出現SQL1043C錯誤,可能的問題:
指定容器所在的磁碟空間不足,
當容器為file型別時,後面的long-num引數不對,比如25600代表256Mb,但如果指定256則會導致以上錯誤。


平臺 RH Linux 8
DB2 UDB v8.1
在WAS 5中建立到db2的資料來源,但連線失敗,返回以下錯誤:
[Servlet Error]-[SQLConnect]: java.lang.UnsatisfiedLinkError: SQLConnect
原因是沒有為執行was服務的使用者設定以下環境變數:
LD_LIBRARY_PATH
LIBPATH
DB2INSTANCE

以上環境變數定義在
INSTHOME/sqllib/db2profile<br>shstopServer.shservername<br>.
INSTHOME/sqllib/db2profile
sh startServer.sh servername
也可以把db2profile放到was啟動指令碼中首先執行。

如果只設置了LD_LIBRARY_PATH,LIBPATH兩個環境變數,DB2會返回以下錯誤:
CLI0600E Invalid connection handle or connection is closed.
SQLSTATE S1000


對應於Oracle的Job包功能,DB2通過一個GUI工具-任務中心(task center)實現。使用任務中心前需要進行必要的工具設定,需要建立一些資料庫物件,可以建立在已有的一個數據庫中,也可以單獨建立一個數據庫。通過以下命令實現:
create catalog tools schema_name create new database db_name
此命令為編目工具建立一個名為db_name 的資料庫,並指定了一個模式名。
注意:無法用using 子句指定一個codeset,系統會預設使用ISO8859-1字符集。


Quest Center for DB2帶有資料庫效能診斷功能,動態監視db記憶體,磁碟io, 表空間,負載等等。

DB2客戶端的型別:
DB2執行時客戶端 DB2 Runtime Client
DB2管理客戶端 DB2 Administrator Client(包含執行時客戶端的所有內容)
DB2應用程式開發客戶端 DB2 Application Development Client(包含管理客戶端的所有內容)
DB2瘦客戶端 DB2 Thin Client

DB2 Relational Connect 聯邦資料庫,用於連線異種資料庫。

db2idrop -f instance_name 強制斷開已有連線,停止例項並刪除。
db2imigr instance_name 用於在UNIX下遷移例項。
db2iupdt instance_name 更新例項,用於例項獲得一些新的產品選項或修訂包的訪問權。
db2 get instance 獲取當前所處的例項。

當更新例項級別或資料庫級別的引數後,有些可以立即生效,有些需要重新啟動例項才可生效。immediate 顯式指明更改立即生效,deferred 顯式指明更改在重起例項後生效。


當需要配置許多臺客戶機與DB2伺服器的連線時,可以用配置助手將伺服器的概要檔案匯出,然後在每個客戶機使用配置助手匯入概要檔案。若客戶端只安裝了執行時客戶端,則可以使用
db2cfimp access_profile_name
匯入概要檔案。
疑問:是否應該由已配置好的一臺客戶機匯出概要檔案?

db2 list applications 列出所有的資料庫連線
db2 force application (2) 終止指定的連線控制代碼,事務被中斷並回滾。同時操作多個控制代碼可以用逗號分開,或者指定關鍵字 all。此命令只終止指定的連線,不會阻止新的應用連線到資料庫。


建立資料庫時可以指定排序方式:collate using identity

系統模式集是和每個資料庫一起建立的,並且它們被放置到 SYSCATSPACE 表空間中:
SYSIBM:
基本系統目錄
建議不要進行直接訪問
SYSCAT:
PUBLIC 被授予該模式的 SELECT 許可權
對只讀檢視編目
這是獲取目錄資訊的推薦方式
SYSSTAT:
可更新的目錄檢視 - 影響優化器
SYSFUN:
使用者定義的函式

如果表中的現有行不滿足約束,則不能定義該約束。可以關閉約束檢查以加快大量資料的新增,但是該表處於檢查暫掛(CHECK PENDING)狀態。


在建立表時,可以使用選項來指定一個或多個表空間,表和索引將被放置到其中:
CREATE TABLE TEST (
column 1 definition, column 2 definition, …
) IN <tablespace name> INDEX IN <index space name>
這條命令為您提供了一個選項:指定建立表和索引的位置。如果沒有指定單獨的索引表空間,那麼將在表所在的同一表空間中建立索引。建立表之後,就沒有機會在不同的表空間中建立索引了。建立索引要提前作規劃!
CREATE <UNIQUE> INDEX <index name> ON <table name>
(
column 1 <ASC | DESC> ,
column 2 <ASC | DESC> …
)
UNIQUE 屬性告訴 DB2,索引必須強制所有插入值的唯一性。
如果結果集是以升序和降序兩種方式排序的,ALLOW REVERSE SCANS 會告訴 DB2 在索引中包括附加的指標,以允許在記錄中有效地進行正向和反向連結。

DB2 能夠向正在建立的索引中新增另外的列。CREATE INDEX 命令允許使用者指定那些不屬於實際索引但因為效能原因而儲存在索引記錄中的列。
CREATE UNIQUE INDEX ON EMPLOYEE (EMPNO) INCLUDE (LASTNAME,FIRSTNAME)
對於索引中包含的列而言,索引必須是 UNIQUE 的。當建立索引時,另外的列被新增到索引值中。索引不使用這些值進行排序或確定唯一性,但可以在滿足 SQL 查詢時使用它們。例如,下列 SELECT 語句將不需要讀取實際資料行:
SELECT LASTNAME, FIRSTNAME FROM EMPLOYEE WHERE EMPNO < ‘000300’

要在表上建立群集索引,將 CLUSTER 關鍵字附加到 CREATE INDEX 命令的末尾,例如:
CREATE INDEX DEPTS-IX ON EMPLOYEE(WORKDEPT) CLUSTER

使用下列通用規則來決定為表定義的索引的經典數量。索引數量取決於資料庫的主要用途:
對於線上事務處理(OLTP)環境,建立一到兩個索引。
對於混合查詢和 OLTP 環境,建立兩到五個索引。
對於只讀查詢環境,建立五個以上索引。


在Windows平臺上的DB2的命令列模式下,或者在類Unix平臺下,使用命令db2cc啟動控制中心。

db2move提供了在資料庫之間批量移動資料的能力,可以指定某個表,也可以指定整個資料庫的表。
db2move dbname action

action 可以指定為:export, import或者load
使用 -l 引數指定lob物件儲存的資料夾


執行增量備份要求設定資料庫配置引數“trackmod”的值為“YES”
執行線上備份要求設定資料庫配置引數“logretain”的值為“YES”,線上備份語法:
db2 backup db dbname online to path


當刪除了das使用者的home目錄,未先drop掉das服務,則再執行dasdrop則不成功,提示:
db2admin 命令無法找到,原因是db2admin命令儲存在das的home目錄中。
可以刪除乾淨das使用者的home目錄後,重起伺服器解決此問題。

dasupdt dasName 升級das
db2iupdt instName 升級例項
db2licd end 停止許可證守護程序

在Linux系統安裝DB2 V8.1後,db2fmcd程序會自動啟動,即使不啟動例項和DAS,

在中文Linux環境下安裝了DB2資料庫服務,並使用GBK內碼表(codepage)建立了一個數據庫,完成後可以正常連線操作,若更改作業系統內碼表為英語,則使用“db2 connect”時會報錯,連線時無法轉換內碼表