আমি কীভাবে মাইএসকিএল "শো প্রসেসলিস্টে" সমস্ত প্রক্রিয়া মেরে ফেলব?


120

কারণ আমি সেখানে প্রচুর প্রক্রিয়া দেখি এবং "সময়" কলামটি তাদের সকলের জন্য বড় মান দেখায়।


আপনি sudo service mysqld restart
মাইএসকিএলডি

উত্তর:


108

আপনাকে একে একে হত্যা করতে হবে, মাইএসকিউএল-তে কোনও বিশাল কিল কমান্ড নেই। আপনি এটি যে কোনও ভাষায় স্ক্রিপ্ট করতে পারেন, উদাহরণস্বরূপ পিএইচপিতে আপনি এমন কিছু ব্যবহার করতে পারেন:

$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);
  }
}

এটা একটা ভাল সিদ্ধান্ত. লেমমে এটিকে ক্রোনের শেল স্ক্রিপ্টে রূপান্তর করার চেষ্টা করুন ...!
এম ফারাজ

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

mysql -u -p -e "প্রসেসলিস্ট দেখান;" | গ্রেপ ঘুম | awk '{মুদ্রণ $ 1}' | লাইন পড়ার সময়; do mysql -u -p -e "মেরে ফেলুন $ লাইন"; সম্পন্ন
ব্যবহারকারীর 3770797

213

গণহত্যা অভিযানের সময় সাশ্রয় হয়। এটি মাইএসকিউলে নিজেই করুন:

এই আদেশগুলি চালান

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/…
আর্টেম গাউসসোল

2
@ আর্টেমগাউটসোল তবে আমি মনে করি না আমি এই সাইটে রেফার করেছি। এটি করার আমার নিজস্ব ট্রেন্ড।
অ্যাঞ্জলিন নাদার

@ জানুস ট্রলসন তবে আমার উত্তরটি 3 বছরের '12 এর পরে
অ্যাঞ্জেলিন নাদার

1
@ অ্যাঞ্জেলিন নাদার আপনাকে ধন্যবাদ!
সিলভার লাইট

1
@ শঙ্করদমোদরন সুর
অ্যাঞ্জলিন নাদার

16

আমি মাইএসকিউএল-এর মাধ্যমে পার্স কীভাবে প্রসেসলিস্ট কমান্ড কমান্ডটি অনুসন্ধান করেছি এবং একটি শেলটিতে ওয়ান-লাইনার দিয়ে শেষ করেছি:

mysqladmin processlist -u <USERNAME> -p<PASSWORD> | \
awk '$2 ~ /^[0-9]/ {print "KILL "$2";"}' | \
mysql -u <USERNAME> -p<PASSWORD>
  • mysqladmin প্রসেসলিস্ট থ্রেড আইডিসহ একটি টেবিল প্রিন্ট করবে;
  • awk কেবল দ্বিতীয় কলাম থেকে সংখ্যার (থ্রেড আইডি) বিশ্লেষণ করবে এবং মাইএসকিউএল কেআইএল কমান্ড উত্পন্ন করবে;
  • এবং পরিশেষে শেষ কল মাইএসকিউএল পাস কমান্ড চালানো হবে।

আপনি চালাতে পারেন , grep আগে awk একটি নির্দিষ্ট ডেটাবেস নাম ফিল্টার করতে কমান্ড।


13

বা ... শেল ...

service mysql restart

হ্যাঁ, আমি জানি, আমি অলস, তবে এটি খুব সহজেই কার্যকর হতে পারে।


10
এটি একটি খুব খারাপ ধারণা ... বিশেষত আপনার যদি মেমরিটিতে টেবিল ইঞ্জিন সেট থাকে তবে সমস্ত ডেটা নষ্ট হয়ে যায় ... বা আপনি যদি ইনডোডব ইঞ্জিন প্রকার ব্যবহার করেন তবে এটি পুনরায় আরম্ভের সমস্ত সূচি পুনরায় করবে
হেলব্যাবি

8
এছাড়াও এটি সমস্ত ডাটাবেসে সমস্ত প্রক্রিয়া মেরে
ফেলেছে

10

এটি এর পরে আর সহজ হয় না, কেবল এটি মাইএসকিএল প্রম্পটে চালায়।

kill USER username;

