अधिकतम_लेग्ड_पैकेट आकार कैसे बदलें


317

मुझे अपने MySQL डेटाबेस में BLOB फ़ील्ड्स में समस्या हो रही है - जब लगभग 1MB से बड़ी फ़ाइलों को अपलोड करने पर मुझे एक त्रुटि मिलती है Packets larger than max_allowed_packet are not allowed.

यहाँ मैं क्या करने की कोशिश की है:

MySQL क्वेरी ब्राउज़र में मैंने एक रन show variables like 'max_allowed_packet'दिया, जिसने मुझे 1048576 दिया।

फिर मैं क्वेरी का set global max_allowed_packet=33554432अनुसरण show variables like 'max_allowed_packet'करता हूं - यह मुझे उम्मीद के मुताबिक 33554432 देता है।

लेकिन जब मैं MySQL सर्वर को पुनः आरंभ करता हूं तो यह जादुई रूप से 1048576 पर वापस आ जाता है। मैं यहां क्या गलत कर रहा हूं?

बोनस प्रश्न, क्या BLOB फ़ील्ड को संपीड़ित करना संभव है?


1
एक BLOB फ़ील्ड एक बाइनरी लार्ज OBject है। यह सिर्फ बिट्स है। तो हाँ, आप सामग्री को संपीड़ित कर सकते हैं, और यह अन्य (और उम्मीद है, कम) बिट्स आप BLOB- फ़ील्ड में इसके बजाय संग्रहीत करते हैं। यह सिर्फ बदलता है कि आप इसमें कौन सा डेटा डालते हैं। जब आपको फिर से आवश्यकता हो, तो आपको BLOB- सामग्री को विघटित करना होगा।
कोनरक

ठीक है धन्यवाद, Mysql में एक सेक फीचर फीचर बनाने की उम्मीद की थी
Muleskinner

जवाबों:


407

अपनी फ़ाइल में एकल पंक्ति के अंतर्गत या अनुभाग को शामिल करके my.iniया ~/.my.cnfफ़ाइल में बदलें :[mysqld][client]

max_allowed_packet=500M

फिर MySQL सेवा को पुनरारंभ करें और आप कर रहे हैं।

अधिक जानकारी के लिए दस्तावेज़ देखें ।


1
धन्यवाद काम कर रहा है, भले ही मुझे उम्मीद थी कि मैन्युअल रूप से ini फ़ाइलों को संशोधित किए बिना यह संभव होगा।
मुल्सकिनर

63
FYI करें पाठकों, यह भी "MySQL दूर हो गया" का समाधान है
djb

1
@Konerak, कौन था तानाशाह?
पचेरियर

14
ऐसा लगता है कि किसी को एक उत्तर देने के बजाय व्यर्थ लगता है और फिर उन्हें बताएं कि उन्हें उत्तर के लिए Google की जांच करनी चाहिए। खासकर तब से, एसओ हमेशा किसी भी सभ्य प्रोग्रामिंग से संबंधित प्रश्न के लिए शीर्ष परिणामों में से कई पर कब्जा कर लेता है। एक अनंत लूप प्रोग्रामिंग के बारे में बात करो !!! Google> SO> Google> SO> Google> SO इत्यादि।
फिल हिले

5
सुनिश्चित करें कि यह अंडर है [mysqld]और नहीं [mysql](बहुत समान)। मुझे हेडस्क्रेचिंग के कुछ मिनटों का खर्च।
हैलवर होल्स्टेन स्ट्रैंड

225

Max_allowed_packet चर एक प्रश्न चलाकर विश्व स्तर पर सेट किया जा सकता।

हालाँकि, यदि आप इसे my.iniफ़ाइल में नहीं बदलते हैं (जैसा कि ड्रैगन 112 ने सुझाव दिया है), सर्वर के पुनरारंभ होने पर मान रीसेट हो जाएगा, भले ही आप इसे विश्व स्तर पर सेट करें।

सर्वर के पुनरारंभ होने तक सभी के लिए अधिकतम अनुमत पैकेट को 1GB में बदलने के लिए:

SET GLOBAL max_allowed_packet=1073741824;

