আমি কীভাবে মাইএসকিএল লকগুলি দেখাতে পারি?


44

মাইএসকিএল ডাটাবেসে সক্রিয় থাকা সমস্ত লকগুলি কীভাবে দেখানোর জন্য আছে?


1
আপনি INNODB_LOCK_WAITS এবং INNODB_LOCKS সারণী জিজ্ঞাসা করতে পারেন।

উত্তর:


39

InnoDB টেবিল এবং ক্যাভ্যাটগুলির জন্য মার্কোর লিঙ্কটি দেখুন।

মাইআইএসএএম এর জন্য, এটি কোনও মৃত সহজ "এটি আপত্তিজনক ক্যোয়ারী" সমাধান নয়। আপনার সর্বদা একটি প্রক্রিয়া তালিকা দিয়ে শুরু করা উচিত। তবে পুরো কীওয়ার্ডটি অবশ্যই অন্তর্ভুক্ত করবেন তা নিশ্চিত করুন যাতে মুদ্রিত প্রশ্নগুলি কাটা না যায়:

SHOW FULL PROCESSLIST;

এটি আপনাকে সমস্ত বর্তমান প্রক্রিয়াগুলির তালিকা, তাদের এসকিউএল কোয়েরি এবং রাজ্যের তালিকা প্রদর্শন করবে। এখন সাধারণত যদি একটি একক জিজ্ঞাসা অন্য অনেককে লক করার কারণ হয়ে থাকে তবে এটি চিহ্নিত করা সহজ হওয়া উচিত। ক্ষতিগ্রস্থ অনুসন্ধানগুলির একটি স্থিতি থাকবে Lockedএবং আপত্তিজনক ক্যোয়ারী নিজে থেকেই বসে থাকবে, সম্ভবত অস্থায়ী টেবিলের মতো নিবিড় কিছু করার জন্য অপেক্ষা করছে।

যদি এটি সুস্পষ্ট না হয় তবে আপনাকে এসকিউএল ছাড়ের আপনার ক্ষমতাগুলি নির্ধারণ করতে হবে যে কোনও আপত্তিজনক এসকিউএল আপনার সমস্যাগুলির কারণ হতে পারে determine


20

আপনি যদি InnoDB ব্যবহার করেন এবং আমার প্রস্তাবিত চলমান অনুসন্ধানগুলি চেক করা দরকার need

show engine innodb status;

যেমন মার্কোর লিঙ্কে উল্লিখিত এটি আপনাকে লকিংয়ের ক্যোয়ারী দেবে, এটির দ্বারা কতগুলি সারি / সারণী লক করা আছে ইত্যাদি ট্রান্সএকশনের নীচে দেখুন।

ব্যবহারের SHOW PROCESSLISTক্ষেত্রে সমস্যাটি হ'ল অন্য প্রশ্নগুলি সারিবদ্ধ না হওয়া পর্যন্ত আপনি লকগুলি দেখতে পাবেন না।


20

চেষ্টা করুন SHOW OPEN TABLES:

show open tables where In_Use > 0 ;

আমি মনে করি অবিলম্বে ব্যবহারের তালাগুলি সনাক্ত করার সেরা উপায়টি বিশেষত যদি আপনার একাধিক ডাটাবেস এবং কয়েকশ সংযোগ থাকে।
নীলাও

7

এই কমান্ড ব্যবহার করে

SHOW PROCESSLIST

টেবিলগুলিতে লক অর্জন করেছে এমন প্রক্রিয়া সহ বর্তমানে চলমান সমস্ত প্রক্রিয়া প্রদর্শন করবে।


7

উত্তরের কোনওটিই বর্তমানে অনুষ্ঠিত সমস্ত লকটি প্রদর্শন করতে পারে না।

টার্মিনালে যেমন mysql এ এটি করুন।

start transaction;
update someTable set name="foobar" where ID=1234;
-- but no rollback or commit - just let it sit there

স্পষ্টত উপরে লেনদেন একটি লক ধরে, কারণ লেনদেন এখনও সক্রিয়। তবে এখনই কোনও জিজ্ঞাসা চলছে না এবং কেউ কোথাও লকটির জন্য অপেক্ষা করছে না (এখনও কমপক্ষে)।

INFORMATION_SCHEMA.INNODB_LOCKSখালি, যা ডকুমেন্টেশন প্রদত্ত বোঝায় , কারণ এখানে কেবলমাত্র একটি লেনদেন রয়েছে এবং বর্তমানে কেউই কোনও লকের জন্য অপেক্ষা করছে না waiting এছাড়াও INNODB_LOCKSযাইহোক হ্রাস করা হয়।

SHOW ENGINE INNODB STATUSঅকেজো: someTableমোটেই উল্লেখ করা হয় না

SHOW FULL PROCESSLIST খালি, কারণ অপরাধী আসলে এই মুহূর্তে কোনও অনুসন্ধান চালাচ্ছে না।

আমার অন্যান্য উত্তরে বর্ণিত রূপ হিসাবে অতীতে সক্রিয় লেনদেনগুলি কার্যকর করেছে এমন প্রশ্নগুলি আপনি ব্যবহার করতে পারেন এবং তা বের করতে পারেন INFORMATION_SCHEMA.INNODB_TRX, তবে উপরের দৃশ্যে লক আছে কিনা তা দেখার জন্য আমি কোনওভাবেই পৌঁছতে পারি নি ।performance_schema.events_statements_historyperformance_schema.threadssomeTable

এখনও পর্যন্ত অন্যান্য উত্তরের পরামর্শগুলি কমপক্ষে সহায়তা করবে না।

দাবি অস্বীকার: আমার ইনোটপ ইনস্টল নেই এবং আমি বিরক্তও করি নি। সম্ভবত যে কাজ করতে পারে


6

আফাইক এমআইএসকিউএল- তে এখনও কোনও নেটিভ উপায় নেই, তবে আমি ইনোটপ ব্যবহার করি । এটি নিখরচায় রয়েছে এবং প্রচুর পরিমাণে অন্যান্য কার্যকারিতাও রয়েছে।

আরো দেখুন এই লিঙ্কে innotop টুল ব্যবহার করে আরও তথ্যের জন্য।


4

রেফারেন্স এই পোস্ট থেকে নেওয়া।

আপনি নীচে স্ক্রিপ্ট ব্যবহার করতে পারেন:

SELECT 
    pl.id
    ,pl.user
    ,pl.state
    ,it.trx_id 
    ,it.trx_mysql_thread_id 
    ,it.trx_query AS query
    ,it.trx_id AS blocking_trx_id
    ,it.trx_mysql_thread_id AS blocking_thread
    ,it.trx_query AS blocking_query
FROM information_schema.processlist AS pl 
INNER JOIN information_schema.innodb_trx AS it
    ON pl.id = it.trx_mysql_thread_id
INNER JOIN information_schema.innodb_lock_waits AS ilw
    ON it.trx_id = ilw.requesting_trx_id 
        AND it.trx_id = ilw.blocking_trx_id
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.