rails 应用和 mysql 部署在不同的服务器上面。 服务器偶尔断电服务自启后,往往 mysql 启动比较慢,rails 应用启动时又依赖 mysql 连接。
如何才能做到 Mysql 未启动,Rails 应用启动不报连接 mysql 错误?
可能要研究一下 MySQL 的连接有没有超时控制机制,但是怎么判断 MySQL 正在启动和启动失败?
我觉得应该做的是 MySQL 还没有启动前,不应该启动 Rails.
#!/bin/bash function is_db_up { nc -z -w5 MYSQL_IP MYSQL_PORT } echo -n "Waiting for db to be up..." until is_db_up ; do printf '.' sleep 1 done echo done\! # start rails application
楼上检测 MySQL 是否启动的方法依赖 nc,需要单独安装。发现一种只依赖 bash 的方案:
is_db_up(){ timeout 5s bash -c 'echo > /dev/tcp/example.com/3306' }
至于连接数据库,Rails 是在内置的 Initializers 中的 active_record.initialize_database 初始化连接的,我之前有其它需求想删除这个 initializer,但没找到方法。
active_record.initialize_database