示例:恢复具有部分事务的对象
如果执行的“活动时保存”操作可能会导致对象与部分事务一起保存,那么建议您使用“备份、恢复和介质服务”(BRMS)。
可以使用 BRMS 来自动执行备份和恢复操作。 BRMS 自动将更改应用于具有部分事务的对象,并将其恢复到可用状态。
如果对象与部分事务一起保存,那么当在对象的恢复版本上应用或除去已记录的更改时需要 FROMENT(*LASTSAVE)。
使用字符界面恢复具有部分事务的对象时,请执行以下步骤以恢复库 CHK 和 SAV:
- 使用以下命令恢复这两个库:
RSTLIB SAVLIB(CHK) DEV(TAP01) RSTLIB SAVLIB(SAV) DEV(TAP01)如果日志仍然在系统中存在,那么不恢复。 但是,这不是问题。
如果不存在,那么系统将首先恢复日志对象,然后才恢复其他对象。
- 根据输出文件的指定,恢复最早的接收器。 如果保存时日志接收器位于 CHK 或 SAV 以外的库,并且当前不存在于系统中,那么请使用以下恢复命令来恢复接收器:
RSTOBJ OBJ(attached-receiver-at-save-time) + SAVLIB(receiver-library) + DEV(TAP01) + OUTPUT(*OUTFILE)OUTFILE(lib/file)如果在保存数据时,连接的接收器位于 CHK 或 SAV 中,并且在 RSTLIB 操作之前不存在,那么系统会将其作为 RSTLIB 操作的一部分恢复。
- 确定要使 CHK 和 SAV 中对象处于其中的时间点或应用程序边界。 这就使所有对象处于相互关系的一致状态。 在确定所需的应用程序边界后,可能需要恢复其他日志接收器。 可以使用 WRKJRNA 命令为随后的“应用已记录的更改”(APYJRNCHG)操作确定所需的接收器的适当范围。 可以使用 DSPJRN 命令来定位标识所需应用程序边界的确切序号。 如果涉及多个日志,那么必须在每个日志中定位相同的应用程序边界(很可能由时间戳记标识)。 另外,还必须要记录相应的日志序号。 如果需要恢复其他日志接收器,但接收器并未联机,那么请使用以下恢复命令来恢复这些接收器。 此步骤可能需要执行多个恢复命令:
RSTOBJ OBJ(other-needed-receivers) + SAVLIB(receiver-library) + DEV(TAP01) - 使用下列“应用已记录的更改”(APYJRNCHG)命令之一将对象转发到特定应用程序边界。 根据给定的条件,APYJRNCHG 命令的不同变体也可能适合。
如果在保存操作期间任何对象接收更改并处于落实控制之下,那么将在以下 APYJRNCHG 命令上保持落实边界。 如果不希望保持落实控制边界,那么您需要在以下 APYJRNCHG 命令上指定 CMTBDY(*NO)。
- 如果以下条件成立,那么请使用以下命令将已记录的更改应用于对象(完成或部分完成):
- 未恢复日志,原因是正在将对象从其保存位置恢复到系统中。
- 所用介质表示对象的最近保存。
- 保存在保存命令上指定 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 序号很可能不同,但它们都标识一个公共应用程序边界。
- 如果以下条件成立,那么请使用以下命令将已记录的更改应用于对象(完成或部分完成):
- 已经恢复日志。
- 所用介质表示对象的最近保存。
- 保存在保存命令上指定 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 序号很可能不同,但它们都标识一个公共应用程序边界。
- 如果所有“活动时保存”介质未能表示保存指定 UPDHST(*YES) 的对象的最近保存,那么请执行以下命令。
- 使用 DSPJRN 命令决定每个对象保存开始日志项的序号。
- 为每个对象发出单独的 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 值。
- 如果以下条件成立,那么请使用以下命令将已记录的更改应用于对象(完成或部分完成):