InnoDB तालिका त्रुटि बनाएँ: "पंक्ति आकार बहुत बड़ा"


11

हमारे पास कुछ इंजीनियर हैं जो रिपोर्ट बनाने के उद्देश्यों के लिए एक सामान्य तालिका संरचना को एक अस्थायी तालिका में समतल करते हैं। कॉलम के रूप में निर्दिष्ट किया गया है TEXT NOT NULL(मुझे पता है "वे ऐसा क्यों कर रहे हैं?"; चलो मान लेते हैं कि हम इसे संबोधित कर रहे हैं)।

हम MySQL 5.1.48 कम्युनिटी RHEL5 का उपयोग लिनक्स पर InnoDB प्लग-इन 1.0.9 के साथ करते हैं।

MyISAM का उपयोग करते समय हमें कभी भी अधिकतम कॉलम या अधिकतम पंक्ति लंबाई की तालिका आकार सीमा का सामना नहीं करना पड़ा (जांच के दौरान हमने अधिकतम कॉलम सीमा 2598 (2599 वाँ त्रुटि 1117 का कारण बनता है) मारा है। InnoDB के साथ हम सीमाएँ मार रहे हैं। ये सीमाएँ इस सीमा के दौरान प्रकट हो रही हैं। तालिका (कोई डेटा प्रविष्टि नहीं):

ERROR 1118 (42000) पंक्ति 1 पर: पंक्ति आकार बहुत बड़ा। प्रयुक्त तालिका प्रकार के लिए अधिकतम पंक्ति आकार, BLOB की गिनती नहीं, 8126 है। आपको कुछ कॉलम TEXT / BLS में बदलना होगा

मैं निम्नलिखित के उत्तर की तलाश में हूं:

  1. बहुत सारे v / v / b / t कॉलम का उपयोग करते समय पंक्ति आकार की पैंक्रियालिटी के निर्धारण के लिए विस्तृत सूत्र क्या है? मैंने varchar(N)स्तंभों (जहाँ N 1 और 512 के बीच है), UTF8 charset (* 3) का उपयोग करते हुए कुछ अलग-अलग फॉर्मूले आज़माए हैं , और जब तक विफलता नहीं होगी, तब तक कई स्तंभों का उपयोग करेंगे। कंबोज में से कोई भी मैंने उन मूल्यों को देने की कोशिश की है जो वास्तविक परीक्षा परिणामों के साथ मेल खाते हैं।

  2. पंक्ति आकार की गणना करते समय मुझे क्या अन्य 'ओवरहेड' पर विचार करना चाहिए?

  3. जब मैं varchar (109) कॉलम से varchar (110) कॉलम के साथ टेबल बनाने से जाता हूं, तो त्रुटि संदेश 8126 से 65535 तक क्यों बदल जाता है?


मुझे भी यही समस्या थी। जब मैं एक डेटाबेस की जाँच कर रहा था तो मैंने पाया कि वेब ब्राउज़र में ऐड-ऑन में से एक HTML कोड को पेज सोर्स कोड (यहां तक ​​कि फॉर्म तक) में सम्मिलित कर रहा था और यह समस्या पैदा कर रहा था।

HTML खलनायक नहीं है। और न ही उस HTML का आकार। आपके पास एक से अधिक टेक्स्ट / varchar कॉलम होने चाहिए और कुछ सीमाएँ पूरी कर ली हैं, जिनके आसपास काम किया जा सकता है।
रिक जेम्स

जवाबों:


19

आपके प्रश्नों के उत्तर जटिल हैं, क्योंकि वे InnoDB फ़ाइल प्रारूप द्वारा भिन्न होते हैं । आज, दो प्रारूप हैं, जिन्हें एंटेलोप और बाराकुडा कहा जाता है।

केंद्रीय टेबलस्पेस फ़ाइल (ibdata1) हमेशा एंटेलोप प्रारूप में होती है। यदि आप फ़ाइल-प्रति-तालिका का उपयोग करते हैं, तो आप my.cnf में सेटिंग करके व्यक्तिगत फ़ाइलों को बाराकुडा प्रारूप का उपयोग कर सकते हैं innodb_file_format=Barracuda

मूल बिंदु:

  • InnoDB डेटा के एक 16KB पृष्ठ में डेटा की कम से कम दो पंक्तियाँ होनी चाहिए। साथ ही प्रत्येक पृष्ठ में एक हेडर और एक पाद लेख होता है जिसमें पृष्ठ चेकसम और लॉग अनुक्रम संख्या और इसी तरह होता है। यही कारण है कि आपको प्रति पंक्ति 8KB से थोड़ा कम की सीमा मिलती है।

  • निश्चित आकार के डेटा प्रकार जैसे INTEGER, DATE, FLOAT, CHAR को इस प्राथमिक डेटा पेज पर संग्रहीत किया जाता है और पंक्ति आकार सीमा की गणना की जाती है।

  • चर-आकार के डेटा प्रकार जैसे VARCHAR, TEXT, BLOB को ओवरफ़्लो पृष्ठों पर संग्रहीत किया जाता है, इसलिए वे पंक्ति आकार सीमा की पूरी तरह से गणना नहीं करते हैं। एंटेलोप में, ऐसे कॉलम के 768 बाइट्स को ओवरफ्लो पेज पर संग्रहीत किए जाने के अलावा प्राथमिक डेटा पेज पर संग्रहीत किया जाता है। बाराकुडा एक गतिशील पंक्ति प्रारूप का समर्थन करता है , इसलिए यह प्राथमिक डेटा पृष्ठ पर केवल 20-बाइट सूचक को संग्रहीत कर सकता है।

  • चर-आकार के डेटा प्रकार भी लंबाई को एन्कोड करने के लिए 1 या अधिक बाइट्स के साथ उपसर्ग किए जाते हैं। और InnoDB पंक्ति प्रारूप में फ़ील्ड ऑफ़सेट्स की एक सरणी भी होती है। इसलिए उनकी विकि में आंतरिक संरचना कम या ज्यादा प्रलेखित है । [संपादित करें] मृत लिंक - यहाँ अब बेहतर दिखता है।

बाराकुडा एक ROW_FORMAT = अतिप्रवाह डेटा के लिए आगे भंडारण क्षमता हासिल करने के लिए तैयार का भी समर्थन करता है ।

मुझे यह भी टिप्पणी करनी होगी कि मैंने कभी भी डिज़ाइन की गई तालिका को पंक्ति आकार सीमा से अधिक नहीं देखा है। यह एक मजबूत "कोड गंध" है जिसे आप फर्स्ट नॉर्मल फॉर्म की रिपीटिंग ग्रुप कंडीशन का उल्लंघन कर रहे हैं ।


2
यह उन इंजीनियरों के लिए बहुत आसान है जो फ्लैट डेटा रूट पर जाने के लिए डीबी-कॉन्शियस नहीं हैं। यह कभी नहीं करता है। मेरी अपनी विरासत डीबी जिसकी एक समान स्थिति है, पंक्ति का आकार इतना कम नाटकीय नहीं है लेकिन लड़का यह एक प्रदर्शन वरदान है! मैं कहूंगा कि आपके रिपोर्टिंग इंजीनियर को यह स्वीकार करने की आवश्यकता है कि उन्हें जॉइन करना होगा और बस उस काम के लिए अनुक्रमण भर में साथ करना होगा।
TechieGurl

1

मेरी स्थिति थोड़ी अलग है। प्रत्येक पंक्ति में मेरे द्वारा संग्रहीत डेटा तत्वों में से एक संभावित रूप से बहुत बड़ा है। (डेटा फ़ील्ड एक दस्तावेज़ के लिए एक LONGBLOB है जिसमें कई एम्बेडेड चित्र हो सकते हैं। मेरे नमूना डेटाबेस में 25 - 30 एमबी के रूप में बड़े दस्तावेज़ हैं, लेकिन ये दस्तावेज़ कुछ मामलों में बड़े हो सकते हैं।) मेरे द्वारा ऑनलाइन प्राप्त किए गए समाधानों में से किसी ने भी राहत नहीं दी। । (बारकोडा में InnoDB फ़ाइल प्रकार को बदला, लॉग फ़ाइल का आकार बढ़ाया, पंक्ति प्रारूप को COMPRESSED में सेट किया।)

एकमात्र समाधान जो मैंने पाया है कि मेरे लिए काम किया है वह MySQL 5.5.x पर वापस MySQL 5.6.x से वापस आ गया था।

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