我的数据库中有一个表,其中包含几个简单的列和一个二进制列。该表的主键是一种integer
类型。
我面临的问题是自动递增的主键列已达到其最大限制 +2147483647。意味着该表中有大约 20 亿条记录。由于该表中的二进制列,它255 GB
在磁盘上有大约大小。
现在,由于该数据类型限制,对该表的所有插入都已停止。逻辑解决方案是我们将该主键列转换为bigint
. 但是由于ALTER TABLE
命令的大小总是会失败,有时甚至数据库会进入不一致的状态,我们根本无法访问该表。
使用的语句:
ALTER TABLE table_name ALTER COLUMN id SET DATA TYPE bigint ;
任何人都有解决此问题的任何建议。
一个想法,在不知道你得到的错误的情况下,是操作超时。当要获取的锁与其他操作发生冲突或有太多索引和约束需要更新和检查时,有时会发生这种情况。我在下面的回答为这种情况提供了一个想法。其他可能性是您的磁盘空间不足 - 添加更多磁盘来修复它,并考虑以下解决方案来更改表结构。
现在您无法再插入表中,您也可以创建一个类似的表,
bigint
而不是integer
PK 列。复制现有数据。完成后(并建立必要的索引),您可以简单地重命名同一事务中的两个表,以便新的表最终将具有当前表的名称。对于正常操作,这会有点复杂(必须复制插入以写入新表等),但在您的情况下,它应该如上所述工作。
在没有约束和索引的情况下复制表的数据可能比原地更改要快得多(至少在大多数情况下)。
注意: 9.1 将很快失去支持,请考虑升级到更新的版本。