MySQL के साथ पंक्ति आकार की त्रुटि


11

मैं अपनी मैकबुक पर (परीक्षण के लिए) एक MySQL सर्वर चला रहा हूं। होमब्रे से संस्करण 5.6.20 है। मैंने "रो आकार बहुत बड़ी" त्रुटियों में भागना शुरू कर दिया, और मैं इसे इस परीक्षण मामले में कम करने में सक्षम रहा हूं। तालिका:

mysql> describe test;
+-------+----------+------+-----+---------+----------------+
| Field | Type     | Null | Key | Default | Extra          |
+-------+----------+------+-----+---------+----------------+
| id    | int(11)  | NO   | PRI | NULL    | auto_increment |
| stuff | longtext | YES  |     | NULL    |                |
+-------+----------+------+-----+---------+----------------+

तालिका स्थिति:

mysql> show table status where Name = 'test';
+------+--------+---------+------------+------+----------------+-------------+-----------------+--------------+-----------+----------------+---------------------+-------------+------------+-----------------+----------+----------------+---------+
| Name | Engine | Version | Row_format | Rows | Avg_row_length | Data_length | Max_data_length | Index_length | Data_free | Auto_increment | Create_time         | Update_time | Check_time | Collation       | Checksum | Create_options | Comment |
+------+--------+---------+------------+------+----------------+-------------+-----------------+--------------+-----------+----------------+---------------------+-------------+------------+-----------------+----------+----------------+---------+
| test | InnoDB |      10 | Compact    |    1 |          16384 |       16384 |               0 |            0 |   5242880 |              2 | 2014-08-28 23:51:12 | NULL        | NULL       | utf8_general_ci |     NULL |                |         |
+------+--------+---------+------------+------+----------------+-------------+-----------------+--------------+-----------+----------------+---------------------+-------------+------------+-----------------+----------+----------------+---------+

जब मैं तालिका में एक पंक्ति सम्मिलित करने का प्रयास करता हूं, तो वह त्रुटि होती है जहां stuffकॉलम में 5033932 बाइट्स होते हैं।

mysql> select length(stuff) from test;
+---------------+
| length(stuff) |
+---------------+
|       5033932 |
+---------------+

mysql> update test set stuff = concat(stuff, 'a');
ERROR 1118 (42000): Row size too large (> 8126). Changing some columns to TEXT or BLOB or using ROW_FORMAT=DYNAMIC or ROW_FORMAT=COMPRESSED may help. In current row format, BLOB prefix of 768 bytes is stored inline.

मैंने इस त्रुटि के लिए चारों ओर खोजा है, अधिकांश उत्तरों में बहुत अधिक स्तंभ शामिल हैं, और प्रत्येक में 768 बाइट्स इनलाइन संग्रहीत हैं। जैसा कि आप देख सकते हैं, मेरे लिए ऐसा नहीं है। इसके अलावा, संख्या ५०३३ ९ ३२ तालिका में मेरे पास मौजूद स्तंभों की संख्या की परवाह किए बिना बनी हुई है। मेरे मूल आवेदन में, पांच कॉलम थे, और अपडेट तब भी विफल रहे जब कॉलम का आकार 5033932 से अधिक हो गया।

मैंने लोगों को पंक्ति स्वरूपों को स्विच करके समस्या को हल करने के लिए भी देखा है, जिसे मैं थोड़ा सा प्रयास करूंगा, लेकिन मैं यह समझना चाहूंगा कि इस त्रुटि का कारण क्या है।

अग्रिम में धन्यवाद!

जवाबों:


12

5.6.20 जारी नोटों में बदलाव:

Redo लॉग बड़े, बाहरी रूप से संग्रहीत BLOB फ़ील्ड्स के लिए लिखता है जो सबसे हालिया चेकपॉइंट को अधिलेखित कर सकता है। 5.6.20 पैच रीडो लॉग के आकार को सीमित करता है बीएलओबी रीडो लॉग फाइल के आकार का 10% लिखता है। 5.7.5 पैच एक सीमा लगाए बिना बग को संबोधित करता है। MySQL 5.5 के लिए, बग एक ज्ञात सीमा है।

MySQL 5.6 के लिए शुरू की गई रेड लॉग लॉग BLOB लेखन सीमा के परिणामस्वरूप, innodb_log_file_size को आपकी तालिकाओं की पंक्तियों में पाए जाने वाले सबसे बड़े BLOB डेटा आकार से 10 गुना अधिक मूल्य पर सेट किया जाना चाहिए और अन्य चर लंबाई फ़ील्ड (VARCHAR, VARBINARY) की लंबाई , और पाठ प्रकार के क्षेत्र)। ऐसा करने में विफल होने के परिणामस्वरूप "पंक्ति आकार बहुत बड़ी" त्रुटियां हो सकती हैं।

(जोर मेरा)

innodb_log_file_size50331648 के लिए डिफ़ॉल्ट , जिसका अर्थ है कि आप डेटा प्रकार की परवाह किए बिना सबसे बड़ा BLOB / TEXT मान बना सकते हैं, 5033164 के करीब है, और आपको पता चला कि सटीक मान 5033932 है। मुझे लगता है कि आंतरिक रूप से गणना में एक फ्रॉड कारक शामिल है।

इसलिए innodb_log_file_sizeअगर आपको बड़ा BLOB / TEXT डेटा स्टोर करना है तो आपको बढ़ाना होगा। सौभाग्य से, लॉग फ़ाइल का आकार बदलना, InnoDB के पुराने संस्करणों की तुलना में 5.6 में बहुत आसान है। नए मूल्य के साथ अपने my.cnf में बस एक पंक्ति जोड़ें और mysqld को पुनरारंभ करें।


छोटे नोटिस, आपको पुनः आरंभ या रोकना होगा और परिवर्तन को प्रभावित होने देने के लिए फिर से शुरू करना होगा, पुनः लोड करने से काम नहीं
चलेगा

1
इस redo आकार की सीमा mysql 5.6.22 से कुल संयुक्त innodb_log_file_size (innodb_log_file_size * innodb_log_files_in_group) को 10% तक छूट दी गई है। और लॉन्गब्लोब की अधिकतम लंबाई 4294967295 (2 ^ 32 - 1) अक्षर हो सकती है अर्थात 4GB के आसपास। इस longblob मान को संग्रहीत करने के लिए हमारे पास न्यूनतम 40GB संयुक्त innodb_log_file_size (innodb_log_file_size * innodb_log_files_in_group) होना चाहिए।
काशी
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.