Amazon EC2, mysql aborting start क्योंकि InnoDB: mmap (x बाइट्स) विफल; गलत 12


95

मैंने यहाँ जो कुछ भी पढ़ा है उसके आधार पर EC2 पर एक माइक्रो इंस्टेंस सर्वर स्थापित किया है

mysql सर्वर बार-बार विफल होता है और तीसरी बार mysql सर्वर चला जाता है। लॉग केवल दिखाता है

120423 09:13:38 mysqld_safe mysqld from pid file /var/run/mysqld/mysqld.pid ended
120423 09:14:27 mysqld_safe Starting mysqld daemon with databases from /var/lib/mysql
120423  9:14:27 [Note] Plugin 'FEDERATED' is disabled.
120423  9:14:27 InnoDB: The InnoDB memory heap is disabled
120423  9:14:27 InnoDB: Mutexes and rw_locks use GCC atomic builtins
120423  9:14:27 InnoDB: Compressed tables use zlib 1.2.3
120423  9:14:27 InnoDB: Using Linux native AIO
120423  9:14:27 InnoDB: Initializing buffer pool, size = 512.0M
InnoDB: mmap(549453824 bytes) failed; errno 12
120423  9:14:27 InnoDB: Completed initialization of buffer pool
120423  9:14:27 InnoDB: Fatal error: cannot allocate memory for the buffer pool
120423  9:14:27 [ERROR] Plugin 'InnoDB' init function returned error.
120423  9:14:27 [ERROR] Plugin 'InnoDB' registration as a STORAGE ENGINE failed.
120423  9:14:27 [ERROR] Unknown/unsupported storage engine: InnoDB
120423  9:14:27 [ERROR] Aborting

वास्तव में क्या है failed; errno 12? और मैं इसे कैसे तय करने के लिए अधिक स्थान / मेमोरी या जो कुछ भी आवश्यक हो सकता है।

मैं हर बार पूरे सिस्टम को रिबूट करके और सभी लॉग को हटाकर mysql सर्वर को पुनरारंभ करके इसे ठीक करता हूं। लेकिन मुझे पता है कि मेरे कॉन्फ़िगरेशन में कुछ गड़बड़ है।

