在DB2中有關實例(Instance), 數據庫(Database),表空間(TableSpace),容器(Container)等概念:
在一個操做系統中,DB2數據服務能夠同時運行多個實例(有別於Oracle在一個系統內只能起一個實例),數據庫定義在實例中,一個實例能夠包含多個數據庫。在同一個實例中的不一樣數據庫是徹底獨立的,分別擁有本身獨立的系統編目表。
表空間分爲DMS方式和SMS(System manegement Space)方式,定義在數據庫中,一個數據庫中必須存在兩個系統基本的表空間,分別是系統編目表空間(SysCatSpace)與系統臨時表空間(SysTempSpace)。在數據庫中建立的任何對象都以在系統編目表空間中增長記錄的方式體現,對於臨時表空間,其佔用磁盤大小是根據使用狀況動態伸縮的,即僅在須要時才分配磁盤空間,並在使用後進行回收。此外,若用戶須要建立表,則須要建立用戶表空間(UserSpace),若須要使用臨時表,則須要建立用戶臨時表空間(UserTempSpace)。
DMS與SMS類型在表空間創建時指定,建好後不能轉換。對於DMS方式,一個表空間對應了一個或多個容器(Container),容器指定了數據的物理存儲位置。對於SMS方式,只可以指定一個目錄,不可以增長。
容器分爲三種類型,前兩種是文件與設備,用於DMS方式的表空間;還有一種是目錄,用於SMS方式的表空間,此種方式不須要人工管理數據存儲文件,DB2可根據狀況在目錄中自動增長存儲文件,只要磁盤空間容許。實質上,表空間是數據存儲的邏輯位置定義,容器則是數據存儲的物理位置定義。
影響一個數據庫的性能主要有如下因素:磁盤(Disk), 內存(Memory), 處理器(CPU), 網絡(Network)。其中以磁盤最爲顯著,90%的性能瓶頸可能來自於磁盤的IO競爭;其次是內存,一方面是指物理內存的總量要知足需求,另外一方面是指與內存相關的配置參數應正確配置;固然處理器的性能也很重要,多路CPU會對哪些依賴計算能力的複雜SQL查詢起到顯著的效果;網絡不屬於主要因素,屬於客觀的環境因素,是指過慢的網速會對數據的傳輸形成影響。如下列出一些對於提升數據庫性能有效的方法:
對於運行數據庫服務的服務器能夠儘量的配置多塊物理磁盤,每塊的容量沒必要太大,這樣能夠有效的分擔數據存儲與讀取操做過程的磁盤IO競爭。即採用多塊小容量的磁盤在性能上要優於僅採用一塊大容量的磁盤。
若是條件容許,儘可能使數據存儲服務與操做系統分別運行在物理分開的磁盤上。
採用DMS(Database Management Space)管理方式的表空間。
在物理不一樣的磁盤上建立多個表空間。而後能夠將數據和索引分別存放在不一樣的表空間,這樣能夠顯著的提升性能。還能夠把一個使用頻繁的大表縱向拆成多個小表,分別存放在不一樣的表空間中,而後用一個視圖進行聯合。
DB2服務器能夠管理裸設備,即除系統以及DB2服務運行磁盤之外,爲DB2數據存放單獨準備磁盤,能夠是多塊,分區後不須要格式化,建立裸設備後直接交給DB2進行管理,用於存儲數據。
系統的臨時表空間對數據庫性能影響很大,當由管理的物理內存不能知足數據庫操做的須要時,DB2便會把臨時數據寫到磁盤上,這時便用到了系統臨時表空間,而且這種狀況會常常發生。
儘可能在磁盤靠近最內層磁道的位置安放數據,由於此處磁盤的訪問速度較快。
DB2的參數配置分爲兩個級別,一個是實例級別,另外一個是數據庫級別。對數據服務性能影響較大的參數主要在數據庫級別配置。如下是三個比較重要的內存配置參數:
bufferpage: 由同一個數據庫中的全部對象共享。
sortheap: 用於排序的內存交換區,非共享,不宜設置太大,不然,很容易引發內存耗盡,由於每個事務都會申請獨立的內存用於排序。
locklist: 共享內存,用於記錄數據服務運行中創建的鎖。建議設置20Mb左右,須要時根據實際狀況進行調整。DB2默認使用行級鎖,若是設置過小,當鎖的記錄太多時,則會致使內存不足,此時DB2會把多個行鎖升級爲一個表鎖,這樣就會大大下降應用程序的併發性能。若是設置太大,則多分配的內存不多會被用到,致使浪費。
其餘的一些配置參數:
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;java
表空間類型分爲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文件中,能夠採用的解決方案:
sh stopServer.sh servername
. $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 聯邦數據庫,用於鏈接異種數據庫。node
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」時會報錯,鏈接時沒法轉換代碼頁sql