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-genérico # 64-Ubuntu SMP seg 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á em funcionamento há mais de um ano. Então esta segunda-feira o MySQL começou a falhar. Uma atualização causou o problema e não conseguimos descobrir o que é. Nós até tentamos reverter para o MySQL 5.5.30, mas sem sorte. Nós retornamos em 5.5.31.

Entradas do registro 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 correndo para o problema ulimit. Nós removemos o APPARMOR completamente. Nós 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 que 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 em my.cnf

[mysqld_safe]
open_files_limit = 16384

[mysqld]
open_files_limit = 16384

No entanto:

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

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

    
por Van 30.04.2013 / 14:17

4 respostas

19

SO: implementações do Ubuntu (Debian)

Opção do Servidor MySQL: open-files-limit

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

A solução é modificar o arquivo mysql.conf que define o serviço upstart, ele está localizado em /etc/init/mysql.conf e adiciona as seguintes linhas antes do bloco pré-início :

# 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:

por Van 30.04.2013 / 16:21
4

Tive o mesmo problema no Ubuntu 15.10.

link - trouxe a solução:

  1. verifique se /lib/systemd/system/mysql.service ou /lib/systemd/system/mysqld.service é existente
  2. (no meu caso) se não, crie /lib/systemd/system/mysql.service e copie o conteúdo para este arquivo link e adicione as duas linhas em algum lugar no arquivo

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

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

... e tudo deve ficar bem.

    
por Hendrik Eggers 31.01.2016 / 19:34
1

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

Em /etc/mysql/my.conf você precisa aumentar o open_files_limit interno do MySQL. Então adicione temporariamente isso à configuração e reinicie o MySQL.

[mysqld]
open_files_limit = 100000

sudo /etc/init.d/mysql restart

Depois de executar a operação que lhe dá o erro muitos arquivos abertos , você pode alterar sua configuração de volta ao seu padrão e reiniciar o MySQL novamente.

    
por mniess 13.04.2017 / 15:34
0

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

  1. Meu diretório de dados é diferente da instalação padrão. Por vários motivos, tanto históricos quanto técnicos.
  2. Eu estava atualizando de uma instalação muito antiga, que passou por várias portas de retorno e de encaminhamento. 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 plugin que estava disponível nas versões anteriores não está presente no 5.5) e a marca de upgrade foi criada sem atualizar quaisquer tabelas.

Após 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 root 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 maiores limites corrigiu o restante dos problemas, obrigado!

    
por AnrDaemon 28.01.2015 / 01:56