运行 LargeHadronMigrator add_column 期间出现 Mysql 错误“超出锁定等待超时;尝试重新启动事务”

Lui*_*iGi 5 ruby-on-rails rails-migrations

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

Mysql2::Error: Lock wait timeout exceeded; 
try restarting transaction: UPDATE competition_clients...
Run Code Online (Sandbox Code Playgroud)

这是我的迁移:

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
Run Code Online (Sandbox Code Playgroud)

有没有人遇到同样的问题,或者有没有人有解决方案如何运行迁移而不从主应用程序引发异常?

Mic*_*ter 4

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

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

mysql> set GLOBAL wait_timeout=28800;
Run Code Online (Sandbox Code Playgroud)

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

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

~$ vim /etc/my.conf
Run Code Online (Sandbox Code Playgroud)

插入以下行:

wait_timeout = 28800
Run Code Online (Sandbox Code Playgroud)

现在重新启动 MySQL:

sudo /etc/init.d/mysql restart
Run Code Online (Sandbox Code Playgroud)

或者在红帽上:

sudo service mysqld restart
Run Code Online (Sandbox Code Playgroud)

笔记

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

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

可以这样设置:

interactive_timeout = 28800
Run Code Online (Sandbox Code Playgroud)

my.cnf
my.cnf 的可能位置:

  • /etc/my.cnf
  • /etc/mysql/my.cnf
  • $MYSQL_HOME/my.cnf
  • [数据目录]/my.cnf
  • 〜/.my.cnf

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