MySQL क्यों कहता है कि मैं स्मृति से बाहर हूँ?


9

मैं INSERT...SELECTJDBC के साथ MySQL में एक बहुत बड़ी घटना को अंजाम देने की कोशिश कर रहा था , और मुझे निम्नलिखित अपवाद मिला:

Exception in thread "main" java.sql.SQLException: Out of memory (Needed 1073741824 bytes)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1073)

चूंकि मैं वास्तव में रिजल्टसेट ऑब्जेक्ट नहीं लौटा रहा हूं, इसलिए मुझे लगा कि जावा हीप स्पेस कोई मुद्दा नहीं होना चाहिए। हालाँकि, मैंने इसे ऊपर उठाने की कोशिश की और यह अच्छा नहीं हुआ। मैंने तब MySQL वर्कबेंच में स्टेटमेंट निष्पादित करने की कोशिश की और मुझे अनिवार्य रूप से एक ही बात मिली:

Error Code 5: Out of memory (Needed 1073741816 bytes)

इन ऑपरेशनों को पूरा करने के लिए मेरे पास बहुत सारी RAM होनी चाहिए (मैं जिस तालिका का चयन कर रहा हूं, उसे पूरा करने के लिए पर्याप्त है), लेकिन मैं यह अनुमान लगा रहा हूं कि मेरी सभी मेमोरी का लाभ उठाने के लिए मुझे विभिन्न सेटिंग्स की आवश्यकता है। मैं एक अमेज़ॅन EC2 हाई मेमोरी डबल एक्सट्रा लार्ज इंस्टेंस एक विंडोज सर्वर 2008 एएमआई के साथ चला रहा हूं । मैंने बेहतर सेटिंग्स का उपयोग करने के लिए my.ini फ़ाइल के साथ फ़िडलिंग की कोशिश की है, लेकिन सभी के लिए मुझे पता है कि मैंने चीजों को बदतर बना दिया है। यहाँ उस फ़ाइल का एक डंप है:

[client]
port=3306
[mysql]
default-character-set=latin1
[mysqld]
port=3306
basedir="C:/Program Files/MySQL/MySQL Server 5.5/"
datadir="C:/ProgramData/MySQL/MySQL Server 5.5/Data/"
character-set-server=latin1
default-storage-engine=INNODB
sql-mode="STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"
max_connections=100
query_cache_size=1024M
table_cache=256
tmp_table_size=25G
thread_cache_size=8
myisam_max_sort_file_size=100G
myisam_repair_threads = 2
myisam_sort_buffer_size=10G
key_buffer_size=5000M
bulk_insert_buffer_size = 4000M
read_buffer_size=8000M
read_rnd_buffer_size=8000M
sort_buffer_size=1G
innodb_additional_mem_pool_size=26M
innodb_flush_log_at_trx_commit=2
innodb_log_buffer_size=13M
innodb_buffer_pool_size=23G
innodb_log_file_size=622M
innodb_thread_concurrency=18
innodb_file_per_table=TRUE
join_buffer_size=4G
max_heap_table_size = 10G

तो क्या यह सिर्फ मेरे पर्यावरण के लिए बेहतर काम करने के लिए उपरोक्त सेटिंग्स को बदलने का मामला है? यदि हां, तो मुझे किन सेटिंग्स का उपयोग करना चाहिए? मैं केवल वही हूं जो कभी भी इस उदाहरण का उपयोग करता हूं; मैं इसे अपने व्यक्तिगत शौक परियोजना के लिए उपयोग करता हूं जिसमें बड़े डेटासेट का सांख्यिकीय विश्लेषण शामिल है। जैसे, मैं इसे अपने प्रश्नों के लिए सभी उपलब्ध संसाधनों का उपभोग करने के लिए स्वतंत्र हूं।

यदि यह उन सेटिंग्स को बदलने का मामला नहीं है, तो समस्या क्या है? किसी भी मदद के लिए धन्यवाद जो आप बेहतर सब कुछ कॉन्फ़िगर करने के लिए दे सकते हैं।


1g क्वेरी कैश का उपयोग करने वाले को कोई सुराग नहीं है कि वे क्या कर रहे हैं।

@winmutt आप बहुत अच्छी तरह से सही हो सकता है लेकिन अपनी टिप्पणी आगे विवरण के बिना मदद के किसी को भी नहीं है। क्या आप अपनी भावना के कारण बताकर हमारी मदद कर सकते हैं?
माइकल मैकगोवन

आरंभ करने के लिए एक उपयोगी उपकरण tools.percona.com/wizard है
KCD

जवाबों:


9

यह देखते हुए कि विंडोज इंस्टॉलेशन है, @DTest ने अभी भी प्रारंभिक उचित दिशा प्रदान की है।

निम्नलिखित सूत्र लागू करें:

ज्यादातर लोग इसका उपयोग करते हैं:

Maximum MySQL Memory Usage = innodb_buffer_pool_size + key_buffer_size + (read_buffer_size + sort_buffer_size) X max_connections

