Mysql "show processlist"의 모든 프로세스를 어떻게 종료합니까?


121

많은 프로세스가 있고 "시간"열에 모든 프로세스에 대한 큰 값이 표시되기 때문입니다.


mysqld를 다시 시작할 수도 있습니다. 예 :sudo service mysqld restart
philfreo 2011 년

답변:


108

하나씩 죽일 필요가 있습니다. MySQL에는 대규모 kill 명령이 없습니다. 예를 들어 PHP에서 다음과 같은 것을 사용할 수 있습니다.

$result = mysql_query("SHOW FULL PROCESSLIST");
while ($row=mysql_fetch_array($result)) {
  $process_id=$row["Id"];
  if ($row["Time"] > 200 ) {
    $sql="KILL $process_id";
    mysql_query($sql);
  }
}

좋은 생각이야. Lemme는 cron의 쉘 스크립트로 변환 해보십시오 ...!
M. Faraz 2013-09-13

4
for i in {994..1145}; do mysql -uroot -p123456 -e "kill $i" ; done
zhuguowei

mysql -u -p -e "show processlist;" | grep 수면 | awk '{print $ 1}'| LINE을 읽는 동안; mysql -u -p -e "kill $ LINE"; 완료
user3770797 2011

213

대량 살상 작업은 시간을 절약합니다. MySql 자체에서 수행하십시오.

다음 명령 실행

mysql> select concat('KILL ',id,';') from information_schema.processlist
where user='root' and time > 200 into outfile '/tmp/a.txt';

mysql> source /tmp/a.txt;

참고

---------edit------------

파일에 저장하지 않으려면 variable

명령 프롬프트에서 실행하십시오.

> out1=$(mysql -B test -uroot -proot --disable-column-names  -e "select concat('KILL ',id,';') from information_schema.processlist where user='root' and time > 200;")

> out2= $(mysql -B test -uroot -proot --disable-column-names  -e "$out1")

13
소스를 참조하는 것을 기억하십시오 mysqlperformanceblog.com/2009/05/21/...은
아르 템 Goutsoul에게

2
@ArtemGoutsoul하지만이 사이트를 참조한 기억이 없습니다. 이 일을하는 나만의 경향.
Angelin Nadar 2012

@JanusTroelsen하지만 내 대답은 3 세 '12 이후
Angelin Nadar

1
@Angelin Nadar 감사합니다!
Silver Light

1
@ShankarDamodaran SURE
Angelin Nadar

16

또한 SHOW PROCESSLIST 명령을 MySQL을 통해 구문 분석하는 방법을 검색하고 셸에서 한 줄로 끝났습니다.

mysqladmin processlist -u <USERNAME> -p<PASSWORD> | \
awk '$2 ~ /^[0-9]/ {print "KILL "$2";"}' | \
mysql -u <USERNAME> -p<PASSWORD>
  • mysqladmin processlist 는 스레드 ID가있는 테이블을 인쇄합니다.
  • awk 는 두 번째 열에서 숫자 (스레드 ID) 만 구문 분석하고 MySQL KILL 명령을 생성합니다.
  • 마지막으로 mysql에 대한 마지막 호출 은 전달 된 명령을 실행합니다.

awk 명령 전에 grep 을 실행 하여 특정 데이터베이스 이름을 필터링 할 수 있습니다 .


13

아니면 ... 쉘에서 ...

service mysql restart

그래, 나도 나도 게으르지 만 편리 할 수도있어.


10
이것은 매우 나쁜 생각입니다. 특히 테이블 엔진이 메모리에 설정되어 있으면 모든 데이터가 손실됩니다 ... 또는 innodb 엔진 유형을 사용하는 경우 다시 시작할 때 모든 인덱스를 다시 실행합니다
HellBaby

8
또한 그것은 모든 데이터베이스의 모든 프로세스를 종료
디에고 안드레스 디아즈 에스피 노자

10

