ফিক্সিং "লক অপেক্ষার সময়সীমা অতিক্রম করেছে; একটি 'আটকে "মাইএসকিএল টেবিলের জন্য লেনদেন পুনরায় চালু করার চেষ্টা করবেন?


131

একটি স্ক্রিপ্ট থেকে আমি আমার স্থানীয় ডাটাবেসে হাজার বার এর মতো একটি কোয়েরি পাঠিয়েছি:

update some_table set some_column = some_value

আমি যেখানে অংশটি যুক্ত করতে ভুলে গিয়েছি, তাই একই কলামটি টেবিলের সমস্ত সারিগুলির জন্য একই মান হিসাবে সেট করা হয়েছিল এবং এটি কয়েক হাজার বার করা হয়েছিল এবং কলামটি সূচিযুক্ত হয়েছিল, সুতরাং সংশ্লিষ্ট সূচকটি সম্ভবত অনেক বার আপডেট হয়েছিল updated ।

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

Lock wait timeout exceeded; try restarting transaction

এটি একটি ইনডোডব টেবিল, সুতরাং লেনদেন আটকে থাকা সম্ভবত জড়িত। আমি কীভাবে এই টেবিলটি ঠিক করতে পারি এবং এটি থেকে আটকে থাকা লেনদেনটি সরাতে পারি?


3
এর আউটপুট কি SHOW FULL PROCESSLIST?
ওল্ফ

এটি কেবলমাত্র সম্পূর্ণ প্রসেসলিস্ট কমান্ড দেখায়, অন্য কিছুই নয়। এটি একটি স্থানীয় বিকাশ ডাটাবেস। এতে কিছুই চলছে না। আমি সেখান থেকে সূচকটি নামানোর চেষ্টা করার সময় কমান্ড লাইনে 'লক ওয়েট ..' ত্রুটি বার্তা পেয়েছি।
টম

সেক্ষেত্রে আপনি সম্ভবত বিভিন্ন লেনদেনে 2 টি পৃথক সংযোগ তৈরি করছেন যা প্রত্যেকের জন্য অপেক্ষা করতে হবে।
ওল্ফ

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

উত্তর:


143

আমার অনুরূপ সমস্যা হয়েছিল এবং থ্রেডগুলি যা চলছে তা পরীক্ষা করে এটি সমাধান করেছি। চলমান থ্রেডগুলি দেখতে mysql কমান্ড লাইন ইন্টারফেসে নিম্নলিখিত কমান্ডটি ব্যবহার করুন:

SHOW PROCESSLIST;

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

KILL 115;

এটি সংশ্লিষ্ট থ্রেডের জন্য সংযোগটি শেষ করবে।


36
নোট নাও! এই সমস্যাটি সম্পর্কে বহু এসও থ্রেডগুলির মধ্যে একটির দ্বারা এটি কারও দ্বারা উল্লেখ করা হয়েছিল: কখনও কখনও টেবিলটি লক করে রাখা প্রক্রিয়াটি প্রসেসলিস্টে ঘুমন্ত হিসাবে প্রদর্শিত হয়! আমি জিজ্ঞাসা করে ঘুমিয়ে থাকি কি না, ডাটাবেসে খোলা সমস্ত থ্রেড না মেরে আমি আমার চুল ছিঁড়ে ফেলছিলাম। এটি অবশেষে টেবিলটি আনলক করে এবং আপডেট কোয়েরিটি চালাতে দেয়। মন্তব্যকারী এমন কিছু উল্লেখ করেছে যেমন "" কখনও কখনও একটি মাইএসকিউএল থ্রেড একটি টেবিলটি লক করে, তারপরে ঘুমিয়ে থাকে যখন এটি মাইএসকিউএল-সম্পর্কিত কিছু হওয়ার জন্য অপেক্ষা করে। "
এরিক এল।

(আমি এই সম্পর্কিত চিন্তাভাবনা সম্পর্কে এখানে আমার নিজের উত্তর যুক্ত করেছি , সম্পর্কিত প্রশ্নে)
এরিক এল

এটি আমাকে সাহায্য করেছিল। আমার পিএইচপিএসটারম ডাটাবেস পরিচালনা / ক্যোয়ারী বৈশিষ্ট্য দ্বারা নির্মিত বেশ কয়েকটি ঘুমের থ্রেড ছিল ।
এজাজ

গ্রেট! আমার 5 ঘন্টা থেকে একটি গোপন প্রক্রিয়া ছিল যা আমি সনাক্ত করতে এবং হত্যা করতে পারি।
অ্যালডো প্যারাডিসো

