以最小停机时间将 Django 的 ID 字段从 int 迁移到 big int

主要观点:Django 3.2 LTS 之前创建的基于 Django 的应用可能会遇到 ID 溢出问题,本文介绍了在 PostgreSQL 中重现该问题的 SQL 语句及解决步骤。
关键信息:

  • Django 3.2 LTS 之前用int作为数据库中模型 ID 的数据类型,其范围是 0 到 2147483647,约 21 亿多记录。
  • 在 PostgreSQL 中通过创建表、修改数据类型、交换表名和移动数据等步骤来解决 ID 溢出问题,如创建新表mytable_new并将id数据类型改为bigint,然后交换表名,最后移动数据。
    重要细节:
  • PostgreSQL 对插入最大 4 字节整数表现正常,但超过最大值会报错integer out of range
  • 解决过程中要考虑外键引用和数据迁移等情况,如在修改表结构时要临时禁用约束,数据迁移可使用触发器或 RDMS 提供的其他功能。
  • 移动数据时,若在问题发生前处理有更多时间,可研究如何同步两个表;若在问题发生后处理则需尽快复制数据,且复制速度取决于表中数据量。

结论:该问题在 Ruby on Rails 中也有出现,以前人们未预料到这种情况,如今磁盘空间利用借口已不成立,应将解决此问题列入优先级列表。

阅读 6
0 条评论