`ERROR 1114 (HY000) तालिका ... पूर्ण है` innodb_file_per_table के साथ ऑटिऑनडेंड पर सेट करें


26

मेरे पास एक MySQL डेटाबेस है जो बड़ी मात्रा में डेटा (100-200GB - वैज्ञानिक माप का एक गुच्छा) रखता है। डेटा का विशाल बहुमत एक तालिका में संग्रहीत किया जाता है Sample। अब मैं डेटाबेस की एक गुलाम प्रतिकृति बना रहा हूं और मैं innodb_file_per_tableइस प्रक्रिया के दौरान लाभ लेना चाहता था । इसलिए मैंने innodb_file_per_tableअपने गुलाम कॉन्फ़िगरेशन में सेट किया और डेटाबेस के डंप को आयात किया। मेरे आश्चर्य के साथ, यह विफल रहा

ERROR 1114 (HY000) लाइन 5602 पर: तालिका 'नमूना' भरा हुआ है

फ़ाइल Sample.ibdवर्तमान में लगभग 93GB है, जिसमें विभाजन पर 600GB से अधिक मुक्त स्थान उपलब्ध है, इसलिए यह डिस्क मुक्त स्थान नहीं है। न तो यह किसी भी तरह की फ़ाइल-सिस्टम सीमा को मार रहा है (मैं ext4 का उपयोग कर रहा हूं)।

मैं किसी भी विचार के लिए आभारी हूँ कि क्या कारण हो सकता है, या क्या जांच हो सकती है।


अद्यतन: मैं उपयोग कर रहा हूँ mysql Ver 14.14 Distrib 5.1.66, for debian-linux-gnu (x86_64)

SELECT @@datadir; -- returns `/home/var/lib/mysql/`
SHOW VARIABLES LIKE '%innodb_data_file_path%'; -- ibdata1:10M:autoextend 

df -h /home/var/lib/mysql/
768G   31G  699G   5% /home

जवाबों:


33

तथ्य

आपने कहा आप उपयोग कर रहे हैं 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 को दोष देना है।

ये लॉग क्या हैं? पुस्तक के अनुसार

SxS

अध्याय 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

मुझे ibdata2innodb_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 घंटों में, ibdata331G तक बढ़ गया। MySQL एक बार फिर से काम कर रहा था।


मैं मालिक के नाम से अनुमान लगा रहा हूं कि आपका क्लाइंट एक अप और आने वाले मॉनिटरिंग टूल का उपयोग कर रहा था ... धन्यवाद, ऐसा लगता है कि मेरे लिए भी एक समस्या तय हो गई है।
स्टीव

मुझे आश्चर्य है कि अगर यह अभी भी एक मुद्दा है (आशा नहीं)
इवान कैरोल

3

मुझे भी यही समस्या थी और मैंने सिर्फ एक काम किया और यह काम कर गया।

आपको लगता है कि innodb_data_file_pathआपकी my.cnfकॉन्फ़िगरेशन फ़ाइल में आपके लिए बहुत कम अधिकतम आकार है । बस नीचे दिया गया कोड बदलें -

innodb_data_file_path = ibdata1:10M:autoextend:max:512M

महत्वपूर्ण नोट आप संयुक्त 512MBसभी InnoDBतालिकाओं में डेटा से अधिक की मेजबानी नहीं कर सकते ।

आप का उपयोग करके एक निर्दोष-प्रति-तालिका योजना पर भी स्विच कर सकते हैं innodb_file_per_table

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