O MySQL não pode abrir arquivos após a atualização do servidor: errno: 24

16

Ubuntu: 12.04 LTS (Linux mysql02 3.2.0-40-generic # 64-Ubuntu SMP segunda-feira, 25 de março 21:22:10 UTC 2013 x86_64 x86_64 x86_64 GNU / Linux)

MySQL: Ubuntu distro 5.5.31

Apparmor: REMOVIDO!

O servidor está funcionando muito bem há mais de um ano. Então, nesta segunda-feira, o MySQL começou a falhar. Uma atualização causou o problema e não podemos descobrir o que é. Até tentamos reverter para o MySQL 5.5.30, mas sem sorte. Voltamos às 5.5.31.

Entradas do log de erros do MySQL:

130430  7:55:46 [ERROR] Error in accept: Too many open files
130430  7:55:46 [ERROR] /usr/sbin/mysqld: Can't open file: './eci_elite_test/fclvod.frm' (errno: 24)
130430  7:55:46 [ERROR] /usr/sbin/mysqld: Can't open file: './eci_elite_test/fcnote.frm' (errno: 24)
130430  7:55:47 [ERROR] /usr/sbin/mysqld: Can't open file: './eci_elite_test/ffcont.frm' (errno: 24)
130430  7:55:47 [ERROR] /usr/sbin/mysqld: Can't open file: './eci_elite_test/ffcontv.frm' (errno: 24)
130430  7:55:47 [ERROR] /usr/sbin/mysqld: Can't open file: './eci_elite_test/ffnote.frm' (errno: 24)
130430  7:55:47 [ERROR] /usr/sbin/mysqld: Can't open file: './eci_elite_test/frcfcl.frm' (errno: 24)

Parece que estamos enfrentando um problema ulimit. Removemos completamente o APPARMOR. Aumentamos o /etc/security/limits.conf e ainda não temos sorte:

# Out of desperation....
* soft  nofile  49152
* hard  nofile  65536

# No effect!?!!?
#mysql  soft  nofile  49152
#mysql  hard  nofile  65536

E para mostrar o limits.conf está funcionando:

root@mysql02:/etc/security# ulimit -Sa | grep "open files"
open files                      (-n) 49152

root@mysql02:/etc/security# ulimit -Ha | grep "open files"
open files                      (-n) 65536

E aqui estão as entradas importantes no my.cnf

[mysqld_safe]
open_files_limit = 16384

[mysqld]
open_files_limit = 16384

Contudo:

root@mysql02:/etc/mysql# mysqladmin -u root -pThePassword variables| grep open_files_limit
open_files_limit                                  | 1024

Estamos totalmente perplexos e deprimidos. Qualquer ajuda seria muito apreciada.

furgão
fonte
11
Que mensagens de erro existem nos logs ANTES da mensagem sobre muitos arquivos abertos? Você reiniciou o mysqld desde que mudou o open_files_limit, certo?
30513 Bert
Sim, nós reiniciamos o MySQL toda vez que fazemos alterações. Temos uma tabela que está sendo relatada como ausente (e é por algum motivo): 30430 8:36:39 InnoDB: Erro: tentando abrir uma tabela, mas não foi possível InnoDB: abrir o arquivo do espaço de tabela './oti_lw_prod/apinvoice_charges .ibd '!
Van
Para sua informação, movemos nossos usuários para nosso outro mestre (configuração de mestre de duelos) sever (01) e agora está exibindo exatamente os mesmos sintomas. Ele (01) tinha a mesma configuração exata que este servidor com falha (02) e é nosso mestre de failover, caso este (02) morra. Bem, muito para esse plano. Temos certeza de que este é um problema do sistema operacional.
Van
Tenho certeza de que isso não funcionou para o pôster original, mas para mim isso aconteceu após uma atualização de segurança, e reiniciar o mysql foi suficiente.
Kzqai

Respostas:

19

Implementações do SO: Ubuntu (Debian)

MySQL Server Option: limite de arquivos abertos

Parece que o upstart Debian não usa os parâmetros definidos em /etc/security/limits.conf , então, quando você inicia o mysql através do comando service (e, portanto, no upstart), ele substitui os limites definidos e usa o padrão 1024 .

A solução é modificar o arquivo mysql.conf que define o serviço inicial, localizado em /etc/init/mysql.conf e adicionar as seguintes linhas antes do bloco de pré-inicialização :

# NB: Upstart scripts do not respect
# /etc/security/limits.conf, so the open-file limits
# settings need to be applied here.
limit nofile 32000 32000
limit nproc 32000 32000

Referências:

furgão
fonte
Decepcionante isso não está documentado claramente em algum lugar. :( Nós apenas Aconteceu no post de David em serverfault.
Van
E este não é um bug, de acordo com esta: bugs.launchpad.net/mysql-server/+bug/938669
Van
Isso pode se tornar repentino e alarmante após a adição de partições às tabelas, o que pode causar um aumento nos arquivos abertos.
Markdwhite 17/02
Isso funcionou para mim no Ubuntu 15.10. Após atualizar pacotes tem toneladas de 'Não é possível abrir arquivo' mensagens de erro, que quebrou todos os meus sites: (... Graças um milhão por me salvar um monte de dor de cabeça e tempo.
Emmanuel
alguém pode explicar o que é o bloco "pre-start"? Estou correndo Ubuntu 16 e tendo esta questão, mas o arquivo de configuração parece diferente do que ele fez anteriormente
billynoah
4

Teve o mesmo problema no Ubuntu 15.10.

https://bugs.launchpad.net/ubuntu/+source/mysql-5.6/+bug/1434758 - trouxe a solução:

  1. verifique se /lib/systemd/system/mysql.service ou /lib/systemd/system/mysqld.service existe
  2. (no meu caso), se não, crie /lib/systemd/system/mysql.service e copie o conteúdo deste arquivo https://bugs.launchpad.net/ubuntu/+source/mysql-5.6/+bug/1434758/ comments / 11 e adicione as duas linhas em algum lugar do arquivo

    LimitNOFILE=infinity
    LimitMEMLOCK=infinity
    
  3. se houver um ou ambos os arquivos, verifique se essas duas linhas estão incluídas:

    LimitNOFILE=infinity
    LimitMEMLOCK=infinity
    
  4. executar systemctl daemon-reload

... e tudo deve ficar bem.

Hendrik Eggers
fonte
1

Como nenhuma das opções acima corrigiu o problema para mim (apenas levou o sistema a ficar sem memória), aqui está a solução que encontrei:

Em /etc/mysql/my.confvocê precisa aumentar MySQLs open_files_limit interno. Então, adicione isso temporariamente à configuração e reinicie o MySQL.

[mysqld]
open_files_limit = 100000

sudo /etc/init.d/mysql restart

Após executar a operação que apresenta o erro de muitos arquivos abertos , você pode alterar sua configuração para o padrão e reiniciar o MySQL novamente.

mniess
fonte
Isso funcionou para mim no Ubuntu 16.04, graças :)
Richard Frank
0

Obrigado pela solução alternativa. Mas para mim, a questão foi ofuscada pelos outros dois fatos.

  1. Meu diretório de dados é diferente da instalação padrão. Por várias razões, históricas e técnicas.
  2. Eu estava atualizando a partir de uma instalação muito antiga, que passou por várias portas de entrada e saída. No primeiro início de um MySQL 5.5 recém-instalado, o mecanismo InnoDB não foi ativado (a implementação interna foi desativada no arquivo de configuração, mas o plug-in disponível nas versões anteriores não está presente no 5.5) e a marca de atualização foi criada sem realmente atualizar quaisquer mesas.

Depois de corrigir o problema do InnoDB, ele ainda estava cuspindo

mysql> SHOW DATABASES;
ERROR 1018 (HY000): Can't read dir of '.' (errno: 24)

Eu tive que iniciar o mysqld no console raiz e reiniciar manualmente

/usr/bin/mysql_upgrade --defaults-extra-file=/etc/mysql/debian.cnf --force

Em seguida, o servidor começou a mostrar bancos de dados, mas não conseguiu acessar algumas das tabelas. Sua solução alternativa com limites aumentados corrigiu o restante dos problemas, obrigado!

AnrDaemon
fonte