海山数据库(He3DB)源码详解:主备复制pg_wal_replay_resume

# 大云海山数据库(He3DB)源码详解:主备复制pg_wal_replay_resume、pg_is_wal_replay_paused

背景

He3DB 采用了先进的存储引擎和查询优化技术,能够快速处理大量数据和复杂查询。无论是 OLTP(在线事务处理)还是 OLAP(在线分析处理)场景,都能提供出色的性能表现。He3DB 具备完善的数据备份和恢复机制,能够在系统故障或数据损坏时快速恢复数据,确保业务的连续性。He3DB 支持水平扩展和垂直扩展,可以轻松应对不断增长的数据需求。He3DB 提供了严格的访问控制和数据加密功能,确保数据的安全性和隐私性。

主备复制

时间点恢复——pg_wal_replay_resume

pg_wal_replay_resume函数在数据库处于恢复过程且未触发备用服务器提升操作时,恢复或继续 WAL 重放

在这里插入图片描述

  1. 检查恢复是否正在进行中
    首先调用RecoveryInProgress()函数来确认当前数据库是否处于恢复模式。如果数据库不是在恢复模式下运行(即,它是一个正常运行的主数据库或已经完成了恢复过程的备用数据库),则函数会抛出一个错误
    错误信息会明确指出“recovery is not in progress”,并给出提示,说明这些恢复控制函数只能在恢复过程中执行
Datum
pg_wal_replay_resume(PG_FUNCTION_ARGS)
{
	if (!RecoveryInProgress())
		ereport(ERROR,
				(errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE),
				 errmsg("recovery is not in progress"),
				 errhint("Recovery control functions can only be executed during recovery.")));
  1. 检查是否触发了提升(Promote)操作
    函数检查是否触发了将备用数据库提升为主数据库的操作。这是通过调用PromoteIsTriggered()函数来完成的
    如果已经触发了提升操作,函数会抛出一个错误,指出“standby promotion is ongoing”。同时,给出提示,说明在提升操作被触发后,pg_wal_replay_resume() 函数不能被执行
if (PromoteIsTriggered())
		ereport(ERROR,
				(errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE),
				 errmsg("standby promotion is ongoing"),
				 errhint("%s cannot be executed after promotion is triggered.",
						 "pg_wal_replay_resume()")));
  1. 恢复(继续)WAL 重放
    如果上述两个检查都通过,函数会调用SetRecoveryPause(false)来设置恢复进程不再暂停,即恢复或继续WAL的重放
SetRecoveryPause(false);
  1. 返回
    函数通过PG_RETURN_VOID(); 返回,表示没有返回值
	PG_RETURN_VOID();
}

函数调用栈

在这里插入图片描述

时间点恢复——pg_is_wal_replay_paused

  1. 检查恢复是否正在进行中
    函数首先调用RecoveryInProgress()函数来确认当前数据库是否处于恢复模式。这是执行任何恢复控制函数的前提条件
    如果数据库不是在恢复模式下运行(即,它是一个正常运行的主数据库或已经完成了恢复过程的备用数据库),则函数会抛出一个错误
    错误信息会明确指出“recovery is not in progress”,并给出提示,说明这些恢复控制函数只能在恢复过程中执行
Datum
pg_is_wal_replay_paused(PG_FUNCTION_ARGS)
{
	if (!RecoveryInProgress())
		ereport(ERROR,
				(errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE),
				 errmsg("recovery is not in progress"),
				 errhint("Recovery control functions can only be executed during recovery.")));
  1. 返回结果
    函数通过PG_RETURN_BOOL返回一个布尔值,表示WAL重放是否暂停。如果WAL重放暂停了,则返回true;否则,返回false
	PG_RETURN_BOOL(GetRecoveryPauseState() != RECOVERY_NOT_PAUSED);

函数调用栈

在这里插入图片描述

时间点恢复——pg_wal_replay_pause

pg_wal_replay_pause在数据库恢复过程中暂停 WAL 回放,如果数据库未处于恢复状态或备用服务器晋升正在进行中则报错,设置恢复暂停标志并唤醒恢复进程后返回。

在这里插入图片描述

  1. 检查恢复是否正在进行中
    首先调用RecoveryInProgress()函数来检查当前数据库是否处于恢复模式。如果数据库不是在恢复模式下运行(即,它是一个正常运行的主数据库或已经完成了恢复过程的备用数据库),则函数会抛出一个错误
    错误信息会明确指出“recovery is not in progress”,并给出提示,说明这些恢复控制函数只能在恢复过程中执行
	if (!RecoveryInProgress())
		ereport(ERROR,
				(errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE),
				 errmsg("recovery is not in progress"),
				 errhint("Recovery control functions can only be executed during recovery.")));
  1. 检查是否触发了提升(Promote)操作
    接下来,函数检查是否触发了将备用数据库提升(Promote)为主数据库的操作。这是通过调用PromoteIsTriggered()函数来完成的
    如果已经触发了提升操作,函数会抛出一个错误,指出“standby promotion is ongoing”。同时,给出提示,说明在提升操作被触发后,pg_wal_replay_pause()函数不能被执行
