Tenho criado um micro servidor instância no EC2 com base no que eu li aqui
O servidor mysql falha frequentemente e pela terceira vez o servidor mysql desapareceu. Os logs mostram apenas
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
O que é realmente failed; errno 12
? E como eu poderia dar mais espaço / memória ou o que fosse necessário para fazer isso corrigido.
Eu corrijo isso todas as vezes, reiniciando todo o sistema, excluindo todos os logs e reiniciando o servidor mysql. Mas eu sei que algo está errado com minha configuração.
Além disso, meu `my.cnf 'é como abaixo:
[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
mysql
amazon-ec2
Pmoubed
fonte
fonte
Respostas:
Eu encontrei o mesmo problema quando tentei executar um wordpress na minha microinstância sem RDS.
Adicionar uma página de troca resolveu o problema para mim.
Você pode seguir as etapas abaixo para configurar o espaço de troca.
Se ainda não funcionar para você, considere usar o serviço RDS.
===================================================
Copiei o conteúdo do blog para registro. O crédito vai para o autor do blog pmoubed :
Espaço de troca de microinstância do Amazon EC2 - Linux
Eu tenho uma instância do Amazon EC2 Linux Micro. Como as microinstâncias têm apenas 613 MB de memória, o MySQL travava de vez em quando. Depois de uma longa pesquisa sobre MySQL, Microinstância e Gerenciamento de Memória, descobri que não há espaço SWAP padrão para Microinstância. Portanto, se você quiser evitar o travamento, pode precisar configurar um espaço de troca para sua microinstância. Na verdade, em termos de desempenho, é melhor habilitar a troca.
As etapas abaixo mostram como fazer um espaço de troca para sua microinstância. Presumo que você tenha uma conta AWS com uma microinstância em execução.
dd if=/dev/zero of=/swapfile bs=1M count=1024
mkswap /swapfile
swapon /swapfile
/swapfile swap swap defaults 0 0
a/etc/fstab
A etapa 4 é necessária se você deseja habilitar automaticamente o arquivo de troca após cada reinicialização.
Alguns comandos úteis relacionados ao espaço SWAP:
Referências:
fonte
Eu também tive esse problema em uma microinstância do Amazon EC2. Tentei diminuir o uso de memória do inno_db adicionando o seguinte ao
/etc/my.cnf
Isso não funcionou, eu tentei diminuir para 16M e ainda não funcionou. Então percebi que a instância tinha basicamente zero memória livre. Tentei reiniciar o apache
E tudo funcionou bem. Talvez outra solução seja configurar o apache para não consumir tanta memória de alguma forma.
fonte
Parece que você está solicitando 128 MB de memória para innodb_buffer_pool_size no arquivo my.cfg que você mostra na postagem, mas o MySQL acha que você está pedindo 512 MB de memória:
Algumas linhas abaixo, a mensagem de erro informa que o MySQL não iniciará porque não pode reservar memória suficiente (512M) para o buffer pool do InnoDB:
Isso levanta três questões:
Você pode responder 1.
Quanto a 2., existem alguns lugares diferentes onde os arquivos de opções do MySQL podem ser localizados. Os arquivos encontrados posteriormente substituem as opções especificadas nos arquivos encontrados anteriormente. Vejo
http://dev.mysql.com/doc/refman/5.5/en/option-files.html
O problema 3. pode ser devido a uma condição de falta de memória que ocorre algum tempo após a inicialização. Você deve ver uma indicação disso nos registros, se for esse o caso.
Finalmente, mas de forma algo não relacionado, você está usando instâncias apoiadas pelo EBS? Isso geralmente é altamente recomendado para servidores de banco de dados (na verdade, para qualquer instância, exceto circunstâncias especiais). Para mais informações, consulte
https://stackoverflow.com/a/3630707/141172
fonte
Para mim, exatamente esse problema foi corrigido adicionando um volume de swap à minha instância EC2. Meus serviços estavam simplesmente consumindo toda a memória da caixa e travavam. Não é algo que eu estava acostumado, sendo um administrador RedHat / CentOS por anos - o Anaconda faz MUITOS trabalhos que a instância gratuita do Ubuntu EC2 não faz.
Simplesmente criei um volume de 2 Gb por meio do console da web, anexei-o à minha instância e fiz "mkswap / dev / [qualquer]", editei / etc / fstab e o travamento parou.
Essas instâncias NÃO são instaladas como uma instalação de sistema operacional baseada em mídia com a qual a maioria de nós está acostumada - é despojada, sem pacotes, sem sistema de arquivos adequado e coisas como AppArmor, que causam todos os tipos de problemas se você não estiver ciente disso e / ou não sei como configurá-lo.
fonte
O problema é que o servidor não tem memória suficiente para alocar para o processo MySQL. Existem algumas soluções para esse problema.
(1) Aumente a RAM física. Adicionar 1 GB de RAM adicional resolverá o problema. (2) Alocar espaço SWAP. A instância do Digital Ocean VPS não está configurada para usar o espaço de troca por padrão. Ao alocar 512 MB de espaço de troca, conseguimos resolver este problema. Para adicionar espaço de troca ao seu servidor, siga as seguintes etapas:
Reduza o tamanho do buffer pool do MySQL
Verifique também o espaço em disco. Certifique-se de ter espaço suficiente.
fonte
RESPOSTA FÁCIL:
RESPOSTA DETALHADA:
Esta é uma questão importante, especialmente para pessoas que usam um VPS muito pequeno, digamos 1 GB de RAM ou menos. Se o MySQL estiver caindo, pode ser um problema com a configuração do servidor (Apache | nginx) ou configuração do MySQL. Ataques DOS podem causar um aumento no uso de recursos do sistema (veja a imagem). O resultado final é que o processo do MySQL é encerrado pelo Kernel. Para uma solução de longo prazo, você deve olhar para otimizar suas configurações do Apache ou MySQL.
Existem várias outras discussões sobre os tópicos do Stack Overflow, bem como o manual do MySQL e o Percona Blog:
Manual do MySQL - Como o MySQL usa memória:
https://dev.mysql.com/doc/refman/8.0/en/memory-use.html
Percona - Melhores práticas para configurar o uso ideal da memória MySQL:
https://www.percona.com/blog/2016/05/03/best-practices-for-configuring-optimal-mysql-memory-usage/
Como otimizar o desempenho do MySQL usando o MySQLTuner:
https://www.linode.com/docs/databases/mysql/how-to-optimize-mysql-performance-using-mysqltuner/
Configuração de uso de memória Apache:
/server/254436/apache-memory-usage-optimization
Manual Apache sobre ajuste de desempenho:
https://httpd.apache.org/docs/2.4/misc/perf-tuning.html
Ajustando o servidor Apache:
https://www.linode.com/docs/web-servers/apache-tips-and-tricks/tuning-your-apache-server/
No entanto, com relação à sua pergunta original, sim, você pode criar um script de solução temporária que verifica se o serviço MySQL está carregado e ativo e irá reiniciar o MySQL se não estiver carregado e ativo.
Você não mencionou qual sistema operacional está usando. Isso ajudaria a dar a você um comando específico. Vou te dar um exemplo para CentOS linux.
Observe a seguinte saída do comando
systemctl status mysql
. Você pode ver na parte superior que o serviço está carregado e ativo .Se o serviço não estiver carregado, um comando como:
fará o truque de reiniciar o processo. Você poderia cron que:
No entanto, caso o mysql seja carregado , mas o serviço não esteja ativo , seu cron não fará nada. Portanto, você deve usar um comando mais detalhado, como:
* * * * * systemctl is-active --quiet mysqld || systemctl restart mysqld
Nesse caso, se o serviço estiver carregado, mas inativo , como o estado em que um ataque DOS pode deixar seu serviço mysql, o comando também reiniciará o mysql. Usar o
--quiet
sinalizador apenas especifica o comando apenas para retornar um código de status, sem exibir nada na tela. Se você omitir o--quiet
sinalizador, verá uma saída de status deactive
ouinactive
.Você também pode criar algum espaço de troca para adicionar mais recursos de RAM disponíveis ao seu servidor, como:
fonte
Use qualquer uma das seguintes soluções:
Aumente a RAM física. Adicionar 1 GB de RAM adicional resolverá o problema.
Aloque espaço SWAP usando as alterações de configuração abaixo:
config
fonte