PostgreSQL备机checkpoint
发表于:2025-02-01 作者:千家信息网编辑
千家信息网最后更新 2025年02月01日,数据库异常关闭时,数据库关闭时来不及或者没机会做checkpoint,则需要从上一个一致性检查的开始恢复。PostgreSQL备机checkpoint是不能产生checkpoint WAL的,因为如果
千家信息网最后更新 2025年02月01日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安全错误
数据库的锁怎样保障安全
网络安全产品二手交易网站
江西云都网络技术有限公司
网络安全技能大赛网上报名
腾讯云服务器网络流量包
旷野之息无法连接服务器
网络安全素养和责任担当
根域名服务器的管理
服务器数据库迁移方案
什么是数据库备份
广州工商银行软件开发部在哪里
mc国际版1.17.11服务器
国税 网络安全培训
泰安数据库每股收益
华为X86服务器 洛阳
数据库 查询最大值
数据库历史死锁记录
此网站安全证书不能连接服务器
服务器脑裂
新能源汽车网络技术论文
深圳谦奕软件开发有限公司
携手共建网络安全什么体
ds920服务器
山东计算机软件开发价格表
网络安全 事件 宣传
福州软件开发定制平台
梦幻号忘记哪个服务器怎么查找
为什么数据库要有事务
数据库课程平均分
服务器SMB共享磁盘方法
学生做软件开发用什么电脑