VSAM 檔案結構分析用於資料現代化

VSAM 檔案結構分析在資料現代化專案中的應用

內部網路 2026 年 8 月 18 日 , , ,

資料遷移不能孤立進行,它必須與讀寫這些資料集的 COBOL 應用程式同步演進。這項限制構成了 VSAM 現代化的全部挑戰。 VSAM(虛擬儲存存取方法)不僅僅是一種檔案格式,它是程式之間的資料契約,是一種隱式規範,它只在檔案描述符條目和 SELECT 子句中定義,並控制企業系統中每個程式如何產生和使用其最關鍵的業務資料。如果讀取該記錄的每個程式沒有反映出單一記錄佈局的更改,就會導致資料損壞,而這種損壞可能要等到執行監管報告時才會顯現出來,因為此時資料的含義已與使用程式的預期不符。

成功實現 VSAM 資料現代化的組織並非從目標模式入手,而是從對 VSAM 文件內容、結構、存取程序、存取模式以及生產者和消費者之間存在的隱性契約進行全面、基於證據的理解開始。這種理解,即 VSAM 檔案結構分析,是後續所有決策的前提:哪些 VSAM 資料集對應到關聯表,哪些需要不同的目標架構,哪些記錄佈局需要進行精確度保持的資料類型轉換,以及哪些共用資料集必須作為協調單元而非獨立單元進行遷移。

共享資料集需要協調遷移

SMART TS XL 自動擷取目標模式設計所需的每個記錄佈局細節。

了解更多…

VSAM 的四個組織及其各自的要求

VSAM 資料集分為四種不同的組織形式。每種形式都具有不同的結構特徵、不同的典型存取模式以及與現代目標架構的不同自然映射關係。如果將所有 VSAM 資料集一視同仁地批次轉換為關係表,則產生的目標架構雖然能夠處理某些資料集,但對其他資料集則效能不佳甚至功能失效。

KSDS(鍵序資料集)是最常見的 VSAM 組織方式。記錄按主鍵(主鍵)進行物理排序,既支援按鍵直接訪問,也支援按鍵順序存取。 KSDS 檔案可以選擇性地包含備用索引,即允許透過除主鍵之外的欄位進行擷取的輔助鍵路徑。 KSDS 的理想目標是關係表,其中主鍵變成主鍵,備用索引變成 SQL 索引。

ESDS(條目順序資料集)依照記錄寫入的順序儲存資料。它沒有鍵,記錄透過其物理位元組偏移量(RBA:相對位元組位址)進行定址。 ESDS 檔案通常用於儲存類似日誌的數據,例如稽核追蹤、交易日誌和事件流。 ESDS 的自然目標是僅追加關係表、事件流(Kafka 主題)或時間序列資料庫,具體取決於使用程式存取資料的方式。

相對記錄資料集 (RRDS)儲存固定長度的記錄,並以相對記錄號進行定址。文件中的每個插槽對應一個記錄號;插槽可以為空(已刪除)。 RRDS 檔案用於記錄號碼對應用程式有意義的直接存取場景,通常用作簡單的查找表或基於雜湊的儲存。理想情況下,RRDS 可以作為具有數字序列標識符的關係表,或者在資料集較小且存取頻繁的情況下,作為記憶體查找結構。

LDS(線性資料集)是一種位元組尋址存儲,其記錄結構對 VSAM 不可見。它被應用程式(通常是 DB2、Java 工作負載或自訂程式)使用,這些應用程式在 VSAM 位元組範圍內管理其內部格式。 LDS 檔案無法透過標準的 COBOL FD 條目進行分析,其結構僅存在於寫入它們的應用程式層中。

每個資料集的分析輸出必須明確指出它使用哪個組織,因為組織決定了下游的一切:目標架構、存取模式以及理解其結構所需的特定分析。

記錄佈局分析問題

記錄佈局是 VSAM 結構分析中最具分析複雜性的維度。與關係模式中每列都具有由資料庫引擎強制執行的已定義類型、名稱和約束不同,VSAM 記錄沒有自描述結構。佈局完全存在於 COBOL 函數描述子 (FD) 條目中,而 FD 條目很少是簡單的。

FD條目和副本成員

VSAM 資料集的記錄結構在 COBOL 資料部的檔案描述 (FD) 條目中定義。在維護良好的程式碼庫中,FD 條目引用一個 COPY 成員,這是一個共享的副本簿,它定義了記錄佈局,並且每個存取該資料集的程式都會包含它:

