在PostgreSQL中,向正在更新的表添加索引会丢失数据吗?

bax*_*axx 6 postgresql index

我不确定如何从文档中回答这个问题,并且无法通过搜索找到答案。

我想知道:如果有一个正在更新的现有表(已添加数据),我是否可以通过向表添加索引来丢失任何数据?

我不介意事情变慢一点,但我不想因为添加索引而丢失数据,因为表被锁定或创建索引时发生某些事情。

需要明确的是,数据库中有一个现有表,数据正在添加到表中,我想向表添加索引。我不确定在创建索引时是否会丢失添加到表中的一些数据。

小智 8

不,您不会丢失数据。

当 CREATE INDEX 运行时,Postgres 将阻止对表的所有写访问。因此,在 CREATE INDEX 之后启动的任何 INSERT/UPDATE 或 DELETE 语句都将被迫等待,直到创建索引(并提交)。


如果您使用 CREATE INDEX CONCURRENTLY,情况会有所不同。在这种情况下,写入访问不会被阻止,并且 DML 将“照常”工作。不过,CREATE INDEX 可能需要更长的时间才能完成。

如果并发创建索引时出现问题,索引将被标记为不可用,但仍然不会丢失数据。其中一种情况是创建 UNIQUE 索引,并在其运行时将重复项插入到表中。

有关并发选项的更多详细信息,请参阅手册


jja*_*nes 8

当索引创建正在进行时,INSERT 将被锁阻塞。我们无法告诉您您的客户对此有何反应。也许它会耐心等待然后恢复,也许它会超时,抛出错误,无法捕获错误,然后耻辱地崩溃——丢失内部缓存但尚未保存的所有数据。也许它会释放海妖。

如果您使用 CONCURRENTLY 创建索引,它确实会重新安排时间和赔率,但不会从根本上改变事情。它将缩短获取访问独占锁后保持的时间,但即使是缩短的锁,客户端如何响应仍然取决于客户端。如果有多个客户端,其中一些客户端仍有可能被无限期地阻止。