欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  数据库

MySQL出现大量locked进程的解决

程序员文章站 2022-05-19 15:54:45
...

这两天在测试一个程序,该程序对mysql数据库有较大数据量的访问,最近,一不小心出现了无法查询的情况。利用navicat排查服务器状

这两天在测试一个程序,该程序对mysql数据库有较大数据量的访问,最近,一不小心出现了无法查询的情况。

利用navicat排查服务器状态发现,很多进程都locked了,有一条查询语句一直处于sending data状态,其他进程全部locked。

结束这个进程之后,mysql数据库又恢复正常。

因此,遇到mysql被locked的情况,有以下几种处理方法:

1. 关闭导致locked的进程;

2. 多次查询,处理工作全部交给程序来做,减轻数据库负担;

3. 优化服务器:

以下转自ChinaUnix论坛一个帖子:

数据库有7G数据,随着数据的增大,现在每天出现一次崩溃。
mysqladmin processlist 查询进程,发现locked进程超多,而且一直locked不会解锁,到最后整个mysql被locked进程占满,崩溃。

是否和my.cnf里如下配置有关。

根据网上资料,做了如下配置,效果不是很明显:
MySQL调优性能的系统变量


(1)、back_log:
要求 MySQL 能有的连接数量。当主要MySQL线程在一个很短时间内得到非常多的连接请求,这就起作用,然后主线程花些时间(尽管很短)检查连接并且启动一个新线程。
back_log值指出在MySQL暂时停止回答新请求之前的短时间内多少个请求可以被存在堆栈中。只有如果期望在一个短时间内有很多连接,你需要增加它,换句话说,这值对到来的TCP/IP连接的侦听队列的大小。你的操作系统在这个队列大小上有它自己的限制。 试图设定back_log高于你的操作系统的限制将是无效的。
当你观察你的主机进程列表,发现大量 264084 | unauthenticated user | xxx.xxx.xxx.xxx | NULL | Connect | NULL | login | NULL 的待连接进程时,就要加大 back_log 的值了。默认数值是50,我把它改为500。

(2)、interactive_timeout:
服务器在关闭它前在一个交互连接上等待行动的秒数。一个交互的客户被定义为对 mysql_real_connect()使用 CLIENT_INTERACTIVE 选项的客户。 默认数值是28800,我把它改为7200。

(3)、key_buffer_size:
索引块是缓冲的并且被所有的线程共享。key_buffer_size是用于索引块的缓冲区大小,增加它可得到更好处理的索引(对所有读和多重写),到你能负担得起那样多。如果你使它太大,系统将开始换页并且真的变慢了。默认数值是8388600(8M),我的MySQL主机有2GB内存,所以我把它改为402649088(400MB)。

(4)、max_connections:
允许的同时客户的数量。增加该值增加 mysqld 要求的文件描述符的数量。这个数字应该增加,否则,你将经常看到 Too many connections 错误。 默认数值是100,我把它改为1024 。

(5)、record_buffer:
每个进行一个顺序扫描的线程为其扫描的每张表分配这个大小的一个缓冲区。如果你做很多顺序扫描,你可能想要增加该值。默认数值是131072(128K),我把它改为16773120 (16M)

(6)、sort_buffer:
每个需要进行排序的线程分配该大小的一个缓冲区。增加这值加速ORDER BY或GROUP BY操作。默认数值是2097144(2M),我把它改为 16777208 (16M)。

(7)、table_cache:
为所有线程打开表的数量。增加该值能增加mysqld要求的文件描述符的数量。MySQL对每个唯一打开的表需要2个文件描述符。默认数值是64,我把它改为512。

(8)、thread_cache_size:
可以复用的保存在中的线程的数量。如果有,新的线程从缓存中取得,当断开连接的时候如果有空间,,客户的线置在缓存中。如果有很多新的线程,为了提高性能可以这个变量值。通过比较 Connections 和 Threads_created 状态的变量,可以看到这个变量的作用。我把它设置为 80。

(10)、wait_timeout:
服务器在关闭它之前在一个连接上等待行动的秒数。 默认数值是28800,我把它改为7200。

mysql> show engines;
+------------+----------+----------------------------------------------------------------+
| Engine | Support | Comment |
+------------+----------+----------------------------------------------------------------+
| MyISAM | DEFAULT | Default engine as of MySQL 3.23 with great performance |
| MEMORY | YES | Hash based, stored in memory, useful for temporary tables |
| InnoDB | DISABLED | Supports transactions, row-level locking, and foreign keys |
| BerkeleyDB | NO | Supports transactions and page-level locking |
| BLACKHOLE | NO | /dev/null storage engine (anything you write to it disappears) |
| EXAMPLE | NO | Example storage engine |
| ARCHIVE | YES | Archive storage engine |
| CSV | NO | CSV storage engine |
| ndbcluster | NO | Clustered, fault-tolerant, memory-based tables |
| FEDERATED | NO | Federated MySQL storage engine |
| MRG_MYISAM | YES | Collection of identical MyISAM tables |
| ISAM | NO | Obsolete storage engine |
+------------+----------+-----------------------------------------------------------

mysql> show processlist;
+--------+---------+---------------------+--------+---------+------+-------+------------------+
| Id | User | Host | db | Command | Time | State | Info |
+--------+---------+---------------------+--------+---------+------+-------+------------------+
| 7572 | bbSUSEr | 61.152.X.89:1885 | wy**| Sleep | 4569 | | NULL |
| 235419 | bbsuser | 61.152.X.89:1935 | wy** | Sleep | 7 | | NULL |
| 262995 | root | localhost | NULL | Query | 0 | NULL | show processlist |
| 263404 | bbsuser | 61.152.X.76:53934 | wy** | Sleep | 93 | | NULL |
| 263948 | bbsuser | 61.152.X.76:54559 | wy** | Sleep | 9 | | NULL |
| 263986 | bbsuser | 61.152.X.76:54600 | wy** | Sleep | 4 | | NULL |
| 264005 | bbsuser | 61.152.X.76:54623 | wy** | Sleep | 1 | | NULL |
| 264010 | bbsuser | 61.152.X.76:54629 | wy** | Sleep | 0 | | NULL |
+--------+---------+---------------------+--------+---------+------+-------+------------------+
8 rows in set (0.00 sec)

MySQL出现大量locked进程的解决