我试图解决在不加锁的情况下在大型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有没有人有同样的问题或者有解决方案,如何运行迁移而不会在主应用程序中引发异常?
发布于 2014-06-18 05:57:26
如果你有一个超级查询或一系列查询,我用过的一个解决方案是延长等待超时。
如果您当前无法重启服务器或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
服务器在关闭交互式连接之前等待该连接上的活动的秒数。交互式客户端被定义为使用mysql_real_connect()的CLIENT_INTERACTIVE选项的客户端。
可以像这样设置:
interactive_timeout = 28800my.cnf
My.cnf的可能位置:
来源:http://moorberry.net/blog/mysql-lock-wait-timeout-exceeded/
https://stackoverflow.com/questions/22931722
复制相似问题