Mysql错误"超过锁定等待超时;尝试重启交易"在运行LargeHadronMigrator add_column期间

时间:2014-04-08 08:34:53

标签: ruby-on-rails rails-migrations

我试图解决在没有锁定的情况下在大型MySQL表上添加列的问题,并且在我的开发环境迁移中它可以工作。但是当我在生产中启动它时,应用程序引发了MySQL错误:

Mysql2::Error: Lock wait timeout exceeded; 
try restarting transaction: UPDATE competition_clients...

这是我的迁移:

require 'lhm'

class AddPersonToCompetitionClients < ActiveRecord::Migration

  def up
    Lhm.change_table(:competition_clients, atomic_switch: false) do |m|
      m.add_column(:person_id, 'INT(12)')
      m.add_column(:active, 'TINYINT(1)')
      m.add_index([:person_id])
      m.add_index([:active])
    end
  end

  def down
    Lhm.change_table(:competition_clients, atomic_switch: false) do |m|
      m.remove_index([:person_id])
      m.remove_index([:active])
      m.remove_column(:person_id)
      m.remove_column(:active)
    end
  end

end

是否有任何相同的问题,或者有任何解决方案如何在不引发主应用程序异常的情况下运行迁移?

1 个答案:

答案 0 :(得分:3)

如果您有超级查询或一系列查询,我使用的一个解决方案是延长等待超时。

如果您目前无法重启服务器或MySQL,请在MySQL终端中输入以下内容:

mysql> set GLOBAL wait_timeout=28800;

当前MySQL实例终止时,此设置将消失。

要永久设置wait_timeout参数,请编辑MySQL配置文件:

~$ vim /etc/my.conf

插入以下行:

wait_timeout = 28800

现在重启MySQL:

sudo /etc/init.d/mysql restart

或者在Redhat上:

sudo service mysqld restart

备注

<强> WAIT_TIMEOUT
服务器在关闭非交互式连接之前等待活动的秒数。此超时仅适用于TCP / IP和Unix套接字文件连接,而不适用于使用命名管道或共享内存进行的连接。

<强> interactive_timeout
服务器在关闭之前等待交互式连接上的活动的秒数。交互式客户端定义为使用CLIENT_INTERACTIVE选项到mysql_real_connect()的客户端。

可以设置为:

interactive_timeout = 28800

<强>的my.cnf
my.cnf的可能位置:

  • 的/etc/my.cnf
  • /etc/mysql/my.cnf
  • $ MYSQL_HOME / my.cnf中
  • [DATADIR] /my.cnf
  • 〜/ .my.cnf

来源:http://moorberry.net/blog/mysql-lock-wait-timeout-exceeded/