DB2數據庫常用操作

1 表數據的導出與恢復

  在生產環境上線要向數據庫的表中插入數據的時候,要先備份表數據,防止插入的中途出問題啦,特別是數據中還含有中文的,這樣出問題了可以恢復。

export to TBL_TXN_FLOW_CTL.ixf of ixf messages exportmsgs_flow.txt select * from TBL_TXN_FLOW_CTL; 
export to TBL_TXN_EXEC_CTL.ixf of ixf messages exportmsgs_exec.txt select * from TBL_TXN_EXEC_CTL; 

  表數據的時候出問題了,可以用下列sql語句恢復:

import from  TBL_TXN_FLOW_CTL.ixf of ixf messages importmsgs_flow.txt replace into TBL_TXN_FLOW_CTL;
import from  TBL_TXN_EXEC_CTL.ixf of ixf messages importmsgs_exec.txt replace into TBL_TXN_EXEC_CTL;
load from "/tmp/mbr.del" of del replace into mbr nonrecoverable; 

  這個主要用於清表操作,對於一些大表,刪除比較慢,可以自建一個空檔案(mbr.del),使用這個語句清掉mbr這個表。注意nonrecoverable表示在裝載數據時如果出錯了將不可恢復,如果原先數據很重要,需要先備份。
(load也可以將數據導入到DB2服務器中,並且速度比import快)
注:另外,在導出和導入數據庫數據的時候,需要進行編碼轉換,對於ixf格式,會自動進行代碼轉換,但對於del格式,當在不同系統間export/import/load數據時,由於數據的編碼不同,可能會遇到漢字亂碼問題。所以,一般都用ixf格式。


2 db2數據庫常用的操作

export DBLINK="tsmpdb user tsmpusr using xxx"
db2 connect to $DBLINK
db2 list tables for schema tsmpusr
db2 describe table tsmpusr.TBL_HCE_APPLE_CARD_INFO
db2 "select * from tsmpusr.TBL_HCE_APPLE_CARD_INFO fetch first 1 rows only with ur"

  with ur,ur(uncommitted read,未提交讀)是db2中隔離數據的最低級別,並且提供最高的並行性,在select的時候沒有提交數據的時候就能夠讀到更新的數據。

db2 "update TBL_BAT_TASK_CTL set USE_FLAG='N' where BAT_ID='0024' or BAT_ID='0025'"

delete from TBL_HCE_APPLE_CARD_INFO where HCE_CARD_STAT='31';
select * from TBL_HCE_CARD_APPLY where TXN_DATE between '' and '';
select * from TBL_TXN_FLOW_CTL where TXN_NUM like 'A%';

斷開數據庫連接(敲db2後進入交互模式,quit退出):
disconnect current —— 斷開數據庫連接,不退出命令交互模式
terminate —— 斷開數據庫連接,退出命令交互模式
quit —— 只退出命令交互模式,並沒有斷開數據庫連接

commit work


3 腳本、sqc中見到的有關數據庫的操作

db2 -x "select count(bat_id) from tbl_bat_task_ctl where bat_status<>'S' and use_flag='Y'and substr(bat_flag,1, 1)='0'"

substr(str,pos,len)表示從str的pos位置開始,截取len個字符。
count(*)統計的是結果集的總條數,count(字段名)統計的是結果集中該字段值不爲NULL的總條數。

db2 “select mpanid,spanid,token_pan,hce_card_stat from tbl_hce_apple_card_info where pan='' and cps_id='' order by acq_no desc fetch first rows only

4 遇到的db2數據庫報的錯

  在db2數據庫中執行sql語句如果不成功,會有對應的錯誤碼信息,分爲SQLCODE和對應的SQLSTATE,如果想知道具體的含義,可以通過使用數據庫實例用戶登錄後,執行如下語句:
db2 ? sql0964 —— 可以看SQLCODE爲-964的解釋。
db2 ? 57011 —— 可以看db2的SQLSTATE解釋。

4.1 SQLCODE=964

