使用gh-ost用导轨滴来置



我们正在使用github gh-ost在我们的铁路应用程序中进行在线迁移。目的是从应用程序代码更改中解脱群体迁移,并避免需要在不影响站点性能的情况下简单地通过耙子任务运行的较大迁移的停机时间。

这个罚款,除了一个例外:删除列。当我们放下一列时,轨道会感到困惑,并开始抛出异常。原因是Rails架构缓存。即使应用程序代码没有引用列(我们对运行GH-ost迁移之前必须满足的过程要求(仍然认为它在那里。因此,在表上使用SELECT *的默认行为导致它尝试从不再存在的列(DB迁移完成之后(获取数据。

我们试图提出一个解决这个问题的解决方案,该解决方案仍然使我们能够满足上述两个目标。两种可能性是(1(在GH-OST迁移完成后重新启动导轨服务器,或(2(在GH-OST迁移完成后清除导轨架构缓存。这两者都是可行的,尽管它们限制了我们完全将在线迁移从应用程序代码更改中解脱出来的能力,并且都可能影响站点性能。

鉴于我们的数据库的大小&我认为我们不愿意考虑的申请,正在关闭Rails模式缓存。

还有其他人解决了这个问题吗?我们有什么选择?

我在github问题页面上询问了GH-oST,并学习了一些解决此挑战的方法:

对于Rails 4,覆盖ActiveRecord::Base.columns以从列数数组中删除有关模型的列数:

class User < ActiveRecord::Base
  def self.columns
    super.reject {|column| column.name == 'employee_email'}
  end
end

在Rails 5中,可以使用.ignored_columns完成此操作:

class User < ApplicationRecord
  self.ignored_columns = %w(employee_email)
end

归功于此博客的代码样本。

一种替代方法是从相关关联中删除"急切的加载",以便Rails架构缓存不会像我的问题中所述干扰。

无论选择哪种选项,都必须将其部署到执行GH-OST迁移的Rails Application 之前。这样可以确保该应用程序将在列是否存在的情况下运行,从而消除了GH-OST迁移切割后重新启动Rails应用程序的需要。

最新更新