【问题标题】:How to alter `id` column type for large tables in Rails with MySQL如何使用 MySQL 更改 Rails 中大型表的“id”列类型
【发布时间】:2021-02-27 18:49:55
【问题描述】:

考虑到在 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

【问题讨论】:

  • 应该可以只输入change_column :table_name, :id, :bigint;但是,可能建议在运行时将应用程序置于维护模式以避免任何潜在的冲突。

标签: mysql ruby-on-rails ruby migration


【解决方案1】:

在 Shopify,我们使用了 fork of LHM,它允许在系统启动并运行时进行迁移。比需要您使系统脱机的内联迁移要好得多。

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

具体回答你的观点:

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

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

记录不断被添加到表中

在写入 LHM 表时,新记录将同时写入现有表和 LHM 表。一旦现有表和 LHM 表更新到日期/同步,您就可以对 LHM 表进行切换,从而完成迁移。

如上所述,表格很大

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-03
    • 2014-05-05
    • 2016-11-25
    • 2010-11-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多