科博爾

       FILE SECTION.
       FD  CUSTOMER-FILE
           LABEL RECORDS ARE STANDARD
           RECORD CONTAINS 250 CHARACTERS.
       01  CUSTOMER-RECORD.
           COPY CUSTMSTR.

COPY 成員 CUSTMSTR 定義實際的場地佈局。如果包含 47 個程序 CUSTMSTR那麼,47 個程式都依賴它定義的記錄佈局。字段重命名 CUSTMSTR 影響全部 47 個。這是應用於資料的副本耦合問題:VSAM 記錄佈局是一個共用依賴項,如果不協調使用它的每個程序,就無法變更。

對於遷移分析,每個功能依賴項 (FD) 條目都必須追溯到其對應的副本,而每個副本都必須對應到包含它的所有程式。共享佈局依賴圖是理解遷移範圍的基礎。

重新定義:多種佈局,一筆記錄

REDEFINES 子句是 VSAM 記錄分析真正變得複雜的地方。 REDEFINES 允許對同一實體儲存進行不同的字段解釋。包含交易類型代碼的 VSAM 記錄可以使用 REDEFINES 根據該程式碼以不同的方式解釋剩餘位元組:

科博爾

       01  TRANSACTION-RECORD.
           05  TXN-TYPE        PIC X(2).
           05  TXN-COMMON-DATA PIC X(48).
           05  TXN-DETAIL      REDEFINES TXN-COMMON-DATA.
               10  TXN-PAYMENT.
                   15  PAY-AMOUNT     PIC S9(11)V99 COMP-3.
                   15  PAY-CURRENCY   PIC X(3).
                   15  PAY-METHOD     PIC X(2).
                   15  FILLER         PIC X(28).
           05  TXN-WITHDRAWAL  REDEFINES TXN-COMMON-DATA.
               10  WDR-AMOUNT     PIC S9(11)V99 COMP-3.
               10  WDR-ACCOUNT    PIC 9(12).
               10  WDR-BRANCH     PIC 9(5).
               10  FILLER         PIC X(18).

這張唱片並非只有一種版式,而是有三種,取決於… TXN-TYPE在目標關係模式中,這通常需要採用以下三種設計之一:多型表設計(單寬表,每個變體對應一個可空列)、規範化設計(父行加上特定類型的子行),或使用 JSON 列來儲存變體資料。所有這些決策都必須在分析目標關係模式之後才能做出。 TXN-TYPE 數據中存在這些值,並且實際使用了 REDEFINES 變體。

完整的記錄佈局分析必須包含以下內容:

  • 識別每個 FD 條目中的每個 REDEFINES 層級結構
  • 確定在哪些條件下啟動哪個 REDEFINES 變體(需要進行程序邏輯分析,而不僅僅是功能描述子分析)
  • 記錄每個變體的欄位類型、長度和壓縮十進位精度
  • 為目標模式推薦合適的標準化策略

COMP-3 和數值精度

COBOL的 PIC S9(11)V99 COMP-3 (壓縮十進位)具有特定的精度和小數位數特性,這些特性在 SQL 標準資料類型中沒有直接對應的類型。 V 表示隱含的小數點,該值儲存為隱含 2 位小數的整數。 COMP-3 每個位元組儲存兩個十進制數字,最後一個半位元組儲存符號。

當此欄位遷移到關聯式資料庫時,正確的 SQL 目標是: DECIMAL(13, 2)FLOAT這將引入舍入誤差,而不是 INTEGER這樣會丟失小數位。對於使用 COMP-3 欄位儲存貨幣金額的財務系統而言,精度要求不容商榷。遷移轉換 PIC S9(11)V99 COMP-3 將目標模式中的資料類型轉換為浮點類型會引入舍入誤差,這些誤差會在批次運行中累積,並可能影響監管報告。

在目標模式設計開始之前,必須記錄每個 FD 條目中的每個 COMP-3 欄位的精確度、比例和符號約定。

分析 COBOL 原始碼中的 VSAM 存取模式

文件描述符 (FD) 條目描述了記錄的內容。 COBOL 過程部 (PROCEDURE DIVISION) 描述了程式如何使用這些內容。兩者對於完整的結構分析都是必要的。存取模式分析會檢查每個程式中所有存取資料集的檔案存取謂詞。

SELECT 子句:第一個訊號

ENVIRONMENT DIVISION 中的 SELECT 子句規定了 COBOL 程式如何存取 VSAM 檔案:

