设为首页 收藏本站
查看: 825|回复: 0

[经验分享] postgresql检查点

[复制链接]

尚未签到

发表于 2016-11-19 10:11:28 | 显示全部楼层 |阅读模式
1 Checkpoint作用
1.1将事务提交的修改写进disk(写脏数据);保证数据库的完整性和一致性。
1.2缩短恢复时间

2 checkpoint所用结构体
typedef struct CheckPoint
{
XLogRecPtrredo;//创建检查点时记录xlog插入位置
TimeLineIDThisTimeLineID;
uint32nextXidEpoch;
TransactionId  nextXid;
OidnextOid;
         MultiXactId   nextMulti;MultiXactOffset nextMultiOffset;
TransactionId  oldestXid;
OidoldestXidDB;pg_time_t      time;

TransactionId    oldestActiveXid;
} CheckPoint;

XLogRecPtr  //记录文件内的位置(文件名和文件内偏移)
typedef struct XLogRecPtr
{
uint32xlogid;/* log file #, 0 based */
uint32xrecoff;/* byte offset of location in log file */
} XLogRecPtr;

3 checkpoint's position
the checkpoint's position is saved in the file pg_control and log
when pg_control corrupt
To deal with the case where pg_control is corrupt, we should support the possibility of scanning existing log segments in reverse order — newest to oldest — in order to find the latest checkpoint

4checkpoint执行控制
4.1,数据量达到checkpoint_segments(=3)*16M时,系统自动触发;
4.2,时间间隔达到checkpoint_timeout参数值时;
4.3,用户发出checkpoint命令时。

5 创建一个检查点
5.1是recptr是pg_contrl中checkpoint中的recptr进行赋值(如果pg_control中关于checkpoint的记录是正确的话)。
5.2如果pg_control中recptr的记录是不正确的,则checkpoint.recptr = {0}。

// redo保存了xlog的当前插入transaction log位置。
5.2.1INSERT_RECPTR(checkPoint.redo, Insert, Insert->curridx);
其中Insert为:XLogCtlInsert *Insert = &XLogCtl->Insert;
5.2.2checkPoint.nextXid = ShmemVariableCache->nextXid;
5.2.3checkPoint.oldestXid = ShmemVariableCache->oldestXid;
5.2.4checkPoint.oldestXidDB = ShmemVariableCache->oldestXidDB;
6 Flush all data in shared memory to disk, and fsync
实现函数static void
CheckPointGuts(XLogRecPtr checkPointRedo, int flags)
{
CheckPointCLOG();
CheckPointSUBTRANS();
CheckPointMultiXact();
CheckPointPredicate();
//CheckPointRelationMap();
CheckPointBuffers(flags);/* performs all required fsyncs */
/* We deliberately delay 2PC checkpointing as long as possible */
CheckPointTwoPhase(checkPointRedo);
}
保证redo之前的日志记录的数据修改都刷新到数据库磁盘文件中。

Xlog文件随时间的变化        current insertion point
----------------------------------------------------------------->
            数据是一致性            |            数据一致性未知
                               CheckPoint中的redo
创建checkPoint时,首先获取redo位置,然后保证redo之前的xlog记录的修改都刷新到数据磁盘文件中。这样保证的checkPoint左的数据库文件一致性。如果在checkPoint后需要recovery,只需要redo位置向右replay xlog。

4 Now insert the checkpoint record into XLOG.
4.1  rdata.data = (char *) (&checkPoint);
rdata.len = sizeof(checkPoint);
rdata.buffer = InvalidBuffer;
rdata.next = NULL;

4.2 insert
recptr = XLogInsert(RM_XLOG_ID,
shutdown ? XLOG_CHECKPOINT_SHUTDOWN :
XLOG_CHECKPOINT_ONLINE,
&rdata);

4.3 flush to disk
Ensure that all XLOG data through the given position is flushed to disk.
XLogFlush(recptr);

结束一个检查点
把一些统计信息写到LOG(= 15)中。

欢迎批评指正~_~

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-302474-1-1.html 上篇帖子: postgreSQL基本操作 下篇帖子: postgreSQL常用方法
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表