Amazon EC2, mysql ยกเลิกการเริ่มต้นเนื่องจาก InnoDB: mmap (x bytes) ล้มเหลว เออร์โน 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 ล่มเนื่องจากไม่มีหน่วยความจำ
pmoubed

คำตอบ:


163

ฉันพบปัญหาเดียวกันเมื่อพยายามเรียกใช้ wordpress บนไมโครอินสแตนซ์โดยไม่ใช้ RDS

การเพิ่มหน้า Swap ช่วยแก้ปัญหาให้ฉันได้

คุณสามารถทำตามขั้นตอนด้านล่างเพื่อตั้งค่าพื้นที่แลกเปลี่ยน

หากยังไม่ได้ผลสำหรับคุณให้พิจารณาใช้บริการ RDS

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

ฉันคัดลอกเนื้อหาของบล็อกสำหรับบันทึก เครดิตไปที่ผู้เขียนบล็อกpmoubed :

Amazon EC2 Micro Instance Swap Space - Linux

ฉันมีอินสแตนซ์ Amazon EC2 Linux Micro เนื่องจากอินสแตนซ์ Micro มีหน่วยความจำเพียง 613MB MySQL จึงหยุดทำงานทุกขณะ หลังจากค้นหา MySQL, Micro Instance และ Memory Managment มานานฉันพบว่าไม่มีพื้นที่ SWAP เริ่มต้นสำหรับอินสแตนซ์ Micro ดังนั้นหากคุณต้องการหลีกเลี่ยงความผิดพลาดคุณอาจต้องตั้งค่าพื้นที่แลกเปลี่ยนสำหรับไมโครอินสแตนซ์ของคุณ ประสิทธิภาพที่แท้จริงนั้นดีกว่าในการเปิดใช้งานการแลกเปลี่ยน

ขั้นตอนด้านล่างแสดงวิธีสร้างพื้นที่แลกเปลี่ยนสำหรับอินสแตนซ์ Micro ของคุณ ฉันถือว่าคุณมีบัญชี AWS ที่มีอินสแตนซ์ Micro ทำงานอยู่

  1. วิ่ง dd if=/dev/zero of=/swapfile bs=1M count=1024
  2. วิ่ง mkswap /swapfile
  3. วิ่ง swapon /swapfile
  4. เพิ่มบรรทัดนี้/swapfile swap swap defaults 0 0ไปที่/etc/fstab

ขั้นตอนที่ 4 เป็นสิ่งจำเป็นหากคุณต้องการเปิดใช้งานไฟล์ swap โดยอัตโนมัติหลังจากรีบูตแต่ละครั้ง

คำสั่งที่มีประโยชน์บางอย่างที่เกี่ยวข้องกับ SWAP space:

$ 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 สิ่งนี้ใช้ได้ผลกับฉันใน Digital Ocean droplet (512 MB) ไม่ใช่ว่าสิ่งนี้จะทำให้ทุกคนประหลาดใจ แต่ในกรณีที่ใครก็ตามที่ไม่แน่ใจอาจทำงานบนเซิร์ฟเวอร์ใดก็ได้ที่มีปัญหาเดียวกัน
jfacemyer

ขอบคุณสำหรับการช่วยชีวิตนี้! ยังใช้งานไมโครอินสแตนซ์กับเซิร์ฟเวอร์ Ubuntu
ECC-Dan

4
สำหรับผู้ใช้ Digital Ocean ฉันทำตามบทช่วยสอนนี้และมันได้ผลดี: digitalocean.com/community/articles/…
Chris Ray

ขอบคุณมาก. ดึงผมออกมา 24 ชั่วโมงที่ผ่านมาเล่นกับขนาดบัฟเฟอร์ / แคช / แบบสอบถามทุกชนิด .. คุณคือผู้ช่วยชีวิต!
pranshus

24

ฉันมีปัญหานี้เช่นกันในอินสแตนซ์ไมโคร Amazon EC2 ฉันพยายามลดการใช้หน่วยความจำของ inno_db โดยเพิ่มสิ่งต่อไปนี้ใน/etc/my.cnf

innodb_buffer_pool_size = 64M

ไม่ได้ผลฉันลองลดลงเหลือ 16M แล้วก็ยังไม่ได้ผล จากนั้นฉันก็รู้ว่าอินสแตนซ์นั้นมีหน่วยความจำว่างเป็นศูนย์ ฉันจึงลองรีสตาร์ท apache

ระบบ sudo httpd รีสตาร์ท
sudo system mysqld รีสตาร์ท

และทุกอย่างทำงานได้ดี บางทีวิธีอื่นคือการกำหนดค่า apache เพื่อไม่ให้กินหน่วยความจำมากนัก