DB2 SQL Error: SQLCODE=-964, SQLSTATE=57011, SQLERRMC=null, DRIVER=3.57.82

db2 delete大數據表中的部分數據經常會產生很大日誌,造成數據庫日誌空間滿的情況。
1、清空表:
  alter table TBL_APPLEPAY_CARD_APPLY activate not logged initially with empty table;(不記日誌)(alter命令可以修改表結構。)
  import from /dev/null of del replace into TBL_APPLEPAY_CARD_APPLY;
2、增加日誌文件大小(一般不做修改,DBA的事)
  db2 update db cfg for tsmpdb using LOGSIZE 262144
  db2 update db cfg for tsmpdb using LOGPRIMARY 20

4.2 SQLCODE=818

  SQLCODE=-818,出現場景是上一版本到測試環境了,但是發現數據庫的一個bnd文件不對,又重新編譯這個數據庫的sqc文件,然後再上版本,再綁定數據庫時。
  不能運行老的程序訪問新被綁定PACKAGE的數據庫,解決辦法是要重新編譯,重新上版本,再重新綁定數據庫。

4.3 SQLCODE=332

SQL0332N  Character conversion from the source code page "1386" to the target code page "819" is not supported.  SQLSTATE=57017

  建完節點編目和數據庫編目後,db2 connect to O2ODB2 user o2ousr using o2ousr2202,連接數據庫的時候報上面的這個錯,執行一下db2set db2codepage=1386這個命令後,db2 terminate斷開數據庫後,再連接數據庫就可以正常連上啦。

4.4 db2數據庫中字符集相關問題

  計算機處理文本時,把一門語言中的每個字符都賦以特定的值,這種字符與數值的對照表就叫codepage(代碼頁)。例如ASCII就是把英文字母表和一些控制字符映射到一些特定的數值上去。

  在db2數據庫中,與字符集相關的問題主要有三個層次的字符集的設置,其中系統級別和實例級別的字符集可以根據需求進行修改,而數據庫級別的數據集則必須在建庫時確定。
(1)操作系統locale:系統級別的代碼頁設置,決定應用程序的默認代碼頁;如果希望將OS Local設置成中文,可以考慮下面的方法:
unix:可以通過export LANG=”zh_CN”命令修改當前的local到中文;
windows:在“開始->設置->控制面板->區域選項”中進行對系統的語言設置進行選擇。
(2)db2codepage:db2實例級別的代碼頁設置,它會影響db2相關應用程序對代碼頁轉換時做出代碼頁判定。可以通過db2set db2codepage=命令將db2codepage設置爲你需要的字符集。
(3)database codepage:db2數據級別的代碼頁設置,必須在建庫時進行設置。
例如:創建指定區域爲中國(CN)的Unicode數據庫。
db2 “create database dbname using codeset utf-8 territory CN”

db2set命令是用於修改db2實例級別的註冊變量(profile registies),profile registries要比實例的configuration parameters大一點,比系統環境變量小一點。
db2set -ll //列出當前設置過的變量
例如:
[e] DB2DBDFT=tsmpdb
[e] DB2PATH=/opt/IBM/db2/V9.7
[i] DB2CODEPAGE=1386
[g] DB2SYSTEM=localhost.localdomain
[g] DB2INSTDEF=tsmp
注:[e]表示是操作系統級別的環境變量
[i]表示實例級別定義的變量
[g]表示在全局對該系統上的所有實例上定義

4.5 db2鎖現象

在數據庫中,鎖的主要功能是爲了控制併發數據的完整性而引入的機制,在併發應用中出現鎖現象並不可怕,鎖現象通常分爲死鎖和鎖等待兩種情形。


5 應用系統中db2數據庫的整個相關編程應用場景

1、數據庫服務器上db2數據庫的安裝;
2、配置數據庫,創建數據庫用戶,並建相關應用的數據庫,各種表;
3、在windows下用DbVisualizer連接應用數據庫,進行各種查詢等操作;
4、在Linux中安裝數據庫客戶端,shell下用db2 connect to $DBLINK連接數據庫後,來進行查詢等各種操作(包括一些腳本中的操作);
5、嵌入式sql編程,在程序中連接數據庫,並對數據庫進行一些操作。

