中科永聯高級技術培訓中心(www.itisedu.com)
DB2是IBM一種分散式資料庫解決方案。說簡單點:DB2就是IBM開發的一種大型關係型資料庫平台.它支持多用戶或套用程式在同一條SQL 語句中查詢不同database甚至不同DBMS中的數據。目前,DB2有如下一些版本:(比如DB2 for Unix,DB2 for Windows,DB2 for AS/400,DB2 for OS/390等)
DB2是IBM公司開發的關係資料庫管理系統,它有多種不同的版本,如:DB2工作組版(DB2Workgroup Edition)、DB2企業版(DB2 Enterprise Edition)、DB2個人版(DB2 Personal Edition)和DB2企業擴展版(DB2 Enterprise-Exended Edition)等,這些產品基本的數據管理功能是一樣的,區別在於支持遠程客戶能力和分散式處理能力。
個人版適用於單機使用,即伺服器只能由本地應用程式訪問。工作組版和企業版提供了本地和遠程客戶訪問DB2的功能(當然遠程客戶要安裝相應客戶應用程式開發部件),企業版包括工作組版中的所有部件外再增加對主機連線的支持。企業擴展版允許將一個大的資料庫分布到同一類型的多個不同計算機上,這種分散式功能尤其適用於大型資料庫的處理。
DB2可運行在OS/2、Windows NT、UNIX作業系統上,通常將運行在這些平台上的DB2產品統稱為DB2通用資料庫,這主要是強調這些產品運行環境類似,並共享相同的原始碼。DB2通用資料庫主要組件包括資料庫引擎(Dalabase Engine )應用程式接口和一組工具。資料庫引擎提供了關係資料庫管理系統的基本功能,如管理數據、控制數據的訪問(包括並發控制)、保證數據完整性及數據安全。所有數據訪問都通過SQL接口進行。
db2起源於system r和system r*。他支持從pc到unix,從中小型機到大型機;從ibm到非ibm(hp及sun unix系統等)各種操作平台。他既可以在主機上以主/從方式獨立運行,也可以在客戶/伺服器環境中運行。其中服務
平台可以是os/400,aix,os/2,hp-unix,sun-solaris等作業系統,客戶機平台可以是os/2或windows, dos, aix, hp-ux, sun solaris等作業系統。
一、db2核心資料庫的特色
db2資料庫核心又稱作db2公共伺服器,採用多進程多線索體系結構,可以運行於多種作業系統之上,並分別根據相應平台環境作了調整和最佳化,以便能夠達到較好的性能。
(1) 支持面向對象的編程
db2支持複雜的數據結構,如無結構文本對象,可以對無結構文本對象進行布爾匹配、最接近匹配和任意匹配等搜尋。可以建立用戶數據類型和用戶自定義函式。
(2) 支持多媒體應用程式
db2支持大二分對象(blob),允許在資料庫中存取二進制大對象和文本大對象。其中,二進制大對象可以用來存儲多媒體對象。
(3) 備份和恢復能力
(4) 支持存儲過程和觸發器,用戶可以在建表時顯示的定義複雜的完整性規則
(5) 支持的矽sql查詢
(6) 支持異構分散式資料庫訪問
(7) 支持數據複製
二、開發工具
ibm提供了許多開發工具,主要有visualizer query, visualage, visualgen。
visualizer是客戶/伺服器環境中的集成工具軟體,主要包括visualizer query可視化查詢工具,visualizer ultimedia query可視化多媒體查詢工具,visualizer chart可視化圖示工具,visualizer procedure可視化過程工具,visualizer statistics可視化統計工具,visualizer plans可視化規劃工具, visualizer development可視化開發工具。
visualage是一個功能很強的可視化的面向對象的套用開發工具,可翼大幅度的提高軟體開發效率。其主要特徵有:
(1) 可視化程式設計工具。
(2) 部件庫。包括支持圖形用戶接口的預製不見,以及包含資料庫查詢、事務和本地、遠程函式的通用部件。
(3) 關係資料庫支持。
(4) 群體程式設計。
(5) 支持增強的動態連線庫。
(6) 支持多媒體。
(7) 支持數據共享。
visualgen是ibm所提供的高效開發方案中的重要組成部分。它集成了第四代語言、客戶/伺服器與面向對象技術,給用戶提供了一個完整、高效的開發環境。
三、DB2資料庫的安裝
這是在IBM RS6000 作業系統為AIX安裝的,HP9000上雷同
1. 註冊為具有超級用戶許可權的用戶(root)
2. 將 標有“DB2通用資料庫企業版”的軟體光碟插入驅動器
3. 輸入如下命令,以創建一個目錄來安裝該 CD-ROM:
# mkdir -p /cdrom 其中 cdrom 表示 CD-ROM 安裝目錄。
輸入如下命令,來分配 CD-ROM 檔案系統:
# smitty storage
4. 選擇檔案系統
5. 選擇添加/更改/顯示/刪除檔案系統
6. 選擇 CDROM 檔案系統
7. 選擇添加 CDROM 檔案系統
8. 在彈出視窗中,輸入如下項作為安裝點:
/cdrom
9. 通過輸入以下命令來安裝 CD-ROM 檔案系統: smit mountf
10. 在檔案系統名稱欄位中輸入值。例如,該名稱可能是 /dev/cd0。
11. 在安裝目錄欄位中輸入值。例如,此值可能是 /cdrom。
12. 將安裝為唯讀系統設定為 Yes。
13. 單擊確定。
14. cd /cdrom
15. 輸入 ./db2setup 命令以啟動 DB2 安裝程式。 安裝 DB2 V6 視窗打開。
16. 按 Tab 鍵更改突出顯示的選項,按 Enter 鍵選擇或取消選擇選項。
(1) 在伺服器上安裝,一般選擇安裝以下三個產品:
注意:要顯示想要安裝的 DB2 產品的部件,選擇定製。要在任何時候返回至先前視窗,選擇取消。
DB2 Administration Client
選擇定製安裝這個產品,
DB2 udb enterprise edition
選擇定製安裝這個產品,
DB2 Software Developer Kit
如果同時做開發,需要定製安裝此產品。
(2) 在“DB2產品信息”和“DB2產品庫”只選擇中國語言ZH_CN支持。
17. 在16步確認後,將開始安裝資料庫程式。在安裝過程中,還需確認以下問題:
(1) 是否建立DB2管理帳戶, 一般選擇建立:
按預設建立db2管理用戶db2as(使用預設的UID,Group Id,安裝home路徑),在語言支持上,
只選擇中國語言ZH_CN支持。
(2) 是否建立DB2的實例, 一般選擇建立:
按預設建立db2管理用戶db2inst1:db2iadm1(使用預設的UID,Group Id,安裝home路徑),
在語言支持上,只選擇中國語言ZH_CN支持。
按預設建立db2用戶db2fenc1:db2fenc1(使用預設的UID,Group Id,安裝home路徑),
在語言支持上,只選擇中國語言ZH_CN支持。
是否建立sample資料庫(為了檢查資料庫的安裝是否正確,一般選擇建立sample資料庫)
是否選擇DB2的實例進程在作業系統啟動時,自動執行初始化
如果在獨立伺服器上安裝使用,可選擇autostart,但在aix+HACMP+db2的雙機共享環境中,不要選擇
autostart,DB2實例進程的啟動,由hacmp來控制。
18. 安裝結果:
資料庫程式安裝完成後,DB2的軟體程式安裝在/usr/lpp目錄中,
DB2DIR = /usr/lpp/DB2_06_01
注意:如果安裝過程中沒有指定建立實例和管理帳戶,在安裝完成後可以使用命令創建實例(db2icrt)。
或者要創建或添加新的實例、“管理伺服器”或其他 DB2 產品和部件,輸入如下命令:
/usr/lpp/DB2_06_01/install/DB2setup
19. 驗證安裝
在安裝時若沒有選擇建立sample資料庫,在安裝完成後可以通過命令(db2sampl)創建 SAMPLE 資料庫,
並通過使用命令行處理器與該資料庫相連來驗證安裝:
(1) 作為具有系統管理 (SYSADM) 許可權的用戶向系統註冊。如:db2inst1
(2) 輸入 DB2sampl 命令以便創建 SAMPLE 資料庫。
(3) 創建 SAMPLE 資料庫時,用資料庫別名 SAMPLE 將它自動編目。
(4) 輸入 DB2start 命令命令來與 SAMPLE 資料庫相連,檢索在部門 20 中工作的所有雇員的列表,並重設資料庫連線:
DB2 connect to sample
DB2 "select * from staff where dept = 20"
DB2 connect reset
注意:在驗證安裝後,可除去 SAMPLE 資料庫以釋放磁碟空間。輸入 DB2 drop database sample 命令
來卸下 SAMPLE 資料庫。
若尚未未安裝 DB2 工具,則您可以通過創建 SAMPLE 資料庫, 並通過使用命令行處理器與該資料庫
相連來驗證安裝,如下所示:
步驟 1.
作為具有系統管理 (SYSADM) 許可權的用戶向系統註冊。
步驟 2.
輸入 db2sampl 命令以便創建 SAMPLE 資料庫。
創建 SAMPLE 資料庫時, 用資料庫別名 SAMPLE 將它自動編目。
步驟 3.
輸入 db2start 命令以啟動資料庫管理程式。
步驟 4.
輸入下列命令來與 SAMPLE 資料庫相連, 檢索在部門 20 中工作的所有雇員的列表,並重設資料庫連線:
db2 connect to sample
db2 "select * from staff where dept = 20"
db2 connect reset
如以上命令均正確執行, 則證明DB2 UDB 資料庫伺服器的安裝已經成功完成.
四、DB2資料庫的備份和恢復
最近,我恢復了一個資料庫.其中的辛苦不予言表,我想寫出自己用到的一些語句,和遇到相同問題的xdjm共勉。
首先談db2資料庫的備份,我用的是backup命令。
db2 backup database 資料庫名(我的庫是jsdb)
忘了說了,在backup之前需要停止你要備份的資料庫,我用了db2stop force(之所以用force參數是因為這樣好停懶省事:)和db2start。這樣就保證可以成功backup了。
備份完成後db2會告訴你一個時間戳,例如:20040831(之後好幾位)這樣就會在當前目錄下產生一個與你資料庫名相同的資料夾名例如:jsdb。這個資料夾目錄層次很重要,如果錯了會在恢復時提示找不到檔案。
備份完成以後就是恢復了,我用的是restore命令。
db2 restore database 資料庫名(jsdb)taken at 時間戳(20040831)
執行這個語句要注意兩點:1,要把備份資料夾考到當前目錄下(我用了一個cd c:\命令設當前目錄為c盤,將jsdb資料夾考到c盤根目錄下);2,時間戳要和jsdb目錄中的一致。
這樣,就完成了恢複數據庫了。
五、DB2編程式技巧
1 DB2編程
1.1 建存儲過程時Create 後一定不要用TAB鍵
CREATE PROCEDURE
的create後只能用空格,而不可用tab健,否則編譯會通不過。
切記,切記。
1.2 使用臨時表
要注意,臨時表只能建在user tempory tables space 上,如果database只有system tempory table space是不能建臨時表的。
另外,DB2的臨時表和sybase及oracle的臨時表不太一樣,DB2的臨時表是在一個session內有效的。所以,如果程式有多執行緒,最好不要用臨時表,很難控制。
建臨時表時最好加上 with replace選項,這樣就可以不顯示的drop 臨時表,建臨時表時如果不加該選項而該臨時表在該session內已創建且沒有drop,這時會發生錯誤。
1.3 從數據表中取指定前幾條記錄
select * from tb_market_code fetch first 1 rows only
但下面這種方式不允許
select market_code into v_market_code
from tb_market_code fetch first 1 rows only;
選第一條記錄的欄位到一個變數以以下方式代替
declare v_market_code char(1);
declare cursor1 cursor for select market_code from tb_market_code
fetch first 1 rows only for update;
open cursor1;
fetch cursor1 into v_market_code;
close cursor1;
1.4 游標的使用
注意commit和rollback
使用游標時要特別注意如果沒有加with hold 選項,在Commit和Rollback時,該游標將被關閉。Commit 和Rollback有很多東西要注意。特別小心
游標的兩種定義方式
一種為
declare continue handler for not found
begin
set v_notfound = 1;
end;
declare cursor1 cursor with hold for select market_code from tb_market_code for update;
open cursor1;
set v_notfound=0;
fetch cursor1 into v_market_code;
while v_notfound=0 Do
--work
set v_notfound=0;
fetch cursor1 into v_market_code;
end while;
close cursor1;
這種方式使用起來比較複雜,但也比較靈活。特別lback 而要保持該cursor不被關閉,只能使用這種方式。
另一種為
pcursor1: for loopcs1 as cousor1 cursor as
select market_code as market_code
from tb_market_code
for update
do
end for;
這種方式的優點是比較簡單,不用(也不允許)使用open,fetch,close。
但不能使用with hold 選項。如果在游標循環內要使用commit,rollback則不能使用這種方式。如果沒有commit或rollback的要求,推薦使用這種方式(看來For這種方式有問題)。
修改游標的當前記錄的方法
update tb_market_code set market_code="0" where current of cursor1;
不過要注意將cursor1定義為可修改的游標
declare cursor1 cursor for select market_code from tb_market_code
for update;
for update 不能和GROUP BY、 DISTINCT、 ORDER BY、 FOR READ ONLY及UNION, EXCEPT, or INTERSECT但 UNION ALL除外)一起使用。
1.5 類似decode的轉碼操作
oracle中有一個函式 select decode(a1,'1','n1','2','n2','n3') aa1 from
db2沒有該函式,但可以用變通的方法
select case a1
when '1' then 'n1'
when '2' then 'n2'
else 'n3'
end as aa1 from
1.6 類似CHARINDEX查找字元在字串中的位置
Locate(‘y’,’dfdasfay’)
查找’y’ 在’dfdasfay’中的位置。
1.7 類似datedif計算兩個日期的相差天數
days(date(‘2001-06-05’)) – days(date(‘2001-04-01’))
days 返回的是從 0001-01-01 開始計算的天數
1.8 寫UDF的例子
C寫見sqllib\samples\cli\udfsrv.c
1.9 創建含identity值(即自動生成的ID)的表
建這樣的表的寫法
CREATE TABLE test
(t1 SMALLINT NOT NULL
GENERATED ALWAYS AS IDENTITY
(START WITH 500, INCREMENT BY 1),
t2 CHAR(1));
在一個表中只允許有一個identity的column.
1.10 預防欄位空值的處理
SELECT DEPTNO ,DEPTNAME ,COALESCE(MGRNO ,'ABSENT'),ADMRDEPT
FROM DEPARTMENT
COALESCE函式返回()中表達式列表中第一個不為空的表達式,可以帶多個表達式。
和oracle的isnull類似,但isnull好象只能兩個表達式。
1.11 取得處理的記錄數
declare v_count int;
update tb_test set t1=’0’
where t2=’2’;
--檢查修改的行數,判斷指定的記錄是否存在
get diagnostics v_ count=ROW_COUNT;
只對update,insert,delete起作用.
不對select into 有效
1.12 從存儲過程返回結果集(游標)的用法
1、建一sp返回結果集
CREATE PROCEDURE DB2INST1.Proc1 ( )
LANGUAGE SQL
result sets 2(返回兩個結果集)
------------------------------------------------------------------------
-- SQL 存儲過程
------------------------------------------------------------------------
P1: BEGIN
declare c1 cursor with return to caller for
select market_code
from tb_market_code;
--指定該結果集用於返回給調用者
declare c2 cursor with return to caller for
select market_code
from tb_market_code;
open c1;
open c2;
END P1
2、建一SP調該sp且使用它的結果集
CREATE PROCEDURE DB2INST1.Proc2 (
out out_market_code char(1))
LANGUAGE SQL
------------------------------------------------------------------------
-- SQL 存儲過程
------------------------------------------------------------------------
P1: BEGIN
declare loc1,loc2 result_set_locator varying;
--建立一個結果集數組
call proc1;
--調用該SP返回結果集。
associate result set locator(loc1,loc2) with procedure proc1;
--將返回結果集和結果集數組關聯
allocate cursor1 cursor for result set loc1;
allocate cursor2 cursor for result set loc2;
--將結果集數組分配給cursor
fetch cursor1 into out_market_code;
--直接從結果集中賦值
close cursor1;
END P1
3、動態SQL寫法
DECLARE CURSOR C1 FOR STMT1;
PREPARE STMT1 FROM
'ALLOCATE C2 CURSOR FOR RESULT SET ?';
4、注意:
一、 如果一個sp調用好幾次,只能取到最近一次調用的結果集。
二、 allocate的cursor不能再次open,但可以close,是close sp中的對應cursor。
1.13 類型轉換函式
select cast ( current time as char(8)) from tb_market_code
1.14 存儲過程的互相調用
目前,c sp可以互相調用。
Sql sp 可以互相調用,
Sql sp 可以調用C sp,
但C sp 不可以調用Sql sp(最新的說法是可以)
1.15 C存儲過程參數注意
create procedure pr_clear_task_ctrl(
IN IN_BRANCH_CODE char(4),
IN IN_TRADEDATE char(8),
IN IN_TASK_ID char(2),
IN IN_SUB_TASK_ID char(4),
OUT OUT_SUCCESS_FLAG INTEGER )
DYNAMIC RESULT SETS 0
LANGUAGE C
PARAMETER STYLE GENERAL WITH NULLS(如果不是這樣,sql 的sp將不能調用該用c寫的存儲過程,產生保護性錯誤)
NO DBINFO
FENCED
MODIFIES SQL DATA
EXTERNAL NAME 'pr_clear_task_ctrl!pr_clear_task_ctrl'@
1.16 存儲過程fence及unfence
fence的存儲過程單獨啟用一個新的地址空間,而unfence的存儲過程和調用它的進程使用同一個地址空間。
一般而言,fence的存儲過程比較安全。
但有時一些特殊的要求,如要取調用者的pid,則fence的存儲過程會取不到,而只有unfence的能取到。
1.17 SP錯誤處理用法
如果在SP中調用其它的有返回值的,包括結果集、臨時表和輸出參數類型的SP,
DB2會自動發出一個SQLWarning。而在我們原來的處理中對於SQLWarning都
會插入到日誌,這樣子最後會出現多條SQLCODE=0的警告信息。
處理辦法:
定義一個標誌變數,比如DECLARE V_STATUS INTEGER DEFAULT 0,
在CALL SPNAME之後, SET V_STATUS = 1,
DECLARE CONTINUE HANDLER FOR SQLWARNING
BEGIN
IF V_STATUS <> 1 THEN
--警告處理,插入日誌
SET V_STATUS = 0;
END IF;
END;
1.18 import用法
db2 import from gh1.out of DEL messages err.txt insert into db2inst1.tb_dbf_match_ha
注意要加schma
1.19 values的使用
如果有多個 set 語句給變數付值,最好使用values語句,改寫為一句。這樣可以提高效率。
但要注意,values不能將null值付給一個變數。
values(null) into out_return_code;
這個語句會報錯的。
1.20 給select 語句指定隔離級別
select * from tb_head_stock_balance with ur
1.21 atomic及not atomic區別
atomic是將該部分程式塊指定為一個整體,其中任何一個語句失敗,則整個程式塊都相當於沒做,包括包含在atomic塊內的已經執行成功的語句也相當於沒做,有點類似於transaction。
2 DB2編程性能注意
2.1 大數據的導表
應該是export後再load性能更好,因為load不寫日誌。
比select into 要好。
2.2 SQL語句儘量寫複雜SQL
儘量使用大的複雜的SQL語句,將多而簡單的語句組合成大的SQL語句對性能會有所改善。
DB2的SQL Engieer對複雜語句的最佳化能力比較強,基本上不用當心語句的性能問題。
Oracle 則相反,推薦將複雜的語句簡單化,SQL Engieer的最佳化能力不是特別好。
這是因為每一個SQL語句都會有reset SQLCODE和SQLSTATE等各種操作,會對資料庫性能有所消耗。
一個總的思想就是儘量減少SQL語句的個數。
2.3 SQL SP及C SP的選擇
首先,C的sp的性能比sql 的sp 的要高。
一般而言,SQL語句比較複雜,而邏輯比較簡單,sql sp 與 c sp 的性能差異會比較小,這樣從工作量考慮,用SQL寫比較好。
而如果邏輯比較複雜,SQL比較簡單,用c寫比較好。
2.4 查詢的最佳化(HASH及RR_TO_RS)
db2set DB2_HASH_JOIN=Y (HASH排序最佳化)
指定排序時使用HASH排序,這樣db2在表join時,先對各表做hash排序,再join,這樣可以大大提高性能。
劇沈剛說做實驗,7個一千萬條記錄表的做join取10000條記錄,再沒有索引的情況下 72秒。
db2set DB2_RR_TO_RS=Y
該設定後,不能定義RR隔離級別,如果定義RR,db2也會自動降為RS.
這樣,db2不用管理Next key,可以少管理一些東西,這樣可以提高性能。
2.5 避免使用count(*) 及exists的方法
1、首先要避免使用count(*)操作,因為count(*)基本上要對表做全部掃描一遍,如果使用很多會導致很慢。
2、exists比count(*)要快,但總的來說也會對表做掃描,它只是碰到第一條符合的記錄就停下來。
如果做這兩中操作的目的是為
select into 服務的話,就可以省略掉這兩步。
直接使用select into 選擇記錄中的欄位。
如果是沒有記錄選擇到的話,db2 會將 sqlcode=100 和 sqlstate=’20000’
如果是有多條記錄的話,db2會產生一個錯誤。
程式可以創建 continue handler for exception
continue handler for not found
來檢測。
這是最快速的方法。
3、如果是判斷是不是一條,可以使用游標來計算,用一個計數器,累加,達到預定值後就離開。這個速度也比count(*) 要快,因為它只要掃描到預定值就不再掃描了,不用做全表的scan,不過它寫起來比較麻煩。
3 DB2表及sp管理
3.1 看存儲過程文本
select text from syscat.procedures where procname="PROC1";
3.2 看錶結構
describe table syscat.procedures
describe select * from syscat.procedures
3.3 查看各表對sp的影響(被哪些sp使用)
select PROCNAME from SYSCAT.PROCEDURES where SPECIFICNAME in(select dname from sysibm.sysdependencies where bname in ( select PKGNAME from syscat.packagedep where bname="TB_BRANCH"))
3.4 查看sp使用了哪些表
select bname from syscat.packagedep where btype="T" and pkgname in(select bname from sysibm.sysdependencies where dname in (select specificname from syscat.procedures where procname="PR_CLEAR_MATCH_DIVIDE_SHA"))
3.5 查看function被哪些sp使用
select PROCNAME from SYSCAT.PROCEDURES where SPECIFICNAME in(select dname from sysibm.sysdependencies where bname in ( select PKGNAME from syscat.packagedep where bname in (select SPECIFICNAME from SYSCAT.functions where funcname="GET_CURRENT_DATE")))
使用function時要注意,如果想drop 掉該function必須要先將調用該function的其它存儲過程全部drop掉。
必須先創建function,調用該function的sp才可以創建成功。
3.6 修改表結構
一次給一個表增加多個欄位
db2 "alter table tb_test add column t1 char(1) add column t2 char(2) add column t3 int"
4 DB2系統管理
4.1 DB2安裝
在Windows 98 下安裝db2 7.1 或其他版本,如果有Jdbc錯誤或者是Windwos 98不能啟動,則將autoexec.bat 中的內容用如下內容替換:
C:\PROGRA~1\TRENDP~1\pcscan.exe C:\ C:\WINDOWS\COMMAND\ /NS /WIN95
rem C:\WINDOWS\COMMAND.COM /E:32768
REM 【Header】
REM 【CD-ROM Drive】
REM 【Miscellaneous】
REM 【Display】
set PATH=%PATH%;C:\MSSQL\BINN;C:\PROGRA~1\SQLLIB\BIN;C:\PROGRA~1\SQLLIB\FUNCTION;C:\PROGRA~1\SQLLIB\SAMPLES\REPL;C:\PROGRA~1\SQLLIB\HELP
IF EXIST C:\PROGRA~1\IBM\IMNNQ\IMQENV.BAT CALL C:\PROGRA~1\IBM\IMNNQ\IMQENV.BAT
IF EXIST C:\PROGRA~1\IBM\IMNNQ\IMNENV.BAT CALL C:\PROGRA~1\IBM\IMNNQ\IMNENV.BAT
set DB2INSTANCE=DB2
set CLASSPATH=.;C:\PROGRA~1\SQLLIB\java\db2java.zip;C:\PROGRA~1\SQLLIB\java\runtime.zip;C:\PROGRA~1\SQLLIB\java\sqlj.zip;C:\PROGRA~1\SQLLIB\bin
set MDIS_PROFILE=C:\PROGRA~1\SQLLIB\METADATA\PROFILES
set LC_ALL=ZH_CN
set INCLUDE=C:\PROGRA~1\SQLLIB\INCLUDE;C:\PROGRA~1\SQLLIB\LIB;C:\PROGRA~1\SQLLIB\TEMPLATES\INCLUDE
set LIB=C:\PROGRA~1\SQLLIB\LIB
set DB2PATH=C:\PROGRA~1\SQLLIB
set DB2TEMPDIR=C:\PROGRA~1\SQLLIB
set VWS_TEMPLATES=C:\PROGRA~1\SQLLIB\TEMPLATES
set VWS_LOGGING=C:\PROGRA~1\SQLLIB\LOGGING
set VWSPATH=C:\PROGRA~1\SQLLIB
set VWS_FOLDER=IBM DB2
set ICM_FOLDER=信息目錄管理器
win
4.2 創建Database
create database head using codeset IBM-eucCN territory CN;
這樣可以支持中文。
4.3 手工做資料庫遠程(別名)配置
db2 catalog tcpip node node1 remote 172.28.200.200 server 50000
db2 catalog db head as test1 at node node1
然後既可使用:
db2 connect to test1 user … using …
連上head庫了
4.4 停止啟動資料庫實例
db2start
db2stop (force)
4.5 連線資料庫及看當前連線資料庫
連線資料庫
db2 connect to head user db2inst1 using db2inst1
當前連線資料庫
db2 connect
4.6 停止啟動資料庫head
db2 activate db head
db2 deactivate db head
要注意的是,如果有連線,使用deactivate db 不起作用。
如果是用activate db啟動的資料庫,一定要用deactivate db才會停止該資料庫。(當然如果是db2stop也會停止)。
使用activate db,這樣可以減少第一次連線時的等待時間。
Database如果不是使用activate db啟動而是通過連線資料庫而啟動的話,當所有的連線都退出後,db也就自動停止。
4.7 查看及停止資料庫當前的應用程式
查看應用程式:
db2 list applications show detail
授權標識 | 應用程式名 | 應用程式句柄 | 應用程式標識 | 序號# | 代理程式 | 協調程式 | 狀態 | 狀態更改時間 | DB 名 | DB 路徑| | 節點號 | pid/執行緒
其中:1、應用程式標識的第一部分是應用程式的IP位址,不過是已16進制表示的。
2、pid/執行緒即是在unix下看到的執行緒號。
停止應用程式:
db2 "force application(236)"
db2 “force application all”
其中:該236是查看中的應用程式句柄。
4.8 查看本instance下有哪些database
db2 LIST DATABASE DIRECTORY 【 on /home/db2inst1 】
4.9 查看及更改資料庫head的配置
請注意,在大多數情況下,更改了數據的配置後,只有在所有的連線全部斷掉後才會生效。
查看資料庫head的配製
db2 get db cfg for head
更改資料庫head的某個設定的值
4.9.1 改排序堆的大小
db2 update db cfg for head using SORTHEAP 2048
將排序堆的大小改為2048個頁面,查詢比較多的套用最好將該值設定比較大一些。
4.9.2 改事物日誌的大小
db2 update db cfg for head using logfilsiz 40000
該項內容的大小要和資料庫的事物處理相適應,如果事物比較大,應該要將該值改大一點。否則很容易處理日誌檔案滿的錯誤。
4.9.3 出現程式堆記憶體不足時修改程式堆記憶體大小
db2 update db cfg for head using applheapsz 40000
該值不能太小,否則會沒有足夠的記憶體來運行應用程式。
4.10 查看及更改資料庫實例的配置
查看資料庫實例配置
db2 get dbm cfg
更改資料庫實例配製
4.10.1 打開對鎖定情況的監控。
db2 update dbm cfg using dft_mon_lock on
4.10.2 更改診斷錯誤捕捉級別
db2 update dbm cfg using diaglevel 3
0 為不記錄信息
1 為僅記錄錯誤
2 記錄服務和非服務錯誤
預設是3,記錄db2的錯誤和警告
4 是記錄全部信息,包括成功執行的信息
一般情況下,請不要用4,會造成db2的運行速度非常慢。
4.11 db2環境變數
db2 重裝後用如下方式設定db2的環境變數,以保證sp可編譯
將set_cpl 放到AIX上, chmod +x set_cpl, 再運行之
set_cpl的內容
db2set DB2_SQLROUTINE_COMPILE_COMMAND="xlc_r -g \
-I$HOME/sqllib/include SQLROUTINE_FILENAME.c \
-bE:SQLROUTINE_FILENAME.exp -e SQLROUTINE_ENTRY \
-o SQLROUTINE_FILENAME -L$HOME/sqllib/lib -lc -ldb2"
db2set DB2_SQLROUTINE_KEEP_FILES=1
4.12 db2命令環境設定
db2=>list command options
db2=>update command options using C off--或on,只是臨時改變
db2=>db2set db2options=+c --或-c,永久改變
4.13 改變隔離級別
DB2SET DB2_SQLROUTINE_PREPOPTS=CS|RR|RS|UR
互動環境更改session的隔離級別,
db2 change isolation to UR
請注意只有沒有連線資料庫時可以這樣來改變隔離級別。
4.14 管理db\instance的參數
get db cfg for head(db)
get dbm cfg(instance)
4.15 升級後消除版本問題
db2 bind @db2ubind.lst
db2 bind @db2cli.lst
4.16 查看資料庫表的死鎖
再用命令中心查詢數據時要注意,如果用了互動式查詢數據,命令中心將會給所查的記錄加了s鎖.這時如果要update記錄,由於update要使用x鎖,排它鎖,將會處於鎖等待.
首先,將監視開關打開
db2 update dbm cfg using dft_mon_lock on
快照
db2 get snapshot for Locks on cleardb >snap.log
tables
bufferpools
tablespaces
database
然後再看snap.log中的內容即可。
對Lock可根據Application handle(應用程式句柄)看每個應用程式的鎖的情況。
監視完畢後,不要忘了將監視器關閉
db2 update dbm cfg using dft_mon_lock off
六、DB2常用知識
以下主要以DB27.X為基礎的.以下的字元為小寫.
本文對DB2高手來說是不用看的.
1.DB2產品的級別有那些?
企業版的 ENTERPRISE EDITION
工作企業擴展版 ENTERPRISE EXTENDED EDITION
個人版的 PERSONAL EDITION
衛星版的 SATELLITE EDITION
微型版的 EVERYPLACE
2.可以連線到DB2資料庫的產品有哪些?
DB2客戶端
DB2CONNECT
DB2DATA propagator
DB2NET.DATA
DB2DATA joiner
DB2 RELATIONAL CONNECT
等
3.DB2支持的通訊協定有哪些?
TCP/IP
NETBIOS
APPG
IPX/SPX
NAMEPIPE
等
4.DB2客戶端產品有哪些?
DB2運行時間客戶端DB2 RUNTIME CLIENT
DB2管理客戶端DB2ADMINI STRATION CLIENT
DB2應用程式開發客戶端DB2 APPLICATION DEVELOP MENT CLIENT
DB2瘦客戶端 DB2 THIN CLIENT
5.一個資料庫是否可以安裝在多個資料庫伺服器上?
可以
6.從哪個版本後存儲過程可以用SQL語句來創建?
7.1版後
7.DB2提供哪些關係擴展器?
文本擴展器 TEXT EXTENDER
圖象擴展器 IMAGE EXTENDER
音頻擴展器 AUDIO EXTENDER
視頻擴展器 VIDEO EXTENDER
空間數據擴展器 SPATIAL EXTENDER
XML擴展器 XML EXTENDER
網路搜尋擴展器NET.SEARCH EXTENDER
8.WINDOWS和OS/2環境下的DB2安裝目錄結構?
用SETUP.EXE來安裝
\SQLLIB安裝的根目錄,包括README檔案
\SQLLIB\ADSM包含ADSTAR分散式存儲管理器檔案
\SQLLIB\BIN包含DB2工具的執行檔
\SQLLIB\BND包含DB2工具的綁定檔案
\SQLLIB\CC包含運行控制中心所需的檔案
\SQLLIB\CFG包含默認的系統配置檔案
\SQLLIB\CONV包含代碼頁轉換表檔案
\SQLLIB\DB2默認的實例目錄
\SQLLIB\DB2DAS00預設的DB2管理伺服器目錄
\SQLLIB\DOC包含DB2在線上手冊
\SQLLIB\FUNCTION默認的用戶自定義函式目錄
\SQLLIB\FUNCTION\UNFENCED默認的非隔離用戶自定義函授目錄
\SQLLIB\HELP在線上幫助檔案
\SQLLIB\JAVADB2所需的JAVA類庫
JAVA12包含JDK1.2的支持程式
\SQLLIB\MISC包含HTML搜尋伺服器檔案
\SQLLIB\MSG\PRIME包含信息檔案
\SQLLIB\QP包含QUERYPATROLLER的客戶端檔案
\SQLLIB\SAMPLES包含樣例程式和樣例腳本
\SQLLIB\SPMLOG包含DB2同步點管理器日誌檔案
\SQLLIB\THNSETUP包含瘦客戶端安裝檔案
9.UNIX和LINUX環境下的DB2安裝目錄結構?
用DB2SETUP.EXE來安裝
安裝的根目錄下還將創建以下目錄:
README安裝的根目錄,包括README檔案
ADM包含系統管理工具檔案
ADSM包含ADSTAR分散式存儲管理器檔案
BIN包含DB2工具的二進制執行檔
BND包含DB2工具的綁定檔案
CC包含運行控制中心所需的檔案
CFG包含默認的系統配置檔案
CONV包含代碼頁轉換表檔案
DOC包含DB2在線上手冊
FUNCTION默認的用戶自定義函式目錄
FUNCTION\UNFENCED默認的非隔離用ё遠ㄒ搴諛柯?lt;BR>INSTALL包含安裝程式
INSTANCE包含實例腳本
JAVADB2所需的JAVA類庫
LIBDB2庫檔案
MAP包含DB2CONNECT使用的映射檔案
MISC包含HTML搜尋伺服器檔案
SAMPLES包含樣例程式和樣例腳本
MSG\$L包含DB2信息檔案
10.AIX下用哪個命令來安裝DB2?
INSTALLP命令
11.同一作業系統下可以安裝多個DB2資料庫?
可以的
12.如何停止實例?
DB2STOP
13.如何啟動實例?
DB2START
【page】
14.如何修改註冊項的值?
DB2SET可以修改
如:
設定當前實例的一個參數
DB2SET PARAMETER=VALUE
設定一個全局級的參數
DB2SET PARAMETER=VALUE-G(小寫)
查看能在配置檔案註冊表中設定的所有變數的列表
DB2SET-LR(小寫)
15.如何在CLP執行作業系統的命令?
在命令前加"!"作為前綴
DB2=>!DIR C:\
16.在CLP中命令過長怎么辦?
用"\"作為續行符號
17.如何獲得DB2的命令的語法相關信息?
DB2 ?顯示所有DB2命令
DB2 ? COMMAND顯示命令信息
DB2 ? SQLnnnn 顯示這個SQLCODE的解釋信息
DB2 ? DB2nnnn 顯示這個DB2錯誤的解釋信息
18.如何查看當前CLP的設定?
DB2=>LIST COMAND OPTIONS
19.如何更新當前CLP會話的特定項設定?
DB2 UPDATE COMMAND OPTIONS USING OPTIONS...
20.COMMAND WINDOWS可以通過哪個命令調用?
DB2CMD命令
21.管理伺服器的默認名為?
UNIX下為DB2AS
WINDOWS下為DB2DAS00
22.常用管理DB2伺服器實例的命令?
DB2ADMIN START 啟動DB2管理伺服器實例
DB2ADMIN STOP 停止DB2管理服器實例
DASICRTUNIX下創建DB2管理伺服器實例
DASIDROPUNIX下刪除DB2管理伺服器實例
DB2 ADMIN CREATE WINDOWS OR OS/2下創建DB2管理伺服器實例
DB2 ADMIN DROP WINDOWSOROS/2下刪除DB2管理伺服器實例
DB2 GET ADMIN CFG 顯示DB2管理伺服器的配置參數
DB2 UPDATE ADMIN CFG 修改DB2管理伺服器的配置參數
DB2 RESET ADMIN CFG將DB2管理伺服器的配置參數設為默認值
23.DB2目錄分為哪幾種?
系統資料庫目錄
本地資料庫目錄
節點目錄
DCS目錄
管理節點目錄
24.如何查看系統資料庫目錄?
LIST DB DIRECTORY
25.如何查看資料庫伺服器目錄?
LIST NODE DIRECTORY
26.DB2實例的伺服器的默認連線埠是?
50000
伺服器名稱為DB2CDB2
27.DB2UDB伺服器端的認證類型有?
SERVER
SERVER_ENCRYPT
CLIENT
DCE
DCE_SERVER_ENCRYPT
KERBEROS
KRB_SERVER_ENCRYPT
28.DB2客戶端的認證類型有?
SERVER
SERVER_ENCRYPT
DCS
DCS_ENCRYPT
CLIENT
DCE
29.DB2中有哪幾種類型的許可權?
SYSADM 系統管理許可權
SYSCTRL系統控制許可權
SYSMAINT系統維護許可權
DBADM 資料庫管理許可權
LOAD 對表進行LOAD操作的許可權
30.不能通過GRANT授權的許可權有哪種?
SYSAM
SYSCTRL
SYSMAINT
要更該上述許可權必須修改資料庫管理器配置參數
31.表的類型有哪些?
永久表(基表)
臨時表(說明表)
臨時表(派生表)
51.安裝DB2默認的事例名稱是?
在WINDOWS或OS/2中默認的是DB2
在LINUX或UNIX環境下默認的是DB2INST1
52.安裝後的默認帳戶是?
在WINDOWS或OS/2中默認的是DB2ADMIN
在LINUX或UNIX環境下默認的是DB2AS
53.事例的類型有哪些?
CLIENT(客戶)
STANDALONE(獨立的)
SATELLITE(衛星)
EEDB2
EEE
68.一個資料庫至少包括哪些表空間?
一個目錄表空間
一個或多個用戶表空間
一個或多個臨時表空間【page】
69.根據數據與存儲空間之間移動的控制方式不同,分哪兩種表空間?
系統管理的空間(SMS)
資料庫管理的空間(DMS)
81.表的類型有哪些?
基本表
結果表
概要表
類型表
子類型
子表
聲明的臨時表
系統臨時表
105.DB2資料庫監控的兩個組成部分?
快照監控(SNAPSHOTMONITOR)可返回特定時間點的資料庫活動的快照.
事件監控(EVENTMONITOR)記錄事件發生的數據.
106.系統監控的數據元素類型?
計數器(COUNTER)記錄活動發生的次數.
測量(GAUGE)測量條目的當前值.
水線(WATERMARK)從監控來元素達到的最大或最小數值.
信息(INFORMATION)監控活動的參照類型細節.
時間點(TIMESTAMP)活動發生的日期時間.
時間(TIME)返回一個活動花費的時間.
114.DB2的SQL語句的類別?
DCL:數據控制語言,提供對資料庫對象的訪問許可權.
DDL:數據定義語言,創建,修改,刪除資料庫對象的.
DML:數據操縱語言,用來插入,更新,刪除數據的.【page】
115.DCL的許可權有哪些?
CONTROL許可權:如果用戶創建一個對象,則改用戶能完全訪問該對象.
GRANT語句將許可權授予給用戶.
REVOKE語句撤銷一個用戶的許可權.
116.DDL有哪些?
CREATE
DECLARE
ALTER
DROP
等
117.DML有哪些?
INSERT
SELECT
UPDATE
DELETE
等
118.DB2有沒有布爾類型?
沒有
119.如何查詢DB2的內置函式?
自帶文檔ADMINISTION-->SQLREFERENCE-->FUNCTIONS內
綜述
IBM公司研製的一種關係型資料庫系統。DB2主要套用於大型套用系統,具有較好的可伸縮性,可支持從大型機到單用戶環境,套用於OS/2、Windows等平台下。 DB2提供了高層次的數據利用性、完整性、安全性、可恢復性,以及小規模到大規模應用程式的執行能力,具有與平台無關的基本功能和SQL命令。DB2採用了數據分級技術,能夠使大型機數據很方便地下載到LAN資料庫伺服器,使得客戶機/伺服器用戶和基於LAN的應用程式可以訪問大型機數據,並使資料庫本地化及遠程連線透明化。 它以擁有一個非常完備的查詢最佳化器而著稱,其外部連線改善了查詢性能,並支持多任務並行查詢。 DB2具有很好的網路支持能力,每個子系統可以連線十幾萬個分散式用戶,可同時激活上千個活動執行緒,對大型分散式套用系統尤為適用。 DB2是IBM出口的一系列關係型資料庫管理系統,分別在不同的作業系統平台上服務。雖然DB2產品是基於UNIX的系統和個人計算機作業系統,在基於UNIX系統和微軟在windows系統下的Access方面,DB2追尋了ORACLE的資料庫產品。 除了它可以提供主流的OS/390和VM作業系統,以及中等規模的AS/400系統之外,IBM還提供了跨平台(包括基於UNIX的LINUX,HP-UX,Sun Solaris,以及SCO UnixWare;還有用於個人電腦的OS/2作業系統,以及微軟的Windows 2000和其早期的系統)的DB2產品。DB2資料庫可以通過使用微軟的開放資料庫連線(ODBC)接口,Java資料庫連線(JDBC)接口,或者CORBA接口代理被任何的應用程式訪問。 7月14日,IBM全球同步發布了一款具有劃時代意義的資料庫產品——DB2 9(“DB2”是IBM資料庫產品系列的名稱)。而這款新品最大特點即是率先實現了可擴展標記語言(XML)和關係數據間的無縫互動,而無需考慮數據的格式、平台或位置。 DB2的前世今生和未來: 對於每個最終站在獎台上淚水盈面的奧運冠軍來說,為此刻他或她也許已經付出了5年甚至10年的艱苦努力。相比這些人類的冠軍們,這個世界還有另外一種意義上的冠軍,它們雖沒有淚水,卻依然在歷史上留下了非凡的軌跡—DB2就是這類冠軍中的一員。這個資料庫領域裡當之無愧的冠軍,已用了足足25年來描繪它的軌跡。 紀念IBM DB2的誕生 IBM DB2已經25周歲拉!DB2回顧與展望