Amazon EC2, mysql başlatılıyor çünkü InnoDB: mmap (x bayt) başarısız oldu; hata 12


95

Burada okuduklarıma göre EC2 üzerinde bir mikro örnek sunucusu kurdum

mysql sunucusu sık sık başarısız oluyor ve üçüncü kez mysql sunucusu yok oluyor. Günlükler yalnızca şunu gösterir:

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

Gerçekten failed; errno 12nedir? Ve nasıl daha fazla alan / bellek veya bunu düzeltmek için ne gerekiyorsa verebilirim.

Bunu her seferinde tüm sistemi yeniden başlatıp tüm günlükleri silerek ve mysql sunucusunu yeniden başlatarak düzeltirim. Ama konfigürasyonumda bir sorun olduğunu biliyorum.

Ayrıca benim my.cnf'm aşağıdaki gibidir:

[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 mikro örneğimde de aynı sorunu yaşıyorum. İnnodb_buffer_pool_size = 128M ayarlamayı denediniz ve nasıl gittiğini göreceksiniz.
swxxii

Mikro örnek kullanıyorsanız, takas alanı eklemeniz gerekebilir: prowebdev.us/2012/05/amazon-ec2-linux-micro-swap-space.html
pmoubed

1
EC2 mikro Bulut Sunucularında varsayılan olarak HİÇBİR takas alanı yoktur ve manuel olarak ayarlanması gerekir. Aksi takdirde, bellek yetersizliğinden dolayı çok sayıda MySQL çökmesi görebilirsiniz.
pmoubed

Yanıtlar:


163

Mikro örneğimde RDS olmadan bir wordpress çalıştırmaya çalıştığımda da aynı problemle karşılaştım.

Bir Takas sayfası eklemek sorunu benim için çözdü.

Takas alanını ayarlamak için aşağıdaki adımları takip edebilirsiniz.

Hala işinize yaramazsa, RDS hizmetini kullanmayı düşünün.

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

Kayıt için blogun içeriğini kopyaladım. Kredi blog yazarına gider pmoubed :

Amazon EC2 Mikro Bulut Sunucusu Takas Alanı - Linux

Bir Amazon EC2 Linux Micro bulut sunucum var. Mikro örnekler yalnızca 613 MB belleğe sahip olduğundan, MySQL ara sıra çöküyordu. MySQL, Micro Instance ve Memory Managment hakkında uzun bir araştırmadan sonra, Micro instance için varsayılan SWAP alanı olmadığını öğrendim. Dolayısıyla, çökmeyi önlemek istiyorsanız, mikro örneğiniz için bir takas alanı kurmanız gerekebilir. Aslında performans açısından, değişimi etkinleştirmek daha iyidir.

Aşağıdaki adımlar, Micro örneğiniz için nasıl takas alanı oluşturacağınızı gösterir. Mikro bulut sunucusu çalıştıran AWS Hesabınız olduğunu varsayıyorum.

  1. Çalıştırmak dd if=/dev/zero of=/swapfile bs=1M count=1024
  2. Çalıştırmak mkswap /swapfile
  3. Çalıştırmak swapon /swapfile
  4. Bu satırı ekleyin /swapfile swap swap defaults 0 0etmek/etc/fstab

Her yeniden başlatmanın ardından takas dosyasını otomatik olarak etkinleştirmek istiyorsanız 4. adım gereklidir.

SWAP alanıyla ilgili bazı yararlı komutlar:

$ swapon -s   
$ free -k

$ swapoff -a
$ swapon  -a

Referanslar:

  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/

Teşekkürler! Bu bana yardımcı oldu!
Geri al

8
Bilginize, bu benim için Dijital Okyanus damlasında (512 MB) çalıştı. Bunun kimseyi şaşırtmaması gerektiğinden değil, ancak emin olmayan birinin olması durumunda, muhtemelen aynı sorunları olan herhangi bir sunucuda çalışacaktır.
jfacemyer

Bu hayat kurtarıcı için teşekkürler! Ayrıca Ubuntu Sunucusu ile bir mikro örnek çalıştırıyordu.
ECC-Dan

4
Digital Ocean kullanıcıları için, bu öğreticiyi takip ettim ve bir cazibe gibi çalıştı: digitalocean.com/community/articles/…
Chris Ray

Çok teşekkürler. Son 24 saattir saçlarımı koparıyorum, her türlü tampon / önbellek / sorgu boyutuyla oynadım .. Sen bir hayat kurtarıcısın!
pranshus

24

Bu sorunu bir Amazon EC2 mikro bulut sunucusunda da yaşadım. Aşağıdakileri ekleyerek inno_db'nin bellek kullanımını azaltmayı denedim/etc/my.cnf

innodb_buffer_pool_size = 64 milyon

Bu işe yaramadı, 16M'ye düşürmeyi denedim ve yine de işe yaramadı. Sonra, örneğin temelde sıfır boş belleğe sahip olduğunu fark ettim. Bu yüzden apache'yi yeniden başlatmayı denedim

sudo sistemi httpd yeniden başlat
sudo sistemi mysqld yeniden başlat

Ve her şey yolunda gitti. Belki başka bir çözüm, apache'yi bir şekilde çok fazla bellek tüketmeyecek şekilde yapılandırmaktır.


2
MySQL hala çökebilir, bu nedenle mikro örneğinize takas alanı eklemeniz gerekebilir.
pmoubed

Teşekkürler, mantıklı. Sanırım apache'nin üretebileceği iş parçacığı sayısını da sınırlamaya çalışabilirim.
wfbarksdale

Harika çalışıyor. Ben de bu sorunu yaşıyorum ve httpd'yi yeniden başlatarak sorunu çözdüm.
Lionel Chan

1
Harika av, aynı tekne burada. Apache'mi daha az ram kullanacak şekilde ayarladım ve ayrıca 512m'lik bir takas dosyası oluşturdum, ancak vm.swappiness'i 10'a ayarladım, böylece yalnızca bir tutamda kullanılacak.
newz2000

Nginx ve php-fpm'nin yeniden başlatılması da mysql'nin başlamasına izin verecek kadar bellek açığa çıkardı! Teşekkürler!
msEmmaMays

4

Gönderide gösterdiğiniz my.cfg dosyasındaki innodb_buffer_pool_size için 128M bellek istiyor gibi görünüyor , ancak MySQL 512M bellek istediğinizi düşünüyor :

Arabellek havuzu başlatılıyor, boyut = 512.0M

Birkaç satır aşağı, hata mesajı, InnoDB arabellek havuzu için yeterli (512M) bellek ayıramadığından MySQL'in başlamayacağını söyler:

Önemli hata: arabellek havuzu için bellek ayıramıyor

Bu üç soruya yol açar:

  1. Örneğinizde ne kadar bellek var? InnoDB'nin arabellek havuzu için kapmaya çalıştığı 512M InnoDB'nin yanı sıra MySQL'in ayırdığı diğer her şey, artı uygulamalarınız ve işletim sistemi için yeterli bellek olması gerekir mi?
  2. InnoDB neden düşündüğünüzden daha fazlasını almaya çalışıyor?
  3. MySQL neden yeniden başlıyor?

Cevap verebilirsin 1.

2.'ye gelince, MySQL seçenek dosyalarının bulunabileceği birkaç farklı yer vardır. Daha sonra bulunan dosyalar, önceden bulunan dosyalarda belirtilen seçenekleri geçersiz kılar. Görmek

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

Sorun 3., başlangıçtan bir süre sonra oluşan bir bellek yetersiz durumundan kaynaklanıyor olabilir. Durum böyleyse, günlüklerde daha sonra bunun bir göstergesini görmelisiniz.

Son olarak, ancak biraz ilgisiz, EBS destekli bulut sunucuları mı kullanıyorsunuz? Bu, genellikle veritabanı sunucuları için şiddetle tavsiye edilir (aslında, özel durumlar dışında herhangi bir durum için). Daha fazlası için bkz.

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


2

Benim için bu tam sorun EC2 bulut sunucuma bir takas hacmi eklenerek düzeltildi. Hizmetlerim kutudaki tüm belleği tüketiyordu ve çöküyordu. Yıllardır RedHat / CentOS yöneticisi olarak alışkın olduğum bir şey değil - Anaconda, ücretsiz Ubuntu EC2 bulut sunucusunun yapmadığı çok sayıda iş yapıyor.

Basitçe web konsolu aracılığıyla bir 2Gb birim oluşturdum, örneğime ekledim ve "mkswap / dev / [her neyse]" yaptım, / etc / fstab düzenledim ve çökme durdu.

Bu örnekler, çoğumuzun alışkın olduğu medya tabanlı bir işletim sistemi yüklemesi gibi KURULMUYOR - paket olmadan, uygun dosya sistemi olmadan ve AppArmor gibi şeylerle çıplak olarak çıkarılır ve farkında değilseniz her türlü soruna neden olur. ve / veya nasıl yapılandırılacağını bilmiyorum.


1

Sorun, sunucunun MySQL işlemi için ayırmak için yeterli belleğe sahip olmamasıdır. Bu sorunun birkaç çözümü var.

(1) Fiziksel RAM'i artırın. 1GB ek RAM eklemek sorunu çözecektir. (2) SWAP alanını tahsis edin. Digital Ocean VPS örneği, varsayılan olarak takas alanını kullanacak şekilde yapılandırılmamıştır. 512 MB takas alanı ayırarak bu sorunu çözmeyi başardık. Sunucunuza takas alanı eklemek için lütfen aşağıdaki adımları izleyin:

## 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 arabellek havuzu boyutunun boyutunu azaltın

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

Ayrıca lütfen Disk Alanınızı kontrol edin. Yeterli alanınız olduğundan emin olun.

df-h


1

KOLAY CEVAP:

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

DETAYLI CEVAP:

Bu, özellikle 1GB veya daha az RAM gibi çok küçük bir VPS kullanan kişiler için önemli bir sorudur. MySQL düşüyorsa, sunucu yapılandırmanızla (Apache | nginx) veya MySQL yapılandırmanızla ilgili bir sorun olabilir. DOS saldırıları, sistem kaynak kullanımlarında artışa neden olabilir (resme bakın). Sonuç, MySQL işleminin Çekirdek tarafından kapatılmasıdır. Uzun vadeli bir çözüm için Apache veya MySQL yapılandırmalarınızı optimize etmeye bakmalısınız.

Sistem kaynakları ani RAM artışına (18: 00'dan hemen önce) ve sistem kaynaklarında ani yükselişe neden olarak yalnızca Salı 18'de Gece Yarısı'nda bir CPU artışına neden oluyor

Stack Overflow bu konuların yanı sıra MySQL kılavuzu ve Percona Blog gibi başka tartışmalar da var:

MySQL Kılavuzu - MySQL Belleği Nasıl Kullanır:

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

Percona - En İyi MySQL Bellek Kullanımını Yapılandırmak İçin En İyi Uygulamalar:

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

MySQLTuner Kullanarak MySQL Performansını Optimize Etme:

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

Apache Bellek Kullanım Yapılandırması:

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

Performans Ayarlamayla İlgili Apache Kılavuzu:

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

Apache Sunucusunu Ayarlama:

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

Ancak, orijinal sorunuzla ilgili olarak, evet, MySQL hizmetinin yüklü ve etkin olup olmadığını kontrol eden ve yüklü ve etkin değilse MySQL'i yeniden başlatan geçici bir çözümün komut dosyası oluşturabilirsiniz.

Hangi işletim sistemini kullandığınızı söylemediniz. Bu size belirli bir komut vermenize yardımcı olur. CentOS linux için size bir örnek vereceğim.
Komutun aşağıdaki çıktısına bakın systemctl status mysql. En üstte servisin yüklü ve aktif olduğunu görebilirsiniz .

[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.

Hizmet yüklenmemişse, aşağıdaki gibi bir komut:

systemctl status mysqld || systemctl restart mysqld 

süreci yeniden başlatma hilesini yapacak. Bunu yapabilirsin :

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

Bununla birlikte, mysql'in yüklenmesi , ancak hizmetin aktif olmaması durumunda , cron'unuz hiçbir şey yapmayacaktır. Bu nedenle, aşağıdaki gibi daha ayrıntılı bir komut kullanmalısınız:

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

Bu durumda, bir DOS saldırısının mysql hizmetinizden çıkabileceği durumu gibi hizmet yüklüyse ancak etkin değilse , komut da mysql'yi yeniden başlatacaktır. --quietBayrağın kullanılması, yalnızca bir durum kodu döndürmek için komutu belirtir, ekrana hiçbir şey çıkarmaz. --quietBayrağı çıkarırsanız activeveya durum çıktısını görürsünüz inactive.

Sunucunuza aşağıdaki gibi daha fazla kullanılabilir RAM kaynağı eklemek için biraz takas alanı da oluşturabilirsiniz:

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

Aşağıdaki çözümlerden herhangi birini kullanın:

  1. Fiziksel RAM'i artırın. 1GB ek RAM eklemek sorunu çözecektir.

  2. Aşağıdaki yapılandırma değişikliklerini kullanarak SWAP alanını ayırın:

yapılandırma

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
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.