~/.bashrc
if [ -f /home/tsmp/sqllib/db2profile ]; then
    . /home/tsmp/sqllib/db2profile
fi
DB2DIR=/opt/ibm/db2/V9.7

x.sqc程序在預編譯階段會生成x.bnd文件和x.c文件,x.bnd文件需要綁定,x.c文件再按linux下C程序的編譯過程生成動態庫文件。
x.bnd文件綁定腳本如下:

db2 connect to $DBLINK                                                                                                       
for file in `ls *.bnd`
do
    echo $file
    db2 bind $file
done

這個是全綁,一般只需要重新綁定修改了的,db2 bind xxx.bind即可。
關於sqc文件的詳細編譯過程及bnd文件的作用可另作查詢。


數據庫配置
查詢:

db2 get db cfg <for database_name>

設置:

db2 update db cfg for <database_name> using <parameter_name> <value>

數據庫管理器配置
查詢:

db2 get dbm cfg

設置:

db2 update dbm cfg using <parameter_name> <value>

Linux下本地連接遠程服務器的數據庫:
裝db2的客戶端,建實例,配置數據庫環境,新建數據庫節點(catlog),再連接數據庫。
系統(主機) ——> 實例 —— > 通信節點 ——> 表空間 ——> 數據庫對象

關於數據庫和實例的理解:
實例就是一組操作系統進程(或者是一個多線程的進程)和一些內存,這些進程可以操作數據庫。
數據庫只是一個文件集合。
數據庫可以由多個實例裝載和打開,而實例可以在任何時間點裝載和打開一個數據庫。

編目節點就是把遠程服務器映射到本地
在DB2中從客戶端訪問服務器的數據庫時,不能直接用connect命令,而必須先建立通信node,再在node的基礎上建立數據庫連接。
在命令行的具體操作如下:

db2 catalog tcpip node ${nodeName} remote ${serverName} server ${portNumber}
db2 catalog db ${dbName} as ${dbAlias} at node ${nodeName}
db2 connect to ${dbAlias} user ${userName} using ${passWord}
db2 terminate
//說明:${dbAlias}編目到本地後的數據庫別名

取消節點編目:

db2 uncatalog node <node_name>

取消數據庫編目:

db2 uncatalog database <db_name>

db2ilist可以查看系統上的所有實例
查看當前實例:db2 get instance或echo $DB2INSTANCE

查看本地編目節點信息:db2 list node directory
查看當前實例下的編目數據庫信息:db2 list db directory


多個數據庫在本地建了節點,怎麼從連接的一個數據庫切換到另一個數據庫?
dbset clear_passwd clear_passwd user_key onl/his
dbset tsmpdb/tsmpdb123@vend3 tsmpdb/tsmpdb123@vend3 123456 onl
dbset “O2ODB user o2ousr using o2ousr1234” “O2ODB user o2ousr using o2ousr1234” 123456 onl
dbget onl

/home/o2obtc/batch/src/dbs/dbcommon/dbscommon.sqc
DbsConnect ()
36 rc = GetOnlPwd(sConnStr);

/home/o2obtc/batch/etc/batch.db.sh

#DBLINK
connstr=`dbget onl`
sub=`echo $connstr|cut -c1-2`
num_sub=`expr ${sub} + 4`
DBLINK=`echo $connstr|cut -c5-$num_sub`
export DBLINK

linux中的cut命令可以從一個文本文件或者文本流中提取文本列。
cut -c 字符區間 —— 以字符(characters)的單位取出固定字符區間。