यह मेरे लिए ज़्यादा प्रधान है:

Maximum MySQL Memory Usage = innodb_buffer_pool_size + key_buffer_size + ((read_buffer_size + read_rnd_buffer_size + sort_buffer_size + join_buffer_size) X max_connections)

ये चर वे हैं जिन्हें आपको तब तक समायोजित करने की आवश्यकता है जब तक कि सूत्र 80% स्थापित रैम या उससे कम पैदावार न दे।

sort_buffer_size
read_buffer_size
read_rnd_buffer_size
join_buffer_size
max_connections

4

मैं आपके बफर साइज़ को कम करने की कोशिश करूँगा। आपके पास उन्हें जितना बड़ा बनाना है, उससे समस्याएँ पैदा होने वाली हैं। इन मूल्यों को चलाने के लिए आपके पास कितनी स्मृति उपलब्ध है:

query_cache_size=1024M
myisam_max_sort_file_size=100G
myisam_sort_buffer_size=10G
key_buffer_size=5000M
bulk_insert_buffer_size = 4000M
read_buffer_size=8000M
read_rnd_buffer_size=8000M
sort_buffer_size=1G
innodb_buffer_pool_size=23G

बफर के कुछ आकार प्रति थ्रेड आवंटित किए जाते हैं, उदाहरण के लिए 10G के myisam_sort_buffer_size प्रत्येक थ्रेड के लिए 10G आवंटित करता है।

मैं सबसे पहले उन मूल्यों को नाटकीय रूप से कम कर दूंगा, और फिर जांच करूंगा कि किन मूल्यों के लिए आपको वास्तव में इस RAM को आवंटित करने की आवश्यकता है (यदि कोई हो)।


4

यह निर्धारित करने के लिए कि कितनी मेमोरी MySQL सोचती है, यह निर्धारित करने के लिए एक त्वरित तरीका निम्नानुसार है:

wget mysqltuner.pl

perl mysqltuner.pl

जब आप इस स्क्रिप्ट को चलाने, यह आपको बता देंगे स्थापित रैम MySQL के कितने प्रतिशत का मानना ​​है कि यह सुरक्षित रूप से आवंटित कर सकते हैं। यदि दिया गया उत्तर 100% से अधिक है, तो आपको निश्चित रूप से अपने बफर आकार को कम करना होगा। ध्यान केंद्रित करने के लिए मुख्य एक हैं:

Sort_buffer_size
read_buffer_size
read_rnd_buffer_size
join_buffer_size
max_connections
key_buffer_size (वास्तव में प्रभावी 4 जी नहीं)

@Dest ने पहले से ही अपने जवाब में आपके लिए दिशा निर्धारित कर दी है, इसलिए +1 उनके awser के लिए। पर्ल स्क्रिप्ट आपको बताएगी कि क्या होगा अगर आप इसे सेट नहीं करते हैं या यदि आप कोई मूल्य बदलते हैं। यहाँ एक उदाहरण है:

मेरा एक ग्राहक
read_buffer_size = 128K
read_rnd_buffer_size = 256K
sort_buffer_size = 2M
join_buffer_size = 128K
max_connecter = 1050 है

यहाँ mysqltuner.pl से आउटपुट है:

MySQLTuner 1.2.0 - मेजर हेडन
बग रिपोर्ट, फ़ीचर अनुरोध और डाउनलोड http://mysqltuner.com/
अतिरिक्त विकल्पों और आउटपुट फ़िल्टरिंग के लिए '--help' के साथ चलाएँ
कृपया अपना MySQL प्रशासनिक लॉगिन
दर्ज करें : lwdba कृपया MySQL प्रशासनिक दर्ज करें कुंजिका:

-------- जनरल सांख्यिकी ---------------------------------------- ----------
[-] MySQLTuner स्क्रिप्ट के लिए संस्करण संस्करण छोड़ दिया
[ठीक] वर्तमान में समर्थित MySQL संस्करण 5.0.51a-समुदाय-लॉग
[!!] 64-बिट OS पर स्विच करें - MySQL वर्तमान में उपयोग नहीं कर सकता है आपकी सभी रैम

-------- संग्रहण इंजन सांख्यिकी --------------------------------------- ----
[-] स्थिति: + पुरालेख -BDB + Federated + InnoDB -ISAM -NDBCluster
[-] MyISAM तालिकाओं में डेटा: 319M (सारणी: 108)
[-] InnoDB तालिकाओं में डेटा: 2M (सारणी: 5)
[!!] कुल खंडित सारणियाँ: २२