7
मदद नहीं करता है :(। यह प्रदर्शित करता है "क्वेरी ठीक है, 0 पंक्तियाँ प्रभावित (0.00 सेकंड)"
artnikpro

15
@artnikpro यह काम करता है, "क्वेरी ठीक है, 0 पंक्तियाँ प्रभावित (0.00 सेकंड)" भ्रामक लग सकता है लेकिन यह सही है।
12

10
मेरे लिए काम नहीं करता है। SHOW VARIABLES WHERE variable_name = 'max_allowed_packet'अभी भी पुराने मूल्य को दिखाता है
पोमा

50
यह पुराने मान को दिखाता है क्योंकि max_allowed_packet मौजूदा कनेक्शन के लिए परिवर्तित नहीं होता है। यदि आप डिस्कनेक्ट और फिर से कनेक्ट करते हैं तो आपको अपडेटेड वैल्यू दिखाई देगी।
मैट क्रिंकलाव-वोग

2
मैट क्रिंकलाव-वोग्ट सही है। इसे बाहर निकलने और फिर से जुड़ने की जरूरत है
makriria

89

मेरे एक जूनियर डेवलपर को मेरे लिए इसे संशोधित करने में समस्या हो रही थी, इसलिए मैंने सोचा कि मैं लिनक्स के उपयोगकर्ताओं के लिए इसका अधिक विस्तार से विस्तार करूंगा:

1) खुला टर्मिनल

2) ssh रूट @ YourIP

3) रूट पासवर्ड डालें

4) नैनो /etc/mysql/my.cnf (यदि कमांड पहचाना नहीं गया है तो पहले यह प्रयास करें या vi फिर कोशिश करें: yum install नैनो)

5) लाइन जोड़ें: [MYSQLD] सेक्शन के तहत max_allowed_packet = 256M (जाहिर है कि आपको जो भी जरूरत हो उसके लिए साइज एडजस्ट करें)। उन्होंने इसे फ़ाइल के निचले भाग पर रखने की गलती की, इसलिए यह काम नहीं किया।

यहां छवि विवरण दर्ज करें

6) कंट्रोल + ओ (सेव) फिर एंटर (कंफर्म) फिर कंट्रोल + एक्स (एग्जिट फाइल)

7) सेवा mysqld पुनरारंभ

8) आप phpmyadmin पर चर खंड में परिवर्तन की जाँच कर सकते हैं


यह वास्तव में CentosOS6 पर किया गया था, मैं निश्चित रूप से रूट ssh एक्सेस का उपयोग नहीं करने के बारे में सहमत हूं
naw103

@tamasd कुछ GNU / Linux डिस्ट्रोस जो मैंने उपयोग किया है (जैसे डेबियन 8 और सेंटोस 6) का उत्पादन sudo: command not foundया this incident will be reportedक्योंकि या तो sudoस्थापित और कॉन्फ़िगर नहीं किया गया है। क्या इस उत्तर sudoको पहली बार स्थापित करने के निर्देशों के साथ देना बेहतर होगा ?
डेमियन यरिक

रूट ssh समस्या नहीं है, लेकिन पासवर्ड लॉगिन है। Sudo अनुमति वाला उपयोगकर्ता खाता लगभग असुरक्षित है जैसा कि रूट है। बस SSH कुंजी आधारित प्रमाणीकरण का उपयोग करें।
मार्टिन श्नाइडर

मशीन में लॉग इन करने का मामला ओटी का है, उन्होंने अपने नुस्खा में सही बताया कि आपको एक तरह से या किसी अन्य तरीके से लॉग इन करना होगा।
देवसंख्या

41

मुझे लगता है कि कुछ लोग यह भी जानना चाहेंगे कि अपने पीसी पर my.ini फाइल कैसे खोजें। विंडोज़ उपयोगकर्ताओं के लिए, मुझे लगता है कि सबसे अच्छा तरीका इस प्रकार है:

  1. विन + आर ('रन' के लिए शॉर्टकट), टाइप करें services.msc , Enter
  2. आपको 'MySQL56' जैसी प्रविष्टि मिल सकती है, उस पर राइट क्लिक करें, गुण चुनें
  3. आप st को "D: / Program Files / MySQL / MySQL Server 5.6 / bin \ mysqld" --defaults-file = "D: \ ProgramData \ MySQL \ MySQL Server 5.6 \ my \" \ "\ _ \ _ \ _ \ _ \ _ की तरह देख सकते हैं।

