mysql连接数问题

最近在跑一个shell脚本,大概的流程是:

1
2
3
4
从hive拉取数据到一个文件
把步骤1的文件切分成100个子文件
启动300个子进程,传入子文件做参数,每个进程都会调用一个后端的php脚本,来处理子文件。
处理过程比较复杂,会涉及到多个读、写操作

开始运行后,日志里出现部分sql执行失败的情况。出错的sql既有写操作语句,也有读操作语句。
首先怀疑是不是sql本身的问题。把sql拿出来在mysql client上执行都是可以的。排除这种了可能性,那就只能是调用mysql时出现错误了。mysql进程还在,手动执行sql正常。由于后端php脚本操作数据库的lib封装时log没有输出错误码,所以从日志中也不能直接看出来是什么错误。再去看下mysql的状态。

先看下是否有慢查询导致mysql响应不过来? 没有。

1
2
3
4
5
6
7
mysql> show status like '%slow%';
+---------------------+-------+

| Variable_name | Value |
+---------------------+-------+

| Slow_launch_threads | 0 |
| Slow_queries | 0 |
+---------------------+-------+

再看下是否因为锁表导致不能响应?

1
Table_locks_waited为0

再看是否是连接的问题?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
mysql> show status like '%connect%';
+-----------------------------------------------+-------+
| Variable_name | Value |
+-----------------------------------------------+-------+
| Aborted_connects | 21 |
| Connection_errors_accept | 0 |
| Connection_errors_internal | 0 |
| Connection_errors_max_connections | 608 |
| Connection_errors_peer_address | 0 |
| Connection_errors_select | 0 |
| Connection_errors_tcpwrap | 0 |
| Connections | 7277 |
| Max_used_connections | 150 |
| Performance_schema_session_connect_attrs_lost | 0 |
| Ssl_client_connects | 0 |
| Ssl_connect_renegotiates | 0 |
| Ssl_finished_connects | 0 |

这里面的Max_used_connections表示mysql收到的最大连接数。再看mysql配置中支持的最大连接数是多少?151

1
2
3
4
5
6
7
8
9
10
11
12
13
14
mysql> show variables like '%connect%';
+-----------------------------------------------+-------------------+
| Variable_name | Value |
+-----------------------------------------------+-------------------+
| character_set_connection | latin1 |
| collation_connection | latin1_swedish_ci |
| connect_timeout | 10 |
| disconnect_on_expired_password | ON |
| init_connect | |
| max_connect_errors | 100 |
| max_connections | 151 |
| max_user_connections | 0 |
| performance_schema_session_connect_attrs_size | 512 |
+-----------------------------------------------+-------------------+

最大连接数是151. 操作mysql的进程数300,超过了mysql的最大连接数而导致部分连接请求失败。调整一下max_connection参数试一下。(这里也可以修改mysql的my.cnf配置文件重启后生效)
mysql> set GLOBAL max_connections=1000;

重新运行批处理脚本,日志中错误消失。