官术网_书友最值得收藏!

1.6 診斷智能掃描錯誤結果集

Exadata的智能掃描功能涉及計算節點和存儲節點的很多模塊,其中的任何一個模塊出現問題,都有可能導致智能掃描的結果集出現異常。智能掃描功能涉及的層次和模塊如表1.5所示。

表1.5 智能掃描涉及的模塊及說明

1.6.1 智能掃描流程圖

如圖1.9所示是計算節點數據庫和存儲節點上智能掃描的整個流程圖及實現智能掃描的主要模塊。

圖1.9 智能掃描流程圖

ROWSRC模塊用于在Exadata進行表掃描、索引快速全掃描的時候決定是否使用直接路徑讀取。在這種情況下,將在KDS(數據層)、KTR(事務層)和KCBL(直接路徑讀)中積累元數據,然后再傳遞給KCFIS模塊。KCFIS模塊是Exadata中的一個新模塊,它負責在數據庫上驅動智能IO。KCFIS模塊使用一個與ASM相關的名為KFIS的模塊,實現數據庫的數據文件地址空間到存儲節點Griddisk地址空間的轉換。

KCFIS模塊使用LIBCELL庫實現了與Exadata存儲節點的通信接口,元數據和Griddisk的塊號列表、它們的偏移量及其長度都會被發送到存儲節點(LIBCELL庫使用SKGXP提供可靠的網絡接口)。存儲節點的CELLSRV進程接收這些信息,啟動Block IO和/或Flash IO,并使用FPLIB庫來應用智能IO卸載操作。在智能掃描過程中,FPLIB庫創建的結果集最終被發送回計算節點的數據庫。

下面對存儲節點上的智能掃描部分進一步細化,存儲節點上智能掃描的整個流程圖及實現智能掃描的主要模塊如圖1.10所示。

圖1.10 存儲節點智能掃描流程圖

■ 存儲節點CELLSRV進程中的PredicateDisk模塊通過PredicateDiskRead代碼發布IO請求。

■ PredicateDiskRead代碼向Storage Idx進行咨詢,檢查是否有必要向底層的存儲發布這些IO請求。

■ 在StorageIdx Metadata元數據的幫助下,Storage Idx和FPLIB庫將決定是否應該發布IO。對于給定的謂詞,如果Storage Idx表明不需要發布IO掃描,那么PredicateDiskRead將不會為那些IO請求發出真實的IO掃描。

■ 如果Storage Idx表明IO請求需要發出IO掃描,那么PredicateDiskRead將向FlashCache,也可能是Griddisk(也即硬盤),發出真實的IO掃描操作。

■ 如果PredicateDiskRead實際上發布了真正的IO掃描操作,那么掃描的IO將通過PredicateFilter模塊進行過濾操作。

■ PredicateFilter模塊使用FPLIB庫執行篩選動作,FPLIB庫可以使用CommitCache和NLS庫,生成的結果將被發送回計算節點的數據庫。

1.6.2 智能掃描錯誤結果集的診斷

正如在前面所看到的,智能掃描操作中涉及許多層面和模塊,錯誤結果集可能出自任何一個層面或模塊中的軟件缺陷。有選擇地關閉這些層面或模塊,可以幫助確認是哪些層面或模塊代碼導致了智能掃描操作產生錯誤結果集。

1.cell_offload_processing參數

該數據庫參數的默認值為true,也即開啟智能掃描。如果將該參數設置為false,則表示關閉智能掃描。

當某條SQL語句出現錯誤的結果集問題時,首先要做的是禁用智能掃描,并檢查是否仍然存在錯誤結果集的問題。

將這個參數設置為false,也即關閉智能掃描,如果問題不再發生,則說明這是智能掃描特性引發的問題;如果問題仍然發生,則說明這并不是智能掃描特性引發的問題,很可能出自更高層次的數據層。

2._kcfis_cell_passthru_enabled參數

該數據庫參數的默認值為false,也即禁用存儲節點的pass-thru模式進行智能掃描,而選用smart-io模式進行智能掃描。如果該參數值設置為true,則表明支持使用存儲節點的pass-thru模式進行智能掃描。

將這個參數設置為true,如果問題不再發生,則說明是FPLIB庫的問題;如果問題仍然發生,則說明這并不是FPLIB庫的問題,而很可能是KCFIS模塊、Storage Index模塊、PredicateDisk模塊、FlashCache模塊的問題。

3._kcfis_storageidx_disabled參數

該數據庫參數的默認值為false,也即啟用存儲索引特性。如果該參數值設置為true,則表示關閉存儲索引特性。

存儲索引特性會依賴于存儲索引元數據,同時在FPLIB庫的幫助下避免了智能掃描所不需要的IO掃描。

將這個參數設置為true,如果問題不再發生,則說明是存儲索引特性引發的問題;如果問題仍然發生,則說明不是存儲索引特性引發的問題。

4._kcfis_kept_in_cellfc_enabled參數

該數據庫參數的默認值為true,也即在智能掃描時,允許從FlashCache中獲取需要的數據;如果該參數值設置為false,則表明在智能掃描時,不允許從FlashCache中獲取需要的數據。

將這個參數設置為false,如果問題不再發生,則說明是FlashCache傳輸的問題或FlashCache與智能掃描交互過程中產生的問題;如果問題仍然發生,則說明不是FlashCache引發的問題。

注意:直到11.2.0.2版本,數據庫中才出現了_kcfis_kept_in_cellfc_enabled參數。在11.2.0.1版本中,與之對應的數據庫參數為_kcfis_control1,其參數值為0或1。其中0為默認值,表示在Smart Scan時,允許從FlashCache中獲取需要的數據,而參數值為1,則表示在智能掃描時,不允許從FlashCache中獲取需要的數據。

5._kcfis_rdbms_blockio_enabled參數

該數據庫參數的默認值為false,也即禁用計算節點數據庫的Block IO模式。如果該參數值設置為true,則表示開啟計算節點數據庫的Block IO模式。

將這個參數設置為true,如果問題不再發生,則這個問題變得有點費解了。也許仍然是KCFIS模塊的問題,可能需要提交Exadata研發部門進一步確認。如果問題仍然發生,則說明很可能是計算節點數據庫的KCFIS模塊引發的問題。

針對SQL語句在智能掃描過程中出現了錯誤的結果集,可以參照圖1.11所示的過程進行一一排查。

圖1.11 智能掃描出現錯誤結果集排錯流程圖

如果按照圖1.11所示流程進行排查,仍無法定位是什么模塊導致出現錯誤的結果集,則需要向Oracle官方提交“服務請求”。在提交“服務請求”時,可以依據MOS文檔ExadataHow to diagnose smart scan and wrong results(Doc ID 1260804.1)來收集相關的信息。

主站蜘蛛池模板: 日土县| 乡宁县| 荃湾区| 高陵县| 汨罗市| 江门市| 宁海县| 洛隆县| 乌海市| 信阳市| 湟源县| 文水县| 永吉县| 彭泽县| 江永县| 自贡市| 邻水| 衡山县| 莱西市| 平阴县| 大邑县| 黔江区| 泰安市| 镇原县| 淄博市| 尉氏县| 新干县| 韶山市| 和田县| 额尔古纳市| 凌源市| 剑川县| 平顺县| 九台市| 高淳县| 孟连| 莱芜市| 西华县| 鹤庆县| 株洲县| 莲花县|