मुझे इसका जवाब http://bugs.mysql.com/bug.php?id=68516 से मिला


2
यह विंडोज पर महत्वपूर्ण है। एक सेवा के रूप में MySQL था और कार्यक्षेत्र में my.ini को संपादित किया और इस उत्तर ने मुझे एहसास दिलाया कि एक सेवा के रूप में MySQL एक अन्य my.ini का उपयोग करता है, तो एक मैंने कार्यक्षेत्र में संपादित किया।
रॉबर्ट नीस्ट्रोज

20

सभी निर्देशों का पालन करते हुए, मैंने यही किया और काम किया:

mysql> SELECT CONNECTION_ID();//This is my ID for this session.
+-----------------+
| CONNECTION_ID() |
+-----------------+
|              20 |
+-----------------+
1 row in set (0.00 sec)

mysql> select @max_allowed_packet //Mysql do not found @max_allowed_packet
+---------------------+
| @max_allowed_packet |
+---------------------+
| NULL                |
+---------------------+
1 row in set (0.00 sec)

mysql> Select @@global.max_allowed_packet; //That is better... I have max_allowed_packet=32M inside my.ini
+-----------------------------+
| @@global.max_allowed_packet |
+-----------------------------+
|                    33554432 |
+-----------------------------+
1 row in set (0.00 sec)

mysql> **SET GLOBAL max_allowed_packet=1073741824**; //Now I'm changing the value.
Query OK, 0 rows affected (0.00 sec)

mysql> select @max_allowed_packet; //Mysql not found @max_allowed_packet
+---------------------+
| @max_allowed_packet |
+---------------------+
| NULL                |
+---------------------+
1 row in set (0.00 sec)

mysql> Select @@global.max_allowed_packet;//The new value. And I still have max_allowed_packet=32M inisde my.ini
+-----------------------------+
| @@global.max_allowed_packet |
+-----------------------------+
|                  1073741824 |
+-----------------------------+
1 row in set (0.00 sec)

इसलिए, जैसा कि हम देख सकते हैं, my_i से max_allowed_packet को बाहर बदल दिया गया है।

चलो सत्र छोड़ दो और फिर से जाँच करें:

mysql> exit
Bye

C:\Windows\System32>mysql -uroot -pPassword
Warning: Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 21
Server version: 5.6.26-log MySQL Community Server (GPL)

Copyright (c) 2000, 2015, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> SELECT CONNECTION_ID();//This is my ID for this session.
+-----------------+
| CONNECTION_ID() |
+-----------------+
|              21 |
+-----------------+
1 row in set (0.00 sec)

mysql> Select @@global.max_allowed_packet;//The new value still here and And I still have max_allowed_packet=32M inisde my.ini
+-----------------------------+
| @@global.max_allowed_packet |
+-----------------------------+
|                  1073741824 |
+-----------------------------+
1 row in set (0.00 sec)

Now I will stop the server
2016-02-03 10:28:30 - Server is stopped

mysql> SELECT CONNECTION_ID();
ERROR 2013 (HY000): Lost connection to MySQL server during query


Now I will start the server
2016-02-03 10:31:54 - Server is running


C:\Windows\System32>mysql -uroot -pPassword
Warning: Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 9
Server version: 5.6.26-log MySQL Community Server (GPL)

Copyright (c) 2000, 2015, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> SELECT CONNECTION_ID();
+-----------------+
| CONNECTION_ID() |
+-----------------+
|               9 |
+-----------------+
1 row in set (0.00 sec)

mysql> Select @@global.max_allowed_packet;//The previous new value has gone. Now I see what I have inside my.ini again.
+-----------------------------+
| @@global.max_allowed_packet |
+-----------------------------+
|                    33554432 |
+-----------------------------+
1 row in set (0.00 sec)

निष्कर्ष, SET GLOBAL max_allowed_packet = 1073741824 के बाद, सर्वर को फिर से शुरू होने तक नया max_allowed_packet होगा, जैसा कि किसी ने पहले कहा था।


