无规律出现下边的报错:
[2017-08-24 14:29:56] production.ERROR: exception 'PDOException' with message 'SQLSTATE[HY000] [2002] Connection timed out' in /data/vendor/laravel/framework/src/Illuminate/Database/Connectors/Connector.php:55
Stack trace:
#0 /data/vendor/laravel/framework/src/Illuminate/Database/Connectors/Connector.php(55): PDO->__construct('mysql:host=10.1...', 'aa', 'anytime&anyw...', Array)
#1 /data/vendor/laravel/framework/src/Illuminate/Database/Connectors/MySqlConnector.php(24): Illuminate\Database\Connectors\Connector->createConnection('mysql:host=10.1...', Array, Array)
网上找了下,没有找到明确说明报错的原因,但是从SQLSTATE[HY000] [2002] Connection timed out内容来看,应该是数据库连接失败导致的超时问题。
结合laravel5 的数据库配置,没有直接配置time out的参数,但是可以通过数据库配置中增加:
'options' => array(
PDO::ATTR_PERSISTENT => true,
),
来对数据库长连接做一个持久化的设置。是否能解决根本问题,还需进一步观察。
通过查找上边问题,找到一些关于mysql超时的一些说明,这里也做个记录(采用拿来主义,请见谅):
[mysql]> show global variables like "%timeout%";
+-----------------------------+----------+
| Variable_name | Value |
+-----------------------------+----------+
| connect_timeout | 10 |
| delayed_insert_timeout | 300 |
| innodb_flush_log_at_timeout | 1 |
| innodb_lock_wait_timeout | 120 |
| innodb_rollback_on_timeout | OFF |
| interactive_timeout | 28800 |
| lock_wait_timeout | 31536000 |
| net_read_timeout | 30 |
| net_write_timeout | 60 |
| rpl_stop_slave_timeout | 31536000 |
| slave_net_timeout | 3600 |
| wait_timeout | 28800 |
+-----------------------------+----------+
12 rows in set (0.00 sec)
- connect_timeout: 在获取链接时,等待握手的超时时间,只在登录时有效,登录成功这个参数就不管事了。主要是为了防止网络不佳时应用重连导致连接数涨太快,一般默认即可。
- delayed_insert_timeout: 这是为MyISAM INSERT DELAY设计的超时参数,在INSERT DELAY中止前等待INSERT语句的时间。
- innodb_lock_wait_timeout: 就是事务遇到锁等待时的Query超时时间。跟死锁不一样,InnoDB一旦检测到死锁立刻就会回滚代价小的那个事务,锁等待是没有死锁的情况下一个事务持有另一个事务需要的锁资源,被回滚的肯定是请求锁的那个Query。
- innodb_rollback_on_timeout:这个参数关闭或不存在的话遇到超时只回滚事务最后一个Query,打开的话事务遇到超时就回滚整个事务。
- interactive_timeout/wait_timeout:一个持续SLEEP状态的线程多久被关闭。线程每次被使用都会被唤醒为acrivity状态,执行完Query后成为interactive状态,重新开始计时。wait_timeout不同在于只作用于TCP/IP和Socket链接的线程,意义是一样的。一般设置是8小时,一般网站白天都有人访问,从夜里到早上一般都会超过8小时,所以再来访问就会这个问题。
- net_read_timeout / net_write_timeout: 这个参数只对TCP/IP链接有效,分别是数据库等待接收客户端发送网络包和发送网络包给客户端的超时时间,这是在Activity状态下的线程才有效的参数.
- slave_net_timeout: 这是Slave判断主机是否挂掉的超时设置,在设定时间内依然没有获取到Master的回应就人为Master挂掉了