2
MySQL อาจยังขัดข้องดังนั้นคุณอาจต้องเพิ่มพื้นที่แลกเปลี่ยนให้กับไมโครอินสแตนซ์ของคุณ
pmoubed

ขอบคุณที่สมเหตุสมผล ฉันคิดว่าฉันอาจพยายาม จำกัด จำนวนเธรดที่ apache สามารถวางไข่ได้
wfbarksdale

ใช้งานได้ดี ฉันมีปัญหานี้เช่นกันและการรีสตาร์ท httpd ช่วยแก้ปัญหาได้
Lionel Chan

1
เรือลำเดียวกันที่นี่ ฉันตั้งค่า apache ให้ใช้ ram น้อยลงและสร้างไฟล์ swap 512m แต่ตั้งค่า vm.swappiness เป็น 10 เพื่อให้ใช้ในการบีบนิ้วเท่านั้น
newz2000

การรีสตาร์ท nginx และ php-fpm ยังปล่อยหน่วยความจำเพียงพอที่จะให้ mysql เริ่มทำงานได้! ขอบคุณ!
msEmmaMays

4

ดูเหมือนว่าคุณกำลังขอหน่วยความจำ128Mสำหรับ innodb_buffer_pool_size ในไฟล์ my.cfg ที่คุณแสดงในโพสต์ แต่ MySQL คิดว่าคุณกำลังขอหน่วยความจำ512M :

กำลังเริ่มต้นบัฟเฟอร์พูลขนาด = 512.0M

ข้อความแสดงข้อผิดพลาดแจ้งให้คุณทราบว่า MySQL จะไม่เริ่มทำงานเนื่องจากไม่สามารถสำรองหน่วยความจำ (512M) เพียงพอสำหรับพูลบัฟเฟอร์ InnoDB

ข้อผิดพลาดร้ายแรง: ไม่สามารถจัดสรรหน่วยความจำสำหรับบัฟเฟอร์พูล

นั่นทำให้เกิดคำถามสามข้อ:

  1. อินสแตนซ์ของคุณมีหน่วยความจำเท่าใด ควรมีหน่วยความจำเพียงพอที่จะรองรับ 512M InnoDB ที่พยายามคว้าบัฟเฟอร์พูลรวมถึงทุกสิ่งที่ MySQL จัดสรรรวมถึงแอปพลิเคชันของคุณรวมถึงระบบปฏิบัติการหรือไม่?
  2. เหตุใด InnoDB จึงพยายามใช้เวลามากกว่าที่คุณคิด
  3. เหตุใด MySQL จึงเริ่มต้นใหม่

คุณสามารถตอบ 1.

ตามที่ 2 มีที่ที่แตกต่างกันไม่กี่ไฟล์ตัวเลือก MySQL สามารถพบได้ พบในภายหลังไฟล์แทนที่อ็อพชันที่ระบุในไฟล์ที่พบก่อนหน้านี้ ดู

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

ปัญหาที่ 3. อาจเกิดจากสภาวะหน่วยความจำไม่เพียงพอที่เกิดขึ้นในบางครั้งหลังจากเริ่มต้นระบบ คุณควรเห็นข้อบ่งชี้ของสิ่งนั้นย้อนกลับไปในบันทึกหากเป็นเช่นนั้น

สุดท้าย แต่ค่อนข้างไม่เกี่ยวข้องคุณใช้อินสแตนซ์ที่ได้รับการสนับสนุนจาก EBS หรือไม่ โดยทั่วไปแนะนำเป็นอย่างยิ่งสำหรับเซิร์ฟเวอร์ฐานข้อมูล (อันที่จริงสำหรับกรณีที่มีการ จำกัด กรณีพิเศษใด ๆ ) สำหรับข้อมูลเพิ่มเติมโปรดดู

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


2

สำหรับฉันปัญหานี้ได้รับการแก้ไขโดยการเพิ่มวอลลุ่มแลกเปลี่ยนให้กับอินสแตนซ์ EC2 ของฉัน บริการของฉันใช้หน่วยความจำทั้งหมดในกล่องและจะหยุดทำงาน ไม่ใช่สิ่งที่ฉันคุ้นเคยในการเป็นผู้ดูแลระบบ RedHat / CentOS มาหลายปีแล้ว - Anaconda ทำงานมากมายโดยที่อินสแตนซ์ Ubuntu EC2 ฟรีไม่มี

ฉันเพิ่งสร้างไดรฟ์ข้อมูล 2Gb ผ่านเว็บคอนโซลเชื่อมต่อกับอินสแตนซ์ของฉันและทำ "mkswap / dev / [อะไรก็ได้]" แก้ไข / etc / fstab และการขัดข้องก็หยุดลง