-------- प्रदर्शन मेट्रिक्स ---------------------------------------- ---------
[-] के लिए ऊपर: ५२ डी २३ एम १५ एम ५ (([२ एम क्यू [१५. q q५ क्यूपीएस], २४१ के कन्व, TX: २ बी, आरएक्स: १ बी)
[-] पढ़ता / लिखता है: ५ ९% / 41%
[-] कुल बफ़र: 34.0M ग्लोबल + 2.7M प्रति थ्रेड (1050 अधिकतम थ्रेड्स)
[]] 32-बिट सिस्टम पर 2GB RAM आवंटित करना सिस्टम अस्थिरता पैदा कर सकता है
[!!] अधिकतम संभव मेमोरी उपयोग: 2.8G !! (72% स्थापित RAM)
[ठीक है] धीमे प्रश्न: 0% (54 / 72M)
[ठीक है] उपलब्ध कनेक्शन का उच्चतम उपयोग: 6% (65/1050)
[ठीक] कुंजी बफर आकार / कुल MyISAM अनुक्रमित: 8.0M / 82.1M
[ठीक] प्रमुख बफर हिट दर: 100.0% (4B कैश / 1M पढ़ता है)
[]] क्वेरी कैश अक्षम किया गया है
[ठीक] अस्थायी तालिकाओं की आवश्यकता वाले सॉर्ट्स: 0% (0 अस्थायी प्रकार / 948K प्रकार)
[ठीक है] डिस्क पर बनाई गई अस्थायी सारणी: 3% (डिस्क / 380K पर 11K कुल)
[!!] थ्रेड कैश अक्षम है
[!!] टेबल कैश हिट दर: 0% (64 ओपन / 32K ओपन)
[ओके] ओपन फाइल !! सीमा का उपयोग: 2% (125 / 5K)
[ठीक] तालिका तुरंत प्राप्त कर लिया ताले: 99% (30M तत्काल / 30M ताले)
[ठीक] InnoDB डेटा आकार / बफ़र पूल: 2.7M / 8.0M

-------- सिफारिशें ----------------------------------------- ------------
जनरल सिफारिशें:
भागो अनुकूलन टेबल defragment तालिकाओं के लिए बेहतर प्रदर्शन के लिए
प्रश्नों का निवारण बुरा करने के लिए धीमी गति से क्वेरी लॉग सक्षम
एक शुरू करने मूल्य के रूप में 4 के लिए सेट thread_cache_size
धीरे-धीरे से बचने फ़ाइल वर्णनकर्ता सीमाओं तक बढ़ाएँ table_cache
चर समायोजित करने के लिए:
query_cache_size (> = 8M)
thread_cache_size (4 पर शुरू)
table_cache (> 64)

कृपया प्रदर्शन मेट्रिक्स के तहत सूचना दें

[-] कुल बफ़र: 34.0M वैश्विक + 2.7M प्रति थ्रेड (1050 अधिकतम धागे)

MySQL /etc/my.cnf में सेटिंग्स के आधार पर 72% तक स्थापित RAM आवंटित कर सकता है।

34M innodb_buffer_pool_size और key_buffer_size पर आधारित है

2.7M प्रति थ्रेड read_buffer_size + read_rnd_buffer_size + Sort_buffer_size + join_buffer_size पर आधारित था।

2.7M के गुणक max_connections पर आधारित हैं।

इसलिए, आपको इन मापदंडों को तब तक टटोलना चाहिए जब तक कि प्रदर्शन मेट्रिक्स रिपोर्ट यह नहीं कहती कि आपके पास स्थापित रैम के 100% (अधिमानतः 80% से कम) हैं।


मुझे यकीन नहीं है कि मैं आपके उपकरण का उपयोग कर सकता हूं; मैं विंडोज का उपयोग कर रहा हूं। प्रलेखन ने उल्लेख किया कि विंडोज समर्थित नहीं है, लेकिन मैंने वैसे भी कोशिश की। जब मैंने इसे चलाने की कोशिश की, तो यह संकेत दिया कि यह मेरे $ PATH में mysqladmin नहीं मिल सकता है, लेकिन MySQL की बिन निर्देशिका वास्तव में मेरे $ PATH में है।
माइकल मैकगोवन

क्षमा करें, मैंने विंडोज डेटाटायर को नोटिस नहीं किया। मैं एक अलग उत्तर जोड़ूंगा।
RolandoMySQLDBA

1

आपने यह नहीं बताया कि आपके पास कितनी रैम है? मुझे लगता है कि यह कम से कम 32GB है।

innodb_buffer_pool_size - 23 जी

ज्यादा रैम के लिए अच्छा है।

query_cache_size = 1G

बहुत बड़ा। यह बड़ा होने पर अक्षम है। 50M से अधिक नहीं की सिफारिश करें।

की-बफर_साइज = 5 जी

विंडोज पर 4 जी (अभी भी) की हार्ड लिमिट हो सकती है, 4 जी की हार्ड लिमिट थी। आपका 5G 1G में बदल गया है। वैसे भी, अगर आपके सभी टेबल InnoDB हैं, तो राम को क्यों बर्बाद करें। इसे 50M पर सेट करें।

चूँकि एरर मैसेज में बिल्कुल 1G था, इसलिए इसकी खुशबू आ रही थी sort_buffer_size। 32M उचित हो सकता है।

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