工作學習之余對DB2使用知識的一點零散記錄,包括DB2的基礎知識、數據庫管理、性能調優以及開發等方面,內容非常零散,而且有時不免理解有誤,可能並未回頭改掉,望見諒,僅供參考。
表空間類型分為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中,對遠程數據庫編目的操作,首先把遠程主機映射為本地節點,節點名自己指定,本例采用TCPIP連接。service_name一般定義在遠程主機的/etc/services文件中。
$ db2 CATALOG TCPIP NODE local_node_name REMOTE hostname|ip SERVER service_name
然後把已知的遠程主機的數據庫映射到本地別名,注意本地別名在主機級別不能重復。節點名指定上面剛編目的節點。
$ 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服務的用戶設置以下環境變量:
D_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客戶端的類型: