PostgreSQL备机checkpoint
发表于:2024-10-17 作者:千家信息网编辑
千家信息网最后更新 2024年10月17日,数据库异常关闭时,数据库关闭时来不及或者没机会做checkpoint,则需要从上一个一致性检查的开始恢复。PostgreSQL备机checkpoint是不能产生checkpoint WAL的,因为如果
千家信息网最后更新 2024年10月17日PostgreSQL备机checkpoint
数据库异常关闭时,数据库关闭时来不及或者没机会做checkpoint,则需要从上一个一致性检查的开始恢复。
PostgreSQL备机checkpoint是不能产生checkpoint WAL的,因为如果写这样类型的checkpoint的话,就会将接收的WAL打乱,那么日志将混乱,回放会出问题。
那么问题来了,备机支持checkpoint吗?他的checkpoint怎么做的?
PostgreSQL为了缩短恢复时间,备机上也支持checkpoint,即CreateRestartPoint。但是其pg_control文件的checkpoint记录的位点是从主机传过来WAL里面的checkpoint记录位置。
1、备机回放
StartupXLOG do{ ... RmgrTable[record->xl_rmid].rm_redo(xlogreader);//回放 ... record = ReadRecord(xlogreader, InvalidXLogRecPtr, LOG, false);//读取一个xlog } while (record != NULL);
2、回放函数
voidxlog_redo(XLogReaderState *record){ ... else if (info == XLOG_CHECKPOINT_SHUTDOWN){ ... memcpy(&checkPoint, XLogRecGetData(record), sizeof(CheckPoint)); ... RecoveryRestartPoint(&checkPoint); }else if (info == XLOG_CHECKPOINT_ONLINE){ ... memcpy(&checkPoint, XLogRecGetData(record), sizeof(CheckPoint)); ... RecoveryRestartPoint(&checkPoint); } ...}
3、RecoveryRestartPoint
static voidRecoveryRestartPoint(const CheckPoint *checkPoint){ ... SpinLockAcquire(&XLogCtl->info_lck); XLogCtl->lastCheckPointRecPtr = ReadRecPtr;//ReadRecPtr为读取checkpoint记录后的位置 XLogCtl->lastCheckPointEndPtr = EndRecPtr; XLogCtl->lastCheckPoint = *checkPoint; SpinLockRelease(&XLogCtl->info_lck);}
4、ReadRecPtr赋值
ReadRecord for (;;) { char *errormsg; record = XLogReadRecord(xlogreader, RecPtr, &errormsg); ReadRecPtr = xlogreader->ReadRecPtr; EndRecPtr = xlogreader->EndRecPtr; ... }
5、备机createcheckpoint
boolCreateRestartPoint(int flags){ LWLockAcquire(CheckpointLock, LW_EXCLUSIVE); /* Get a local copy of the last safe checkpoint record. */ SpinLockAcquire(&XLogCtl->info_lck); lastCheckPointRecPtr = XLogCtl->lastCheckPointRecPtr;//checkpoint的位置来自XLogCtl->lastCheckPointRecPtr lastCheckPointEndPtr = XLogCtl->lastCheckPointEndPtr; lastCheckPoint = XLogCtl->lastCheckPoint; SpinLockRelease(&XLogCtl->info_lck); ... if (XLogRecPtrIsInvalid(lastCheckPointRecPtr) || lastCheckPoint.redo <= ControlFile->checkPointCopy.redo){ //回放了最后一个checkpoint记录后,备机再次手动执行checkpoint命令 UpdateMinRecoveryPoint(InvalidXLogRecPtr, true); if (flags & CHECKPOINT_IS_SHUTDOWN){ LWLockAcquire(ControlFileLock, LW_EXCLUSIVE); ControlFile->state = DB_SHUTDOWNED_IN_RECOVERY; ControlFile->time = (pg_time_t) time(NULL); UpdateControlFile(); LWLockRelease(ControlFileLock); } LWLockRelease(CheckpointLock); return false; } ... LWLockAcquire(ControlFileLock, LW_EXCLUSIVE); if (ControlFile->state == DB_IN_ARCHIVE_RECOVERY && ControlFile->checkPointCopy.redo < lastCheckPoint.redo){ ControlFile->prevCheckPoint = ControlFile->checkPoint; ControlFile->checkPoint = lastCheckPointRecPtr;//checkpoint的位置 ControlFile->checkPointCopy = lastCheckPoint; ControlFile->time = (pg_time_t) time(NULL); ... if (flags & CHECKPOINT_IS_SHUTDOWN) ControlFile->state = DB_SHUTDOWNED_IN_RECOVERY; UpdateControlFile(); } ... return true;}
6、备机shutdown
voidShutdownXLOG(int code, Datum arg){ /* * Signal walsenders to move to stopping state. */ WalSndInitStopping(); /* * Wait for WAL senders to be in stopping state. This prevents commands * from writing new WAL. */ WalSndWaitStopping(); if (RecoveryInProgress())//备机写checkpoint CreateRestartPoint(CHECKPOINT_IS_SHUTDOWN | CHECKPOINT_IMMEDIATE); else { /* * If archiving is enabled, rotate the last XLOG file so that all the * remaining records are archived (postmaster wakes up the archiver * process one more time at the end of shutdown). The checkpoint * record will go to the next XLOG file and won't be archived (yet). */ if (XLogArchivingActive() && XLogArchiveCommandSet()) RequestXLogSwitch(false); CreateCheckPoint(CHECKPOINT_IS_SHUTDOWN | CHECKPOINT_IMMEDIATE); } ShutdownCLOG(); ShutdownCommitTs(); ShutdownSUBTRANS(); ShutdownMultiXact();}
7、总结
PostgreSQL备库也可以写检查点,目的是避免每次重启备库都需要从上一个检查点(由主库产生,在WAL中回放出来的)APPLY后面所有的WAL。但是他记录的checkpoint位点是从主库传过来的。这样的话就有问题了,如果主机很长时间都没有做checkpoint了,备机即使正常关闭,重启时,也会从上一个checkpoint开始恢复,这样也会恢复很长时间;并且多次重启也需要从上一次checkpoint开始重复恢复。
位置
问题
检查
主机
位点
数据
数据库
检查点
长时
支持
一致
混乱
这样的话
一致性
再次
函数
命令
手动
文件
日志
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
安恒数据库防火墙厂家排名
企业如何保护网络安全
网络安全人人有责画报
山东政法网络安全学院
数据库的书
软件开发合同 售后约定
炫拓网络技术服务部加我好友
网络技术ps素材
亚控科技天津怎么样软件开发
服务器挂机什么系统最好
软件开发流程和规范
数据库系统的管理功能有哪些
数据库看某个字段的含义
服务器新加一个服务
软件开发毕业软件那里买
软件开发项目资金使用计划
内部数据库的重要性
总结概括服务器端的安全策略
软件开发+需求+设计
举行网络安全培训
免费使用中国法律资源数据库
戴尔电脑dns服务器没检测到
深圳中电网络技术我爱方案
国内外实时数据库
nosql数据库更强调哪种特征
软件开发人工费怎么开票
经济开发区容程网络技术工作室
大学生网络安全交流会流程
网络安全的好词
语音交友软件开发流程