আমি কীভাবে প্রতি ঘন্টা সন্নিবেশ করানোর জন্য মাইএসকিউএল ইনডোডব কনফিগার করতে পারি?


10

আমার একটি খুব বেশি ট্র্যাফিক ওয়েবসাইট রয়েছে যেখানে এটি সম্ভব যে প্রতি ঘন্টা প্রতি নতুন রেকর্ড .োকানো হয়।

এই একটি ত্রুটিটি সাইটটিকে পঙ্গু করে দিচ্ছে:

PDOException: SQLSTATE[40001]: Serialization failure: 1213 
Deadlock found when trying to get lock; 
try restarting transaction: INSERT INTO {location_instance} 
(nid, vid, uid, genid, lid) VALUES (:db_insert_placeholder_0, 
:db_insert_placeholder_1, :db_insert_placeholder_2, 
:db_insert_placeholder_3, :db_insert_placeholder_4); 
Array ( [:db_insert_placeholder_0] => 1059 [:db_insert_placeholder_1] => 
1059 [:db_insert_placeholder_2] => 0 [:db_insert_placeholder_3] => 
cck:field_item_location:1059 [:db_insert_placeholder_4] => 1000 )

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

স্ক্রিপ্টগুলি সহ একটি ডেভলপমেন্ট সার্ভারে আমার ওয়েবসাইট সেট আপ করার জন্য আমার ওয়েবসাইটের একটি অনুলিপি রয়েছে যা ওয়েবসাইটে লিখিত সামগ্রীর বোঝা অনুকরণ করে। আমি 16 গিগাবাইট র‌্যাম সহ উবুন্টু, এলএএমপি স্ট্যাক চালাচ্ছি।

স্বীকার করা, আমি ডাটাবেস সম্পর্কে খুব জ্ঞানী না। আসলে, আমি ডিফল্ট my.cnf দিয়ে শুরু করছি যা 'অ্যাপটি-ইনস্টল ইনস্টল' শেষ হওয়ার পরে এটির সাথে আসে। টেবিলগুলি সমস্ত ইনোডব। এই সমস্যাটি সমাধান করার জন্য আপনি কোন কনফিগারেশন সেটিংস এবং পদ্ধতির শুরু করার পরামর্শ দিচ্ছেন?

আপনার আরও কী তথ্য প্রয়োজন হতে পারে তা আমাকে জানান।

ধন্যবাদ


আপনি কি উত্পাদনের জন্য ডিফল্ট my.cnf দিয়ে শুরু করছেন? মানুষ, আপনি এটি আরও অনুকূলিতকরণ করতে হবে। আমার উত্তরে আপনাকে আরও বিশদ দেবে। :-)

উত্তর:


11

আপনি কোনও অচলাবস্থা নিয়ে কাজ করছেন, কোনও পারফরম্যান্স বাধা সমস্যা নয়।

আপনার যদি প্রতি ঘন্টা এক হাজার নতুন রেকর্ড থাকে তবে আপনি মাইএসকিউএল সীমাতে পৌঁছনো থেকে অনেক দূরে। মাইএসকিউএল আপনার লোড কমপক্ষে 50 বার পরিচালনা করতে পারে।

ডেডলকগুলি অ্যাপ্লিকেশন কোডের কারণে হয় এবং এটি ডাটাবেস সার্ভারের দোষ নয়। নির্দিষ্ট কিছু পরিস্থিতিতে বাদে মাইএসকিউএল সার্ভারের দিকে ডেডলকগুলি স্থির করা যায় না।

InnoDBSHOW ENGINE INNODB STATUSমাইএসকিউএল প্রম্পটে বা তার সাথে চালিয়ে আপনাকে বিশদ ডেডলক তথ্য প্রদর্শন করতে পারে mysql -uroot -p... -e "SHOW ENGINE INNODB STATUS"

তবে এটি কেবল শেষ অচলাবস্থা দেখায় যা ঘটেছিল, কোনও অচল লগ নেই।

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


