MySQL掉线咯

July 26th, 2008

一个后台操作算得太久,然后再想跟MySQL说说话的时候,就发现 那个server已经偷偷的跑掉了

MySQL的超时可以用SQL查到:

mysql> show variables;

看interactive_timeout和wait_timeout这两项。缺省是28800(秒),我们的服务器上设成了600。所以,一个长循环跑了11分钟之后,数据库连接已经被关掉了,因为中间没有和数据库打交道。

(多长的循环可以跑10分钟?我看到的大概是8000多和20000多的两个数组做了一下select…)

这些变量可以在/etc/my.cnf里面设置的。

Rails应用可以把ActiveRecord::Base.verification_timeout设为一个小于数据库连接超时的值(比如500)这样Rails就会帮你每过500秒PING一下数据库这样连接就不会断掉了。

(唔…10分钟会让很多东西超时,比如Apache…)

然则我们的操作是Rails之外的一个stand-alone进程,Rails也不管帮忙它,所以要在循环的过程中时不时的PING一下数据库:

ActiveRecord::Base.connection.verify!(0)

于是就可以了。

第一次在Rails应用里用到了 MySQL 5的视图 ,留个纪念。

Rails创建大概50,000个ActiveRecord对象就会很慢(大概50~60秒,在我的双核Mac Mini上),为了对付一个报表,就搞了一个视图。整体时间从70秒降到7秒。

Rails预先定义的rake任务中有db:test:prepare(里面调用db:test:clone_structure),但这个任务只把development库的所有表复制到test,不会复制视图,所以要自己在Rakefile里准备test库。

以上。