if (PromoteIsTriggered())
		ereport(ERROR,
				(errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE),
				 errmsg("standby promotion is ongoing"),
				 errhint("%s cannot be executed after promotion is triggered.",
						 "pg_wal_replay_pause()")));
  1. 设置恢复暂停状态
    如果上述两个检查都通过,函数会调用SetRecoveryPause(true)来设置恢复暂停状态。这意味着后续的WAL重放将被暂停,直到恢复过程被明确恢复
SetRecoveryPause(true)
  1. 唤醒恢复进程
    函数通过调用WakeupRecovery()来唤醒恢复进程。这是必要的,因为恢复进程可能在等待新的WAL数据或处于某种休眠状态。唤醒恢复进程可以确保它尽快处理暂停请求
WakeupRecovery();
  1. 返回
    最后,函数通过PG_RETURN_VOID(); 返回,表示没有返回值
PG_RETURN_VOID();

函数调用栈

在这里插入图片描述

作者介绍

周雨慧 中移(苏州)软件技术有限公司 数据库内核开发工程师

PG_RETURN_VOID();

函数调用栈

[外链图片转存中…(img-eSnOughD-1731654888416)]

作者介绍

周雨慧 中移(苏州)软件技术有限公司 数据库内核开发工程师

<think>我们有一个matplotlib的文本对象,通过ax.text()方法添加。该方法的第一个和第二个参数是文本的坐标(x, y)。当前文本的位置是(45, 2250)。如果我们想将文本向左移动,我们需要减小x坐标的值。 例如,如果我们想向左移动50个单位,那么新的x坐标就是45-50 = -5。但是要注意,移动后要确保文本仍在图形区域内,否则可能看不到。 但是,由于我们不知道具体的图形坐标范围,所以通常需要根据实际情况调整。这里我们假设图形x轴的范围是从0到某个值(比如360),那么向左移动一点,比如移动到x=0的位置,可能会被截断,所以可以尝试移动到一个适中的位置。 建议:根据当前位置向左移动,可以尝试将x坐标减少一定的值,比如20,那么新的x坐标就是25。 修改代码: 将原来的45改为25(或者其他你认为合适的更小的数值)。 注意:y坐标2250保持不变,因为我们只想水平移动。 因此,修改后的代码为: ```python ax.text(25, 2250, info, fontsize=10, bbox=dict(facecolor=&#39;white&#39;, alpha=0.8)) ``` 如果移动后位置还不合适,可以继续调整x的值,直到满意为止。 另外,我们也可以考虑使用相对位置(比如相对于坐标轴的比例位置),这样在图形大小变化时文本位置也能相对保持。例如,可以使用transform参数来指定坐标系(如使用ax.transAxes表示使用坐标轴的比例,范围0~1)。但当前坐标是数据坐标(因为默认使用数据坐标系),所以如果希望使用数据坐标移动,就直接调整x和y的值。 由于问题中只要求向左移动,所以我们就减少x坐标值即可。 注意:如果移动后文本超出左边界,可能需要调整图形的x轴范围,或者将文本的水平和垂直对齐方式进行调整(通过ha和va参数)。默认情况下,文本的参考点(即给定的坐标点)在文本的左下角。我们可以通过设置ha(水平对齐)和va(垂直对齐)来改变参考点的位置。例如,设置ha=&#39;left&#39;(默认)表示参考点在文本左侧,ha=&#39;right&#39;表示参考点在文本右侧,ha=&#39;center&#39;表示中心。如果我们希望文本向右移动,实际上也可以改变对齐方式,但这里不需要。 由于问题没有特殊要求,我们只调整x坐标。 总结:将x坐标减少,例如从45改为25。 修改后的代码行: ```python ax.text(25, 2250, info, fontsize=10, bbox=dict(facecolor=&#39;white&#39;, alpha=0.8)) ``` 如果25太靠左,可以尝试35;如果还不够,再减小。请根据实际图形调整。 </think> 要调整文本位置向左移动,需要修改 `ax.text()` 函数中的 **x 坐标参数**(第一个参数)。以下是修改方案: ### 修改说明: 1. 当前 x 坐标为 `45`(位于图形右侧) 2. 减小 x 坐标值可使文本向左移动 3. 例如将 `45` 改为 `10`(具体值需根据实际坐标范围调整) ### 修改后的代码: ```python # 将x坐标从45减小到10(向左移动) ax.text(10, 2250, info, fontsize=10, bbox=dict(facecolor=&#39;white&#39;, alpha=0.8)) ``` ### 关键参数解释: - **第一个参数**:x 坐标(水平位置),值越小越靠左 - **第二个参数**:y 坐标(垂直位置),保持不变 - `2250` 是当前 y 坐标值(距离原点的垂直距离) ### 调整建议: 1. 如果移动后位置仍不理想,可继续减小 x 值(尝试 `5`、`0` 或负值) 2. 如需精确定位,可添加对齐参数: ```python ax.text(10, 2250, info, fontsize=10, bbox=dict(facecolor=&#39;white&#39;, alpha=0.8), ha=&#39;left&#39;, # 水平对齐:left/center/right va=&#39;top&#39;) # 垂直对齐:top/center/bottom ``` ### 坐标系说明: - 默认使用**数据坐标系**(与图形轴刻度一致) - 可通过 `transform` 参数切换坐标系(如 `ax.transAxes` 使用相对坐标 [0-1]) ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值