我试图解决在没有锁定的情况下在大型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
是否有任何相同的问题,或者有任何解决方案如何在不引发主应用程序异常的情况下运行迁移?
答案 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的可能位置:
来源:http://moorberry.net/blog/mysql-lock-wait-timeout-exceeded/