广告
返回顶部
首页 > 资讯 > 数据库 >PostgreSQL状态变迁
  • 647
分享到

PostgreSQL状态变迁

2024-04-02 19:04:59 647人浏览 薄情痞子
摘要

typedef enum DBState { DB_STARTUP = 0, DB_SHUTDOWNED, DB_SHUTDOWNED_IN_RECOVERY,

typedef enum DBState
{
	DB_STARTUP = 0,
	DB_SHUTDOWNED,
	DB_SHUTDOWNED_IN_RECOVERY,
	DB_SHUTDOWNING,
	DB_IN_CRASH_RECOVERY,
	DB_IN_ARCHive_RECOVERY,
	DB_IN_PRODUCTioN
} DBState;

postgresql启动以及关闭或运行过程中的状态包括以上七种。在pg_controldata获取的内容Database cluster state一栏显示的是DB的状态。其中:

DB_STARTUP:表示数据库正在启动状态,实际上没有使用该状态。

DB_SHUTDOWNED:数据库实例正常关闭(非standby)控制文件写入的状态就是这个状态

DB_SHUTDOWNED_IN_RECOVERY:standby实例正常关闭,控制文件写入的状态是这个状态。是由CreateRestartPoint修改该状态。

DB_SHUTDOWNING:非standby实例在关闭时,做checkpoint:CreateCheckPoint,开始做时修改为该状态,做完后修改为DB_SHUTDOWNED状态。

DB_IN_CRASH_RECOVERY:实例异常关闭,重启后,恢复时需要将实例先置为该状态

DB_IN_ARCHIVE_RECOVERY:standby实例重启后置为该状态。

DB_IN_PRODUCTION:非standby实例正常重启后就是这个状态,standby是DB_IN_ARCHIVE_RECOVERY

分析

1、DB_STARTUP

initdb->BootStrapXLOG:
	memset(ControlFile, 0, sizeof(ControlFileData));
	...
	ControlFile->state = DB_SHUTDOWNED;
	...
	WriteControlFile();

初始化时,首先将其状态初始化为DB_STARTUP,然后立即置成DB_SHUTDOWNED并将其刷写到磁盘。

2、StartupXLOG

StartupXLOG->
	ReadControlFile();
	...
	readRecoveryCommandFile();->
	|--...
	|	for (item = head; item; item = item->next){
	|		if (strcmp(item->name, "restore_command") == 0){
	|			...
	|		}...
	|		else if (strcmp(item->name, "standby_mode") == 0){
	|			if (!parse_bool(item->value, &StandbyModeRequested))
	|		}...
	|	}
	|	...
	|--	ArchiveRecoveryRequested = true;
	...
	if (ArchiveRecoveryRequested &&
			(ControlFile->minRecoveryPoint != InvalidXLogRecPtr ||
			 ControlFile->backupEndRequired ||
			 ControlFile->backupEndPoint != InvalidXLogRecPtr ||
			 ControlFile->state == DB_SHUTDOWNED)){
			InArchiveRecovery = true;
			if (StandbyModeRequested)
				StandbyMode = true;
	}
	...
	record = ReadCheckpointRecord(xlogreader, checkPointLoc, 1, true);
	...
	if (InRecovery){
		if (InArchiveRecovery)//何时?
			ControlFile->state = DB_IN_ARCHIVE_RECOVERY;
		else
			ControlFile->state = DB_IN_CRASH_RECOVERY;
		...
		UpdateControlFile();
		replay...
	}
	...
	LWLockAcquire(ControlFileLock, LW_EXCLUSIVE);
	ControlFile->state = DB_IN_PRODUCTION;
	UpdateControlFile();
	LWLockRelease(ControlFileLock);
	...

只要有recovery.conf文件,ArchiveRecoveryRequested即为TRUE->InArchiveRecovery = true,配置了standby_mode=on,那么StandbyMode=TRUE。这样standby启动后,ControlFile->state为DB_IN_ARCHIVE_RECOVERY状态。

3、checkpoint

CheckpointerMain->
	for (;;){
		...
		if (shutdown_requested){
			ShutdownXLOG(0, 0);->
			|--if (RecoveryInProgress()){
			|	    CreateRestartPoint(CHECKPOINT_IS_SHUTDOWN | CHECKPOINT_IMMEDIATE);
			|  }else{
			|	    CreateCheckPoint(CHECKPOINT_IS_SHUTDOWN | CHECKPOINT_IMMEDIATE);
			|  }
			|--...
			proc_exit(0);
		}
		...
		if (do_checkpoint){
			do_restartpoint = RecoveryInProgress();
			...
			if (flags & CHECKPOINT_END_OF_RECOVERY)//flags从哪来?
				do_restartpoint = false;
			...
			if (!do_restartpoint){
				CreateCheckPoint(flags);
				ckpt_perfORMed = true;
			}
			else
				ckpt_performed = CreateRestartPoint(flags);
		}
	}

备机上做checkpoint调用CreateRestartPoint,主机做checkpoint调用CreateCheckPoint

CreateCheckPoint(int flags)->
	if (flags & (CHECKPOINT_IS_SHUTDOWN | CHECKPOINT_END_OF_RECOVERY))
		shutdown = true;
	else
		shutdown = false;
	...
	if (shutdown){
		LWLockAcquire(ControlFileLock, LW_EXCLUSIVE);
		ControlFile->state = DB_SHUTDOWNING;
		ControlFile->time = (pg_time_t) time(NULL);
		UpdateControlFile();
		LWLockRelease(ControlFileLock);
	}
	...
	LWLockAcquire(ControlFileLock, LW_EXCLUSIVE);
	if (shutdown)
		ControlFile->state = DB_SHUTDOWNED;
	...
	UpdateControlFile();
	LWLockRelease(ControlFileLock);

shutdown时,先将状态置为DB_SHUTDOWNING,最后将状态置为DB_SHUTDOWNED

CreateRestartPoint(int flags)->
	LWLockAcquire(CheckpointLock, LW_EXCLUSIVE);
	SpinLockAcquire(&XLoGCtl->info_lck);
	lastCheckPointRecPtr = XLogCtl->lastCheckPointRecPtr;
	lastCheckPointEndPtr = XLogCtl->lastCheckPointEndPtr;
	lastCheckPoint = XLogCtl->lastCheckPoint;
	SpinLockRelease(&XLogCtl->info_lck);
	if (!RecoveryInProgress()){
		LWLockRelease(CheckpointLock);
		return false;
	}
	...
	if (XLogRecPtrIsInvalid(lastCheckPointRecPtr) ||lastCheckPoint.redo <= ControlFile->checkPointCopy.redo){
		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){
		...
		if (flags & CHECKPOINT_IS_SHUTDOWN)
			ControlFile->state = DB_SHUTDOWNED_IN_RECOVERY;
		UpdateControlFile();
	}
	LWLockRelease(ControlFileLock);
	...

备机shutdown,将状态置为DB_SHUTDOWNED_IN_RECOVERY


您可能感兴趣的文档:

--结束END--

本文标题: PostgreSQL状态变迁

本文链接: https://www.lsjlt.com/news/44993.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • PostgreSQL状态变迁
    typedef enum DBState { DB_STARTUP = 0, DB_SHUTDOWNED, DB_SHUTDOWNED_IN_RECOVERY,...
    99+
    2022-10-18
  • 怎么在Java中迁移线程状态
    这篇文章将为大家详细讲解有关怎么在Java中迁移线程状态,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。一、六种状态java.lang.Thread 的状态分为以下 6 种,它们以枚举的形式,...
    99+
    2023-06-15
  • android登录状态如何改变
    在Android中,可以使用SharedPreferences或数据库来保存用户的登录状态,并在需要的时候更改状态。1. 使用Sha...
    99+
    2023-10-11
    android
  • react如何改变组件状态
    这篇文章主要介绍“react如何改变组件状态”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“react如何改变组件状态”文章能帮助大家解决问题。在react中,可以利用setState()来修改组件的...
    99+
    2023-07-04
  • Android 监听网络状态变化
    此篇存在的主要意义在于解决用户使用app中网络状态发生了变化,需要我们去动态监听网络连接状态(有网、无网)、网络类型 (包括wifi、移动网络 -> 3G、4G等等) 文章目录 门前授...
    99+
    2023-10-11
    android 网络
  • react怎么改变组件状态
    本教程操作环境:Windows7系统、react18版、Dell G3电脑。一、有状态组件和无状态组件1.先理解一下什么是状态:定义:是用来描述事物在某一时刻的形态的数据 , 一般称为state。(可以简单理解为状态就是数据)例如:9月2...
    99+
    2023-05-14
    组件状态 前端 React.js
  • react如何改变列表状态
    本篇内容介绍了“react如何改变列表状态”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!react改变列表状态的方法:1、打开相应的reac...
    99+
    2023-07-05
  • PXC——状态参数与变量参数
    “galera 参数解析:”1、状态参数:--wsrep_last_committed:  表示的是当前节点最新提交的事务号,也是最新galera GTID的后半部分,前半部分是参数wsrep_l...
    99+
    2022-10-18
  • 通透Windows 2008系统状态变化
      俗话说“知己知彼,百战不殆”,只有充分了解系统自身的各种状态变化,我们才能为系统量身定制好安全防御方案,从而保证自己的系统始终安全、稳定地运行。在对系统自身各方面的状态进行检查时,我们有时需要通过专业工具来帮忙才能完...
    99+
    2023-05-24
    变化 状态 系统 命令 我们 Windows Server 服务 d: 服务器
  • Mysql系统变量与状态变量详细介绍
    目录系统变量什么是mysql系统变量设置系统变量my.cnf设置配置启动项配置Set的形式修改系统变量SESSION作用范围语法GLOBAL作用范围语法查看系统变量值系统变量注意点并不是所有的系统变量都有session范...
    99+
    2022-09-27
  • Java多线程之线程状态的迁移详解
    目录一、六种状态二、状态迁移图三、线程状态模拟总结一、六种状态 java.lang.Thread 的状态分为以下 6 种,它们以枚举的形式,封装在了Thread类内部: NEW:表...
    99+
    2022-11-12
  • Mysql中如何获取状态和变量
    Mysql中如何获取状态和变量,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。#getMysqlEnv SLAVE_SATUS  ...
    99+
    2022-10-18
  • jquery如何把input变为只读状态
    本篇内容介绍了“jquery如何把input变为只读状态”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成! ...
    99+
    2022-10-19
  • React状态的不变性实例详解
    目录正文什么是 immutableReact 与 Immutability修改 state 的错误案例修改 state 的正确案例总结正文 不变性对应的英文单词是 Immutabil...
    99+
    2022-11-16
    React 状态不变性 React 状态
  • Linux下共享VG改变活动状态
    转载地址:https://blog.csdn.net/lenovouser/article/details/17378101Linux下共享VG改变活动状态lvm and EMC 操作对于WEB server, 从存储上划分了1块lun到W...
    99+
    2023-06-04
  • Flex4beta状态语法中的变化是什么
    这篇文章将为大家详细讲解有关Flex4beta状态语法中的变化是什么,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。Flex4beta状态语法中的变化Flex4beta将状态功能升级为一个全面的MXML语言...
    99+
    2023-06-17
  • 如何在两个OpenShift集群间迁移有状态应用
    Portworx Kubemotion:在OpenShift集群间迁移有状态应用Portworx是一个支撑K8S有状态应用的持久存储和数据管理平台。通过Portworx,它为有状态应用提供了一个单一的数据管理层,从而用户可以在任何底层架构上...
    99+
    2023-06-04
  • android登录状态改变功能怎么实现
    要实现Android登录状态的改变功能,可以通过以下步骤实现:1. 创建一个用户登录状态的变量(例如:isUserLoggedIn)...
    99+
    2023-08-26
    android
  • Eureka源码解析服务离线状态变更
    目录环境1. 服务离线的方式1.1 基于Actuator监控器实现1.2 直接向Eureka Server提交请求1.3 特殊状态CANCEL_OVERRIDE2. 服务下架源码2....
    99+
    2022-11-13
    Eureka 服务离线状态变更 Eureka 离线状态
  • Android Compose状态改变动画animateXxxAsState怎么使用
    今天小编给大家分享一下Android Compose状态改变动画animateXxxAsState怎么使用的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章...
    99+
    2023-07-04
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作