이보다 간단하지 않습니다. mysql 프롬프트에서 실행하십시오.

kill USER username;

제공된 사용자 이름으로 모든 프로세스를 종료합니다. 대부분의 사람들이 모든 용도로 동일한 사용자를 사용하기 때문에 작동합니다!

mysql에 대해 확실하지 않은 MariaDB에서 이것을 테스트했습니다.


3
어떤 버전의 MySQL에 존재합니까? MySQL 5.7 참조에 문서화되어 있지 않습니다 . 사용자가 죽일 수 있다는 증거는 없습니다 : KILL [CONNECTION | QUERY] processlist_id. MySQL 5.6.34에서 쿼리를 시도했는데 구문 오류로 간주됩니다.
Birchlabs

4
MySQL 5.6.34 프롬프트에서 이것을 시도했습니다. mysql> kill user root; ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'root' at line 1 아마도 귀하의 대답은 MariaDB 전용 기능 일 것입니다.
Birchlabs

이것은 Mysql에서 작동하지 않습니다. 다른 DB 시스템과 관련된 조언을 게시하기 전에 읽어
보세요

7

다음은 커서를 사용하여 현재 사용중인 프로세스를 제외하고 모든 프로세스를 하나씩 종료하는 간단한 저장 프로 시저를 만듭니다.

DROP PROCEDURE IF EXISTS kill_other_processes;

DELIMITER $$

CREATE PROCEDURE kill_other_processes()
BEGIN
  DECLARE finished INT DEFAULT 0;
  DECLARE proc_id INT;
  DECLARE proc_id_cursor CURSOR FOR SELECT id FROM information_schema.processlist;
  DECLARE CONTINUE HANDLER FOR NOT FOUND SET finished = 1;

  OPEN proc_id_cursor;
  proc_id_cursor_loop: LOOP
    FETCH proc_id_cursor INTO proc_id;

    IF finished = 1 THEN 
      LEAVE proc_id_cursor_loop;
    END IF;

    IF proc_id <> CONNECTION_ID() THEN
      KILL proc_id;
    END IF;

  END LOOP proc_id_cursor_loop;
  CLOSE proc_id_cursor;
END$$

DELIMITER ;

SELECTs 와 함께 실행하여 다음과 같이 전후 프로세스를 표시 할 수 있습니다 .

SELECT * FROM information_schema.processlist;
CALL kill_other_processes();
SELECT * FROM information_schema.processlist;

6

나는 최근에 이것을해야했고 이것을 생각 해냈다

-- GROUP_CONCAT turns all the rows into 1
-- @q:= stores all the kill commands to a variable
select @q:=GROUP_CONCAT(CONCAT('KILL ',ID) SEPARATOR ';')  
FROM information_schema.processlist 
-- If you don't need it, you can remove the WHERE command altogether
WHERE user = 'user';
-- Creates statement and execute it
PREPARE stmt FROM @q;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;

이렇게하면 단일 명령으로 모든 쿼리를 파일에 저장하고 실행할 필요가 없습니다.


5

모든 선택 쿼리 제거

select concat('KILL ',id,';') 
from information_schema.processlist 
where user='root' 
  and INFO like 'SELECT%' into outfile '/tmp/a.txt'; 
source /tmp/a.txt;

5

information_schema가없는 경우 :

mysql -e "show full processlist" | cut -f1 | sed -e 's/^/kill /' | sed -e 's/$/;/' ;  > /tmp/kill.txt
mysql> . /tmp/kill.txt

4

관리자로 Mysql에 로그인하십시오.

 mysql -uroot -ppassword;

그리고 실행 명령보다 :

mysql> show processlist;

다음과 같은 내용이 표시됩니다.

