本文闡述聯邦系統的系統表及視圖,並講解了如何獲取聯邦系統中基本的有效信息並利用其來對遇到的故障進行診斷分析。
引言
聯邦數據庫系統是一種基于 DB2 實現的分布式數據管理系統,由于其屏蔽了各種數據源之間的差異,能夠實時,快捷的對異構數據源的數據進行操作,得到了廣泛的應用。同任何産品一樣,普通用戶在使用聯邦系統的的過程中,必然會遇到一些問題,這些問題一部分是系統自身的設計缺陷造成的,但是還有很大部分是由于用戶沒有遵循産品使用的規則,沒有注意到使用各項特性的先決條件造成的,本文正是針對此類問題,從聯邦系統目錄和視圖的角度出發,描述了其相關的系統表信息,並介紹了如何獲取並利用這些信息來對故障進行定位,從而更有效率的解決此類問題。本文面向對象需要了解聯邦系統相關知識,並理解其內建對象(用戶映射,函數映射,別名等)。
聯邦系統系統目錄信息介紹
系統目錄表
如前所述,聯邦系統基于 DB2 實現,它利用了 DB2 的系統表來存儲遠程數據源相關的系統信息,如 SYSIBM.TABLES, SYSIBM.INDEXES,SYSIBM.COLUMNS,SYSIBM.ROUTINES 等,同時對于那些聯邦系統特有的對象和特性 , 設計了專門的系統表來存儲相關信息,這些表包括:
◆SYSIBM.SYSWRAPPERS:每一行代表注冊過的轉換器 (wrapper)
◆SYSIBM.SYSSERVERS: 每一行代表了數據源的信息,如數據源版本號,類型等。
◆SYSIBM.SYSFUNCMAPPINGS: 包括函數映射的基本信息如函數映射名,基于服務器的名字等等,一般可以用來判斷找不到相應函數這類的錯誤。
◆SYSIBM.SYSSERVEROPTIONS: 包括對服務器選項的設置信息,如 Collating_sequence,PROXY_AUTHID 等,這些選項的設置可以對查詢性能産生影響。
◆SYSIBM.SYSTYPEMAPPINGS: 包括數據類型映射的基本信息,如聯邦服務器這一側的數據類型和遠程數據源短的數據類型的對應關系,一般用于判斷數據類型相關的錯誤。
◆SYSIBM.SYSUSEROPTIONS: 在這個表中包括了用戶選項及其設置值,如連接遠程數據源使用的用戶名和密碼信息 (REMOTE_AUTHID, REMOTE_PASSWORD) 等,一般可以用于判斷連接錯誤或者訪問權限錯誤 ( 配合 DB2 本身的 SYSDBAUTH 系統表 )
◆SYSIBM.SYSWRAPOPTIONS: 其中包含了關于創建的轉換器的一些可選信息,例如在使用轉換器的時候是否使用“ Trusted ”或者“ Fenced ”選項。
除此以外,聯邦系統特定的系統表還包括 SYSIBM.SYSPASSTHRUAUTH,SYSIBM.SYSFUNCMAPPARMOPTIONS,SYSIBM.SYSFUNCMAPOPTIONS。在聯邦系統中,各系統表中的信息在正確情況下應該是一致的,例如對于每條 SYSIBM.SYSSERVERS 中的記錄,在 SYSIBM.SYSWRAPPERS 中總有一條記錄與此服務基于的轉換器對應。如果出現不一致的情況,那麽表示系統的缺陷導致了系統表的混亂。
系統可讀視圖和可更新視圖
除了系統表外,爲了查詢方便和權限管理起見,同 DB2 一樣,聯邦系統也存在著一些可讀的系統視圖如下:
清單1. 系統可讀視圖
SYSCAT.FUNCMAPPINGS
SYSCAT.FUNCMAPPARMOPTIONS
SYSCAT.FUNCMAPOPTIONS
SYSCAT.NICKNAMES
SYSCAT.PASSTHRUAUTH
SYSCAT.SERVEROPTIONS
SYSCAT.SERVERS
SYSCAT.TYPEMAPPINGS
SYSCAT.USEROPTIONS
SYSCAT.ROUTINESFEDERATED
這些可讀視圖爲用戶查詢特定的信息提供了方便,如 SYSCAT.ROUTINESFEDERATED 就從 SYSIBM.SYSROUTINES 和 SYSCAT.ROUTINEOPTIONS 中提取出了聯邦系統相關的例程信息,方便了用戶的查詢。
因爲聯邦系統的查詢相關的統計信息等和所有的 DB2 查詢統計信息一樣,可以通過 DB2 可更新的視圖來更新,因此聯邦系統不具有單獨的可被更新的系統視圖。
獲取解決問題信息的方法
1. db2look
如果用戶在遇到故障的時候,忘記了自己做過什麽操作或者由于操作過多,那麽在用戶操作引發錯誤的時候,往往知道引發這個問題的直接操作是什麽,但是並不能獲取可能引發錯誤的所有操作的信息用于診斷。DB2 本身提供了強大的工具 (db2support) 可以還原用戶的環境,但是對于普通用戶而非開發人員來講,從這些信息裏提取有用的信息非常困難,而 db2look 其簡潔靈活的特點是其更加適用于普通用戶的分析。對一般用戶來講,最常用的兩個選項爲 -d 和 -e 選項。
2. db2cat
db2cat 是得到聯邦系統和遠程數據源系統的信息的又一種工具,通過其打印出來的各種信息和我們直接從 catalog 表中取得的數據理論上應該是一致的,其 -p 選項後的 server 和 remote 選項值爲聯邦系統專有,別名 (nickname) 被做爲本地表來進行存儲和處理。注意 db2cat 並不能獲得用戶映射和函數映射這樣的信息,對于這類信息我們只能通過直接查詢系統表或系統試圖來獲得。我們可以利用 db2cat -h 選項來查看其更詳細的用法。
3. 直接從系統表中查詢相應信息
應用舉例
1.直接查詢系統目錄表信息舉例
以如何解決下面創建別名的時候遇到的權限問題爲例來說明系統目錄表的信息應用。
清單2. 爲遠程表創建別名
db2 => create nickname N2 for DATASTORE2.J15USER1.tab1
DB21034E The command was processed as an SQL statement
because it was not a valid Command Line Processor command.
During SQL processing it returned:
SQL0551N “ZURBIE” does not have the privilege to perform
operation “CREATE NICKNAME” on object “ZURBIE.N2”. SQLSTATE=42501
爲了解決上述問題,我們可以首先查詢用戶選項表 (SYSCAT.USEROPTIONS) 來判斷是否已經爲當前用戶 ZURBIE 建立了到遠程數據源的用戶映射 , 查詢如下:
清單3.通過查詢系統目錄獲得的用戶映射信息
db2 => select authid from syscat.useroptions where
servername = 'DATASTORE2' and option = 'REMOTE_AUTHID' and setting = 'J15USER1'
AUTHID
----------------------
LISHD
1 record(s) selected.
從中我們可以看到並沒有 Zurbie 相關的用戶映射,從而確定以上結果是正常的輸出。如果存在相應的用戶映射,那麽我們可以通過查詢 SYSCAT.DBAUTH 來確定用戶對聯邦系統操作的權限。
2.使用 db2cat 進行故障診斷
下面給出了更改已經創建的服務器端相應選項時遇到的錯誤:
清單4. 設置服務器選項
db2 => alter server NET8_SERVER options(set wrong_opt 'WRONG')
DB21034E The command was processed as an SQL statement
because it was not a valid Command Line Processor command.
During SQL processing it returned:
SQL1881N “WRONG_OPT” is not a valid “SERVER” option for “NET8_SERVER”.
SQLSTATE=428EE
這類問題我們也可以通過直接查詢 syscat.serveroptions 系統試圖來判斷此服務器選項是否真的存在,不過這裏給出利用 db2cat 來查詢服務器端相關信息的方法,我們可以利用如下命令:
db2cat –d test1 –s LISHD –p server –n NET8_SERVER –o output.pd
可以查看輸出得到如下,從中可以發現並沒有相應的選項,所以輸出結果也是正常的。
清單5.通過db2cat查詢到的服務器選項結果
$ vi output.pd
output.pd 41 lines,836 characters
DB2 Version 9.5,5622-044 (c) Copyright IBM Corp. 2007
Licensed Material - Program Property of IBM
IBM DATABASE 2 Catalog Analysis and Repair Tool
Please use single quote for delimited name
---------------------------------------------
SYSSERVERS.SERVER_DESC:
SYSSERVERS.SERVER_DESC HEADER
-----------------------------
SERVER IDENTIFICATION:
Wrapper Name :NET8
Server Name :NET8_SERVER
Server Type :ORACLE
Server Version :10.1
SERVER OPTIONS
-------------------------------
Name :NODE
Value :ora10g
Uid :SQL080403001500734
TimeStamp: {2008-04-03-00.15.00734363}
DATA TYPE MAPPINGS
---------------------------------
No Data Type Mappings
FUNCTION MAPPINGS
--------------------------------
No Function Mappings
3.真正的問題
一般來講,如果在執行 DDL 語句是遇到的錯誤,那麽一般可以根據查詢系統表和 db2cat 打印相關對象信息的方法來定位是産品的缺陷,如果是使用錯誤一般也可以從中得到相應的解決方法。諸如查詢效率低下或者查詢時遇到的相關問題等問題不但需要用戶熟悉系統表的組織,同時也需要用戶清楚自己數據源的特性,比如需要檢查服務器選項值的設置是否正確,如 collating_sequence,varchar_no_trailing_blanks 等,或者要檢查統計信息是否正確 ( 例如,可以通過 syscat.coldist 獲知列的分布情況,由此得知統計信息正確與否 )。一般說來當在用戶文檔中查詢不到對遇到的錯誤的詳細解釋說明時 ( 如 SQL901N), 或者聯邦系統停止在正在運行的操作上時此類錯誤是産品的缺陷,這是一種極少發生的情形。
總結
聯邦系統的系統目錄信息保存了聯邦系統特有對象的描述信息,産品同時還提供了一些系統視圖來簡化對相關信息的查詢。本文通過分析系統目錄的信息,簡要地描述了如何從系統目錄中獲得診斷相關的信息,並給出了相應的例子。