मैं मैसकॉल "शो प्रक्रिया सूची" में सभी प्रक्रियाओं को कैसे मार सकता हूं?


121

क्योंकि मुझे वहां बहुत सारी प्रक्रियाएं दिखाई देती हैं, और "समय" कॉलम उन सभी के लिए बड़े मूल्य दिखाता है।


आप mysqld को भी पुनः आरंभ कर सकते हैं, जैसेsudo service mysqld restart
फिल्पेरो

जवाबों:


108

आपको उन्हें एक-एक करके मारने की जरूरत है, MySQL के पास कोई बड़े पैमाने पर मारने की कमान नहीं है। आप इसे किसी भी भाषा में लिख सकते हैं, उदाहरण के लिए 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 एक क्रोन पर एक शेल स्क्रिप्ट में परिवर्तित करने का प्रयास करें ...!
एम। फराज

4
शैलfor i in {994..1145}; do mysql -uroot -p123456 -e "kill $i" ; done
ज़ुगूवेई

mysql -u -p -e "शो प्रक्रिया सूची;" | grep नींद | awk '{प्रिंट $ 1}' | पढ़ते समय LINE; mysql -u -p -e "किल $ लाइन"; किया
user3770797

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/…
Artem Goutsoul

2
@ArtemGoutsoul लेकिन मुझे याद नहीं कि मैंने इस साइट का संदर्भ दिया था। ऐसा करने का मेरा अपना चलन है।
एंजेलिन नादर

@JanusTroelsen लेकिन मेरा उत्तर 3 वर्ष 12 के बाद है
एंजेलिन नादर

1
@Angelin नादर आपको धन्यवाद!
सिल्वर लाइट

1
@ शंकरदामोदरन स्योर
नादर

16

मैंने यह भी खोज लिया है कि कैसे MySQL के माध्यम से कमांड को कम किया जाए और प्रोसीलिस्ट को कम करें और शेल में एक-लाइनर के साथ समाप्त हो:

mysqladmin processlist -u <USERNAME> -p<PASSWORD> | \
awk '$2 ~ /^[0-9]/ {print "KILL "$2";"}' | \
mysql -u <USERNAME> -p<PASSWORD>
  • mysqladmin processlist थ्रेड आईडी के साथ एक टेबल प्रिंट करेगा;
  • awk दूसरे कॉलम से केवल संख्याओं (थ्रेड आईडी) को पार्स करेगा और MySQL KILL कमांड उत्पन्न करेगा;
  • और अंत में mysql को अंतिम कॉल पारित आदेशों को निष्पादित करेगा।

आप किसी विशेष डेटाबेस नाम को फ़िल्टर करने के लिए awk कमांड से पहले grep चला सकते हैं ।


13

या ... शेल में ...

service mysql restart

हाँ, मुझे पता है, मैं आलसी हूँ, लेकिन यह भी आसान हो सकता है।


10
यह एक बहुत बुरा विचार है ... विशेष रूप से यदि आपके पास मेमोरी पर टेबल इंजन सेट है, तो सभी डेटा खो जाएगा ... या यदि आप innodb इंजन प्रकार का उपयोग करते हैं, तो यह पुनः आरंभ होने पर सभी अनुक्रमों को फिर से करेगा
HellBaby

8
इसके अलावा यह सभी प्रक्रियाओं पर सभी प्रक्रियाओं को मारता है
डिएगो आंद्रेस डिज़ एस्पिनोज़ा

10

यह सरल नहीं है तो यह, बस mysql प्रॉम्प्ट में इसे निष्पादित करें।

kill USER username;

यह उपलब्ध उपयोगकर्ता नाम के तहत सभी प्रक्रिया को मार देगा। क्योंकि अधिकांश लोग सभी उद्देश्य के लिए एक ही उपयोगकर्ता का उपयोग करते हैं, यह काम करता है!

मैंने इस पर परीक्षण किया है कि मारबडी ने mysql के बारे में सुनिश्चित नहीं किया है।


3
MySQL के किस संस्करण में यह मौजूद है? मैं इसे MySQL 5.7 संदर्भ में प्रलेखित नहीं देखता ; इसका कोई सबूत नहीं है कि उपयोगकर्ता द्वारा मारना संभव है KILL [CONNECTION | QUERY] processlist_id:। मैंने MySQL 5.6.34 में आपकी क्वेरी की कोशिश की और इसे सिंटैक्स त्रुटि माना जाता है।
बिर्चलैब्स

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 संभवतः आपका उत्तर केवल मारबीडीबी के लिए एक विशेषता है।
बिर्चलैब्स

