Postgresql AWS在故障切换过程中的后置稳定性

Postgresql AWS在故障切换过程中的后置稳定性,postgresql,amazon-web-services,npgsql,Postgresql,Amazon Web Services,Npgsql,在故障切换或硬件资源调配期间,是否提供关于OID稳定性的任何保证 我这样问是因为在测试本地Postgres数据库时,我删除并重新创建了包含citexttype列的数据库,并遇到了错误字段“name”的类型当前Npgsql(OID 1393966)。我意识到这是因为OID不会在数据库的拖放和创建中持久化 我是Azure和AWS的新手,但我发现Azure连接不可靠,因为它可以对客户端“透明”地移动数据库。我不确定AWS是否有类似的行为,但我已经了解到区域之间的故障转移是透明的。我担心,无论出于何种原

在故障切换或硬件资源调配期间,是否提供关于OID稳定性的任何保证

我这样问是因为在测试本地Postgres数据库时,我删除并重新创建了包含
citext
type列的数据库,并遇到了错误
字段“name”的类型当前Npgsql(OID 1393966)
。我意识到这是因为OID不会在数据库的拖放和创建中持久化

我是Azure和AWS的新手,但我发现Azure连接不可靠,因为它可以对客户端“透明”地移动数据库。我不确定AWS是否有类似的行为,但我已经了解到区域之间的故障转移是透明的。我担心,无论出于何种原因,透明地切换服务器都可能会更改
citext
的OID,并导致应用程序开始失败——或者更糟糕的是,在OID冲突的机会上出现错误行为


我的担心是没有根据的吗?有没有检测连接开关和调用的方法?

PostgreSQL通常不能保证扩展创建的类型的OID稳定性(与稳定的内置类型相反)。总之,PostgreSQL就是这样,而不仅仅是RDS

这就是Npgsql按名称加载类型的原因之一——当它第一次连接到给定的数据库(或者更准确地说,连接到给定的连接字符串)时,所有类型都被加载,并且已知的类型名称(例如,
citext
)都与该名称的特定数据库的类型OID相匹配。此信息在应用程序的生命周期内缓存在连接字符串上

如果在应用程序的生命周期内,类型OID发生更改(因为该类型的扩展已被删除并重新创建),则确实必须调用
NpgsqlConnection.ReloadTypes()
来重新加载名称/OID信息


你关于失败的问题确实很有趣。。。我不知道RDS是如何实现其故障转移的,但您是否确实看到citext类型OID在两个地理实例中有所不同?

因此,通过一些实验,OID似乎是稳定的

我每100毫秒运行一次以下查询:

select typname, oid, pg_postmaster_start_time(), inet_server_addr()::text
from pg_catalog.pg_type
where typname = 'citext'; 
并在任何结果更改时记录。然后使用故障转移重新启动RDS实例。在几次连接超时后,inet_server_addr()发生了更改,但oid没有更改。我再次重新启动,inet_server_addr()恢复,oid再次保持不变


除非任何人能够明确证明OID发生了变化或了解内部实施细节,我现在相信OID在故障转移期间是稳定的-但我不敢说我已经证明了它,因为我还没有证明相反的情况

我还没有在不同的地区设置RDS-这更多的是一个理论问题,因为我目前正在从自托管SQL Server移植到托管Postgres,并试图做尽可能多的研究来避免任何一个都可以。出于兴趣,您认为Npgsql抛出一个自定义异常(应用程序可以捕获该异常以决定是否重新加载类型)有多容易?捕获NotSupportedException可能有效,但我不希望出现误报。我认为代码是正确的,但我不确定NpgsqlSafeReadException是什么…当然可以为此抛出特定的异常,但如果应用程序必须捕获它并作为其正常流的一部分重新加载,这似乎相当糟糕。。。到目前为止,只有当应用程序向数据库添加扩展,然后希望在同一应用程序实例中使用其类型时,才需要重新加载。我假设(或者更确切地说是希望)RDS复制的一部分是为了确保总的数据库标识,其中包括类型OID,所以这个问题可能根本不存在。有什么方法可以证实这一点吗?如果您感兴趣,我已经做了一些实验,看起来OID在故障切换期间是稳定的。我在我的回答中发布了更多的信息。谢谢你的帮助!很高兴知道,谢谢你花时间做这个实验!