Postgresql日志系统的实现(五)

1.3.1.3 XLog其他信息

资源数据结构:

xlog_internal.h中定义了一个结构体,resource manager可以调用某种资源(RmgrData代表的资源)的某个方法(redoundo等)。这里的资源可以简单的理解成pg中存在这些代码,在pg运行时,系统中就生成了这些可利用的资源。例如(hashbtreeheap等等)。

    typedef struct RmgrData

    {

        const char  *rm_name;

        void        (*rm_redo) (XLogRecPtr lsn, XLogRecord *rptr);

    void        (*rm_undo) (XLogRecPtr lsn, XLogRecord *rptr);

    void        (*rm_desc) (char *buf, uint8 xl_info, char *rec);

    void        (*rm_startup) (void);

    void        (*rm_cleanup) (void);

} RmgrData;

说明:函数表提供了不同对象可进行的同恢复相关的操作,但不是所有可恢复的对象都需要做“startupcleanup”等操作,这个因对象而异。

 

 

资源调用结构体数组:

rmgr.c中定义了一个RmgrData类型的结构体数组RmgrTable[],指明在PG中可以使用的各种资源,如XlogTransactionstorage等等。这个信息在PG8.x较以前有了新的扩展(多了一个“Heap2

 

const RmgrData RmgrTable[RM_MAX_ID + 1] = {

    {"XLOG", xlog_redo, xlog_desc, NULL, NULL, NULL},

    {"Transaction", xact_redo, xact_desc, NULL, NULL, NULL},

    {"Storage", smgr_redo, smgr_desc, NULL, NULL, NULL},

    {"CLOG", clog_redo, clog_desc, NULL, NULL, NULL},

    {"Database", dbase_redo, dbase_desc, NULL, NULL, NULL},

    {"Tablespace", tblspc_redo, tblspc_desc, NULL, NULL, NULL},

    {"MultiXact", multixact_redo, multixact_desc, NULL, NULL, NULL},

    {"Reserved 7", NULL, NULL, NULL, NULL, NULL},//备用

    {"Reserved 8", NULL, NULL, NULL, NULL, NULL},//备用

    {"Heap2", heap2_redo, heap2_desc, NULL, NULL, NULL},

    {"Heap", heap_redo, heap_desc, NULL, NULL, NULL},

    {"Btree", btree_redo, btree_desc, btree_xlog_startup, btree_xlog_cleanup, btree_safe_restartpoint},

    {"Hash", hash_redo, hash_desc, NULL, NULL, NULL},

    {"Gin", gin_redo, gin_desc, gin_xlog_startup, gin_xlog_cleanup, gin_safe_restartpoint},

    {"Gist", gist_redo, gist_desc, gist_xlog_startup, gist_xlog_cleanup, gist_safe_restartpoint},

    {"Sequence", seq_redo, seq_desc, NULL, NULL, NULL}

};

在“StartupXLOG”方法中,首先做一些准备工作,然后在循环中持续根据xlog文件中的记录类型分别调用日志记录类型对应的资源的方法“xxxRodo”来完成恢复任务,代码为“RmgrTable[record->xl_rmid].rm_redo(EndRecPtr, record);”。可以从这里看出数据库的恢复需要在不同的层次结构上进行。例如:需要进行事务恢复,存储恢复,数据库恢复,表空间恢复,索引恢复等等。

选择RmgrTable数组中的哪个数据项,通过以RmgrId为数组下标来确定。被引用时只需指定RmgrId的值,就能引用相应的函数。例如:RmgrTable[1]表示进行事务恢复。

RmgrTable[i] i值定义如下(RmgrId标识了可以保证恢复的资源,目前PG8.x版本包括如下资源可以管理:):

#define RM_XLOG_ID                              0

#define RM_XACT_ID                              1

#define RM_SMGR_ID                              2

#define RM_CLOG_ID                              3

#define RM_DBASE_ID                      4

#define RM_TBLSPC_ID                           5

#define RM_MULTIXACT_ID                    6

#define RM_HEAP2_ID                             9

#define RM_HEAP_ID                               10

#define RM_BTREE_ID                      11

#define RM_HASH_ID                               12

#define RM_GIN_ID                                 13

#define RM_GIST_ID                               14

#define RM_SEQ_ID                                 15

#define RM_MAX_ID                                RM_SEQ_ID

这些信息,对应了PG可以支持的恢复的对象内容,具体信息参见“RmgrTable”中的定义的函数。

 

你可能感兴趣的:(数据库)