科博爾

       ENVIRONMENT DIVISION.
       INPUT-OUTPUT SECTION.
       FILE-CONTROL.
           SELECT CUSTOMER-FILE
               ASSIGN TO CUSTFILE
               ORGANIZATION IS INDEXED
               ACCESS MODE IS DYNAMIC
               RECORD KEY IS CUST-PRIME-KEY
               ALTERNATE RECORD KEY IS CUST-ALT-KEY
                   WITH DUPLICATES
               FILE STATUS IS WS-CUST-STATUS.

此 SELECT 子句揭示了:

  • ORGANIZATION IS INDEXED → KSDS
  • ACCESS MODE IS DYNAMIC → 程式同時使用了順序存取和隨機存取。
  • ALTERNATE RECORD KEY IS CUST-ALT-KEY WITH DUPLICATES → 存在備用索引,本程式使用該索引。

動態存取模式特別重要:以動態模式存取 KSDS 的程式可以使用 READ 附有可直接進入的鑰匙 READ NEXT 對於從定位點開始的順序掃描,目標中必須複製這兩種存取模式,這可能需要關係模式同時支援直接查找(主鍵查詢)和範圍掃描(有序遍歷)。

訪問動詞及其對移民的影響

每個文件存取動詞都揭示了程式與 VSAM 資料集互動的不同面向:

閱讀(直接): READ CUSTOMER-FILE KEY IS WS-CUST-KEY直接鍵查找。映射到 SELECT ... WHERE primary_key = ?大多數 KSDS 程式都使用這種模式;它可以直接轉換為關係索引查找。

讀取(順序): READ CUSTOMER-FILE NEXT RECORD從目前位置開始順序掃描。映射到 SELECT ... ORDER BY primary_key 遊標定位。隱式排序依賴關係(即依賴 VSAM 自然鍵序進行順序處理的程式)必須在目標系統中明確保留。

開始: START CUSTOMER-FILE KEY >= WS-SEARCH-KEY 其次是 READ NEXT從部分鍵位置進行範圍掃描。映射到範圍查詢: SELECT ... WHERE primary_key >= ? ORDER BY primary_key使用 START 的程式會為順序掃描建立下限;這是 KSDS 檔案的關鍵存取模式,除非目標表具有相同的按鍵順序,否則沒有簡單的等效方法。

寫: 按鍵插入新記錄。映射到 INSERT INTO如果 VSAM 檔案有備用索引,則寫入作業必須與這些索引保持一致;在 VSAM 中,這是自動的;在關聯式資料庫中,則需要資料庫觸發器或應用程式層級程式碼來維護等效的輔助索引表。

改寫: 就地更新記錄。該記錄目前必須處於持有狀態(在執行帶有持有意圖的讀取操作之後)。映射到 UPDATE ... WHERE primary_key = ?. REWRITE 是一種讀-修改-寫入模式;遷移必須在讀取和寫入過程中保持事務完整性。

DELETE:按鍵刪除記錄。在 KSDS 檔案中,DELETE 執行的是物理刪除。那些期望已刪除的記錄槽位在後續順序掃描中不可用的程式依賴於這種物理刪除行為。目標中的軟刪除(邏輯刪除標誌)不會產生等效的行為,除非所有使用該記錄的程式都更新為過濾邏輯刪除的記錄。

替代索引用法:隱藏的依賴關係

KSDS 檔案的備用索引是 VSAM 遷移中最常被忽略的依賴項之一。備用索引允許程式透過主鍵以外的欄位存取 KSDS。備用索引本身是一個獨立的 VSAM 資料集(路徑),必須與基礎叢集保持同步。

一個訪問程序 CUSTOMER-FILE 透過它的備用鍵 CUST-ALT-KEY 如果僅分析基礎叢集 FD 條目,則存在不可見的依賴關係。遷移必須:

  1. 確定哪些程式使用哪些備用鍵(在 SELECT 子句中可見)。 ALTERNATE RECORD KEY 聲明)
  2. 將每個備用鍵對應到目標表上的等效 SQL 索引。
  3. 確保對目標表執行的 INSERT 和 DELETE 操作能夠自動維護與備用索引等效的值,通常是透過資料庫引擎透明維護的 SQL 唯一索引或非唯一索引來實現的。

分析必須列出每個 KSDS 資料集的每個備選索引,並將每個索引對應到其使用的程式。

共享資料集問題:隱式資料契約

VSAM 檔案經常在多個程式和多個 JCL 作業步驟之間共用。這種共享會創建隱式資料契約,即程式之間關於記錄佈局、鍵範圍和存取模式的約定,而這些約定僅存在於程式碼本身。

共享資料集依賴關係有兩個維度:

