【蓝因子教育】代码走读(蓝因子护肤品官方店)

【蓝因子教育】代码走读(蓝因子护肤品官方店)

从源代码得知只有在drop database的过程中才会设置datconnlimit为-2

把drop database的主要过程整理为流程图方便大家理解,当然这不是完整的流程,只是把我认为关键的部分呈现出来。

我们都知道drop database是一个不可逆的操作[1] ,理论上要么不删除,要么删除成功。

在exec_simple_query中start_xact_command隐式开启事务,看到这你可能会质疑,不是说不可逆吗,怎么还会放到事务中?别着急,继续往下看。

由于drop database是一个Utility statement,因此不会生成执行计划,是直接调用到对应的逻辑里执行的。流程图中绿色部分从dropdb函数开始就是drop database语句的核心逻辑。

step1:

在dropdb函数里,首先做了一些ACLcheck及login校验后对pg_database加RowExclusiveLock

step2:

使用inplace_update去修改当前 drop database的datconnlimit这个过程稍微详细的描述下。

systable_inplace_update_begin里对我们要修改的这条记录使用heap_inplace_lock即调用Lock_buffer给当前buffer_content加LWlock LW_EXCLUSIVE模式锁,这样其他进程都无法访问这条内容。

然后执行修改datform->datconnlimit = !!#ff0000 DATCONNLIMIT_INVALID_DB!!;

改完之后systable_inplace_update_finish释放锁LWlock释放,这样修改就“生效”了。什么?生效了?不是在事务里?事务还没提交,怎么生效的?

大家应该注意到了这里是inplace update,而并不是PG默认的多版本标记更新,默认的标记更新只有等当前事务提交,才对外可见。为什么这么设计呢?

我们先串完整个过程,后续会有答案。

然后进行XLogFlush把WAL及时刷下去。

step3:

CatalogTupleDelete删除pg_database当前database这条记录,这里是标准的heap_delete,目前在事务里,得等到commit后才“生效”。

所以事务其实保护的就是这里,我们某个database可不可见主要取决于pg_database里对应的记录可不可见。那么这部分是可逆的,在这个步骤事务提交就这条记录清理,事务回滚这条记录依然可见。

step4:

ok,下来就到了不可逆的操作了,DropDatabaseBuffers丢弃这个database对应修改过的buffer内容,并且触发一次checkpoint。

remove_dbtablespaces调用unlink删除该database目录下物理文件。

处理完毕table_close释放pg_database加的锁。

step5:

finish_xact_command提交事务,操作完毕,这个时候要drop 的database在pg_database中记录就看不到了。

流程走读完毕,那么看起来就是drop database具体的流程中有部分可逆的步骤,有大部分不可逆的步骤。其实也好理解,当一个操作有一个不可逆的步骤,那么这个操做本身就是不可逆的,这些不可逆的其实也就是无法支持事务的。

再回到drop database datname这个语句本身,执行结果就只有两种,要么删除了,要么不删除,我们肯定不接受删除了一半,或者删除了部分数据这种中间状态,这种情况下database也是无法使用的。

所以在一开始执行drop database,就使用了inplace update将database修改为invalid禁止登录。即便你在drop database中间状态备份了数据,使用这个备份恢复数据,或者访问数据库都无法访问。似乎是保证了drop database的“原子性”。

所以回到这个case,不是什么BUG,是PITR选择的时间点不对,应该再往前,选用更早备份结合增量WAL重新恢复。当前恢复的时间点,这个database正在被删除。

特别声明:[【蓝因子教育】代码走读(蓝因子护肤品官方店)] 该文观点仅代表作者本人,今日霍州系信息发布平台,霍州网仅提供信息存储空间服务。

猜你喜欢

丹麦科学家首创″活数据集″模式:语言数据库从此可以持续更新升(丹麦青少年科学家竞赛)

目前这个过程面临着三个让人头疼的问题:首先,许多用于训练的文本资料版权不明,就像使用了未经授权的教科书,随时可能面临法律风险;其次,这些数据库一旦发布就像印刷版图书一样固定不变,无法及时更新最新知识;最后,数…

丹麦科学家首创″活数据集″模式:语言数据库从此可以持续更新升(丹麦青少年科学家竞赛)

“凡人”大博弈:B优爱争抢开新局,阅文坐收“修仙税”

更让人关注的是,随着剧版的成功引爆,B站独播的《凡人修仙传:重返天南》,以及由爱奇艺主控的院线动画电影《凡人修仙传之瀚海迷踪》,连同原著小说,一同跻身豆瓣热门榜TOP5,形成了“一剧带动全IP”的罕见盛况。…

“凡人”大博弈:B优爱争抢开新局,阅文坐收“修仙税”

“营救大师”连姆·尼森的7部代表作,你是从哪部认识他的?

连姆尼森将角色布莱恩的情感变化拆解得细腻且有说服力,紧凑到窒息的节奏,连姆尼森化身铁血老爹,拳拳到肉的动作戏荷尔蒙爆棚,很好地诠释了“老男人”的魅力。 《傲气盖天》是一部以爱尔兰内战为背景的战争题材电影,电影…

“营救大师”连姆·尼森的7部代表作,你是从哪部认识他的?

日本称美国确认将对日终止关税叠加 美承诺下调汽车关税(日本和美国声明)

日本首席贸易谈判代表赤泽亮正周四表示,美国确认将停止对日本叠加普遍性关税,并按照承诺下调汽车关税。这一消息是在与美国商务部长霍华德·卢特尼克和财政部长斯科特·贝森特会谈后发布的

日本称美国确认将对日终止关税叠加 美承诺下调汽车关税(日本和美国声明)

为了不变老,这对夫妻坚持31年不吃肉不生子,如今62岁近况不敢认(为了不变老.能吃黄体酮胶囊吗女性)

在与现任妻子相遇之前,他经历了两段感情,一位是万绮雯,另一位是吴绮莉。在恋情的开端,吕颂贤便开始选择素食;受到其影响,麦景婷也毅然决定不再吃肉。于是,两人一直以来均坚持素食,麦景婷为家庭牺牲了自己的事业,自2…

为了不变老,这对夫妻坚持31年不吃肉不生子,如今62岁近况不敢认(为了不变老.能吃黄体酮胶囊吗女性)