2
এটি একটি সংক্রামিত ক্ষতটির উপরে নালী টেপ করা ছাড়া আর কোনও সমাধান নয়। আপনি অন্তর্নিহিত মূল সমস্যাটি সম্বোধন করছেন না।
ব্যবহারকারী 2914191

55

আপনি বর্তমানে চলমান লেনদেনগুলির সাথে পরীক্ষা করতে পারেন

SELECT * FROM `information_schema`.`innodb_trx` ORDER BY `trx_started`

আপনার লেনদেন প্রথমটির মধ্যে একটি হওয়া উচিত, কারণ এটি তালিকার প্রাচীনতম। এখন শুধু এর থেকে মানটি নিয়ে কমান্ডটি trx_mysql_thread_idপ্রেরণ করুন KILL:

KILL 1234;

আপনি যদি নিশ্চিত হন না যে কোন লেনদেন আপনার, আপনার প্রথম ক্যোয়ারীটি প্রায়শই পুনরাবৃত্তি করুন এবং দেখুন কোন লেনদেন অব্যাহত রয়েছে।


কোন লেনদেনটি অন্যকে টেবিল অ্যাক্সেস করা থেকে প্রকৃতপক্ষে অবরুদ্ধ করছে তা দেখতে আপনাকে এই এসকিউএল চালাতে রুট অ্যাকাউন্টটি ব্যবহার করতে হতে পারে
tom10271

40

লকগুলির জন্য InnoDB স্থিতি পরীক্ষা করুন

SHOW ENGINE InnoDB STATUS;

মাইএসকিউএল খোলা সারণী পরীক্ষা করুন Check

SHOW OPEN TABLES WHERE In_use > 0;

মুলতুবি InnoDB লেনদেন পরীক্ষা করুন

SELECT * FROM `information_schema`.`innodb_trx` ORDER BY `trx_started`; 

লক নির্ভরতা পরীক্ষা করুন - কোনটি ব্লক করে

SELECT * FROM `information_schema`.`innodb_locks`;

উপরের ফলাফলগুলি তদন্ত করার পরে, আপনাকে কী লক করছে তা দেখতে সক্ষম হওয়া উচিত।

ইস্যুটির মূল কারণটিও আপনার কোডে থাকতে পারে - দয়া করে সম্পর্কিত ফাংশনগুলি বিশেষত টীকাগুলির জন্য পরীক্ষা করুন যদি আপনি হাইবারনেটের মতো জেপিএ ব্যবহার করেন।

উদাহরণস্বরূপ, এখানে বর্ণিত হিসাবে , নিম্নলিখিত টীকাগুলির অপব্যবহারের ফলে ডাটাবেসে লক হতে পারে:

@Transactional(propagation = Propagation.REQUIRES_NEW) 

4
তোমাকে অনেক ধন্যবাদ! দৌড়ে SELECT * FROM information_schema.innodb_trx t JOIN information_schema.processlist p ON t.trx_mysql_thread_id = p.idদোষী ব্যক্তির উদ্ঘাটিত হয়েছিল: লকিংয়ের থ্রেডটি আমার আইপি ঠিকানায় এসেছিল ... আমি লেনদেনের মাঝখানে ফেলে রেখেছি এমন একটি ডিবাগ কনসোলটি বন্ধ করতে ভুলে গিয়েছিলাম ...
এলিয়াস স্ট্রহলে

40

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

সত্যটি সম্ভবত আপনার প্রশ্ন বা আপনার ডিবি হয় তবে অনুকূলকরণের কিছু উপায় আছে তবে ঠিক সমাধানের জন্য এই 2 টি প্রশ্নের চেষ্টা করুন।

এটি চালান:

SET GLOBAL innodb_lock_wait_timeout = 5000; 

এবং তারপরে এটি:

SET innodb_lock_wait_timeout = 5000; 

2
রেফারেন্সের লিঙ্ক: ইনোডাব_লোক_উইট_টাইমআউট
কালিক্স

1
আমি খুব ব্যস্ত 11 জিবি ডাটাবেস চালাচ্ছি। এটিই আমার পক্ষে কাজ করেছে, ধন্যবাদ!
dongemus

আপনি যদি চিরতরে সেখানে রাখতে না চান তবে মানটিকে পূর্বের মানগুলিতে পরিবর্তন করতে কেবল মনে রাখবেন।
রিকার্ডো মার্টিনস

এর অর্থ এই যে আমার কিছু ব্যবহারকারীর আরও ধীর অভিজ্ঞতা হবে?
আর্নল্ড রোয়া

9

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

সমাধান: লকটি ছেড়ে দেওয়ার জন্য সংযোগটি বন্ধ করুন বা setAutoCommit(true)(আপনার নকশা অনুসারে)।