生產者-消費者關係。程式 A 寫入記錄,程式 B 讀取記錄。程式 A 產生的記錄佈局、鍵值和順序必須與程式 B 期望使用的完全一致。如果 A 和 B 在沒有協調共享資料契約的情況下獨立遷移到不同的目標模式,則會導致資料靜默損壞:B 對目標資料庫的讀取操作雖然成功,但傳回的資料格式與 B 的邏輯無法正確處理。

跨作業步驟的並發存取。一個 JCL 作業流程可能包含多個步驟,每個步驟依序執行不同的程式來處理同一個 VSAM 資料集。步驟 1 寫入數據,步驟 2 讀取並轉換數據,步驟 3 寫入結果。遷移必須保留這種順序依賴關係,程式存取和修改共享資料集的順序是系統行為規範的一部分。

完整的共享資料集分析必須:

  • 列舉每個 VSAM 資料集以及存取該資料集的每個程式。
  • 將每個程式的存取權限分類為生產者(寫入/重寫/刪除)、消費者(讀取)或兩者兼有。
  • 記錄每個程式運行的 JCL 作業上下文,包括每個程式運行的步驟、作業以及調度器依賴關係鏈。
  • 找出生產者-消費者對,其中生產者的輸出格式必須與消費者預期的輸入格式完全匹配。

這項分析不能孤立地檢視任何一個程序來完成,它需要進行跨程序、跨JCL的結構分析。

遷移前交付成果:分析必須產生哪些結果

VSAM結構分析足以支援資料現代化規劃,並可產生六項成果:

交付成果 1:VSAM 資料集清單

環境中的每個 VSAM 資料集,包括:資料集組織(KSDS/ESDS/RRDS/LDS)、平均和最大記錄長度、估計的記錄數(來自 JCL SPACE 參數或目錄項目)、鍵結構(主鍵偏移量、長度;備用鍵結構)以及資料集是否具有備用索引。

交付成果 2:記錄版面目錄

對於每個資料集,每個 FD 條目及其引用的副本,包括:所有欄位定義(包括 REDEFINES 層次結構)、每個 COMP-3 欄位及其精確精確度和比例、每個二進位 (COMP/COMP-5) 欄位及其位元組長度、每個可變長度元素(OCCURS DEPENDING ON 及其控製)以及 REDEFINES 欄位變體的佈局。

交付成果 3:各項目的訪問模式分類

對於存取每個資料集的每個程式:SELECT 子句特徵(組織、存取模式、備用鍵用法)、使用的完整存取動詞集(READ/START/WRITE/REWRITE/DELETE)、程式是否使用順序存取並依賴按鍵順序、程式使用的備援索引,以及程式是否具有讀-修改-寫模式(隱式交易要求)。

交付成果 4:共享資料集映射

這是一個有向圖,其中節點代表 VSAM 資料集和程序,邊代表存取關係及其類型(讀/寫)。此圖顯示了每個生產者、每個消費者、生產者-消費者對以及每次造訪的 JCL 作業序列上下文。

交付成果 5:目標模式建議

針對每個VSAM資料集,根據其組織和存取模式,建議的目標架構如下:

VSAM 類型主訪問模式推薦目標
KSDS,僅限直接金鑰訪問按主鍵找點關係表,已建立索引
KSDS,有開始/閱讀下一頁按關鍵順序進行範圍掃描帶有聚集索引的關係表
KSDS及其替代索引多路徑密鑰訪問具有多個索引的關係表
ESDS,僅追加順序追加,無鍵僅追加表、事件流或日誌
ESDS,具有 RBA 存取權限位元組偏移定位帶有元資料索引的物件存儲
RRDS記錄編號訪問具有序列列的關係表
大型 KSDS(批次、分析)完整連續掃描列式儲存或資料湖
摩門教應用程式管理的內部格式需要進行應用層分析

交付成果 6:精確敏感欄位註冊表

每個資料集中的每個 COMP-3、COMP、COMP-5 和浮點字段,都有其 COBOL 定義、正確的 SQL 資料類型映射,以及在遷移前後需要進行精度驗證的任何字段的標誌。

VSAM 分析與關係模式分析有何不同?

擁有關聯式資料庫遷移經驗的團隊有時會低估 VSAM 分析的重要性,因為他們沿用了傳統的模式遷移思維模式:提取 DDL、重新設計模式、遷移資料。 VSAM 在資料庫意義上沒有 DDL。模式分佈在原始程式碼、FD 條目、副本、SELECT 子句以及 PROCEDURE DIVISION 邏輯中,該邏輯決定了給定記錄啟動的 REDEFINES 變體。

VSAM 分析有以下三個結構上的獨特之處:

