大型機(jī)上的 DB2 數(shù)據(jù)庫(DB2 for z/OS)作為數(shù)據(jù)庫家族中的元老,數(shù)據(jù)庫應(yīng)該掌握的幾種語言(即交互方式,見表 1),它當(dāng)然是很在行的。
交互方式 | 特點(diǎn) |
---|---|
SQL | 統(tǒng)一的標(biāo)準(zhǔn) , 適用于所有數(shù)據(jù)庫 |
Command | 統(tǒng)一的格式 , 方便快捷 |
Utility | DB2 for z/OS 特有的工具 , 功能強(qiáng)大 |
SQL 的全稱是結(jié)構(gòu)化查詢語言(Structured Query Language),最早的是 IBM 的 San Jose 實(shí)驗(yàn)室為關(guān)系數(shù)據(jù)庫管理系統(tǒng) SYSTEM R 開發(fā)的一種查詢語言,SYSTEM R 就是 DB2 的前身。自從 IBM 公司 1981 年推出以來,SQL 語言得到了廣泛的應(yīng)用。如今無論是像 Oracle、Sybase、SQL Server 這些數(shù)據(jù)庫管理系統(tǒng),還是像 Visual FoxPro,PowerBuilder 這些微機(jī)上常用的數(shù)據(jù)庫開發(fā)系統(tǒng),都支持 SQL 語言作為標(biāo)準(zhǔn)的查詢語言。
Command 是數(shù)據(jù)庫提供給 DBA 們控制和調(diào)用各種數(shù)據(jù)庫對(duì)象(Object)的利器,它有一套標(biāo)準(zhǔn)的格式(見圖 1),有了它 DBA 可以很方便的了解數(shù)據(jù)庫的各種狀態(tài),并加以調(diào)整。
Utility 是 DB2 for z/OS 上特定的一組工具,它可以幫助 DB2 for z/OS 方便的完成 COPY CHECK INDEX, RUNSTATS 等眾多日常的工作。Utility 分兩種類型:online utilities 和 stand-alone utilities。online utilities 必須在 DB2 處于運(yùn)行狀態(tài)時(shí)才能執(zhí)行,而 stand-alone utilities 則沒有這個(gè)限制。Utility 是 DB2 for z/OS 自己的”方言”,它要靠 JCL(Job Control Language)作業(yè)去執(zhí)行(見清單 1)。
//CHIWC55 JOB MSGLEVEL=(1,1),REGION=0M, // CLASS=A,MSGCLASS=H,NOTIFY=&SYSUID //* - - - - - - - - - - - - - - - - - - - - - //CHECK EXEC PGM=DSNUTILB,PARM='DSN7,CHIWC55' //SYSPRINT DD SYSOUT=* //UTPRINT DD SYSOUT=* //SYSUT1 DD SPACE=(4096,(10000,10000)) //SORTOUT DD SPACE=(4096,(10000,10000)) //SYSIN DD * CHECK INDEX (ALL) TABLESPACE WC55DB1.ACACTGRP /* |
SQL 根據(jù)其使用的方式分為兩種類型:靜態(tài) SQL 和動(dòng)態(tài) SQL(見表 2)。
靜態(tài) SQL / STATIC SQL | 動(dòng)態(tài) SQL / DYNAMIC SQL |
---|---|
程序中直接嵌入 SQL 語句 | 程序通過宿主變量(Host Variable)把 SQL 傳給數(shù)據(jù)庫 |
在程序在”編譯”過程中,數(shù)據(jù)庫決定這條 SQL 到數(shù)據(jù)庫中存取數(shù)據(jù)的方法和路徑 | 在程序運(yùn)行的過程中,數(shù)據(jù)庫在接到通過宿主變量傳入的 SQL 后決定這條 SQL 到數(shù)據(jù)庫中存取數(shù)據(jù)的方法和路徑 |
不論重復(fù)執(zhí)行多少遍這條 SQL,數(shù)據(jù)庫都會(huì)依據(jù)原來定好的方法并按照同樣的”路”到數(shù)據(jù)庫中存取數(shù)據(jù)。 | 在每一次執(zhí)行這條 SQL 時(shí),數(shù)據(jù)庫都會(huì)動(dòng)態(tài)地決定這一次的存取數(shù)據(jù)方法和”路”,每次都可能不同。 |
簡潔 , 效率高 , 使用起來不夠靈活 | 復(fù)雜 , 效率低,使用靈活 |
在 DB2 for z/OS 運(yùn)行一個(gè)嵌入式 SQL 的應(yīng)用程序總共有 4 步。
DB2 for z/OS 是通過 JCL 作業(yè)來運(yùn)行一個(gè)嵌入式程序的(以 COBOL 程序?yàn)槔娗鍐?2)。
//************************************************************** //* STEP1: PRECOMPILE THE SQL IN COBOL PROGRAM //************************************************************** //PC EXEC PGM=DSNHPC,PARM='HOST(COB2)',REGION=4096K ... //************************************************************** //* STEP2:COMPILE THE COBOL PROGRAM IF STEP1 IS OK //************************************************************** //COB EXEC PGM=IGYCRCTL,COND=(4,LT,PC), // PARM='DYNAM,LIB,OBJECT,RENT,APOST,MAP,XREF,LIST,DBCS' //* CICS(''COBOL3,SP'')' ... //************************************************************** //* STEP2: LINKEDIT IF THE PRECOMPILE AND COMPILE //* RETURN CODES ARE 4 OR LESS //************************************************************** //LKED EXEC PGM=IEWL,PARM='XREF,AMODE(31),RMODE(ANY)', // COND=((4,LT,COB),(4,LT,PC)) ... //************************************************************** //* STEP 3: BIND PROGRAMS //************************************************************** //PH02CS04 EXEC PGM=IKJEFT01,DYNAMNBR=20,COND=(4,LT) ... //SYSTSIN DD * DSN SYSTEM(SSID) BIND PLAN (TESTPLAN) MEMBER(PGM01) ISO(CS) QUALIFIER(ABC) VALIDATE(BIND) END //* //************************************************************** //* STEP 4: RUN //************************************************************** //RUNPGM01 JOB CLASS=A,MSGLEVEL=(1,1),NOTIFY=&SYSUID,MSGCLASS=H ... //SYSTSIN DD * DSN SYSTEM(SSID) RUN PROGRAM(PGM01) PLAN(TESTPLAN) END /* |
SPUFI(SQL Processing Using File Input)是 DB2 for z/OS 中最常用的執(zhí)行動(dòng)態(tài) SQL 的工具。
請(qǐng)回顧一下表 2 中描述的動(dòng)態(tài) SQL 的特點(diǎn),其實(shí)圖 4 所示的這些工具就是正在運(yùn)行的程序,它們都是通過宿主變量把 SQL 傳給 DB2 for z/OS,然后再通過 PREPARE 決定這一次的存取數(shù)據(jù)方法和路徑,最后通過 EXECUTE 執(zhí)行這條 SQL 并返回結(jié)果。
以圖 5 中執(zhí)行的 SQL 為例:
CREATE TABLE TTEST (A VARCHAR(512));
SPUFI 會(huì)先把這串字符放到一個(gè)宿主變量 (STMTBUFF) 中:MOVE ‘CREATE TABLE TTEST (A VARCHAR(512))’ TO STMTBUFF
接著執(zhí)行:PREPARE S1 FROM: STMTBUFF
最后執(zhí)行:EXECUTE S1
在與 DB2 for z/OS 對(duì)話的過程中,也經(jīng)常會(huì)有’溝通不暢’的問題,這時(shí) DB2 for z/OS 就會(huì)通過各種錯(cuò)誤信息來告訴你,所以看明白 SQL 運(yùn)行中出現(xiàn)的錯(cuò)誤信息(見表 3),對(duì)于分析這些問題是至關(guān)重要的。
問題癥狀 | 關(guān)注信息 | 信息來源 |
---|---|---|
Sqlcode | SQLCA | SQL Output |
Abend | Abend Description | EREP or DUMP |
Incorrout | Access Plan | Visual Explain |
導(dǎo)致錯(cuò)誤的原因可能是用戶使用錯(cuò)誤也可能是軟件的 Bug,DB2 for z/OS 技術(shù)支持人員也是通過分析上述錯(cuò)誤信息來診斷問題的。
Sqlcode 是在執(zhí)行 SQL 時(shí)最常見的一種錯(cuò)誤。碰到這種問題時(shí),完整的 SQLCA 對(duì)于輔助分析問題是很重要的
在 SQLCA 中有三部分信息是需要被關(guān)注的(見表 4)。
① | SQLCODE = -601 | 參考 DB2 UDB for z/OS V8 Codes,可以看到詳細(xì)的問題描述以及基本的處理措施。 |
② | SQLERRP = DSNXISB2 | 這部分信息告訴大家是 DB2 for z/OS 哪個(gè) Module 拋出的這個(gè)錯(cuò)誤信息 |
③ | SQLERRD = 100 | 這部分信息顯示位置標(biāo)識(shí)符,它能夠唯一標(biāo)識(shí) Module 中出錯(cuò)的位置 |
結(jié)合上述三部分信息,可以作出如下判斷 :
SQLCODE -601 是 DSNXISB2 這個(gè) Module 在位置 100 拋出的,原因是與所要?jiǎng)?chuàng)建的對(duì)象(TTABLE)重名。參考 DB2 UDB for z/OS V8 Codes 的相應(yīng)章節(jié),發(fā)現(xiàn)通過 DROP TABLE TTABLE 或者取另一個(gè) Table 名可以解決這個(gè)問題。
注:如果是軟件 Bug 導(dǎo)致錯(cuò)誤地拋出了 SQLCODE,DB2 for z/OS 技術(shù)支持人員會(huì)根據(jù)上述 SQLCA 中的三部分信息 , 定位到出錯(cuò)的代碼,進(jìn)而根據(jù)代碼上下文中的各種情況分析并找出問題的根源。
Abend (Abnormal end of Program)
顧名思義,Abend 會(huì)導(dǎo)致程序非正常結(jié)束。通常 Abend 信息會(huì)被記錄到 EREP (DB2 for z/OS 的信息日志,見圖 8),而且為了便于詳細(xì)的分析導(dǎo)致異常的具體原因,DB2 for z/OS 常常會(huì)把系統(tǒng)異常時(shí)內(nèi)存的實(shí)時(shí)信息存到叫 DUMP 的文件中。
在 Abend Description 中有三部分信息是需要被關(guān)注的(見表 5):
① | CSECT NAME : DSNHXLTR | 指出了出現(xiàn)異常的 Module |
② | ABEND CODE : 004E | 指出了 Abend 類型。Abend 通常可分為兩種類型:一種是 DB2 for z/OS 異常 , 如 04E; 另一種是操作系統(tǒng)異常 , 如 0C4。 |
③ | REASON CODE : 00C89014 | 參考 DB2 UDB for z/OS V8 Codes,可以看到 REASON CODE 的詳細(xì)描述,以及相應(yīng)的處理措施。 |
結(jié)合上述三部分信息,可以作出如下判斷 :
Abend 是由于 DB2 for z/OS 的 Module DSNHXLTR 在運(yùn)行過程中發(fā)現(xiàn)嚴(yán)重的錯(cuò)誤,從而導(dǎo)致程序異常結(jié)束。通過參考 DB2 UDB for z/OS V8 Codes 的相應(yīng)章節(jié)(見清單 3),可以知道 Abend 是程序在 precompiler 時(shí)做一致性檢查發(fā)現(xiàn)錯(cuò)誤所致。
注:如果 Abend 是軟件 Bug 導(dǎo)致的,DB2 for z/OS 技術(shù)支持人員會(huì)根據(jù) DUMP 中的信息找出發(fā)生錯(cuò)誤時(shí) Module 中各個(gè)變量以及結(jié)構(gòu)的內(nèi)容,進(jìn)而找到導(dǎo)致錯(cuò)誤的變量或結(jié)構(gòu) , 并結(jié)合代碼分析并找出問題的根源。
3.6.1 00C8901x 00C8901x Explanation: An internal precompiler/parser consistency check failed. An S04E abend is generated. The error type and reason code are found in register 15 of the dump. In the reason code, x is one of the following:... …. 4. Error in pointer structures. …. System Programmer Response: Obtain the SVC dump and a copy of the application program source… |
Incorrout 通常是指在執(zhí)行 SQL 時(shí),正確的結(jié)果應(yīng)該是 DB2 for z/OS 返回記錄 N,但卻返回了記錄 M。 Incorrout 多數(shù)是由于 SQL 的 Access Plan(即表 2中提到的 SQL 到數(shù)據(jù)庫中存取數(shù)據(jù)的方法和路徑)改變所致的。Visual Explain for DB2 for z/OS 是 IBM 提供的一個(gè)幫助客戶圖形化 Access Plan 的工具,請(qǐng)參見參考資源。
通過 Visual Explain 可以產(chǎn)生 SQL 對(duì)應(yīng)的 Access Plan(見圖 9)
Access Plan 是 DB2 for z/OS 根據(jù) Catalog Statistics 計(jì)算出來的,所以當(dāng)遇到 Incorrout 問題時(shí)可以通過運(yùn)行 RUNSTATS utility 獲得最新的 Catalog Statistics,從而產(chǎn)生正確的 Access Plan。
注:如果 Incorrout 是軟件 Bug 導(dǎo)致的,由于它沒有出錯(cuò)信息 , 程序也沒有異常結(jié)束,因此錯(cuò)誤可能發(fā)生 DB2 for z/OS 決定 Access Plan 過程中的任一環(huán)節(jié)。對(duì)于這種問題,DB2 for z/OS 技術(shù)支持人員會(huì)先在 IBM 標(biāo)準(zhǔn)的 DB2 for z/OS 環(huán)境中重現(xiàn)這樣的問題,然后再結(jié)合 Visual Explain 產(chǎn)生的 Access Plan,通過 DEBUG 工具分析產(chǎn)生這種 Access Plan 過程中涉及到的 Module,進(jìn)而找出問題的根源。
聯(lián)系客服