7

মাইএসকিউএল পুনরায় চালু করুন, এটি দুর্দান্ত কাজ করে।

কিন্তু হুঁশিয়ার যদি এই ধরনের একটি ক্যোয়ারী আটকে, একটা সমস্যা আছে কোথাও যে:

  • আপনার ক্যোয়ারিতে (ভুল জায়গায় স্থান দেওয়া, কার্তেসিয়ান পণ্য, ...)
  • সম্পাদনা করার জন্য খুব রেকর্ড
  • জটিল যোগদান বা পরীক্ষা (MD5, সাবস্ট্রিংস LIKE %...%, ইত্যাদি)
  • তথ্য কাঠামো সমস্যা
  • বিদেশী কী মডেল (চেইন / লুপ লকিং)
  • ভুল তথ্যযুক্ত তথ্য data

@ সাইয়েদরাকিব যেমন বলেছিলেন, এটি কাজ করে তবে এটি উত্পাদন জন্য দীর্ঘস্থায়ী সমাধান নয়।

সাবধানতা: পুনঃসূচনাটি আপনার ডেটাটিকে বেমানান স্থিতির সাথে প্রভাবিত করতে পারে।

এছাড়াও, আপনি মাইএসকিউএল কীভাবে এক্সপ্ল্লেইন কীওয়ার্ডটি দিয়ে আপনার ক্যোয়ারী পরিচালনা করেন তা পরীক্ষা করতে পারেন এবং জিজ্ঞাসাটি (ইনডেক্স, জটিল পরীক্ষা, ...) দ্রুততর করতে সেখানে কিছু সম্ভব কিনা তা দেখতে পারেন।


ধন্যবাদ. আপনি আমার সমস্যাটি সরাসরি সমাধান করেননি তবে আমি টেবিলের লক থেকে ভুগছি এবং এটি খুব খারাপ। পুরো ইন্টারনেট এটিই একমাত্র পোস্ট ওব, যা আমাকে বিদেশী কীগুলি পরীক্ষা করার ধারণার দিকে নিয়ে যায়। সুতরাং আমি জানতে পারি যে প্রাথমিক কীটির কীটি 11 এবং বিদেশী কীগুলি 10 ছিল I আমি জানি না কীভাবে এটি ঘটতে পারে এবং কেন সবকিছু আগে কাজ করেছিল।
এসেসনেটস্কেপ

@ ইস্পাত নেটস্কেপ আপনাকে স্বাগতম, আমি খুশি এই ছোট্ট উত্তর আপনাকে সাহায্য করেছে :)
বেঞ্জ

3

মাইএসকিএল-এ যাওয়ার প্রক্রিয়া।

সুতরাং এখনও কাজ কাজ দেখতে পারেন।

নির্দিষ্ট প্রক্রিয়াটি মেরে ফেলুন বা প্রক্রিয়াটি সম্পূর্ণ হওয়া পর্যন্ত অপেক্ষা করুন।


7
এটি সমস্যার সমাধান করে। তবে এটি কোনও লাইভ প্রোডাকশন সার্ভারের সমাধান হতে পারে না ...... কীভাবে আমরা এই অচল হ্যান্ডলিংটিকে আউটপুট দিতে পারি? বা কীভাবে আমরা এই অচলাবস্থা থেকে বাঁচতে পারি?
রকিব

1
ভাল, এটি এমনটি ঘটে যে এমনকি সম্পূর্ণরূপে সু-গঠনযুক্ত এবং যথাযথভাবে মাইএসকিএল অনুসন্ধানগুলি পালিয়ে যায় যা এমনকি বিকাশকারী দ্বারা রচিত হয় না তবে ফ্রেমওয়ার্কের সক্রিয়-রেকর্ড ইন্টারফেস দ্বারা লক অপেক্ষার সময়সীমা শেষ হতে পারে issues সুতরাং আমি সঠিক মাইএসকিএল কোয়েরি লিখছি না এখানে একটি ফ্যাক্টর।
রকিব

1

আমি "আপডেট"-স্টেটমেন্ট নিয়ে একই সমস্যায় পড়েছি। আমার সমাধানটি ছিল কেবল টেবিলের জন্য phpMyAdmin- এ উপলব্ধ অপারেশনগুলির মাধ্যমে চালানো। আমি টেবিলটি অপ্টিমাইজড, ফ্লাশ এবং ডিফ্র্যাগমেন্ট করেছি (সেই ক্রমে নয়)। আমার জন্য টেবিলটি ফেলে দেওয়া এবং এটি ব্যাকআপ থেকে পুনরুদ্ধার করার দরকার নেই। :)