模式存在於程式碼中。 VSAM資料集的記錄佈局定義在 COBOL 原始碼中,而不是資料庫目錄中。查找它需要解析原始程式碼。更改它需要協調所有共用該副本簿的程式。理解其所有變體需要分析程式邏輯,而不僅僅是檔案描述符條目。

存取模式隱含在程式行為中。關聯式資料庫透過 EXPLAIN 計劃和查詢日誌暴露查詢模式。 VSAM 存取模式僅在存取檔案的程式的 PROCEDURE DIVISION 中可見。要了解程式是否依賴鍵排序、備用索引存取或範圍掃描,需要進行程式碼分析。

共享資料集會創建隱藏的契約。在關聯式資料庫中,模式是所有使用者共享和可見的資料庫級元件。而在 VSAM 中,記錄佈局嵌入在每個程式的副本中。兩個程式可能擁有名義上相同的記錄佈局的不同版本,而發現這種差異需要比較不同程式的副本定義,而不是檢查單一模式定義。

SMART TS XL 執行VSAM結構分析

SMART TS XL“ 靜態程式碼分析 解析 COBOL 原始碼中存在的 VSAM 結構的每個元素:FD 條目、COPY 成員展開、SELECT 子句聲明(組織結構、存取模式、主鍵和備用鍵規範)以及 PROCEDURE DIVISION 中的每個檔案存取動詞。對於每個 VSAM 資料集,分析結果會產生存取模式分類、包含完整 REDEFINES 解析的記錄佈局以及包含精確元資料的 COMP-3 欄位註冊表。

應用程式依賴關係映射建立共享資料集映射:每個存取 VSAM 資料集的程序,按存取類型分類,識別生產者-消費者關係,並解析副本共享圖。當 47 個程式共用一個定義 VSAM 記錄佈局的副本時,依賴關係映射會在做出任何遷移決策之前就使所有 47 個程式可見,而不是在佈局變更以意想不到的方式破壞 47 個程式之後才發現問題。

JCL擴充功能提供了操作上下文:哪些 JCL 作業步驟在其 DD 語句中引用了哪些 VSAM 資料集,引用順序如何,以及它們位於哪些作業流程中。 JCL 作業層級的生產者-消費者關係(例如,步驟 1 寫入 VSAM 資料集,步驟 3 讀取該資料集)在 JCL 依賴關係分析中清晰可見,從而實現了遷移排序,並保留了批次調度所強制執行的操作順序依賴關係。

影響分析功能可以解答每個 VSAM 遷移決策之前都必須面對的問題:如果此資料集的佈局發生變化,哪些程式會受到影響?在任何遷移工作開始之前,系統都會列舉影響範圍,包括所有共享相關副本的程序以及所有引用該資料集的 JCL 步驟,從而為協調一致的遷移規劃奠定基礎,而不是逐個發現受影響的程序。

企業搜尋功能讓整個現代化計劃中可以查詢完整的 VSAM 清單:在幾秒鐘內,跨越數百萬行 COBOL 程式碼,尋找存取特定 VSAM 資料集的每個程式、定義特定記錄佈局的每個副本、使用 START/READ NEXT 模式(指示排序依賴關係)的每個程式、定義為 COMP-3(需要精確的目標對應)的每個欄位。

如在上下文中所述 將 IMS 和 VSAM 資料結構與 COBOL 程式一起遷移資料遷移和程式碼分析必須並行進行。 SMART TS XLVSAM 的結構分析提供了使並行性可控的清單、共享記錄佈局、存取模式以及生產者-消費者關係,這些關係決定了資料遷移是否可以獨立進行,或者必須與程式變更協調。

你所理解的結構就是你能遷移的結構。

在現代化專案中,VSAM 檔案結構分析並非額外開銷,而是決策的基礎。如果不了解記錄佈局變體,就無法設計目標模式;如果不了解生產者-消費者關係,就無法確定遷移順序;如果不了解哪些欄位需要支援小數的目標類型,就無法保持 COMP-3 欄位的精確度。

任何跳過此分析的現代化項目都會在遷移執行過程中發現其遺漏之處:例如,未經分析的 REDEFINES 變體在目標中產生格式錯誤的記錄;共享資料集在未協調所有使用者的情況下被遷移;依賴 VSAM 鍵排序返回的範圍掃描導致目標表(未設計聚集索引)的順序未定義。這些在執行過程中發現的問題,其成本是規劃階段進行分析成本的數倍。

首先理解資料結構,其次再進行資料遷移。順序並非形式,而是決定資料遷移結果是否正確與否的關鍵所在:前者會產生看似正確的數據,而後者則可能在首次監管審計時才被發現。