इसके अलावा मेरा `my.cnf 'नीचे की तरह है:

[mysqld]
# Settings user and group are ignored when systemd is used.
# If you need to run mysqld under different user or group,
# customize your systemd unit file for mysqld according to the
# instructions in http://fedoraproject.org/wiki/Systemd
# max_allowed_packet=500M
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0


innodb_buffer_pool_size         = 512M


[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid

मैं अपने EC2 माइक्रो उदाहरण पर एक ही समस्या है। Innodb_buffer_pool_size = 128M को सेट करने का प्रयास किया है और देखेंगे कि यह कैसे जाता है।
swxxii

यदि आप माइक्रो उदाहरण का उपयोग कर रहे हैं तो आपको स्वैप स्थान जोड़ने की आवश्यकता हो सकती है: prowebdev.us/2012/05/amazon-ec2-linux-micro-swap-space.html
pmoubed

1
EC2 माइक्रो इंस्टेंस पर डिफ़ॉल्ट रूप से कोई स्वैप स्थान नहीं है और इसे मैन्युअल रूप से सेट करने की आवश्यकता है। अन्यथा आप मेमोरी की कमी के कारण बहुत सारे MySQL क्रैश देख सकते हैं।
शाम

जवाबों:


163

मुझे उसी समस्या का सामना करना पड़ा जब मैंने RDS के बिना अपने माइक्रो इंस्टेंस पर एक वर्डप्रेस चलाने की कोशिश की।

एक स्वैप पृष्ठ जोड़ने से मेरे लिए समस्या हल हो गई।

स्वैप स्पेस सेटअप करने के लिए आप नीचे दिए गए चरणों का पालन कर सकते हैं।

यदि यह अभी भी आपके लिए काम नहीं करता है, तो RDS सेवा का उपयोग करने पर विचार करें।

===============================================

मैंने ब्लॉग की सामग्री को रिकॉर्ड के लिए कॉपी किया। इसका श्रेय ब्लॉग लेखक pmoubed को जाता है :

अमेज़ॅन EC2 माइक्रो इंस्टेंस स्वैप स्पेस - लिनक्स

मेरे पास अमेज़ॅन ईसी 2 लिनक्स माइक्रो उदाहरण है। चूंकि माइक्रो इंस्टेंस में केवल 613MB मेमोरी होती है, इसलिए MySQL हर बार क्रैश हो जाता है। MySQL, माइक्रो इंस्टेंस और मेमोरी मैनेजमेंट के बारे में एक लंबी खोज के बाद मुझे पता चला कि माइक्रो उदाहरण के लिए कोई डिफ़ॉल्ट SWAP स्थान नहीं है। इसलिए यदि आप दुर्घटना से बचना चाहते हैं तो आपको अपने माइक्रो इंस्टेंस के लिए स्वैप स्पेस सेटअप करना पड़ सकता है। वास्तव में प्रदर्शन बुद्धिमानी स्वैप को सक्षम करने के लिए बेहतर है।

नीचे दिए गए चरण बताते हैं कि अपने माइक्रो उदाहरण के लिए एक स्वैप स्थान कैसे बनाया जाए। मुझे लगता है कि आपके पास एक माइक्रो उदाहरण के साथ AWS खाता चल रहा है।

  1. Daud dd if=/dev/zero of=/swapfile bs=1M count=1024
  2. Daud mkswap /swapfile
  3. Daud swapon /swapfile
  4. इस लाइन /swapfile swap swap defaults 0 0को जोड़ें/etc/fstab

यदि आप प्रत्येक रीबूट के बाद स्वैप फ़ाइल को स्वचालित रूप से सक्षम करना चाहते हैं, तो चरण 4 की आवश्यकता है।

SWAP स्पेस से संबंधित कुछ उपयोगी कमांड:

$ swapon -s   
$ free -k

$ swapoff -a
$ swapon  -a

संदर्भ:

  1. http://www.thegeekstuff.com/2010/08/how-to-add-swap-space/
  2. http://cloudstory.in/2012/02/getting-the-best-out-of-amazon-ec2-micro-instances/
  3. http://cloudstory.in/2012/02/adding-swap-space-to-amazon-ec2-linux-micro-instance-to-increase-the-performance/
  4. http://aws.amazon.com/ec2/instance-types/

धन्यवाद! इससे मुझे मदद मिली!
पूर्ववत

8
FYI करें, यह मेरे लिए एक डिजिटल महासागर की छोटी बूंद (512 एमबी) पर काम करता है। ऐसा नहीं है कि यह किसी को आश्चर्यचकित करना चाहिए, लेकिन अगर कोई अनिश्चित है, तो यह संभवतः समान मुद्दों के साथ किसी भी सर्वर पर काम करेगा।

इस जीवन रक्षक के लिए धन्यवाद! उबंटू सर्वर के साथ एक माइक्रो इंस्टेंस भी चला रहा था।
ECC-Dan

4
डिजिटल महासागर उपयोगकर्ताओं के लिए, मैंने इस ट्यूटोरियल का अनुसरण किया और इसने एक आकर्षण की तरह काम किया: digitalocean.com/community/articles/…
क्रिस रे

बहुत बहुत धन्यवाद। पिछले 24 घंटों से मेरे बाल खींच रहे हैं, सभी प्रकार के बफर / कैश / क्वेरी आकार के साथ खेले गए हैं .. आप एक जीवन रक्षक हैं!
प्रांशु जूल

23

मुझे यह समस्या अमेज़ॅन ईसी 2 माइक्रो उदाहरण पर भी थी। मैंने निम्नलिखित में जोड़कर inno_db के मेमोरी उपयोग को कम करने की कोशिश की/etc/my.cnf

innodb_buffer_pool_size = 64M

यह काम नहीं किया, मैं 16M करने के लिए इसे छोड़ने की कोशिश की और यह अभी भी काम नहीं किया। तब मुझे एहसास हुआ कि उदाहरण में मूल रूप से शून्य मुक्त मेमोरी थी। इसलिए मैंने अपाचे को फिर से शुरू करने की कोशिश की

sudo system httpd पुनरारंभ
sudo system mysqld पुनरारंभ

और सब कुछ ठीक रहा। शायद एक और उपाय यह है कि अपाचे को कॉन्फ़िगर करें ताकि किसी तरह से इतनी मेमोरी न खाएं।


2
MySQL अभी भी क्रैश हो सकता है इसलिए आपको अपने माइक्रो इंस्टेंस में स्वैप स्पेस जोड़ने की आवश्यकता हो सकती है।
दोपहर

धन्यवाद, यह समझ में आता है। मुझे लगता है कि मैं थ्रेड्स अपाचे की संख्या को सीमित करने की कोशिश कर सकता हूं।
wfbarksdale

बहुत अच्छा काम करता है। मेरे पास यह मुद्दा भी है और httpd को पुनः आरंभ करके इस मुद्दे को हल किया।
लियोनेल चान

1
बहुत बढ़िया पकड़, वही नाव। मैंने कम राम का उपयोग करने के लिए अपनी अपाचे को सेट किया और एक 512 मीटर स्वैप फ़ाइल भी बनाई, लेकिन vm.swappiness को 10 पर सेट किया ताकि यह केवल एक चुटकी में उपयोग किया जाए।
newz2000

Nginx और php-fpm को पुनः आरंभ करने ने भी mysql को शुरू करने की अनुमति देने के लिए पर्याप्त मेमोरी जारी की! धन्यवाद!
msEmmaMays

4

ऐसा लगता है कि आप अपने पोस्ट में दिखाए गए my.cfg फ़ाइल में innodb_buffer_pool_size के लिए 128M मेमोरी का अनुरोध कर रहे हैं , लेकिन MySQL को लगता है कि आप 512M मेमोरी के लिए पूछ रहे हैं :

बफर पूल की शुरुआत, आकार = 512.0M

नीचे कुछ पंक्तियाँ, त्रुटि संदेश आपको बताता है कि MySQL शुरू नहीं होगा क्योंकि यह इनोफर्ड बफ़र के लिए पर्याप्त (512M) मेमोरी आरक्षित नहीं कर सकता है:

घातक त्रुटि: बफर पूल के लिए मेमोरी आवंटित नहीं की जा सकती

कि तीन सवाल भीख माँगती है:

  1. आपके उदाहरण में कितनी मेमोरी है? क्या 512M InnoDB को समायोजित करने के लिए पर्याप्त मेमोरी होनी चाहिए, बफर पूल के लिए हड़पने की कोशिश कर रहा है, इसके अलावा सब कुछ MySQL आवंटित करता है, साथ ही आपका एप्लिकेशन (ओं), साथ ही ऑपरेटिंग सिस्टम?
  2. क्यों InnoDB आपको लगता है कि यह चाहिए से अधिक लेने की कोशिश कर रहा है?
  3. क्यों MySQL किसी भी तरह से पुनरारंभ है?

आप 1 जवाब दे सकते हैं।

2 के रूप में, वहाँ कुछ अलग स्थानों MySQL विकल्प फ़ाइलें स्थित हो सकते हैं। बाद में मिली फाइलें पहले से मिली फाइलों में निर्दिष्ट विकल्पों को ओवरराइड करती हैं। देख

http://dev.mysql.com/doc/refman/5.5/en/option-files.html

समस्या 3। स्मृति स्थिति से बाहर होने के कारण हो सकती है जो स्टार्टअप के कुछ समय बाद होती है। आपको लॉग में आगे पीछे होने का संकेत देखना चाहिए अगर ऐसा है।

अंत में, लेकिन कुछ हद तक असंबंधित, क्या आप ईबीएस समर्थित उदाहरणों का उपयोग कर रहे हैं? यह आमतौर पर डेटाबेस सर्वर के लिए अत्यधिक अनुशंसित है (वास्तव में, विशेष परिस्थितियों में किसी भी उदाहरण के लिए)। उस पर अधिक के लिए देखें

https://stackoverflow.com/a/3630707/141172


2

मेरे लिए, मेरे EC2 उदाहरण में स्वैप वॉल्यूम जोड़कर इस समस्या को ठीक किया गया। मेरी सेवाएं बस बॉक्स पर सभी मेमोरी का उपभोग कर रही थीं, और दुर्घटनाग्रस्त हो जाएंगी। कुछ ऐसा नहीं था जिसका मैं वर्षों से RedHat / CentOS एडमिन होने के नाते इस्तेमाल कर रहा था - एनाकोंडा एक बहुत काम करता है जो नि: शुल्क Ubuntu EC2 उदाहरण नहीं करता है।

मैंने बस वेब कंसोल के माध्यम से एक 2Gb वॉल्यूम बनाया, इसे मेरे उदाहरण से जोड़ा, और "mkswap / dev / [जो भी]", संपादित / etc / fstab किया, और क्रैश बंद हो गया।

ये उदाहरण मीडिया-आधारित OS इंस्टॉल की तरह स्थापित नहीं होते हैं, जो कि हम में से अधिकांश के लिए उपयोग किए जाते हैं - यह बिना किसी पैकेज, किसी उचित फाइलसिस्टम, और AppArmor जैसी चीजों के साथ नंगे छीन लिए जाते हैं, जो आपको इसकी जानकारी नहीं होने पर सभी प्रकार की समस्याओं का कारण बनते हैं। और / या यह कैसे कॉन्फ़िगर करने के लिए पता नहीं है।


1

समस्या यह है कि सर्वर के पास MySQL प्रक्रिया के लिए आवंटित करने के लिए पर्याप्त मेमोरी नहीं है। इस समस्या के कुछ समाधान हैं।

(1) भौतिक रैम बढ़ाएँ। 1GB अतिरिक्त RAM जोड़ने से समस्या हल हो जाएगी। (२) स्वाप स्थान आवंटित करना। डिजिटल महासागर VPS उदाहरण डिफ़ॉल्ट रूप से स्वैप स्थान का उपयोग करने के लिए कॉन्फ़िगर नहीं किया गया है। 512MB स्वैप स्थान आवंटित करके, हम इस समस्या को हल करने में सक्षम थे। अपने सर्वर में स्वैप स्थान जोड़ने के लिए, कृपया निम्नलिखित चरणों का पालन करें:

## As a root user, perform the following:
# dd if=/dev/zero of=/swap.dat bs=1024 count=512M
# mkswap /swap.dat
# swapon /swap.dat
## Edit the /etc/fstab, and the following entry.
/swap.dat      none    swap    sw      0       0 

MySQL बफर पूल के आकार को कम करें

## Edit /etc/my.cnf, and add the following line under the [mysqld] heading.
[mysqld]
innodb_buffer_pool_size=64M

कृपया अपना डिस्क स्थान भी जांचें। सुनिश्चित करें कि आपके पास पर्याप्त जगह है।

df-h


1

आसान जवाब:

* * * * * systemctl is-active --quiet mysqld || systemctl restart mysqld

विस्तृत उत्तर:

यह विशेष रूप से उन लोगों के लिए एक महत्वपूर्ण प्रश्न है जो 1GB रैम या उससे कम का बहुत कम VPS का उपयोग कर रहे हैं। यदि MySQL बाहर निकल रहा है, तो यह आपके सर्वर कॉन्फ़िगरेशन (Apache | nginx) या MySQL कॉन्फ़िगरेशन के साथ एक समस्या हो सकती है। डॉस हमलों से सिस्टम रिसोर्स यूजेज (इमेज देखें) में बढ़ी हुई स्पाइक हो सकती है। अंतिम परिणाम यह है कि कर्नेल द्वारा MySQL प्रक्रिया बंद हो जाती है। एक दीर्घकालिक समाधान के लिए अपने अपाचे या MySQL कॉन्फ़िगरेशन को अनुकूलित करने पर ध्यान देना चाहिए।

सिस्टम संसाधन स्पाइक के कारण RAM स्पाइक (6pm से पहले) और सिस्टम संसाधन स्पाइक के कारण केवल 18 पर आधी रात को CPU स्पाइक होता है

उन विषयों के साथ-साथ MySQL मैनुअल और पेरकोना ब्लॉग पर कई अन्य चर्चाएँ स्टैक ओवरफ्लो हैं:

MySQL मैनुअल - कैसे MySQL मेमोरी का उपयोग करता है:

https://dev.mysql.com/doc/refman/8.0/en/memory-use.html

पर्कोना - इष्टतम MySQL मेमोरी उपयोग को कॉन्फ़िगर करने के लिए सर्वोत्तम अभ्यास:

https://www.percona.com/blog/2016/05/03/best-practices-for-configuring-optimal-mysql-memory-usage/

MySQLTuner का उपयोग करके MySQL के प्रदर्शन का अनुकूलन कैसे करें:

https://www.linode.com/docs/databases/mysql/how-to-optimize-mysql-performance-using-mysqltuner/

अपाचे मेमोरी उपयोग कॉन्फ़िगरेशन:

/server/254436/apache-memory-usage-optimization

प्रदर्शन ट्यूनिंग पर अपाचे मैनुअल:

https://httpd.apache.org/docs/2.4/misc/perf-tuning.html

ट्यूनिंग अपाचे सर्वर:

https://www.linode.com/docs/web-servers/apache-tips-and-tricks/tuning-your-apache-server/

हालाँकि, आपके मूल प्रश्न के संबंध में, हाँ, आप एक अस्थायी समाधान लिख सकते हैं जो यह जाँचता है कि MySQL सेवा लोड और सक्रिय है या नहीं और लोड नहीं होने पर MySQL पुनः आरंभ करेगा।

आपने यह नहीं बताया कि आप किस ऑपरेटिंग सिस्टम का उपयोग कर रहे हैं। यह आपको एक विशिष्ट कमांड देने में मदद करेगा। मैं आपको CentOS linux के लिए एक उदाहरण दूंगा।
कमांड के निम्नलिखित आउटपुट को देखें systemctl status mysql। आप शीर्ष पर देख सकते हैं कि सेवा भरी हुई है और सक्रिय है

[root@centos-mysql-demo ~]# systemctl status mysqld
 mysqld.service - MySQL Server
   Loaded: loaded (/usr/lib/systemd/system/mysqld.service; enabled; vendor preset: disabled)
   Active: active (running) since Tue 2019-06-18 18:28:18 UTC; 924ms ago
     Docs: man:mysqld(8)
           http://dev.mysql.com/doc/refman/en/using-systemd.html
  Process: 3350 ExecStart=/usr/sbin/mysqld --daemonize --pid-file=/var/run/mysqld/mysqld.pid $MYSQLD_OPTS (code=exited, status=0/SUCCESS)
  Process: 3273 ExecStartPre=/usr/bin/mysqld_pre_systemd (code=exited, status=0/SUCCESS)
 Main PID: 3353 (mysqld)
   CGroup: /system.slice/mysqld.service
           └─3353 /usr/sbin/mysqld --daemonize --pid-file=/var/run/mysqld/mysqld.pid

Jun 18 18:28:11 centos-mysql-demo systemd[1]: Starting MySQL Server...
Jun 18 18:28:18 centos-mysql-demo systemd[1]: Started MySQL Server.

यदि सेवा लोड नहीं है, तो एक कमांड जैसे:

systemctl status mysqld || systemctl restart mysqld 

प्रक्रिया को फिर से शुरू करने की कोशिश करेगा। आप क्रोन कर सकते हैं कि:

* * * * * systemctl status mysqld || systemctl restart mysqld

हालाँकि, इस मामले में कि mysql भरी हुई है , लेकिन सेवा सक्रिय नहीं है , आपका क्रॉन कुछ नहीं करेगा। तो, आपको अधिक विस्तृत कमांड का उपयोग करना चाहिए जैसे:

* * * * * systemctl is-active --quiet mysqld || systemctl restart mysqld

इस स्थिति में, यदि सेवा भरी हुई है, लेकिन निष्क्रिय है जैसे कि राज्य कि एक डॉस हमला आपकी mysql सेवा को छोड़ सकता है, तो कमांड भी mysql को पुनः आरंभ करेगा। --quietध्वज का उपयोग करना केवल कमांड को एक स्थिति कोड वापस करने के लिए निर्दिष्ट करता है, स्क्रीन पर कुछ भी आउटपुट नहीं। यदि आप --quietझंडे का पालन ​​करते हैं तो आपको activeया तो एक स्टेटस आउटपुट दिखाई देगाinactive

आप अपने सर्वर में अधिक उपलब्ध रैम संसाधनों को जोड़ने के लिए कुछ स्वैप स्थान भी बना सकते हैं जैसे:

sudo dd if=/dev/zero of=/swapfile count=2096 bs=1MiB
chmod 600 /swapfile
mkswap /swapfile
swapon /swapfile
swapon --show
swapon --summary
free -h

0

निम्न में से किसी एक का उपयोग करें:

  1. फिजिकल रैम बढ़ाएं। 1GB अतिरिक्त RAM जोड़ने से समस्या हल हो जाएगी।

  2. नीचे दिए गए कॉन्फ़िगरेशन परिवर्तनों का उपयोग करके स्वैप स्थान आवंटित करें:

config

dd if=/dev/zero of=/extraswap bs=1024 count=512M
mkswap  /extraswap 
swapon  /extraswap 
## Edit the /etc/fstab, and the following entry.
/extraswap      none    swap    sw      0       0
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.