+----+-------------+--------------------+----------+---------+------+-------+------------------+
| Id | User        | Host               | db       | Command | Time | State | Info             |
+----+-------------+--------------------+----------+---------+------+-------+------------------+
| 49 | application | 192.168.44.1:51718 | XXXXXXXX | Sleep   |  183 |       | NULL             ||
| 55 | application | 192.168.44.1:51769 | XXXXXXXX | Sleep   |  148 |       | NULL             |
| 56 | application | 192.168.44.1:51770 | XXXXXXXX | Sleep   |  148 |       | NULL             |
| 57 | application | 192.168.44.1:51771 | XXXXXXXX | Sleep   |  148 |       | NULL             |
| 58 | application | 192.168.44.1:51968 | XXXXXXXX | Sleep   |   11 |       | NULL             |
| 59 | root        | localhost          | NULL     | Query   |    0 | NULL  | show processlist |
+----+-------------+--------------------+----------+---------+------+-------+------------------+

다른 연결에 대한 전체 세부 정보가 표시됩니다. 이제 아래와 같이 잠자기 연결을 종료 할 수 있습니다.

mysql> kill 52;
Query OK, 0 rows affected (0.00 sec)

19
이것은 질문에 대한 답이 아닙니다. 여기서 질문은 한 번에 프로세스를 어떻게 종료 할 수 있는가하는 동안 단일 프로세스를 종료합니다.
Hristo Petev 2014

@ badbod99 나는 mysql 프로세스를 죽이는 방법을 찾기 위해 여기에서 끝났고이 대답은 나를 도왔으므로 upvoted.
Bogdan 2018

3

이것은 나에게 (MySQL 서버 5.5) 모든 MySQL 프로세스를 죽이는 데 효과적이었습니다.

mysql -e "show full processlist;" -ss | awk '{print "KILL "$1";"}'| mysql

3

bash와 mysql을 결합합니다.

for i in $(mysql -Ne "select id from information_schema.processlist where user like 'foo%user' and time > 300;"); do
  mysql -e "kill ${i}"
done

2

다음은 운영 체제에 의존하지 않고 실행할 수있는 솔루션입니다.

1 단계 : 저장 프로 시저를 만듭니다.

DROP PROCEDURE IF EXISTS  kill_user_processes$$ 

CREATE PROCEDURE `kill_user_processes`(
  IN user_to_kill VARCHAR(255)
)
READS SQL DATA
BEGIN

  DECLARE name_val VARCHAR(255);
  DECLARE no_more_rows BOOLEAN;
  DECLARE loop_cntr INT DEFAULT 0;
  DECLARE num_rows INT DEFAULT 0;

  DECLARE friends_cur CURSOR FOR
    SELECT CONCAT('KILL ',id,';') FROM information_schema.processlist WHERE USER=user_to_kill;

  DECLARE CONTINUE HANDLER FOR NOT FOUND
    SET no_more_rows = TRUE;

  OPEN friends_cur;
  SELECT FOUND_ROWS() INTO num_rows;

  the_loop: LOOP

    FETCH  friends_cur
    INTO   name_val;

    IF no_more_rows THEN
        CLOSE friends_cur;
        LEAVE the_loop;
    END IF;


 SET @s = name_val;
    PREPARE stmt FROM @s;
    EXECUTE stmt;
    DEALLOCATE PREPARE stmt;

    SELECT name_val;

    SET loop_cntr = loop_cntr + 1;

  END LOOP the_loop;

  SELECT num_rows, loop_cntr;

END $$
DELIMITER ;

2 단계 : 프로세스를 종료하려는 데이터베이스 사용자의 이름을 제공하는 저장 프로 시저를 호출합니다. 원하는 경우 다른 기준으로 필터링하도록 저장 프로 시저를 다시 작성할 수 있습니다.

요구 kill_user_processes('devdba');


2
mysqladmin pr -u 'USERNAME' -p'PASSWORD' | awk '$2~/^[0-9]+/{print $2}' | xargs -i mysqladmin -u 'USERNAME' -p'PASSWORD' kill {}

