IBM Support

灵活而强大的SAVE命令,你不可不知的故事

Technical Blog Post


Abstract

灵活而强大的SAVE命令,你不可不知的故事

Body

 

IBM i的系统操作中,备份和恢复是不可或缺的功能。我们都知道,一个完整而有效的灾备计划,对于业务稳定的保障是至关重要的。功能强大的IBM i 为我们提供了灵活而多样的备份功能。然而面对纷繁复杂的备份策略,备份介质,菜单即各种命令,我们有时可能会觉得有些迷惑,到底该使用哪种方式,哪个命令,该如何使用呢?在众多备份机制中,有一个最基本同时也是非常强大的命令—SAVE。这篇博文就想跟大家分享一下各种关于保存(SAVE)的命令的非常强大却可能被人们所忽视的奇妙之处。

首先是SAVLIB,这可能是save command中使用频率最高的一个了。SAVLIB用来保存一个库中所有的对象以及对于库自身的描述。SAVLIB的几个关键参数中,除了我们熟知的DEVTGTRSOMITLIB/OMITOBJ,有这么几点值得注意的地方:

LIB—用来指明带保存的库。LIB参数中可以指明三个特殊值,*NONSYS, *IBM, *ALLUSR。如果使用*NONSYS,则所有user-created, licensed program , QGPL, QUSRSYS 都将被保存; *IBM 将保存所有IBM 提供的库,诸如QHTTP, QJAVA, . IBM提供的库是指仅包括IBM建立的对象的那些库。QGPL就不包括在其中,因为QGPL中可能存有用户建立的对象;*ALLUSR 将保存所有不是以”Q”或者”#”开头的库。

SAVACT—如果设为 *NO, 则所保存的对象不能是正在使用中(in use)的,同时,正在被保存的目标也无法被更新。下面这三个参数值能够用来保存当前正在使用的对象。使用*LIB, 则一个库中所有的对象将同时达到一个检查点(checkpoint),从而以一种一致(consistent)的状态保存下来。而*SYNCLIB做的是同样的事,但是针对多个库。建议不要对包含大数量的对象的库(比如几千个对象)使用*LIB或者*SYNCLIB参数。因为在这种情况下,需要很长的时间等待library中所有的目标都到达同一个检查点。这个操作也很有可能因为等待超时而失败。另外要注意的是,*SYNCLIB *LIB会将库中所有的数据区(data areas)锁住,这样就使得访问这些对象的程序有可能失败。还有一个参数值是*SYSDFN. 当使用*SYSDFN, 各对象可能会因为在不同的时间达到检查点,而以一种非一致的状态被保存下来。


然后我们来关注Save 对象命令。这个命令和SAVLIB有类似的参数设置。它们的使用情境最主要的不同点是,我们可以用SAVOBJ来保存某种特定类型的对象。如,如果我们需要保存系统上所有的作业描述(job descriptions),我们可以用SAVOBJ命令,参数设置为OBJ(*ALL), OBJTYPE(*JOBD).


接下来看看Save License Program (SAVLICPGM)命令。这个命令可以用来在多个系统间散布license program。当然你也可以用SAVLIB来完成这个任务,但是两者有一点小小的区别。 SAVLICPGM允许你将程序代码存储到一个备份文件上,这使得通过网络来快速散布特许程序(licensed program)变得更加容易。举一个实际的例子,如我们想在一个系统上安装Omnifind,一个简单的办法就是,首先在一个已经安装了Omnifind的系统上建立SAVE FILE,利用SAVLICPGMOmnifind保存到备份文件里,然后在待安装系统上利用RSTLICPGM完成Omnifind的安装。命令如下所示:

SAVLICPGM LICPGM(5733OMF) DEV(*SAVF) OPTION(*BASE) RLS(V1R1M0) SAVF(OMFINST/OMF0415) // OMFINST/OMF0415为指明的SAVE FILE



还有一个不可不提的命令就是SAV。这个命令可以用来保存IBM iIFSIntegrated File System)中的任何对象。通过使用不同的选项,可以完成IFS的全保存(full save)和部分保存(partial save)。举例来说,部分保存常见的情景可以是,备份某个IFS目录中存储的信息,比如一个网络服务器的根目录,或者一个domino目录,或者一个应用程序数据目录,等。通过部分保存,我们可以将不同的IFS目录保存到不同的磁带上,或者将一个应用程序,比如一个domino server保存到一个备份文件上,然后移植到另一个机器上。

下面列举几个使用SAV的实例。

  1. SAV DEV('qsys.lib/tap01.devd') OBJ(('/*') ('/QSYS.LIB' *OMIT) ('/QDLS' *OMIT))

这个命令将整个IFS目录保存到tap01上。OBJ(('/*')表示根目录为/*所对应的整个IFS目录,('/QSYS.LIB' *OMIT)表示忽略用户的Native DB2信息(保存在/QSYS.LIB)中,同时也忽略用户的DLO 系统 ('/QDLS')。其实通过绿屏用go save目录option 21来进行全系统备份时,也是这么做的。当保存整个IFS的时候,QSYS.LIB and /QDLS paths也是被忽略的。


  1. SAV DEV('qsys.lib/tap01.devd') OBJ(('/usrifs1*' *INCLUDE))

SAV DEV('qsys.lib/tap01.devd') OBJ(('/usrifs1*' *INCLUDE) ('/usrifs2' *INCLUDE)

('/usrifs1/subifs1*' *OMIT))

这个命令保存IFS目录/usfifs1/usrifs2以及其子目录下的所有内容,而对于匹配'/usrifs1/subifs1*'目录格式的内容,都会被忽略而不会被保存。


  1. SUBTREE参数的使用。当你需要指明某个目录下的子目录的备份要求时,需要使用SUBTREE参数。这个参数常用的选项包括:

*ALL—保存匹配的首层目录结构以及其所有子目录,同时包括这些目录结构中包含的所有对象。这个选项是缺省值。

*NONE仅保存OBJ list中所匹配的目录模式以及即此目录下所直接包含的物体,而此目录下的所有子目录及其相关对象都不会被保存。

*OBJ仅精确匹配OBJ name模式的对象会被保存。如果这个对象是一个目录结构,那这个目录下的对象是不会被保存的。

*DIR所有匹配OBJ name模式的目录以及其所包含的对象,同时还有此目录下的所有子目录结构会被保存,而子目录下包含的对象会被忽略。


除了上面提到的这些命令,备份和恢复还有很多其他的命令和方法,能做很多事!常见的如SAVSTG,SAVSYS,SAVAPARDTA,SAVCAL,SAVRST,SAVRSTOBJ,SAVRSTCHG,SAVRSTLIB,SAVRSTCFG等。他们看似简单,其实有很多值得挖掘的地方,让我们多多实践,积累并分享使用心得吧!

[{"Business Unit":{"code":"BU058","label":"IBM Infrastructure w\/TPS"},"Product":{"code":"SWG60","label":"IBM i"},"Component":"","Platform":[{"code":"PF025","label":"Platform Independent"}],"Version":"","Edition":"","Line of Business":{"code":"LOB57","label":"Power"}}]

UID

ibm11146220