জানা ভাল! আমি শো স্থিতিতে লক এবং সম্পর্কিত কোয়েরি এবং সারণী সম্পর্কিত তথ্য কমান্ডটিতে দেখতে পাচ্ছি। এটি আমার কোডে রয়েছে তা প্রদত্ত, আমি কীভাবে এই সমস্যাটি ডিবাগ করতে শুরু করতে স্থিতি কমান্ড থেকে এই তথ্যটি ব্যবহার করতে পারি? পিএইচপি পিডিও ক্যোয়ারী বেশ সোজা এগিয়ে - সংযোগ, প্রস্তুত, সম্পাদন, পুনরাবৃত্তি। আমি কোনও কোড বা স্থিতি বার্তা পোস্ট করতে পেরে খুশি হব যদি তা সাহায্য করে।
ব্যবহারকারী 658182

@ ব্যবহারকারী 658182 কীভাবে ডেডলকগুলি মোকাবেলা করতে হবে সে সম্পর্কে স্ট্যাকওভারফ্লোতে এই পোস্টটি দেখুন: লক পাওয়ার চেষ্টা করার সময়
ভালোর

1
@ সিনট্যাক্স সম্পাদনার জন্য ম্যাক্স-ওয়ারওয়ারন ধন্যবাদ, স্পষ্টত ইংরাজী এটি আমার স্থানীয় ভাষা নয় :-)।
বীরত্ব

1
-e "দেখান ইঞ্জিন InnoDB স্থিতি"
গ্লিফের

8

এটি আপনার কোডের একটি অংশের মতোই সহজ হতে পারে লেনদেন চালাচ্ছে:

insert into t1...
insert into t2...
commit;

যখন আপনার কোডের অন্য অংশটি একই টেবিলগুলিকে আলাদা ক্রমে সংশোধন করে:

delete from t2 where...
delete from t1 where...
commit;

যদি উভয় লেনদেন একই সময়ে চলতে থাকে তবে একটি রেসের শর্ত দেখা দিতে পারে: প্রথম লেনদেনটি সংশোধন করতে পারে না t2কারণ এটি দ্বিতীয় লেনদেনের দ্বারা লক হয়ে গেছে; দ্বিতীয় লেনদেন একইভাবে অবরুদ্ধ করা হয়েছে কারণ t1প্রথম লেনদেন দ্বারা লক করা আছে। মাইএসকিউএল "শিকার" হিসাবে একটি লেনদেন বেছে নেয় যেখানে ইনসার্ট / আপডেট / ডিলিট ব্যর্থ হয়। অ্যাপ্লিকেশনটিকে সেই ত্রুটিটি ধরতে হবে এবং বিবৃতিটি আবার চেষ্টা করতে হবে - সম্ভবত কোনও বিরতির পরে যাতে অন্য লেনদেন শেষ করার সময় হয়। ক্ষমতা সীমাবদ্ধতার সাথে কিছুই করার নেই, কেবল দুর্ভাগ্যজনক সময় যা কোডটি সাজানোর মাধ্যমে আরও বাড়িয়ে তোলা যেতে পারে। লেনদেন # 2, বা লেনদেনের INSERTs # 1 এ ডিলেটগুলি ঘুরে দেখুন এবং তারপরে কোনও বিরোধ নেই - প্রতিটি লেনদেনের প্রয়োজনীয় টেবিলগুলিতে অ্যাক্সেসের জন্য অপেক্ষা করবে।

মাইএসকিউএল 5.6 এ, আপনি মাইএসকিউএল ত্রুটি লগের মধ্যে সমস্ত ডেডলকগুলি (কেবলমাত্র সাম্প্রতিক এক নয়) সম্পর্কিত তথ্য সংগ্রহ করতে সক্ষম ইনডোডবি_প্রিন্ট_ল_এডলকস বিকল্পটি দিয়ে চালাতে পারেন ।

[বাধ্যবাধকতা অস্বীকার: আমি একজন ওরাকল কর্মচারী। উপরেরটি আমার ব্যক্তিগত দৃষ্টিভঙ্গি কোনও অফিশিয়াল বিবৃতি নয়]]

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