এটি প্রদত্ত ব্যবহারকারীর নাম অনুসারে সমস্ত প্রক্রিয়াটিকে হত্যা করবে। কারণ বেশিরভাগ মানুষ সমস্ত ব্যবহারকারীর জন্য একই ব্যবহার করে, এটি কাজ করে!

আমি এটি মারিয়াডিবিতে পরীক্ষা করেছি যে মাইএসকিএল সম্পর্কে নিশ্চিত নয়।


3
মাইএসকিউএলের কোন সংস্করণে এটি বিদ্যমান? আমি এটি মাইএসকিউএল 5.7 রেফারেন্সে নথিভুক্ত দেখতে পাচ্ছি না ; কোনো প্রমাণ এটি ব্যবহারকারী দ্বারা হত্যা করার সম্ভব আছে: KILL [CONNECTION | QUERY] processlist_id। আমি আপনার প্রশ্নটি মাইএসকিউএল 5.6.34 এ চেষ্টা করেছি এবং এটি একটি সিনট্যাক্স ত্রুটি হিসাবে বিবেচিত হয়েছে।
বার্চ্লাবস

4
আমি মাইএসকিউএল 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 সম্ভবত আপনার উত্তরটি কেবল মারিয়াডিবি-র নির্দিষ্ট বৈশিষ্ট্য।
বার্চ্লাবস

এটি মাইএসকিএল-এর জন্য কাজ করে না। অন্যান্য ডিবি সিস্টেমে সম্পর্কিত পরামর্শ পোস্ট করার আগে দয়া করে পড়ুন ...
রায়ানএইচ

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এর আগে এবং পরে প্রক্রিয়াগুলি দেখানোর জন্য এটি দিয়ে চালানো যেতে পারে :

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

আপনার যদি তথ্য_চেম না থাকে:

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 আমি এখানে এসে শেষ করেছিলাম কীভাবে একটি মাইএসকিএল প্রক্রিয়াটি মেরে ফেলা যায় এবং এই উত্তরটি আমাকে সহায়তা করেছিল তাই আমি এটির উন্নতি করেছি।
বোগদান

3

এই স্নিপড আমার (মাইএসকিউএল সার্ভার 5.5) এর জন্য সমস্ত মাইএসকিউএল প্রক্রিয়া মেরে ফেলেছে:

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

3

আমি বাশ এবং মাইএসকিএল একত্রিত করব:

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

আমরা এটি মাইএসকিউএল ওয়ার্কবেঞ্চ দ্বারা করতে পারি। কেবল এটি কার্যকর করুন:

kill id;

উদাহরণ:

kill 13412

এটি এটি সরিয়ে ফেলবে।


উপরে বর্ণিত ভাষা না থাকায় এটি উত্তম উত্তরটি শোনায়।
দেশদীপ সিং 8

0

মাইএসকিএল সার্ভারটি পুনরায় চালু করার একটি সহজ উপায় হবে .. উইন্ডোজ রানে "Services.msc" খুলুন, তালিকা থেকে মাইএসকিএল নির্বাচন করুন। রাইট ক্লিক করুন এবং পরিষেবাটি বন্ধ করুন। তারপরে আবার শুরু করুন এবং একটিকে বাদ দিয়ে সমস্ত প্রক্রিয়া হত্যা করা হত (ডিফল্ট সংরক্ষিত সংযোগ)



0

কখনও কখনও আমার কাছে কিছু জম্বি মাইএসকিএল প্রক্রিয়া থাকে যা হত্যা করা যায় না (এমএএমপি প্রো ব্যবহার করে)।

প্রথমে সমস্ত মাইএসকিএল প্রক্রিয়াগুলির একটি তালিকা পান:

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
কাজ না। টেবিলগুলি ফ্লাশ করুন তবে ঘুমের সহাবস্থানগুলি সক্রিয় রাখুন
গ্রিটিওনপ

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

ক্যোয়ারী 2 উত্স a.txt

এটি আপনাকে নির্দিষ্ট ব্যবহারকারী দ্বারা প্রসেসলিস্টে থাকা সমস্ত ক্যোরিয়াকে হত্যা করতে সক্ষম করবে will


আমি আপগ্রেটেড হয়েছি তখন বুঝতে পেরেছি আপনি কেবল রফএলের নীচে উত্তরটি অনুলিপি করেছেন; stackoverflow.com/a/21547386/3652863
রবার্ট পাউন্ডার

এফওয়াইআই এটি আমার নিজস্ব ছিল, তবে যাই হোক না কেন।
সৌরভ সূদ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.