मैं प्रति घंटे अधिकतम आवेषण को संभालने के लिए MySQL इनोडब को कैसे कॉन्फ़िगर कर सकता हूं?


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 )

मुझे बहुत आश्चर्य होगा अगर MySQL इस प्रकार के भार को संभाल नहीं सका। तो, मेरे सवाल तब हैं, क्या यह एक डेटाबेस समस्या है और मैं इस ट्रैफ़िक को संभालने में सक्षम होने के लिए MySQL को कैसे कॉन्फ़िगर कर सकता हूं?

मेरे पास मेरी वेबसाइट की एक कॉपी है जो एक विकास सर्वर पर स्क्रिप्ट के साथ सेट की गई है जो वेबसाइट पर जोड़ी जा रही सामग्री के भार का अनुकरण करती है। मैं 16GB RAM के साथ Ubuntu, LAMP स्टैक चला रहा हूं।

बेशक, मैं डेटाबेस के बारे में बहुत जानकार नहीं हूँ। वास्तव में, मैं डिफ़ॉल्ट my.cnf के साथ शुरू कर रहा हूं जो 'apt-get install' फिनिश के बाद इसके साथ आता है। टेबल्स सभी इनोडब हैं। कॉन्फ़िगरेशन सेटिंग्स और दृष्टिकोण को शुरू करने से आप इस समस्या को हल करने के लिए क्या सुझाव देंगे?

मुझे पता है कि आपको और क्या जानकारी चाहिए।

धन्यवाद


आप उत्पादन के लिए डिफ़ॉल्ट my.cnf के साथ शुरू कर रहे हैं? यार, तुम इसे और अधिक अनुकूलित करेंगे। मेरे उत्तर में आपको और विस्तार देगा। :-)

जवाबों:


11

आप एक गतिरोध के साथ काम कर रहे हैं, प्रदर्शन की अड़चन के मुद्दे पर नहीं।

यदि आपके पास प्रति घंटे एक हजार नए रिकॉर्ड हैं, तो आप MySQL सीमा तक पहुंचने से बहुत दूर हैं। MySQL आपके लोड को कम से कम 50 बार हैंडल कर सकता है।

डेडलॉक आवेदन कोड के कारण होता है और डेटाबेस सर्वर की गलती नहीं होती है। कुछ विशिष्ट स्थितियों को छोड़कर, MySQL सर्वर साइड पर डेडलॉक तय नहीं किए जा सकते हैं।

InnoDBSHOW ENGINE INNODB STATUSMySQL प्रॉम्प्ट पर, या साथ चलकर आप विस्तृत गतिरोध की जानकारी दिखा सकते हैं mysql -uroot -p... -e "SHOW ENGINE INNODB STATUS"

हालाँकि, यह केवल अंतिम गतिरोध को दिखाता है, कोई गतिरोध लॉग नहीं है।

शुक्र है, एक टूल pt-deadlock-logger है जो उस समस्या का ख्याल रखता है, यह पोलिंग InnoDBस्टेटस का ख्याल रखता है और नए डेडलॉक के साथ रिफ्रेश होने से पहले सभी विस्तृत डेडलॉक जानकारी बचाता है।


जानकार अच्छा लगा! मैं शो स्थिति में ताला और संबंधित क्वेरी और तालिका के बारे में जानकारी देखता हूं। यह देखते हुए कि यह मेरे कोड में है, मैं कैसे स्थिति को डीबग करने के लिए स्थिति कमांड से इस जानकारी का उपयोग कर सकता हूं? PHP पीडीओ क्वेरी बहुत सीधे आगे है - कनेक्ट करें, तैयार करें, निष्पादित करें, दोहराएं। यदि कोई मदद करता है तो मुझे कोई भी कोड या स्थिति संदेश पोस्ट करने में खुशी होगी।
user658182

@ user658182 गतिरोध पर इस पोस्ट की जाँच करें कि कैसे गतिरोध से निपटने के लिए: ताला
Valor

1
@ सिंटैक्स एडिट के लिए मैक्स-वर्न धन्यवाद, स्पष्ट रूप से अंग्रेजी यह मेरी मूल भाषा नहीं है :-)।
वेलोर

1
-IN "SHOW Engine INNODB STATUS"
ग्लिफ़

8

यह आपके कोड के एक भाग के रूप में सरल हो सकता है जो एक लेनदेन चल रहा है:

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

जबकि आपके कोड का एक अन्य हिस्सा एक अलग क्रम में एक ही टेबल को संशोधित करता है:

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

यदि वे दोनों लेन-देन एक ही समय में चलते हैं, तो एक दौड़ की स्थिति उत्पन्न हो सकती है: पहला लेन-देन संशोधित नहीं कर सकता t2क्योंकि यह दूसरे लेनदेन द्वारा लॉक किया जा रहा है; जबकि दूसरा लेन-देन इसी तरह अवरुद्ध है क्योंकि t1पहला लेनदेन बंद है। MySQL एक लेनदेन को "शिकार" होने के लिए चुनता है जहाँ INSERT / UPDATE / DELETE विफल रहता है। आवेदन को उस त्रुटि को पकड़ने की जरूरत है, और बयान को फिर से लेना है - शायद एक ठहराव के बाद इसलिए अन्य लेनदेन को समाप्त करने का समय है। क्षमता सीमा के साथ कुछ नहीं करना है, बस दुर्भाग्यपूर्ण समय जो कोड की व्यवस्था करने के तरीके से समाप्त हो सकता है। # 2 लेन-देन में DELETE के चारों ओर स्विच करें, या # 1 लेनदेन में INSERTs, और फिर कोई संघर्ष नहीं है - प्रत्येक लेनदेन को उस तालिका (तालिका) तक पहुंच की प्रतीक्षा करनी होगी, जिसकी उसे जरूरत है।

MySQL 5.6 में, आप innSQLb_print_all_deadlocks विकल्प के साथ चला सकते हैं जो MySQL त्रुटि लॉग में सभी गतिरोधों के बारे में जानकारी एकत्र करने में सक्षम है (न कि सबसे हाल ही में एक)।

[अप्रचलित अस्वीकरण: मैं एक ओरेकल कर्मचारी हूं। उपरोक्त मेरा व्यक्तिगत विचार है, आधिकारिक बयान नहीं।]

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.