/home/tsmp/tsmp/src/tools/dbsec
C標準文件操作函數:
fopen()/fclose() —— 打開/關閉文件
char *fgets(char *s, int size, FILE *stream);
從參數stream所指的文件內讀入字符並存到參數s所指的內存空間,直到出現換行字符、讀到文件尾或是已讀到了size-1個字符爲止,最後會加上NULL作爲字符串結束。
int fprintf(FILE *stream, const char *format, …);
fprintf()會根據參數format字符串來轉換並格式化數據,然後將結果輸出到參數stream指定的文件中,直到出現字符串結束符(’\0’)爲止。

gethostname();
strcat();

sprintf(sTmp, “%.8x”, i); —— 將i以無符號16進制小數的形式輸出到sTmp中,其中小數位爲8位。但計算機表示的十六進制數不存在小數點,所以上述寫法雖然編譯器能給出正確的結果,但是是錯的,應該寫sprintf(sTmp, “%08x”, i);

char *strtok(char *str, const char *delim);
該函數用來把字符串分割成一個個片段。參數str指向待分割的字符串,參數delim則爲分隔符字符串中所包含的所有字符。當strtok()在參數s的字符串中發現參數delim中包含的字符時,則會將該字符改爲’\0’字符。在第一次調用時,strtok()必須給予參數s字符串,往後的調用則將參數s設置成NULL。每次調用成功則返回指向被分割出片段的指針。


6 有關DB2數據庫的其他操作

db2 list tables for system —— 列出所有系統表

查看db2的命令參數選項:
db2 list command options

運行腳本:
db2 -tf script_name -oz log_name(-f選項表示將命令的輸入從標準輸入指定到某一文件,-z選項表示將所有輸出保存到輸出文件)
db2 -tvf TBL_AM_CARD_PRE_TEST.sql(-v選項表示回送當前命令到標準輸出)

查詢數據庫中的存儲過程:
db2 “select procname,text from sysibm.sysprocedures”


數據庫備份(分全量備份和增量備份,這裏是脫機全量備份):
1、停掉數據庫再重新啓動,以便斷掉所有連接;
db2stop force
db2start
2、備份

db2 backup db <database_name> [to <dir_name>]
//to <dir_name>表示爲備份到的目錄路徑,爲可選項,默認在當前目錄下。

數據庫恢復:
restore


數據庫導出:
1、db2look是DB2用於生成數據庫DDL(建表的)語句的一個工具。
db2look -d 數據庫名 -e -o db.sql -u 用戶名 -w 密碼
2、db2move導出數據。
db2move是一個集成式的數據移動工具,它支持導出(export)、導入(import)、裝入(load)三種操作方式。其中db2move的這三種工作方式分別是通過簡單使用db2 export,db2 import,db2 load指令來完成的。使用db2move導出的數據文件格式是ixf。

db2move 數據庫名 export -u 用戶名 -p 密碼
這將會把該數據庫中的全部數據提取到當前目錄下。每個表的內容都存儲在一個.ixf文件中,每個.ixf文件都有一個與之相對應的.msg文件,.msg文件是描述從表中導出數據時的信息的。另外還有兩個文件,db2move.lst用來記錄.ixf文件、.msg文件與表的一一對應關係,EXPORT.out記錄的是導出數據時的屏幕輸出。

數據庫導入:
1、創建一個空的新數據庫。
2、db2move導入數據。
db2move 數據庫名 import -u 用戶名 -p 密碼
db2move import時系統會自動建表,但表上的索引、視圖等還需要自行創建。

db2cc圖形界面,db2 V10版本中沒有啦,在V9的Linux版本中有。


7 PowerDesigner功能之一Data Architect

  這是一個強大的數據庫設計工具,使用Data Architect可利用實體關係圖爲一個信息系統創建”概念數據模型“——CDM(Conceptual Data Model)。並且可根據CDM產生基於某一特定數據庫管理系統的”物理數據模型“——PDM(Physical Data Model)。還可優化PDM,產生爲特定DBMS創建數據庫的SQL語句並可以以文件形式存儲以便在其他時刻運行這些SQL語句創建數據庫。另外,Data Architect還可根據已存在的數據庫反向生成PDM、CDM及創建數據庫的SQL腳本。

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