如何使用 MySQL 更改 Rails 中大型表的“id”列类型

Igo*_*r P 3 ruby mysql migration ruby-on-rails

在 Rails 中,将包含 2,000,000,000 多条记录的表上的列从 更改为 的推荐方法是什么,int(10)考虑到:bigint(8)

  1. 在生产中运行并暴露给客户
  2. 记录不断添加到表中
  3. 如上所述,桌子很大

这是一个示例迁移,说明了结果应该是什么:

class ChangeTableNameIdType < ActiveRecord::Migration
  def change
    execute('ALTER TABLE table_name MODIFY COLUMN id BIGINT(8) NOT NULL AUTO_INCREMENT')
  end
end
Run Code Online (Sandbox Code Playgroud)

Mat*_*hew 6

在 Shopify,我们使用了LHM 的一个分支,允许在系统启动和运行时进行迁移。比需要使系统离线的内联迁移要好得多。

它将处理数十亿条记录,但重要的是要了解它将在迁移过程中创建一个并行表,然后切换到新表,因此您需要确保有可用的数据库空间。

具体回答你的观点:

在生产中运行并暴露给客户

是的,这将在生产中运行,并且可以在客户使用您的产品时安全地并行运行。

记录不断添加到表中

当写入 LHM 表时,新记录将同时写入现有表和 LHM 表。一旦现有表和 LHM 表更新为最新/同步,您就可以切换到 LHM 表,从而完成迁移。

如上所述,桌子很大

适用于数十亿条记录。有在这种规模下使用它的个人经验。有用。