
一、背景介绍

当终端采集到的数据需要对主实例数据修改时,不会直接修改主库数据,会从指定的分支库中进行变更。 变更完成后,通过校验和审核后,将变更数据同步至主库实例当中。 完成数据的merge之后,当前分支库就有可能不需要了,需要删除。但是分支实例是可以复用的,所以分支实例保留。
数据应用慢,主从切换RTO受到严重影响,一旦处于业务高峰期,每一秒受到的损失都难以承受。 只读实例数据更新缓慢,导致主实例与只读实例数据不一致,严重的还会导致业务出现BUG,导致数据错乱等问题。 若主从同步级别为remote_apply,还会导致主库hang住,导致主库的drop同时也变慢,且DDL会持有排他锁,会导致实例的一系列故障等。
二、原理分析
恢复系统表,例如pg_class,pg_attrbute,pg_type等,相当于移除表的元信息; close表对应的文件; 遍历buffer中的页面,如果缓存的是该表的页面,则标记为invalid,后面其他进程可以使用该页面,这里就调用的前文提到的 DropRelFileNodesAllBuffers; 发异步失效消息给其他backend,通知该表已删除; 删除表对应的外存文件。


三、问题修护
当清理buffer动作未完成时,最后一步unlink file时就已经完成了,此时数据库如果正在做checkpoint时,就会去flush buffer 中还未标记为不可用的page,此时就会导致打开文件错误。 当清理buffer动作未完成时,删除文件执行完成后,又创建了一个和刚刚删除的文件同名的文件,会导致后续的文件在内存中的映射会被异步的置为invalid。

四、结语

文章转载自云加社区,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




