तथ्य
आपने कहा आप उपयोग कर रहे हैं ext4
। फ़ाइल का आकार सीमा 16TB है। इस प्रकार, Sample.ibd
पूर्ण नहीं होना चाहिए।
तुमने कहा तुम्हारा innodb_data_file_path
है ibdata1:10M:autoextend
। इस प्रकार, ibdata1 फ़ाइल में OS के अलावा इसके आकार के लिए कोई टोपी नहीं है।
यह संदेश आखिर क्यों आ रहा है? ध्यान दें कि संदेश "तालिका ... पूर्ण है", "डिस्क ... पूर्ण नहीं है"। यह तालिका पूर्ण स्थिति तार्किक दृष्टिकोण से है । InnoDB के बारे में सोचो। क्या बातचीत चल रही है?
मेरा अनुमान है कि InnoDB एकल लेनदेन के रूप में 93GB डेटा लोड करने का प्रयास कर रहा है। Table is Full
संदेश कहां से निकलेगा? मैं ibdata1 को देखूंगा, न कि इसके भौतिक आकार (जो आपने पहले ही खारिज कर दिया था) के संदर्भ में, लेकिन लेन-देन की सीमा क्या हो रही है।
Ibdata1 के अंदर क्या है जब innodb_file_per_table सक्षम है और आप MySQL में नया डेटा लोड करते हैं?
मेरे संदेह मुझे बताते हैं कि पूर्ववत करें और / या फिर Redo Logs को दोष देना है।
ये लॉग क्या हैं? पुस्तक के अनुसार
अध्याय 10: "संग्रहण इंजन" पृष्ठ 203 अनुच्छेद 3,4 निम्नलिखित कहते हैं:
InnoDB इंजन दो तरह के लॉग रखता है: एक पूर्ववत लॉग और एक रेडो लॉग। एक पूर्व लॉग का उद्देश्य लेनदेन को वापस करना है, साथ ही लेनदेन के अलगाव स्तर में चल रहे प्रश्नों के लिए डेटा के पुराने संस्करणों को प्रदर्शित करना है। कोड जो पूर्ववत लॉग को हैंडल करता है, उसे स्टोरेज / इनोबेस / buf / log / log0log.c में पाया जा सकता है ।
Redo लॉग का उद्देश्य क्रैश रिकवरी में उपयोग की जाने वाली जानकारी को संग्रहीत करना है। यह पुनर्प्राप्ति प्रक्रिया को उन लेनदेन को फिर से निष्पादित करने की अनुमति देता है जो दुर्घटना से पहले पूरा हो सकता है या नहीं हो सकता है। उन लेनदेन को फिर से निष्पादित करने के बाद, डेटाबेस को एक सुसंगत स्थिति में लाया जाता है। रीडो लॉग के साथ काम करने वाले कोड को स्टोरेज / इनोसोबेस / लॉग / लॉग0recv.c में पाया जा सकता है ।
विश्लेषण
Ibdata1 के अंदर 1023 पूर्ववत लॉग हैं (रोलबैक सेगमेंट और पूर्ववत अंतरिक्ष देखें) । चूंकि पूर्ववत लॉग डेटा की प्रतियां रखते हैं, क्योंकि वे पुनः लोड होने से पहले दिखाई दिए थे, सभी 1023 पूर्ववत लॉग इसकी सीमा तक पहुंच गए हैं। एक अन्य दृष्टिकोण से, सभी 1023 पूर्ववत लॉग Sample
टेबल लोड करने वाले एक लेनदेन के लिए समर्पित हो सकते हैं ।
लेकिन रुकें...
आप शायद कह रहे हैं "मैं एक खाली Sample
टेबल लोड कर रहा हूं "। पूर्ववत लॉग कैसे शामिल हैं? इससे पहले कि Sample
तालिका 93GB डेटा के साथ भरी हुई थी, खाली थी। हर पंक्ति का प्रतिनिधित्व करना जो मौजूद नहीं था, उसे पूर्ववत लॉग में कुछ घर वापसी स्थान लेना चाहिए। 1023 अंडो लॉग भरने पर डेटा डालने की मात्रा को देखते हुए तुच्छ लगता है ibdata1
। मैं ऐसा करने वाला पहला व्यक्ति नहीं हूं:
MySQL 4.1 दस्तावेज़ से, ध्यान दें Posted by Chris Calender on September 4 2009 4:25pm
:
ध्यान दें कि 5.0 (पूर्व 5.0.85) और 5.1 (पूर्व 5.1.38) में, आप इनोबीडी टेबल के लिए "तालिका पूर्ण है" त्रुटि प्राप्त कर सकते हैं यदि इनोओडी पूर्ववत स्लॉट (बग # 18828) से बाहर निकलता है।
यहाँ MySQL 5.0 के लिए बग रिपोर्ट है: http://bugs.mysql.com/bug.php?id=18828
सुझाव
जब आप Sample
तालिका का mysqldump बनाते हैं , तो कृपया उपयोग नहीं करें-no-autocommit
mysqldump --no-autocommit ... mydb Sample > Sample.sql
यह COMMIT;
हर के बाद एक स्पष्ट रखा जाएगा INSERT
। फिर, तालिका को फिर से लोड करें।
यदि यह काम नहीं करता है ( आप इसे पसंद नहीं करने जा रहे हैं ), ऐसा करें
mysqldump --no-autocommit --skip-extended-insert ... mydb Sample > Sample.sql
इससे प्रत्येक INSERT में सिर्फ एक पंक्ति होगी। Mysqldump बहुत बड़ा (10+ गुना बड़ा) होगा और पुनः लोड होने में 10 से 100 गुना अधिक समय ले सकता है।
किसी भी स्थिति में, यह पूर्ववत किए गए लॉग को जलमग्न होने से बचाएगा।
कोशिश तो करो !!!
अद्यतन 2013-06-03 13:05 EDT
अतिरिक्त सहायता
यदि InnoDB सिस्टम टेबल (उर्फ ibdata1) एक फाइल की सीमा पर हमला करता है और पूर्ववत लॉग का उपयोग नहीं किया जा सकता है, तो आप सिर्फ एक और सिस्टम टेबलस्पेस (ibdata2) जोड़ सकते हैं।
मुझे अभी दो दिन पहले ही इस स्थिति का सामना करना पड़ा। मैंने अपने पुराने पोस्ट को अपडेट किया कि मैंने क्या किया है: डेटाबेस डिज़ाइन देखें - टेबल आकार पर सीमा के सिरदर्द से बचने के लिए कई डेटाबेस बनाना
संक्षेप में, आपको एक नई प्रणाली टेबलस्पेस फ़ाइल को समायोजित करने के लिए innodb_data_file_path को बदलना होगा । मुझे कैसे समझाएं:
SCENARIO
डिस्क पर (एक्स 3), मेरे क्लाइंट के सर्वर में निम्नलिखित थे:
[root@l*****]# ls -l ibd*
-rw-rw---- 1 s-em7-mysql s-em7-mysql 362807296 Jun 2 00:15 ibdata1
-rw-rw---- 1 s-em7-mysql s-em7-mysql 2196875759616 Jun 2 00:15 ibdata2
सेटिंग थी
innodb_data_file_path=ibdata1:346M;ibdata2:500M:autoextend:max:10240000M
ध्यान दें कि ibdata2
बढ़कर 2196875759616 हो गया है 2145386484M
।
मुझे ibdata2
innodb_data_file_path में फ़ाइलें जोड़ना और जोड़ना थाibdata3
innodb_data_file_path=ibdata1:346M;ibdata2:2196875759616;ibdata3:10M:autoextend
जब मैंने अपने आप को फिर से शुरू किया, तो यह काम किया:
[root@l*****]# ls -l ibd*
-rw-rw---- 1 s-em7-mysql s-em7-mysql 362807296 Jun 3 17:02 ibdata1
-rw-rw---- 1 s-em7-mysql s-em7-mysql 2196875759616 Jun 3 17:02 ibdata2
-rw-rw---- 1 s-em7-mysql s-em7-mysql 32315015168 Jun 3 17:02 ibdata3
40 घंटों में, ibdata3
31G तक बढ़ गया। MySQL एक बार फिर से काम कर रहा था।