यह Mysql के लिए काम नहीं करता है। कृपया अन्य DB प्रणालियों से संबंधित सलाह पोस्ट करने से पहले पढ़ें ...
RyanH

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 ;

इसे SELECTपहले और बाद की प्रक्रियाओं को दिखाने के लिए s के साथ चलाया जा सकता है:

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

यदि आपके पास info_schema नहीं है:

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

4

व्यवस्थापक के रूप में मैसकल में प्रवेश करें:

 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
यह सवाल का जवाब नहीं है। यहां आप एक ही प्रक्रिया को मार रहे हैं, जबकि सवाल यह है कि आप एक ही बार में प्रक्रिया को कैसे मार सकते हैं।
हिस्त्रो पेटेव

@ badbod99 मैं यहाँ एक mysql प्रक्रिया को मारने के तरीके की तलाश में समाप्त हो गया हूँ और इस जवाब ने मुझे मदद की इसलिए मैंने इसे अपडाउन किया।
बोगदान

3

इस स्निप ने मेरे (MySQL सर्वर 5.5) सभी MySQL प्रक्रियाओं को मारने के लिए काम किया:

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

3

मैं बैश और 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
सुनो। यकीन नहीं होता कि आप एक बॉट, कम्युनिटी या इंसान हैं, लेकिन वैसे भी, यह बहुत अच्छा होगा अगर आप कुछ शब्दों को यह बताते हुए जोड़ दें कि कोड की इस लाइन के साथ क्या हो रहा है और यह कैसे मुद्दे को हल करता है?
फेलिक्स गगनोन-ग्रेनियर

1
जोड़ा गया -u और -p उपयोगकर्ता तक पहुँच प्रदान करने के लिए ... काम ठीक है!
लॉर्ड सेंट जॉन

2

हम इसे MySQL कार्यक्षेत्र द्वारा कर सकते हैं। बस इसे निष्पादित करें:

kill id;

उदाहरण:

kill 13412

वह इसे हटा देगा।


यह बेहतर उत्तर लगता है क्योंकि ऊपर उल्लिखित भाषा नहीं थी।
देशदीप सिंह

0

Mysql सर्वर को पुनरारंभ करने का एक आसान तरीका होगा .. विंडोज़ रन में "Services.msc" खोलें, सूची से Mysql चुनें। सेवा को राइट क्लिक करें और बंद करें। तब फिर से शुरू करें और एक को छोड़कर सभी प्रक्रियाओं को मार दिया गया होगा (डिफ़ॉल्ट आरक्षित कनेक्शन)



0

कभी-कभी मेरे पास कुछ लाश mysql प्रक्रियाएं होती हैं जिन्हें मारा नहीं जा सकता (MAMP प्रो का उपयोग करके)।

पहले सभी mysql प्रक्रियाओं की एक सूची प्राप्त करें:

ps -ax | grep mysql

अगला उनमें से हर एक को मारें (पिछले कमांड रिजल्ट में पहले कॉलम के साथ प्रॉसेस को बदलें):

kill -9 processId

0

निम्नलिखित ने मेरे लिए बहुत अच्छा काम किया:

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

0

मैंने flush tablesसभी निष्क्रिय कनेक्शनों को मारने के लिए कमांड का उपयोग किया जहां वास्तव में बड़े पैमाने पर समस्या थी।


1
काम नहीं करता। तालिकाओं को फ्लश करें, लेकिन नींद के कोनों को सक्रिय बनाए रखें
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

यदि आप लार्वा का उपयोग कर रहे हैं तो यह आपके लिए है:

$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 जानकारी_सेकान.प्रोसेसलिस्ट से जहां उपयोगकर्ता = 'उपयोगकर्ता नाम' आउटफिट '/tmp/a.txt' में कंसर्ट ('KILL', id, ';') का चयन करें;

क्वेरी 2 स्रोत a.txt

यह आपको विशिष्ट उपयोगकर्ता द्वारा शो प्रक्रिया सूची में सभी प्रश्नों को मारने में सक्षम करेगा।


मैं उखड़ गया, तब आपको महसूस हुआ कि आपने केवल नीचे दिए गए उत्तर को कॉपी किया है; stackoverflow.com/a/21547386/3652863
रॉबर्ट पाउंडर

FYI करें यह मेरे अपने का था, लेकिन जो भी हो।
सौरव सूद
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.