XOOPS Brasil

 

A.2. Erros Comuns Usando o MySQL

Esta seção lista alguns erros que os utilizadores obtém frequqntemente. Você encontrará descrições de erros e como resolvê-los aqui.

A.2.1. Erro: Access Denied

Veja mais informações sobre isto na Seção 4.3.12, “Causas dos Erros de Accesso Negado. Veja mais informações sobre isto na Seção 4.3.6, “Como o Sistema de Privilégios Funciona”.

A.2.2. Erro: MySQL server has gone away

Esta seção também cobre o erro relacionado sobre perda de conexão com o servidor durante uma consulta.

A razão mais comum para o erro MySQL server has gone away é que o servidor esgotou o tempo limite e fechou a conexão. Por padrão, o servidor fecha uma conexão depois de 8 horas se nada aconctecer. Você pode alterar o tempo limite configurando a variável wait_timeout quando você iniciar o mysqld.

Outra razão comum para receber o erro MySQL server has gone away é porque você executou um ``fechar'' em sua conexão MySQL a então tentou executar uma consulta na conexão fechada.

Se você tiver um script, você só tem que executar a consulta novamente para o cliente reconectar autometicamente.

Você normalmente pode obter os seguintes códigos de erros neste caso (qual você obterá dependerá do SO):

Código de erroDescrição
CR_SERVER_GONE_ERRORO cliente não pode enviar um pedido ao servidor.
CR_SERVER_LOSTO cliente não obteve um erro ao escrever no servidor, mas não obteve uma resposta completa (ou nenhuma resposta) a seu pedido.

Você também irá obter este erro se alguém tiver matado a thread em execução com kill #threadid#.

Você pode verificar que o MySQL não morreu executando mysqladmin version e examinando o tempo em execução. Se o problema é que o mysqld falhou você deve descobrir a razão da falha. Você deve neste caso iniciar verificando se executar a consulta novamente irá finalizar o MySQL novamente. Veja mais informações sobre isto na Seção A.4.1, “O Que Fazer Se o MySQL Continua Falhando”.

Você também pode obter estes erros se você enviar uma consulta incorreta ou muito grande ao servidor. Se mysqld recebe um pacote muito grande ou fora de ordem. ele assume que alguma coisa saiu errado com o cliente e fecha a conexão. Se você precisa de grandes consultas (por exemplo, se você está trabalhando com grandes colunas BLOB), você pode aumentar o limite da consulta iniciando o mysqld com a opção -O max_allowed_packet=# (padrão 1M). A memória extra é alocada sobre demanda, assim o mysqld alocará mais memória apenas quando você executar uma grande consulta ou quando o mysqld deve retornar um grande registro de resultado!

Você também obterá uma conexão perdida se você estiver enviando um pacote >= 16M e se seu cliente for mais antigo que a versão 4.0.8 e a versão do seu servidor é 4.0.8 e acima ou vice versa.

Se você quiser fazer um relatório de erros descreendo este prolema, esteja certo de ter incluído as seguintes informações:

Veja mais informações sobre isto na Seção 1.7.1.2, “Fazendo perguntas ou relatando erros”.

A.2.3. Erro: Can't connect to [local] MySQL server

Um cliente MySQL em Unix pode conectar ao servidor mysqld de dois modos diferentes: sockets Unix, que conectam através de um arquivo no sistema de arquivos (padrão /tmp/mysqld.sock) ou TCP/IP, que conecta através um número de porta. Sockets Unix são mais rápidos que TCP/IP mas só podem ser usados quando conectados ao servidor no mesmo computador. Sockets Unix são usados se você não especificar um nome de máquina ou se você especificar o nome de máquina especial localhost.

No Windows, se o servidor mysqld está rodando no 9x/Me, você só pode conectar via TCP/IP. Se o servidor estiver rodando no NT/2000/XP e o mysqld é iniciado com --enable-named-pipe, você também pode conectar com named pipes. O nome do named pipes é MySQL. Se você não der um nome de máquina quando conectar ao mysqld, um cliente MySQL tentará conectar primeiro ao named pipe, e se isto não funcionar ele irá conectar a porta TCP/IP. Você pode forçar o uso de named pipes no Windows usando . como nome de máquina.

