উত্তর:
আপনাকে একে একে হত্যা করতে হবে, মাইএসকিউএল-তে কোনও বিশাল কিল কমান্ড নেই। আপনি এটি যে কোনও ভাষায় স্ক্রিপ্ট করতে পারেন, উদাহরণস্বরূপ পিএইচপিতে আপনি এমন কিছু ব্যবহার করতে পারেন:
$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);
}
}
for i in {994..1145}; do mysql -uroot -p123456 -e "kill $i" ; done
গণহত্যা অভিযানের সময় সাশ্রয় হয়। এটি মাইএসকিউলে নিজেই করুন:
এই আদেশগুলি চালান
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")
আমি মাইএসকিউএল-এর মাধ্যমে পার্স কীভাবে প্রসেসলিস্ট কমান্ড কমান্ডটি অনুসন্ধান করেছি এবং একটি শেলটিতে ওয়ান-লাইনার দিয়ে শেষ করেছি:
mysqladmin processlist -u <USERNAME> -p<PASSWORD> | \
awk '$2 ~ /^[0-9]/ {print "KILL "$2";"}' | \
mysql -u <USERNAME> -p<PASSWORD>
আপনি চালাতে পারেন , grep আগে awk একটি নির্দিষ্ট ডেটাবেস নাম ফিল্টার করতে কমান্ড।
বা ... শেল ...
service mysql restart
হ্যাঁ, আমি জানি, আমি অলস, তবে এটি খুব সহজেই কার্যকর হতে পারে।
এটি এর পরে আর সহজ হয় না, কেবল এটি মাইএসকিএল প্রম্পটে চালায়।
kill USER username;
এটি প্রদত্ত ব্যবহারকারীর নাম অনুসারে সমস্ত প্রক্রিয়াটিকে হত্যা করবে। কারণ বেশিরভাগ মানুষ সমস্ত ব্যবহারকারীর জন্য একই ব্যবহার করে, এটি কাজ করে!
আমি এটি মারিয়াডিবিতে পরীক্ষা করেছি যে মাইএসকিএল সম্পর্কে নিশ্চিত নয়।
KILL [CONNECTION | QUERY] processlist_id। আমি আপনার প্রশ্নটি মাইএসকিউএল 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 সম্ভবত আপনার উত্তরটি কেবল মারিয়াডিবি-র নির্দিষ্ট বৈশিষ্ট্য।
নিম্নলিখিতটি বর্তমানে একটি সাধারণ সঞ্চিত পদ্ধতি তৈরি করবে যা বর্তমানে ব্যবহৃত প্রক্রিয়া ব্যতীত সমস্ত প্রক্রিয়া একে একে হত্যা করার জন্য একটি কার্সার ব্যবহার করে:
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;
আমার সম্প্রতি এটি করা দরকার ছিল এবং আমি এটি নিয়ে এসেছি
-- 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;
এইভাবে, আপনার একক কমান্ডের সাহায্যে সমস্ত ক্যোয়ারী ফাইল এবং চালানোর দরকার নেই।
সমস্ত নির্বাচন জিজ্ঞাসা হত্যা
select concat('KILL ',id,';')
from information_schema.processlist
where user='root'
and INFO like 'SELECT%' into outfile '/tmp/a.txt';
source /tmp/a.txt;
অ্যাডমিন হিসাবে মাইএসকিএল এ লগইন করুন:
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)
এই স্নিপড আমার (মাইএসকিউএল সার্ভার 5.5) এর জন্য সমস্ত মাইএসকিউএল প্রক্রিয়া মেরে ফেলেছে:
mysql -e "show full processlist;" -ss | awk '{print "KILL "$1";"}'| mysql
অপারেটিং সিস্টেমের উপর নির্ভর না করে আপনি কার্যকর করতে পারেন এমন একটি সমাধান এখানে:
পদক্ষেপ 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');
mysqladmin pr -u 'USERNAME' -p'PASSWORD' | awk '$2~/^[0-9]+/{print $2}' | xargs -i mysqladmin -u 'USERNAME' -p'PASSWORD' kill {}
আমরা এটি মাইএসকিউএল ওয়ার্কবেঞ্চ দ্বারা করতে পারি। কেবল এটি কার্যকর করুন:
kill id;
উদাহরণ:
kill 13412
এটি এটি সরিয়ে ফেলবে।
#! /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;
কখনও কখনও আমার কাছে কিছু জম্বি মাইএসকিএল প্রক্রিয়া থাকে যা হত্যা করা যায় না (এমএএমপি প্রো ব্যবহার করে)।
প্রথমে সমস্ত মাইএসকিএল প্রক্রিয়াগুলির একটি তালিকা পান:
ps -ax | grep mysql
এরপরে তাদের প্রত্যেককে হত্যা করুন (আগের কমান্ডের ফলাফলের প্রথম কলামের সাথে প্রক্রিয়া আইডি প্রতিস্থাপন করুন):
kill -9 processId
নিম্নলিখিতটি আমার পক্ষে দুর্দান্ত কাজ করেছে:
echo "show processlist" | mysql | grep -v ^Id | awk '{print $1}' | xargs -i echo "KILL {}; | mysql"
অজগর ভাষার জন্য, আপনি এটি এর মতো করতে পারেন
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()
আপনি যদি লারাভেল ব্যবহার করছেন তবে এটি আপনার জন্য:
$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 তথ্য_সেমিমা থেকে প্রোসেসলিস্ট থেকে 'কিল', আইডি, ';') নির্বাচন করুন যেখানে ব্যবহারকারী = 'ব্যবহারকারীর নাম' আউটফাইলে '/tmp/a.txt';
ক্যোয়ারী 2 উত্স a.txt
এটি আপনাকে নির্দিষ্ট ব্যবহারকারী দ্বারা প্রসেসলিস্টে থাকা সমস্ত ক্যোরিয়াকে হত্যা করতে সক্ষম করবে will
sudo service mysqld restart