资源数据结构:
在xlog_internal.h中定义了一个结构体,resource manager可以调用某种资源(RmgrData代表的资源)的某个方法(redo,undo等)。这里的资源可以简单的理解成pg中存在这些代码,在pg运行时,系统中就生成了这些可利用的资源。例如(hash,btree,heap等等)。
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;
说明:函数表提供了不同对象可进行的同恢复相关的操作,但不是所有可恢复的对象都需要做“startup、cleanup”等操作,这个因对象而异。
资源调用结构体数组:
在rmgr.c中定义了一个RmgrData类型的结构体数组RmgrTable[],指明在PG中可以使用的各种资源,如Xlog,Transaction,storage等等。这个信息在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”中的定义的函数。