O erro (2002) Can't connect to ... normalmente significa que não há um servidor MySQL rodando no sistema ou que você está usando um arquivo socket ou porta TCP/IP errado ao tentar conectar so servidor mysqld.

Inicie verificando (usando ps ou gerenciador de tarefas do Windows) que há um processo chamado mysqld executando em seu sistema! Se não houver nenhum processo mysqld, você deve iniciar um. Veja mais informações sobre isto na Seção 2.4.2, “Problemas Inicializando o Servidor MySQL”.

Se um processo mysqld estiver em execução, você pode verificar o servidor tentando estas diferentes conexões (o número da porta e o caminho do socket devem ser diferente em sua consiguração, é claro):

shell> mysqladmin version
shell> mysqladmin variables
shell> mysqladmin -h `hostname` version variables
shell> mysqladmin -h `hostname` --port=3306 version
shell> mysqladmin -h 'ip for your host' version
shell> mysqladmin --protocol=socket --socket=/tmp/mysql.sock version

Note o uso de aspas para traz em vez de aspas para frente com o comando hostname; isto provoca a saída de hostname (que é, o nome de máquina atual) para ser substituído no comando mysqladmin.

Aqui estão algumas razões pela quais o erro Can't connect to local MySQL server pode ocorrer:

  • mysqld não está rodando.

  • Você está rodando em um sistema que usa MIT-pthreads. Se você estiver executando em um sistema que não possui threads nativas, o mysqld usa o pacote MIT-pthreads. Veja mais informações sobre isto na Seção 2.2.3, “Sistemas Operacionais suportados pelo MySQL”. No entanto, nem todas as versões de MIT-pthreads suportam sockets Unix. Em um sistema sem suporte a sockets você sempre deve especificar o nome de máquina explicitamente ao conectar ao servidor. Tente usar este comando para verificar a conexão com o servidor:

    shell> mysqladmin -h `hostname` version
    

  • Alguém removeu o socket Unix que o mysqld utiliza (por padrão /tmp/mysqld.sock). Você deve ter um trabalho cron que remove o socket MySQL (por exemplo, um trbalhoque remove arquivos antigos do diretório /tmp). Você sempre pode executar mysqladmin version e verificar que o socket que o mysqladmin está tentando usar realmente existe. A correção neste caso é alterar o trabalho cron para não remover mysqld.sock ou para colocar o socket em outro local. Veja mais informações sobre isto na Seção A.4.5, “Como Proteger ou AlterarHow to Protect or Change the MySQL Socket File /tmp/mysql.sock.

  • Você iniciou o servidor mysqld com a opção --socket=/path/to/socket. Se você alterar o caminho do socket para o servidor, você também deve notificar o cliente MySQL sobre o novo caminho. Você pode fazer isto fornecendo o caminho do socket como um argumento para o cliente. Veja mais informações sobre isto na Seção A.4.5, “Como Proteger ou AlterarHow to Protect or Change the MySQL Socket File /tmp/mysql.sock.

  • Você está usando Linux e uma thread finalizou (core dumped). Neste caso você deve matar as outras threads mysqld (por exemplo, com o script mysql_zap antes de você poder iniciar um novo servidor MySQL. Veja mais informações sobre isto na Seção A.4.1, “O Que Fazer Se o MySQL Continua Falhando”.

  • Você pode não ter privilégios de leitura e escrita tanto no diretório que guarda o arquivo de socket quanto no próprio arquivo de socket. Neste caso você deve mudar o privilégio do diretório/arquivo ou reiniciar mysqld para que ele use um diretorio que você possa utilizar.

Se você obter a mensagem de erro Can't connect to MySQL server on alguma_maquina, você pode tentar o seguinte para descobrir qual é o problema:

  • Verifique se o servidor está funcionando fazendo telnet seu-servidor num-porta-tcp-ip e pressione Enter algumas vezes. Se houver um servidor MySQL em execução nesta porta você deve obter uma resposta que inclui o número da versão do servidor MySQL em execução. Se você obter um erro como telnet: Unable to connect to remote host: Connection refused, então não há nenhum servidor rodando na porta dada.

  • Tente conectar ao daemon mysqld na máquina local e verifique a porta TCP/IP que o mysqld está configurado para usar (variável port) com mysqladmin variables.

  • Verifique se o seu servidor mysqld não foi iniciado com a opção --skip-networking.

A.2.4. Erro: Client does not support authentication protocol

O MySQL 4.1 usa um protocolo de autenticação baseado em um algorítmo de hashing de senha que é incompatível com aquele usado por outros clientes. Se você atualizar o servidor para a versão 4.1, tentar se conectar a ele com um cliente mais antigo pode falhar com a seguinte mensagem:

shell> mysql
Client does not support authentication protocol requested
by server; consider upgrading MySQL client

Para resolver este problema você deve fazer um dos seguintes:

  • Atualizar todos os progrmas clientes para usar a biblioteca cliente 4.1.1 ou mais nova.

  • Use uma conta com uma senha antiga ao conectar em clientes anteriores ao 4.1.

  • Reset o utilizador que precisa de um cliente anterior ao 4.1 para usar a senha antiga:

    mysql> UPDATE user SET Password = OLD_PASSWORD('mypass')
    -> WHERE Host = 'some_host' AND User = 'some_user';
    mysql> FLUSH PRIVILEGES;
    

  • Diga ao servidor para usar o algoritmo de hashing de senha antigo:

    1. Inicie o mysqld com --old-passwords.

    2. Defina a senha para todos os utilizadores que tenham senha longa. Você pode encontrar estes utilizadores com:

      SELECT * FROM mysql.user WHERE LEN(password) > 16;
      

Para mais informações sobre hash de senha e autenticação, veja Seção 4.3.11, “Hashing de Senhas no MySQL 4.1”.

A.2.5. Erro: Host '...' is blocked

Se você obter um erro como este:

Host 'hostname' is blocked because of many connection errors.
Unblock with 'mysqladmin flush-hosts'

significa que o mysqld obteve diversos (max_connect_errors) pedidos de conexão da máquina 'hostname' e que foram interrompidos no eio. Depois de max_connect_errors pedidos com falhas o mysqld assume que algo está errado (como um attack de um cracker), e bloqueia o site para tais conexões até alguém executar o comando mysqladmin flush-hosts.

Por padrão, o mysqld bloqueia um host depois de 10 erros de conexão. Você pode facilmente ajustar isto iniciando o servidor assim:

shell> mysqld_safe -O max_connect_errors=10000 &

Note que se você obter esta mensagem de erro para uma dada máquina, você deve primeiramente verificar se não há nada errado com a conexão TCP/IP desta máquina. Se sua conexão TCP/IP não estiver funcionando, não será nada bom aumentar o valor da variável max_connect_errors!

A.2.6. Erro: Too many connections

Se você obter o erro Too many connections quando vacê tentar se conectar ao MySQL, isto significa que já existe max_connections clientes conectados ao servidor mysqld.

Se você precisar de mais conexões do que o padrão (100), então você deve reiniciar o mysqld com um valor maior para a variável max_connections.

Note que atualmente o mysqld permite que (max_connections+1) clientes se conectem. A última conexão é reservada para um utilizador com o privilégio SUPER. Ao não dar este privilégio a utilizadores normais (eles não precisam dele), um administrador com este privilégio pode logar e utilizar SHOW PROCESSLIST para descobrir o que pode estar errado. Veja mais informações sobre isto na Seção 4.6.8.6, “SHOW PROCESSLIST.

O número máximo de conexões MySQL depende de quão boa é a biblioteca de threads na dada plataforma. Linux ou Solaris devem estar aptos a suportar 500-1000 conexões simultâneas, dependendo de quanta RAM você tem e do que o cliente está fazendo.

A.2.7. Erro: Some non-transactional changed tables couldn't be rolled back

Se você obter o erro/aviso: Warning: Some non-transactional changed tables couldn't be rolled back ao tentar fazer um ROLLBACK, isto significa que algumas das tabelas que você utiliza na transação não suportam transações. Estas tabelas não transacionaisn não serão afetadas pela instrução ROLLBACK.

O caso mais comum em que isto acontece é quando você tenta criar uma tabela de um tipo que não é suportado por seu binário mysqld. Se o mysqld não suporta um tipo de tabela (ou se o tipo de tabela está disabilitado por uma opção de inicialização), ele criará a tabela com o tipo mais comumente usado em suas outras tabelas, que é provavelmente o MyISAM.

Você pode verificar o tipo de uma tabela fazendo:

SHOW TABLE STATUS LIKE 'nome_tabela'. Veja mais informações sobre isto na Seção 4.6.8.2, “SHOW TABLE STATUS.

Você pode verificar as extensão que seu binário mysqld suporta com:

show variables like 'have_%'. Veja mais informações sobre isto na Seção 4.6.8.4, “SHOW VARIABLES.

A.2.8. Erro: Out of memory

Se você executar uma consulta e obter algo como o seguinte erro:

mysql: Out of memory at line 42, 'malloc.c'
mysql: needed 8136 byte (8k), memory in use: 12481367 bytes (12189k)
ERROR 2008: MySQL client ran out of memory

note que o erro se refere ao cliente MySQL mysql. A razão para este erro é simplesmente que o cliente não possui memória suficente para armazenar todo o resultado.

Para solucionar o problema, primeiro verifique que sua consulta está correta. É razoável que você deva retornar tantos registros? Se for, você pode utilizar mysql --quick, que usa mysql_use_result() para retornar o resultado. Isto coloca menos carga no cliente (mas mais carga nop servidor).

A.2.9. Erro: Packet too large

Quando um cliente MySQL ou o servidor mysqld recebe um pacote maior que max_allowed_packet bytes, ele envia o erro Packet too large e fecha a conexão.

No MySQL 3.23 o maior pacote possível é 16M (devido a limites do protocolo cliente/servidor). No MySQL 4.0.1 e acima el só é limitado pela quantidade de memória que você tem no seu servidor (até um máximo teórico de 2GB).

Um pacote de conexão é uma única instrução SQL enviada ao servidor MySQL ou um única linha enviada para o cliente.

Quando um cliente MySQL ou o servidor mysqld obtem um pacote maior que max_allowed_packet bytes, ele envia o erro Packet too large e fecha a conexão. Com alguns clientes você também pode obter o erro Lost connection to MySQL server during query se o pacote de comunicação for muito grande.

Note que tanto o cliente quanto o servidor tem a sua própria variável max_allowed_packet. Se você quiser tratar os pacotes grandes, você tem que aumentar esta variável tanto no cliente quanto no servidor.

É seguro aumentar esta variável já que a memória só é alocada quando necessário; esta variável é mais uma precaução para pegar pacotes errados entre o cliente/servidor e também para assegurar que você use pacotes grandes acidentalemente e assim fique sem memória.

Se você estiver usando o cliente mysql, você pode especificar um buffer maior iniciando o cliente com mysql --set-variable=max_allowed_packet=8M. Outros clientes tem métodos diferentes de configurar esta variável. Por favor, note que --set-variable está obsoleta desde o MySQL 4.0, em seu lugar utilize --max-allowed-packet=8M.

Você pode utilizar o arquivo de opção para definir max_allowed_packet com um tamanho maior no mysqld. Por exemplo, se você está esperando armazenar o tamanho total de um MEDIUMBLOB em uma tabela, você precisará iniciar o servidor com a opção set-variable=max_allowed_packet=16M.

Você também pode obter problemas estranhos com pacotes grandes se você estiver usando blobs grandes, mas você não deu para mysqld accesso a memória suficiente para tratar a consulta. Se você suspeita que este é o caso, tente adicionar ulimit -d 256000 no inicio do script mysqld_safe e reinicie o mysqld.

A.2.10. Erros de Comunicação / Comunicação Abortada

A partir do MySQL 3.23.40 você só recebe o erro de Conexão abortada se você iniciar o mysqld com --warnings.

Se você encontar erros como o seguinte em seu log de erro.

010301 14:38:23 Aborted connection 854 to db: 'users' user: 'josh'

Veja mais informações sobre isto na Seção 4.10.1, “O Log de Erros”.

Isto significa que algum dos seguintes problemas ocorreu:

  • O programa cliente não chamou mysql_close() antes de sair.

  • O cliente tem esperado mais que wait_timeout ou interactive_timeout sem fazer nenhuma requisição. Veja mais informações sobre isto na Seção 4.6.8.4, “SHOW VARIABLES. Veja mais informações sobre isto na Seção 4.6.8.4, “SHOW VARIABLES.

  • O programa cliente finalizou abuptamente no meio de uma transferência.

Quando o descrito acima ocorrer, a variável Aborted_clients do servidor é incrementeda.

A variável Aborted_connects do servidor é incrementeda quando:

  • Quando um pacote de conexão não contém a informação correta.

  • Quando o utilizador não tiver privilégios para conectar ao banco de dados.

  • Quando o utilizador usar uma senha errada.

  • Quando levar mais de connect_timeout segundos para obter um pacote de conexão. Veja mais informações sobre isto na Seção 4.6.8.4, “SHOW VARIABLES.

Note que o descrito acima podia indicar que alguém está tentando derrubar o seu banco de dados.

Outras razões para problemas com Clientes abortados / Conexões abortadas.

  • O uso de protocolo Ethernet com Linux, tanto half quanto full duplex. Muitos drivers de Ethernet do Linux possui este bug. Você deve testá-lo transferindo um arquivo enorme via ftp entre estas duas máquinas. Se uma transferência entra no modo de estouro-pausa-esoturo-pausa... então você está experimentando uma síndorme de duplex no Linux A única solução é trocar o modo duplex, tanto da placa de rede quanto do Hub/Switch entre full duplex e half duplex e testar os resultados para decidir qual é a melhor configuração.

  • Alguns problemas com a biblioteca de threads interrompe uma leitura.

  • TCP/IP mal configurado.

  • Defeitos na rede, hub, switch, cabos, ... Isto pode ser diagnosticado de forma apropriada aomente através de reposição de hardware.

  • max_allowed_packet é muito pequeno ou a consulta exige memória livre que você alocou para mysqld. Veja mais informações sobre isto na Seção A.2.9, “Erro: Packet too large.

A.2.11. Erro: The table is full

exitem alguns casos diferentes nos quais você pode obter este erro:

  • Você está usando um versão mais antiga do MySQL (antes da 3.23.0) quando uma tabela temporária em memória se torna maior que tmp_table_size bytes. Para evitar este problema, você pode utilizar a opção -O tmp_table_size=# para fazer o mysqld aumentar o tamanho da tabela temporária ou usar a opção SQL SQL_BIG_TABLES antes de disparar a consulta problematica. Veja mais informações sobre isto na Seção 5.5.6, “Sintaxe de SET.

    Você também pode iniciar mysqld com a opção --big-tables. Isto é extamente o mesmo que usar SQL_BIG_TABLES para toadas as consultas.

    No MySQL Versão 3.23, se uma tabelas temporárias em memória se torna maior que tmp_table_size, o servido automaticamente a converte para tabelas em disco MyISAM.

  • Você está usando tabelas InnoDB e fica sem espaço no tablespace do InnoDB. Neste cado a solução é extender o tablespace do InnoDB.

  • Você está usando tabelas ISAM ou MyISAM em um SO que só suporta arquivos de 2G e você alcançou este limite para os arquivos de dado ou índice.

  • Você está usando tabelas MyISAM e o dado necessário ou tamanho do índice é maior que alqueles para os quais o MySQL alocou ponteiros. (Se você não especificar MAX_ROWS para CREATE TABLE o MySQL só alocará ponteriros para guardar 4G de dados).

    Você pode verificar o tamanho máximo do dados/índice fazendo

    SHOW TABLE STATUS FROM database LIKE 'nome_tabela';
    

    ou usando myisamchk -dv database/nome_tabela.

    Se este é o problema, você pode corrigí-lo fazendo algo como:

    ALTER TABLE nome_tabela MAX_ROWS=1000000000 AVG_ROW_LENGTH=nnn;
    

    Você só precisa especificar AVG_ROW_LENGTH para tabelas com campos BLOB/TEXT já que neste caso o MySQL não pode otimizar o espaço necessário baseado apenas no número de linhas.

A.2.12. Erro: Can't create/write to file

Se você obter um erro do tipo abaixo em suas consultas:

Can't create/write to file '\\sqla3fe_0.ism'.

significa que o MySQL não pode criar um arquivo temporário para o resultado no diretório temporário dado. (O erro acima é um mensagem de erro típica no Windows; a mensagem de erro do Unix é parecida.) A correção é iniciar o mysqld com --tmpdir=path ou adicionar ao seu arquivo de opção:

[mysqld]
tmpdir=C:/temp

assumindo que o diretórioe c:\\temp existe. Veja mais informações sobre isto na Seção 4.1.2, “Arquivo de Opções my.cnf.

Verifique também o código de erro que você obteve com perror. Outra razão pode ser um erro de disco cheio;

shell> perror 28
Error code 28: No space left on device

A.2.13. Erro no Cliente: Commands out of sync

Se você obter Commands out of sync; you can't run this command now no código de seu cliente, você está chamando funções do cliente na ordem errada.

Isto pode acontecer, por exemplo, se você está utilizando mysql_use_result() e tenta executar uma nova consulta antes de chamar mysql_free_result(). Isto também pode acontecer se você tentar executar duas consultas que retornam dados sem um mysql_use_result() ou mysql_store_result() entre elas.

A.2.14. Erro: Ignoring user

Se você obter o seguinte erro:

Found wrong password for user: 'some_user@some_host'; ignoring user

significa que quando o mysqld foi iniciado ou quando recarregiou a tabela de permissões, ele encontrou uma entrada na tabela user com uma senha inválida. Como resultado, a entrada é simplesmente ignorada pelo sistema de permissões.

As possíveis causas e correções para este problema:

  • Você pode executar uma nova versão do mysqld com uma tabela user antiga. Você pode verificar isto executando mysqlshow mysql user para ver se o campo da senha é menor que 16 caracteres. Se for, você pode corrigir esta condição executando o script scripts/add_long_password.

  • O utilizador tem um senha antiga (8 caracteres) e você não iniciou o mysqld com a opção --old-protocol. Atualize o utilizador na tabela user com uma nova senha ou reinicie o mysqld com --old-protocol.

  • Você especificou uma senha na tabela de utilizador user sem sar a função PASSWORD(). Use mysql para atualizar o utilizador na tabela user com uma nova senha. Utilize a função PASSWORD():

    mysql> UPDATE user SET password=PASSWORD('your password')
    -> WHERE user='XXX';
    

A.2.15. Erro: Table 'xxx' doesn't exist

Se você obter o erro Table 'xxx' doesn't exist ou Can't find file: 'xxx' (errno: 2), significa que não existem tabelas no banco de dados atual com o nome xxx.

Note que como o MySQL utiliza diretórios e arquivos para armazenar banco de dados e tabelas, o nome de banco de dados e tabelas são caso-sensitive! (No Windows o nome de banco de dados e tabelas não são caso-sensitivo mas todas as referências a uma dada tabela dentro de uma consulta devem utilizar o mesmo caso!)

Você pode verificar quais tabelas existem no banco de dados atual com SHOW TABLES. Veja mais informações sobre isto na Seção 4.6.8, “Sintaxe de SHOW.

A.2.16. Erro: Can't initialize character set xxx

Se você obtr um erro do tipo:

MySQL Connection Failed: Can't initialize character set xxx

significa que é um dos seguintes problemas:

  • O conjunto de caracter é multi-byte e você não tem suporte para o conjunto de caracteres no cliente.

    Neste caso você precisa recompilar o cliente com --with-charset=xxx ou com --with-extra-charsets=xxx. Veja mais informações sobre isto na Seção 2.3.3, “Opções típicas do configure.

    Todos os bionários MySQL padrões são compilados com --with-extra-character-sets=complex que habilita o suporte para todos os conjuntos de caracteres multi-byte. Veja mais informações sobre isto na Seção 4.7.1, “O Conjunto de Caracteres Utilizado para Dados e Ordenação”.

  • O conjunto de caracteres é simples e não foi compilado no mysqld e os arquivos de definição do conjunto de caracteres não estão localizados onde o cliente esperava encontrá-los.

    Neste caso você precisa:

    • Recompilar o cliente com suporte ao conjunto de caracteres. Veja mais informações sobre isto na Seção 2.3.3, “Opções típicas do configure.

    • Especificar para o cliente onde o arquivo de definição do conjuntos de caracteres está. Para muitos clientes você pode fazê-lo com a opção --character-sets-dir=path-to-charset-dir.

    • Copie o arquivo de definição de caracteres no caminho onde o cliente espera que eles estejam.

A.2.17. Arquivo Não Encontrado

Se você obter ERROR '...' not found (errno: 23), Can't open file: ... (errno: 24), ou qualquer outro erro com errno 23 ou errno 24 no MySQL, significa que você não alocou descritores de arquivo suficiente para o MySQL. Você pode usar o utilitário perror para obter uma descrição sobre o que o número de erro significa:

shell> perror 23
File table overflow
shell> perror 24
Too many open files
shell> perror 11
Resource temporarily unavailable

O problema aqui é que mysqld está tentando manter aberto muitos arquivos simultanemanete. Você pode também dizer para o mysqld não abrir muitos arquivos de uma vez ou aumentar o número de descritores de arquivos disponíveis para o mysqld.

Para dizer para o mysqld manter aberto poucos arquivos por vez, você pode tornar a cache de tabela menor usando a opção -O table_cache=32 para mysqld_safe (o valor padrão é 64). Reduzindo o valor de max_connections também reduzirá o número de arquivos abertos (o valor padrão é 90).

Para alterar o número de descritores de arquivos disponíveis para mysqld, você pode usar a opção --open-files-limit=# para mysqld_safe ou -O open-files-limit=# para mysqld. Veja mais informações sobre isto na Seção 4.6.8.4, “SHOW VARIABLES. O modo mais fácil de fazer isto é adicioar a opção ao seu arquivo de opção. Veja mais informações sobre isto na Seção 4.1.2, “Arquivo de Opções my.cnf. Se você tiver um versão antiga do mysqld que não suporte isto, você pode editar o script mysqld_safe. Existe uma linha ulimit -n 256 comentada no script. Você pode remover o caracter '#' para ``descomentar'' esta linha, e altere o número 256 para afetar o número de descritores de arquivos disponíveis para mysqld.

ulimit (e open-files-limit) podem aumentar o número de descritorese de arquivo, mas apenas até o limite imposto pelo sistema operacional. Também há um limite 'maior' que só pode ser sobrescrito se você iniciar o mysqld_safe ou mysqld como root (apenas se lembre que você também precisa usar a opção --user=... neste caso). Se você precisa aumentar o limite do SO no número dos descritores de arquivo disponíveis para cada processo, cosulte a documentacão para ser sistema operacional.

Note que se você rodar o shell tcsh, ulimit não funcioará! tcsh também relatará o valor incorreto quando você pergunta pelo limite atual! Neste caso você deve iniciar mysqld_safe com sh!