示例:恢复具有部分事务的对象

如果执行的“活动时保存”操作可能会导致对象与部分事务一起保存,那么建议您使用“备份、恢复和介质服务”(BRMS)。

可以使用 BRMS 来自动执行备份和恢复操作。 BRMS 自动将更改应用于具有部分事务的对象,并将其恢复到可用状态。

如果对象与部分事务一起保存,那么当在对象的恢复版本上应用或除去已记录的更改时需要 FROMENT(*LASTSAVE)。

使用字符界面恢复具有部分事务的对象时,请执行以下步骤以恢复库 CHK 和 SAV:

  1. 使用以下命令恢复这两个库:
    RSTLIB SAVLIB(CHK) DEV(TAP01)
    
    RSTLIB SAVLIB(SAV) DEV(TAP01)

    如果日志仍然在系统中存在,那么不恢复。 但是,这不是问题。

    如果不存在,那么系统将首先恢复日志对象,然后才恢复其他对象。

  2. 根据输出文件的指定,恢复最早的接收器。 如果保存时日志接收器位于 CHK 或 SAV 以外的库,并且当前不存在于系统中,那么请使用以下恢复命令来恢复接收器:
    
    RSTOBJ OBJ(attached-receiver-at-save-time) +
           SAVLIB(receiver-library) +
           DEV(TAP01) +
           OUTPUT(*OUTFILE)OUTFILE(lib/file)

    如果在保存数据时,连接的接收器位于 CHK 或 SAV 中,并且在 RSTLIB 操作之前不存在,那么系统会将其作为 RSTLIB 操作的一部分恢复。


  3. 确定要使 CHK 和 SAV 中对象处于其中的时间点或应用程序边界。 这就使所有对象处于相互关系的一致状态。 在确定所需的应用程序边界后,可能需要恢复其他日志接收器。 可以使用 WRKJRNA 命令为随后的“应用已记录的更改”(APYJRNCHG)操作确定所需的接收器的适当范围。 可以使用 DSPJRN 命令来定位标识所需应用程序边界的确切序号。 如果涉及多个日志,那么必须在每个日志中定位相同的应用程序边界(很可能由时间戳记标识)。 另外,还必须要记录相应的日志序号。 如果需要恢复其他日志接收器,但接收器并未联机,那么请使用以下恢复命令来恢复这些接收器。 此步骤可能需要执行多个恢复命令:
    RSTOBJ OBJ(other-needed-receivers) +
           SAVLIB(receiver-library) +
           DEV(TAP01)

  4. 使用下列“应用已记录的更改”(APYJRNCHG)命令之一将对象转发到特定应用程序边界。 根据给定的条件,APYJRNCHG 命令的不同变体也可能适合。

    如果在保存操作期间任何对象接收更改并处于落实控制之下,那么将在以下 APYJRNCHG 命令上保持落实边界。 如果不希望保持落实控制边界,那么您需要在以下 APYJRNCHG 命令上指定 CMTBDY(*NO)。

    1. 如果以下条件成立,那么请使用以下命令将已记录的更改应用于对象(完成或部分完成):
      • 未恢复日志,原因是正在将对象从其保存位置恢复到系统中。
      • 所用介质表示对象的最近保存。
      • 保存在保存命令上指定 UPDHST(*YES) 的对象。
      • 库 CHK 和 SAV 是已记录库。
      APYJRNCHG JRN(jrnlib/jrnname) +
                FROMENT(*LASTSAVE) +
                OBJ((CHK/*ALL *ALL)) +
                TOENTLRG(seq#-for-application-boundary) 
      
      APYJRNCHG JRN(jrnlib/jrnname) +
                FROMENT(*LASTSAVE) +
                OBJ((SAV/*ALL *ALL)) +
                TOENTLRG(seq#-for-application-boundary)

      如果涉及到多个日志,那么对每个日志重复这些命令,指定标识所需的应用程序边界的正确序号(TOENTLRG 参数)。 请注意,对于 CHK 和 SAV 中的每个日志,TOENTLRG 序号很可能不同,但它们都标识一个公共应用程序边界。

    2. 如果以下条件成立,那么请使用以下命令将已记录的更改应用于对象(完成或部分完成):
      • 已经恢复日志。
      • 所用介质表示对象的最近保存。
      • 保存在保存命令上指定 UPDHST(*YES) 的对象。
      • 库 CHK 和 SAV 是已记录库。
      APYJRNCHG JRN(jrnlib/jrnname) +
                OBJ((CHK/*ALL *ALL)) +
                RCVRNG(rcv-attached-at-save-time +
                       ending-rcv) +
                FROMENT(*LASTSAVE) +
                TOENTLRG(seq#-for-application-boundary)
      
      APYJRNCHG JRN(jrnlib/jrnname) +
                OBJ((SAV/*ALL *ALL)) +
                RCVRNG(rcv-attached-at-save-time +
                       ending-rcv) +
                FROMENT(*LASTSAVE) +
                TOENTLRG(seq#-for-application-boundary)

      如果涉及到多个日志,那么对每个日志重复这些命令,指定标识所需的应用程序边界的正确序号(TOENTLRG 参数)。 请注意,对于 CHK 和 SAV 中的每个日志,TOENTLRG 序号很可能不同,但它们都标识一个公共应用程序边界。

    3. 如果所有“活动时保存”介质未能表示保存指定 UPDHST(*YES) 的对象的最近保存,那么请执行以下命令。
      1. 使用 DSPJRN 命令决定每个对象保存开始日志项的序号。
      2. 为每个对象发出单独的 APYJRNCHG 命令。
      以下示例演示了此类 APYJRNCHG 命令:
      APYJRNCHG JRN(jrnlib/jrnname) +
                OBJ((filelib/filename filembr)) +
                RCVRNG(rcv-attached-at-save-time +
                       ending-rcv) +
                FROMENT(seq#-for-start-of-save-entry) +
                FROMENT(*LASTSAVE) +
                TOENT(seq#-for-application-boundary)

      如果使用的是 V5R3 之后的发行版,并且未在使用对象的最近保存,那么不能在 APYJRNCHG 命令上指定 FROMENT(*LASTSAVE)。 必须对库 CHK 和 SAV 中的每个对象指定一个单独的序号。

      如果日志中有一系列连续的保存开始项,那么某些 APYJRNCHG 命令可以指定多个对象。 通过单个 APYJRNCHG 命令为 FROMENT 参数指定连续序列中所有保存开始项的最早序号,来应用通过保存开始日志项的连续系列标识的成员。 如果使用的是 V5R3 或更高版本,那么请在 FROMENT 参数中使用 *LASTSAVE 值。