1
এটি সমস্যার সমাধান করতে পারে। তবে প্রতিবার যখন এ জাতীয় ত্রুটি ঘটে তখন এটি করা কোনও লাইভ প্রোডাকশন সার্ভারের সমাধান হতে পারে না ...... কীভাবে আমরা এই অচল হ্যান্ডলিংটিকে আউটপুট দিতে পারি? বা কীভাবে আমরা এই অচলাবস্থা থেকে বাঁচতে পারি?
রকিব

1

আমারো একই ইস্যু ছিল. আমি মনে করি এটি এসকিউএল নিয়ে একটি অচলাবস্থা ছিল। আপনি কেবল টাস্ক ম্যানেজার থেকে এসকিউএল প্রক্রিয়া বন্ধ করতে বাধ্য করতে পারেন। যদি এটি ঠিক করে না, কেবল আপনার কম্পিউটার পুনরায় চালু করুন। আপনার টেবিলটি ফেলে দেওয়ার এবং ডেটা পুনরায় লোড করার দরকার নেই।


এটি সমস্যার সমাধান করে। তবে এটি কোনও লাইভ প্রোডাকশন সার্ভারের সমাধান হতে পারে না ...... কীভাবে আমরা এই অচল হ্যান্ডলিংটিকে আউটপুট দিতে পারি? বা কীভাবে আমরা এই অচলাবস্থা থেকে বাঁচতে পারি?
রকিব

অ্যাপাচি এবং এর পরিষেবাগুলি (বা কমপক্ষে মাইএসকিউএল) পুনরায়
চালু করুন,

1

একটি নির্দিষ্ট গ্রুপের রেকর্ডগুলি মুছে ফেলার চেষ্টা করার সময় আমার এই সমস্যা হয়েছিল (ওয়েব সার্ভারে মাইএসকিউএল-তে একটি ওডিবিসি সংযোগ সহ এমএস অ্যাক্সেস 2007 ব্যবহার করে)। সাধারণত আমি মাইএসকিউএল থেকে নির্দিষ্ট রেকর্ডগুলি মুছে ফেলব তারপরে আপডেট হওয়া রেকর্ডগুলির সাথে প্রতিস্থাপন করব (ক্যাসকেড একাধিক সম্পর্কিত রেকর্ড মুছুন, এটি একটি একক রেকর্ড মোছার জন্য সম্পর্কিত সম্পর্কিত সমস্ত রেকর্ড মুছে ফেলবে)।

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

ওয়েবে সিপ্যানেল মাইএসকিউএল অ্যাক্সেসে রেকর্ডের এই গোষ্ঠীর জন্য আমি মুছে ফেলা কোয়েরি চালানোর চেষ্টা করেছি। একই ত্রুটি বার্তা পেয়েছি।

আমার সমাধান: আমি সান এর (ওরাকল এর) নিখরচায় মাইএসকিউএল ক্যোয়ারী ব্রাউজার ব্যবহার করেছি (যা আমি আগে আমার কম্পিউটারে ইনস্টল করেছি) এবং সেখানে মুছে ফেলা ক্যোয়ারী চালিয়েছি। এটি এখনই কাজ করেছে, সমস্যা সমাধান হয়েছে। আমি তখন আবার MySQL সংযোগে ODBC অ্যাক্সেস ব্যবহার করে অ্যাক্সেস স্ক্রিপ্টটি ব্যবহার করে ফাংশনটি সম্পাদন করতে সক্ষম হয়েছি।


-2

ঠিক কর.

নিশ্চিত করুন যে আপনার কাছে কোয়েরিতে কোনও মিল নেই ডেটা টাইপ inোকানো। আমার একটি সমস্যা ছিল যেখানে আমি "ব্যবহারকারী ব্রাউজার এজেন্ট ডেটা" চেষ্টা করে যাচ্ছিলাম VARCHAR(255)এবং এই লকটি নিয়ে সমস্যা থাকলেও আমি যখন এটিকে পরিবর্তন করেছি তখন TEXT(255)এটি ঠিক হয়ে গেছে।

সুতরাং সম্ভবত এটি ডেটা টাইপের একটি মিল নয়।


-151

আমি টেবিলটি ফেলে রেখে এবং ব্যাকআপ থেকে পুনরুদ্ধার করে সমস্যার সমাধান করেছি।


20
ঘটনাচক্রে, এই উত্তরটি এসও-এর সর্বকালের সর্বনিম্ন সর্বনিম্ন-স্কোর "গৃহীত" উত্তর হওয়ার গৌরব অর্জন করে ! 🏆
ashleedawg

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