首页 > 学技术 > 技术网文 > IBM AS400应用论坛 > 正文

[原创] {系统管理员必备}如何恢复PF中被误删除的记录?


来源 chinaunix.net 酷勤网整理

[size=2]如何恢复PF中被误删除的记录?[/size]
                                                                                  作成:ITS qingzhou
                                                                                  时间:2006/6/22

日志(Journal)的概念相当于其它关系数据库的日志(LOG),通常如果事务型应用需要提交/回滚(Commit/Roll Back)时,数据库的表是需要日志的。另外,如果表上定义了触发器、参照完整性(Referential Integrity),表也需要日志的。
DB2 for iSeries的表是可以有日志的,也可以无日志的。如果你用来创建的是Library而不是SQL的Collection,那么创建于这个Library的表默认是没有日志的。反之,如果你用来创建的是SQL的Collection,那么创建于这个Library的表默认是有日志的;默认的日志是QSQJRN,默认的日志接收器是QSQJRN0001,用户可以更改这些默认属性。
以下就是通过日志来恢复误删除PF记录的一个事例,你可以用Navigator方式进行创建日志,如果习惯用5250仿真绿屏方式,也可以使用CL命令来创建日志,以下是以5250绿屏方式。

1、创建日志接收器
===> CRTJRNRCV JRNRCV(LIU/LIUJRNRCV) TEXT('Liu's Journal Receive')  

2、建立日志
===> CRTJRN JRN(LIU/LIUJRN) JRNRCV(LIU/LIUJRNRCV) TEXT('liu's Journal') 

3、以LIU/EXECTL这个PF为例,以*BOTH方式启动日志
 ===> STRJRNPF FILE(LIU/EXECTL) JRN(LIU/LIUJRN) IMAGES(*BOTH)
为了利用JRN进行修改回退,JRN必须启用了参数"Journal images"的"*BOTH"选项,即除了缺省的"After Images"还要包含"Before Images". 
 
4、先查询目前记录情况,共75条记录。
 ===> RUNQRY *N LIU/EXECTL 

5、测试:通过STRDFU删除LIU/EXECTL记录5条,然后再次查询情况,仅剩下70条记录。

6、利用RMVJRNCHG命令恢复记录
===> RMVJRNCHG JRN(LIU/LIUJRN) FILE((LIU/EXECTL))

7、系统提示:Remove failed. 5 entries removed from *QDDS object.

8、再次查询LIU/EXECTL情况,发觉被删除的记录已经恢复。


■如果想删除日志及日志接收器,需要按照如下步骤实施。

1、先解除日志与PF文件的关联
===> ENDJRNPF FILE(LIU/EXECTL) JRN(LIU/LIUJRN) 

2、删除日志
===> DLTJRN JRN(LIU/LIUJRN) 

3、删除日志接收器
===> DLTJRNRCV JRNRCV(LIU/LIUJRNRC



1、创建日志接收器





2、建立日志





3、以LIU/EXECTL这个PF为例,以*BOTH方式启动日志





4、先查询目前记录情况,共75条记录。





5、测试:通过STRDFU删除LIU/EXECTL记录5条,然后再次查询情况,仅剩下70条记录。





6、利用RMVJRNCHG命令恢复记录





7、系统提示:Remove failed. 5 entries removed from *QDDS object.





8、再次查询LIU/EXECTL情况,发觉被删除的记录已经恢复。





 nhxingliang 回复于:2006-06-22 17:27:07

谢谢哦!


 ibmas400 回复于:2006-06-22 18:46:47

辛苦了,,,谢谢~~~


 blogliou 回复于:2006-06-23 09:40:41

赞一个. 

删除PF文件中的记录, 实际上只是做删除标记, 记录数据并没有被删除.
如果PF属性Reuse deleted records为*NO,那么该记录的RRN地址始终不会被覆盖,新插入的记录始终在文件尾部追加,也即该记录数据始终存在,直到PF被重组. 
如果PF属性Reuse deleted records为*YES,那么新插入记录会首先覆盖那些被标记为删除的记录RRN. 
如果记录RRN已被新插入记录覆盖或者被重组后,无论什么方式都不可能恢复PF中误删除的记录了.

RMVJRNCHG这个命令有些意思,谢了.


 ricky.xiao 回复于:2006-06-23 16:11:01

用JRN很方便 我们也在用 感觉恢复起来也不怎么麻烦~~~


 qingzhou 回复于:2006-06-23 16:43:55

[color=Blue]●2006/06/23 继续补充……[/color]

DB2 for iSeries的日志由两部分组成:Journal和 Journal Receive。Journal相当于一张登记表,记录着那些表是有日志的,而日志实际上需要记载的内容(表的创建、打开、增加、修改、删除、权限更改等)存在于日志接收器里。日志和日志接收器是相关联的,一个Journal最多关联两个日志接收器,一般情况是一个。存在于日志接收器里的实际内容是一条一条地排列,称之为日志条目(Journal Entry)。

日志的一个重要作用就是用于恢复数据,可以手工用日志和日志接收器来恢复数据。DB2 for iSeries恢复数据有两种方式:Back Recovery和Forward Recovery。

Back Recovery即为Remove Journal Change(RMVJRNCHG),即为回滚操作。典型的应用情况为,如果用户对数据库进行了误操作,或因为某种原因想让数据库的内容回滚到某个时间点的状态。用户用命令WRKJRN(Work With Journal)来对日志进行操作,如果用户需要恢复到某个时间点,可以由Journal Receive、Sequence Number、Job Name来决定,在进行RMVJRNCHG之前,建议先用DSPJRN命令来判断哪些日志条目需要去除,然后再用RMVJRNCHG进行Back Recovery。

Forward Recovery为前滚操作,典型的应用情况是数据库遭到破坏,但日志没有遭到破坏,这时可以用日志来恢复数据库。与Back Recovery相同的是,用户如果需要恢复到某个时间点,最重要的是需要知道恢复到哪一个时间点,这个可以由Journal Receive、Sequence Number、Job Name来决定,用户在进行APYJRNCHG之前,建议先用DSPJRN命令来判断哪些日志条目需要实施(Apply)。

===> APYJRNCHG JRN(LIU/LIUJRN) FILE((LIU/EXECTL))
 

1、关于CRTJRNRCV创建日志接收器,可以通过参数THRESHOLD(1-1000000000)指定创建的大小:

===> CRTJRNRCV JRNRCV(LIU/LIUJRNRCV) THRESHOLD(5000) TEXT('Liu''s Journal Recei
ve')

日志接收器是有空间限制的,日志接收器的空间限制有两方面:空间大小限制(Size Threshold)和日志条目数(Maximum Journal Entry)。日志接收器的日志条目越多,日志空间就越大;当日志空间超过阀值(Threshold)时,日志接收器就不能存储日志条目了,这时日志就需要交换日志接收器(Swap Receiver)。                                                                            
 
2、关于CRTJRN创建日志时,可以通过参数MNGRCV(*SYSTEM)将数据库日志从用户管理MNGRCV (*USER)改为系统管理MNGRCV (*SYSTEM);通过参数DLTRCV(*YES)设定,可以让系统自动删除已经解除关联的日志接收器。

===> CRTJRN JRN(LIU/LIUJRN) JRNRCV(LIU/LIUJRNRCV) MNGRCV(*SYSTEM) DLTRCV(*YES) 
TEXT('Liu''s Journal')  

管理日志接收器的方法有两种:*SYSTEM和*USER。*SYSTEM是系统管理方式,当日志接收器的空间超过阀值时,系统会自动将当前的日志接收器解除关联(Detach),同时,系统会自动创建一个属性相同的日志接收器并且关联到日志上。如果采用*USER方式,当日志接收器的空间超过阀值时,系统会发出消息(在*QSYSOPR消息队列里)提示用户目前的日志接收器已满,用户需要创建一个日志接收器并且关联到日志上。

建议用系统管理方式,无须人工干预。                                                       
 

3、关于RMVJRNCHGS使用,为防止操作出错,请先备份数据库内容,同时也建议备份JRNRCV。
用CL命令 WRKJRN -> 用选项3 ( 3=Backout recovery )
 

一个Journal可能对应很多PF,所以需要选择哪个PF要被回退,在前面敲 2=Remove journaled changes (相当于启动了命令RMVJRNCHG)。
 
注意参数:
Starting sequence number . . . . *LAST 
Ending sequence number . . . . . 找到要回退到的时间点对应的Sequence号码 

如果继续做第二次的RMV回退,特别要注意:
Starting sequence number . . . . 第一次回退终点 
Ending sequence number . . . . . 下一个要回退到的时间点对应的Sequence号码

[ 本帖最后由 qingzhou 于 2006-6-23 16:55 编辑 ]



===> CRTJRNRCV JRNRCV(LIU/LIUJRNRCV) THRESHOLD(5000) TEXT('Liu''s Journal Recei





===> CRTJRN JRN(LIU/LIUJRN) JRNRCV(LIU/LIUJRNRCV) MNGRCV(*SYSTEM) DLTRCV(*YES)





用CL命令 WRKJRN -> 用选项3 ( 3=Backout recovery )





需要选择哪个PF要被回退,在前面敲 2=Remove journaled changes (相当于启动了命令RMVJRNCHG)





注意参数:Starting sequence number和Ending sequence number





===> APYJRNCHG JRN(LIU/LIUJRN) FILE((LIU/EXECTL))




 just a kid 回复于:2006-06-25 15:05:46

又见QINGZHOU奉献了,刘哥的作品,图文并茂,又有使用性,送礼自用两相宜


 yangzg 回复于:2006-06-25 15:54:40

不错!加油!


 三个石头 回复于:2006-06-25 16:34:59

好东西,可惜俺没有权限在机器试试。


 快乐狗 回复于:2006-06-25 19:20:48

谢谢,支持,非常有用


 xihii 回复于:2006-06-26 09:01:49

不错。LZ辛苦了。


 zhaoming1214 回复于:2006-06-26 09:48:32

不错,收藏了


 michael9406 回复于:2006-06-30 11:25:38

精彩


 胖老头 回复于:2006-06-30 21:17:55

挺好


 caomangyu 回复于:2006-07-06 15:50:51

不错不错 刚试了下




原文链接:http://bbs.chinaunix.net/viewthread.php?tid=778391
转载请注明作者名及原文出处



收藏本页到: