IT

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

lottoking 2020. 7. 21. 07:39
반응형

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


거기에 많은 프로세스가 표시되고 "시간"열에는 모든 프로세스에 대한 큰 값이 표시됩니다.


하나씩 죽일 필요가 있습니다. 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);
  }
}

대량 살상 작업으로 시간이 절약됩니다. 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")

또한 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 을 실행 하여 특정 데이터베이스 이름을 필터링 할 수 있습니다 .


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

service mysql restart

네, 알아요, 게으르지 만 편리 할 수도 있습니다.


이보다 간단하게. mysql 프롬프트에서 실행하십시오.

kill USER username;

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

나는 mysql에 대해 확실하지 않은 MariaDB에서 테스트했다.


information_schema가없는 경우 :

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


다음은 커서를 사용하여 프로세스를 하나씩 종료하는 간단한 저장 프로 시저를 만듭니다.

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;

관리자로 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)

모든 선택 쿼리 종료

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

나는 최근에 제출해야합니다.

-- 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;

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


운영 체제에 의존하지 않고 말 수있는 솔루션은 다음과 가능합니다.

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');


이 절름발이 (MySQL 서버 5.5)는 모든 MySQL 프로세스를 죽였습니다.

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

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

MySQL Workbench로 할 수 있습니다. 그냥 실행하십시오 :

kill id;

예 :

kill 13412

그것을 제거합니다.


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

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


#! /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;

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

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

ps -ax | grep mysql

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

kill -9 processId

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

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

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


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

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()

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;네임 스페이스 뒤에 이것을 사용해야 합니다.


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

쿼리 2 소스 a.txt

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

참고 URL : https://stackoverflow.com/questions/1903838/how-do-i-kill-all-the-processes-in-mysql-show-processlist

반응형