DB2 UDB V8.1 管理

在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;

表空間類型分爲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 聯邦數據庫,用於連接異種數據庫。

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”時會報錯,連接時無法轉換代碼頁

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章