อินสแตนซ์เหล่านี้ไม่ได้ติดตั้งเหมือนกับการติดตั้งระบบปฏิบัติการที่ใช้สื่อที่พวกเราส่วนใหญ่คุ้นเคย - มันถูกถอดออกโดยไม่มีแพ็คเกจไม่มีระบบไฟล์ที่เหมาะสมและสิ่งต่างๆเช่น AppArmor ซึ่งทำให้เกิดปัญหาทุกประเภทหากคุณไม่ทราบ และ / หรือไม่ทราบวิธีกำหนดค่า


1

ปัญหาคือเซิร์ฟเวอร์ไม่มีหน่วยความจำเพียงพอที่จะจัดสรรสำหรับกระบวนการ MySQL วิธีแก้ปัญหานี้มีอยู่สองสามวิธี

(1) เพิ่ม RAM จริง การเพิ่ม RAM เพิ่มเติม 1GB จะช่วยแก้ปัญหาได้ (2) จัดสรรพื้นที่ SWAP อินสแตนซ์ Digital Ocean 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

คำตอบโดยละเอียด:

นี่เป็นคำถามที่สำคัญโดยเฉพาะอย่างยิ่งสำหรับผู้ที่ใช้ VPS ขนาดเล็กมากเช่น RAM 1GB หรือน้อยกว่า หาก MySQL หลุดออกอาจเป็นปัญหากับการกำหนดค่าเซิร์ฟเวอร์ของคุณ (Apache | nginx) หรือการกำหนดค่า MySQL การโจมตี DOS อาจทำให้การใช้ทรัพยากรระบบเพิ่มขึ้นอย่างรวดเร็ว (ดูภาพ) ผลลัพธ์สุดท้ายคือกระบวนการ MySQL ถูกปิดโดยเคอร์เนล สำหรับโซลูชันระยะยาวควรดูที่การปรับแต่งการกำหนดค่า Apache หรือ MySQL ให้เหมาะสม

ทรัพยากรระบบเพิ่มขึ้นอย่างรวดเร็วทำให้ RAM เพิ่มขึ้น (ก่อน 18.00 น.) และทรัพยากรระบบเพิ่มขึ้นทำให้ CPU เพิ่มขึ้นเท่านั้น Midnight ในวันอังคารที่ 18

มีการอภิปรายอื่น ๆ อีกมากมาย Stack Overflow หัวข้อเหล่านั้นรวมถึงคู่มือ MySQL และ Percona Blog:

คู่มือ MySQL - MySQL ใช้หน่วยความจำอย่างไร:

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

Percona - แนวทางปฏิบัติที่ดีที่สุดสำหรับการกำหนดค่าการใช้หน่วยความจำ MySQL ที่เหมาะสมที่สุด:

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

วิธีเพิ่มประสิทธิภาพ MySQL โดยใช้ MySQLTuner:

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

การกำหนดค่าการใช้หน่วยความจำ Apache:

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

คู่มือ Apache เกี่ยวกับการปรับแต่งประสิทธิภาพ:

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

การปรับแต่งเซิร์ฟเวอร์ Apache:

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 

จะทำเคล็ดลับในการเริ่มต้นกระบวนการใหม่ คุณสามารถ cron ที่:

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

อย่างไรก็ตามในกรณีที่มีการโหลด mysql แต่บริการไม่ทำงาน cron ของคุณจะไม่ทำอะไรเลย ดังนั้นคุณควรใช้คำสั่งที่ละเอียดกว่านี้เช่น:

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

ในกรณีนี้หากมีการโหลดบริการแต่ไม่มีการใช้งานเช่นสถานะที่การโจมตี DOS สามารถออกจากบริการ mysql ของคุณได้คำสั่งจะรีสตาร์ท mysql ด้วย การใช้--quietแฟล็กเพียงระบุคำสั่งเพื่อส่งคืนรหัสสถานะเท่านั้นไม่ส่งออกอะไรไปที่หน้าจอ หากคุณเลือกแฟล็ก--quietคุณจะเห็นเอาต์พุตสถานะเป็นอย่างใดอย่างหนึ่งactiveหรือinactive.

คุณยังสามารถสร้างพื้นที่สว็อปเพื่อเพิ่มทรัพยากร RAM ที่มีให้กับเซิร์ฟเวอร์ของคุณเช่น:

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. เพิ่ม RAM จริง การเพิ่ม RAM เพิ่มเติม 1GB จะช่วยแก้ปัญหาได้

  2. จัดสรรพื้นที่ SWAP โดยใช้การเปลี่ยนแปลงการกำหนดค่าด้านล่าง:

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
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.