DB2 RESTART

在讲DB2 RESTART之前,先普及一下CHECKPOINT的概念。

CHECKPOINT检查点,顾名思义就是在某个时间点检查DB2当前的状态,在启动/关闭DB2 subsystem, 在经历了一段时间/写了若干条log, active log switch等时候DB2会take一个checkpoint, 记录当前系统状态。

那么CHECKPOINT到底记录了些什么呢?可以从checkpoint log record里看到checkpoint里记录的内容。

一条CHECKPOINT LOG的记录的内容包括:

    1.CHECKPOINT开始的时间

    2.UR summary(所有in complete UR包括in commit, in doubt, in flight, in abort,postponed UR的状态)

    3.page set summary(所有pseudo-opened page set的状态,包括restart_redo RBA/LRSN)

    4.page set UR summary(包括所有pseudo open的pageset被哪些active UR在做修改)

    5.page set exception summary(即所有DBET状态的page set,有了这个就可以保证即使是在SCA LOST的状态下),RESTART DB2 依然能够从CHECKPOINT LOG里拿到所有page set exception的信

    6.CHECKPOINT结束的时间。

所以总的来说每个CHECKPOINT都记录了当前数据库的状态,有哪些UR,这些UR都处于什么状态,这些UR都在修改哪些page set,以及所有处于exception状态的page set...所有CHECK POINT的起始时间都记录在BSDS里面。当RESTART DB2的时候,就会读该MEMBER的BSDS, 扫描到距离上次shut down最近的checkpoint rba, 然后读从last check point rba开始读log直到log结束,去恢复所有的UR/PAGE SET。 具体分为下面包含下面几个步骤

    RESTART DB2步骤:

    1. LOG initialization

    2. CSR(CURRENT STATUS REBUILD)

    3. HSR(FLR Forward log apply)

    4. AUB(BLR Backward log apply)

    5.End of restart

    6.In-doubt UR resolution

下面具体讲一下在这6个步骤里DB2都做了些什么

LOG initialization 在这个阶段,DB2读BSDS会去检查BSDS里的CATALOGNAME要与DB2的catalogname相同,其实这个很好理解,说白了DB2的底层都是VSAM文件,所有VSAM文件都是编目管理的,所以都有CATALOG,这样做的目的无非就是为了确保启动的是正确的DB2 subsystem。同样也会去验证所有BSDS里的timestamp是否一致,这个也很好理解,为了保证DB2的健壮性,一般会两个(或者多个引导文件BSDS),里面的所有的active log/archive log,checkpoint等等timestamp都在所有的BSDS里都必须一样,这样当一个BSDS物理上不可用时,还可以读其他的BSDS重启DB2。当这些验证都完成的时候,就会去找在上次DB2 SHUT DOWN之前的最近的一个CHECKPOINT,拿到RBA,这个就是重启的RBA, 表示后面所有DB2的活动都是基于这个RBA(时间点)的。在这个阶段还得把DB2最基本的address space启动起来(MSTR,DBM1,IRLM,DDF),如果是data sharing环境下还得连上CF(SCA+GBP+LOCK),可以看下这个阶段主要的message

DB2 RESTART

CSR(CURRENT STATUS REBUILD)这个阶段会去确定last checkpoint RBA表示DB2要从这里开始启动了,对于每个in-complete的UR(包括in commit, in abort, in flight, postponed UR)去build每个UR的状态,针对active UR去看看每个active UR在update哪些pageset, 如果是DS的环境且SCA没坏,则会根据SCA的内容重新build exception page set list,如果NON-DS或者SCA坏掉了,就从CHECKPOINT LOG里的DBET SUMMARY重新build exception page set list。 最后还会确定所有需要做FLR最小的RBA和所有需要做BLR(in-abort/in-fight UR)最大的RBA。下面看一下CSR阶段主要的message

DB2 RESTART

HSR(FLR) 在CSR阶段确定了需要做FLR的最小的RBA, 那么就从这里开始,扫描log record,对于每个in complete的UR来说,如果page set不是deferred resolved的,如果log的RBA/LRSN大于page的RBA/LRSN, 表示LOG更新,那么就需要做在FLR阶段做REDO操作。看一下在此阶段主要的message

DB2 RESTART

AUB(BLR)同样在CSR阶段也记录了AUB阶段最大的LOG RBA/LRSN,在AUB阶段针对每个in-abort/in-flight的UR来说,如果里面的pglogrba>log rba 表示page太新,需要进行回滚操作,那么就会apply undo log,如果没有undo log,也会执行compensation redo log进行back out。下面是主要的message

DB2 RESTART

END OF RESTART

DB2 RESTART

In-doubt UR resolution 对于in-doubt UR的处理办法,如果是决定ABORT in-doubt ur,那么就做从后往前apply undo log,如果决定是COMMIT,那么啥也不用做,因为之前FLR阶段已经针对in-doubt apply了REDO LOG直到COMMIT. 在此阶段要把所有的updated page externalize到GBP或者DASD中去,declaim/close 所有被in doubt UR引用的page set,在做commit的时候释放掉所有的lock