1
안녕하세요. 당신이 봇인지, 커뮤니티인지, 인간인지 확실하지 않지만, 어쨌든이 코드 줄에서 무슨 일이 일어나고 있는지, 그리고 당면한 문제를 어떻게 해결하는지 설명하는 단어를 추가하면 좋을 것입니다.
Félix Gagnon-Grenier 2015 년

1
사용자에게 액세스 권한을 부여하기 위해 -u 및 -p를 추가했습니다. 작업은 괜찮습니다!
Lord St John

2

MySQL Workbench로 할 수 있습니다. 이것을 실행하십시오.

kill id;

예:

kill 13412

그것은 그것을 제거합니다.


위에서 언급 한 언어가 없었기 때문에 이것은 더 나은 대답으로 들립니다.
DeshDeep Singh

0

쉬운 방법은 mysql 서버를 다시 시작하는 것입니다. Windows 실행에서 "services.msc"를 열고 목록에서 Mysql을 선택합니다. 서비스를 마우스 오른쪽 버튼으로 클릭하고 중지하십시오. 그런 다음 다시 시작하면 하나를 제외한 모든 프로세스가 종료됩니다 (기본 예약 연결).


0
#! /bin/bash
if [ $# != "1" ];then
    echo "Not enough arguments.";
    echo "Usage: killQueryByDB.sh <db_name>";
    exit;
fi;

DB=${1};
for i in `mysql -u <user> -h localhost ${DB} -p<password> -e "show processlist" | sed 's/\(^[0-9]*\).*/\1/'`; do
    echo "Killing query ${i}";
    mysql -u <user> -h localhost ${DB} -p<password> -e "kill query ${i}";
done;

0

때로는 죽일 수없는 좀비 mysql 프로세스가 있습니다 (MAMP Pro 사용).

먼저 모든 mysql 프로세스 목록을 가져옵니다.

ps -ax | grep mysql

다음으로 그들 중 하나를 모두 죽입니다 (이전 명령 결과의 첫 번째 열로 processId 대체).

kill -9 processId

0

다음은 나를 위해 잘 작동했습니다.

echo "show processlist" | mysql | grep -v ^Id | awk '{print $1}' | xargs -i echo "KILL {}; | mysql"

0

flush tables실제로 대량 문제가 발생한 모든 비활성 연결을 종료하기 위해 명령 을 사용했습니다 .


1
작동하지 않습니다. 테이블을 플러시하지만 수면 coonections 활성 유지
gtryonp

0

파이썬 언어의 경우 다음과 같이 할 수 있습니다.

import pymysql

connection = pymysql.connect(host='localhost',
                             user='root',
                             db='mysql',
                             cursorclass=pymysql.cursors.DictCursor)

with connection.cursor() as cursor:
    cursor.execute('SHOW PROCESSLIST')
    for item in cursor.fetchall():
        if item.get('Time') > 200:
            _id = item.get('Id')
            print('kill %s' % item)
            cursor.execute('kill %s', _id)
    connection.close()

-1

laravel을 사용하는 경우 다음이 적합합니다.

$query = "SHOW FULL PROCESSLIST";
    $results = DB::select(DB::raw($query));

    foreach($results as $result){
        if($result->Command == "Sleep"){
            $sql="KILL ". $result->Id;
            DB::select(DB::raw($sql));
        }
    }

물론 use Illuminate\Support\Facades\DB;네임 스페이스 뒤에 이것을 사용해야 합니다.


-4

질의 1 select concat ( 'KILL', id, ';') from information_schema.processlist where user = 'username'into outfile '/tmp/a.txt';

쿼리 2 소스 a.txt

이렇게하면 특정 사용자에 의해 show processlist의 모든 쿼리를 종료 할 수 있습니다.


나는 당신이 rofl 아래의 대답을 복사했다는 것을 깨달았습니다. stackoverflow.com/a/21547386/3652863
Robert Pounder

참고로 그것은 내 자신의 것이지만 무엇이든간에.
Saurav Sood
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.