13

यदि बैकअप करते समय यह त्रुटि हो रही है, max_allowed_packetतो my.cnfविशेष रूप से इसके लिए सेट किया जा सकता है mysqldump

[mysqldump]
max_allowed_packet=512M

प्रदर्शन करते समय मुझे यह त्रुटि मिलती रही mysqldumpऔर मुझे समझ में नहीं आया क्योंकि मेरे पास अनुभाग के my.cnfतहत यह सेट था [mysqld]। एक बार जब मुझे पता चला कि मैं इसे सेट कर सकता हूं [mysqldump]और मैंने मूल्य निर्धारित कर दिया, तो मेरे बैकअप बिना किसी समस्या के पूरा हो गए।


10

Wss mysql सर्वर चलाने वालों के लिए

वैम्प ट्रे आइकन -> MySql -> my.ini

[wampmysqld]
port        = 3306
socket      = /tmp/mysql.sock
key_buffer_size = 16M
max_allowed_packet = 16M        // --> changing this wont solve
sort_buffer_size = 512K

यू खोजने तक अंत तक स्क्रॉल करें

[mysqld]
port=3306
explicit_defaults_for_timestamp = TRUE

की लाइन जोड़े packet_size के बीच में

[mysqld]
port=3306
max_allowed_packet = 16M
explicit_defaults_for_timestamp = TRUE

जांचें कि क्या इस क्वेरी के साथ काम किया है

Select @@global.max_allowed_packet;

5

यह त्रुटि तब आती है जब आपके डेटा में बड़ा मूल्य निर्धारित होता है।

बस नीचे लिखें max_allowed_packed=500M या आप उस 500 * 1024k की गणना कर सकते हैं और यदि आप चाहें तो 500M के बजाय इसका उपयोग कर सकते हैं।

अब बस MySQL को रीस्टार्ट करें।


2
करने के लिए /etc/my.cnfMySQL उदाहरण के लिए, या /etc/my.cnf.d/server.cnfMariaDB के लिए
एव्जेनी लेबेडेव

5

कई उत्तरदाताओं ने इस मुद्दे को देखा और पहले से ही समाधान दिया।

मैं सिर्फ एक और उपाय सुझाना चाहता हूं, जो कि मैसकल वर्कबेन्च के टूल के अंदर से गॉगल वैरिएबल वैल्यू को बदल रहा है । यदि आप सर्वर पर स्थानीय रूप से चल रहे कार्यक्षेत्र का उपयोग करते हैं (या SSH कनेक्शन के माध्यम से)

आप बस अपने उदाहरण से कनेक्ट करें और मेनू पर जाएं:

सर्वर -> विकल्प फ़ाइल -> नेटवर्किंग -> max_allowed_packed

आप वांछित मान सेट करते हैं और फिर आपको MySql Service को पुनरारंभ करना होगा


4

अमेज़न आरडीएस सेवा पर MySQL चलाने वाले किसी के लिए, यह परिवर्तन पैरामीटर समूहों के माध्यम से किया जाता है । आपको एक नया पीजी बनाने या मौजूदा (डिफ़ॉल्ट के अलावा, जो केवल पढ़ने के लिए है) का उपयोग करने की आवश्यकता है।

आपको max_allowed_packetपैरामीटर की खोज करनी चाहिए , इसके मूल्य को बदलना चाहिए , और फिर सहेजें को हिट करना होगा।

अपने MySQL उदाहरण में, यदि आपने एक नया पीजी बनाया है, तो आपको अपने उदाहरण के लिए पीजी संलग्न करना चाहिए (आपको रिबूट की आवश्यकता हो सकती है)। यदि आपने एक PG बदला है जो पहले से ही आपके उदाहरण से जुड़ा हुआ था, तो आपके सभी उदाहरणों में बगैर रिबूट के परिवर्तन लागू किया जाएगा, जो कि PG से जुड़ा हुआ है।


0

यदि आप डेटाबेस में बड़े आकार की छवि या डेटा अपलोड करना चाहते हैं। बस डेटा प्रकार को बदल दें 'BIG BLOB'


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