使用大量数据更改 postgresql 表

Naz*_*ain 3 postgresql postgresql-9.1

我的数据库中有一个表,其中有几个简单的列和一个二进制列。该表的主键是一个integer类型。

我面临的问题是自动递增的主键列已达到其最大限制 +2147483647。意味着该表中有大约 20 亿条记录。由于该表中的二进制列,它255 GB在磁盘上有大约大小。

现在,由于该数据类型限制,对该表的所有插入都已停止。逻辑解决方案是我们将该主键列转换为bigint. 但是由于ALTER TABLE命令的大小总是失败,有时甚至数据库进入不一致的状态,我们根本无法访问该表。

使用的语句:

ALTER TABLE table_name ALTER COLUMN id SET DATA TYPE bigint ;
Run Code Online (Sandbox Code Playgroud)

任何人都有任何建议来解决这个问题。

dez*_*zso 6

一种想法,在不知道您得到的错误的情况下,是操作超时。当要获取的锁与其他操作冲突或者有太多索引和约束需要更新和检查时,有时会发生这种情况。我在下面的回答为这种情况提供了一个想法。其他可能性是您的磁盘空间不足 - 添加更多磁盘来修复它,并考虑以下解决方案来更改表结构。

现在您不能再插入到您的表中,您也可以创建一个类似的表bigint而不是integerPK 列。复制现有数据。完成后(并建立必要的索引),您可以简单地重命名同一事务中的两个表,以便新的表最终具有当前表的名称。

对于正常操作,这会更复杂一些(必须复制插入以写入新表等),但在您的情况下,它应该按上述方式工作。

在没有约束和索引的情况下复制表的数据可能比就地更改快得多(至少在大多数情况下)。

注意: 9.1 即将停止支持,请考虑升级到更新的版本。