O Mysql travou e não inicia

11

Nosso servidor mysql de produção travou e não vai voltar. Está dando um erro de segfault. Eu tentei uma reinicialização e só não sei mais o que tentar. Aqui está o stacktrace:

140502 14:13:05 [Note] Plugin 'FEDERATED' is disabled.
InnoDB: Log scan progressed past the checkpoint lsn 108 1057948207
140502 14:13:06  InnoDB: Database was not shut down normally!
InnoDB: Starting crash recovery.
InnoDB: Reading tablespace information from the .ibd files...
InnoDB: Restoring possible half-written data pages from the doublewrite
InnoDB: buffer...
InnoDB: Doing recovery: scanned up to log sequence number 108 1058059648
InnoDB: 1 transaction(s) which must be rolled back or cleaned up
InnoDB: in total 15 row operations to undo
InnoDB: Trx id counter is 0 562485504
140502 14:13:06  InnoDB: Starting an apply batch of log records to the database...
InnoDB: Progress in percents: 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 
InnoDB: Apply batch completed
InnoDB: Starting in background the rollback of uncommitted transactions
140502 14:13:06  InnoDB: Rolling back trx with id 0 562485192, 15 rows to undo
140502 14:13:06  InnoDB: Started; log sequence number 108 1058059648
140502 14:13:06  InnoDB: Assertion failure in thread 1873206128 in file ../../../storage/innobase/fsp/fsp0fsp.c line 1593
InnoDB: Failing assertion: frag_n_used > 0
InnoDB: We intentionally generate a memory trap.
InnoDB: Submit a detailed bug report to http://bugs.mysql.com.
InnoDB: If you get repeated assertion failures or crashes, even
InnoDB: immediately after the mysqld startup, there may be
InnoDB: corruption in the InnoDB tablespace. Please refer to
InnoDB: http://dev.mysql.com/doc/refman/5.1/en/forcing-recovery.html
InnoDB: about forcing recovery.
140502 14:13:06 - mysqld got signal 6 ;
This could be because you hit a bug. It is also possible that this binary
or one of the libraries it was linked against is corrupt, improperly built,
or misconfigured. This error can also be caused by malfunctioning hardware.
We will try our best to scrape up some info that will hopefully help diagnose
the problem, but since we have already crashed, something is definitely wrong
and this may fail.

key_buffer_size=16777216
read_buffer_size=131072
max_used_connections=0
max_threads=151
threads_connected=0
It is possible that mysqld could use up to 
key_buffer_size + (read_buffer_size + sort_buffer_size)*max_threads = 345919 K
bytes of memory
Hope that's ok; if not, decrease some variables in the equation.

thd: 0x0
Attempting backtrace. You can use the following information to find out
where mysqld died. If you see no messages after this, something went
terribly wrong...
stack_bottom = (nil) thread_stack 0x30000
140502 14:13:06 [Note] Event Scheduler: Loaded 0 events
140502 14:13:06 [Note] /usr/sbin/mysqld: ready for connections.
Version: '5.1.41-3ubuntu12.10'  socket: '/var/run/mysqld/mysqld.sock'  port: 3306  (Ubuntu)
/usr/sbin/mysqld(my_print_stacktrace+0x2d) [0xb7579cbd]
/usr/sbin/mysqld(handle_segfault+0x494) [0xb7245854]
[0xb6fc0400]
/lib/tls/i686/cmov/libc.so.6(abort+0x182) [0xb6cc5a82]
/usr/sbin/mysqld(+0x4867e9) [0xb74647e9]
/usr/sbin/mysqld(btr_page_free_low+0x122) [0xb74f1622]
/usr/sbin/mysqld(btr_compress+0x684) [0xb74f4ca4]
/usr/sbin/mysqld(btr_cur_compress_if_useful+0xe7) [0xb74284e7]
/usr/sbin/mysqld(btr_cur_pessimistic_delete+0x332) [0xb7429e72]
/usr/sbin/mysqld(btr_node_ptr_delete+0x82) [0xb74f4012]
/usr/sbin/mysqld(btr_discard_page+0x175) [0xb74f41e5]
/usr/sbin/mysqld(btr_cur_pessimistic_delete+0x3e8) [0xb7429f28]
/usr/sbin/mysqld(+0x526197) [0xb7504197]
/usr/sbin/mysqld(row_undo_ins+0x1b1) [0xb7504771]
/usr/sbin/mysqld(row_undo_step+0x25f) [0xb74c210f]
/usr/sbin/mysqld(que_run_threads+0x58a) [0xb74a31da]
/usr/sbin/mysqld(trx_rollback_or_clean_all_without_sess+0x3e3) [0xb74ded43]
/lib/tls/i686/cmov/libpthread.so.0(+0x596e) [0xb6f9f96e]
/lib/tls/i686/cmov/libc.so.6(clone+0x5e) [0xb6d65a4e]
The manual page at http://dev.mysql.com/doc/mysql/en/crashing.html contains
information that should help you find out what is causing the crash.

Alguma recomendação?

    
por tilleryj 02.05.2014 / 21:20

3 respostas

21

Ai.

InnoDB: immediately after the mysqld startup, there may be
InnoDB: corruption in the InnoDB tablespace. Please refer to
InnoDB: http://dev.mysql.com/doc/refman/5.1/en/forcing-recovery.html
InnoDB: about forcing recovery.

esta parte: link

basicamente, faça um backup de suas tabelas com falhas. edite seu /etc/my.cnf e adicione

 innodb_force_recovery = 1

para ver se você pode entrar em seu banco de dados e obter seus dados / encontrar a tabela corrompida Geralmente quando isso acontece é uma reconstrução (pelo menos de uma tabela corrompida ou duas)

de link

  1. Pare o mysqld.
  2. Backup / var / lib / mysql / ib *
  3. Adicione a seguinte linha no /etc/my.cnf

innodb_force_recovery = 1 (eles sugerem 4, mas é melhor começar com 1 e incrementar se não for iniciado)

  1. Reinicie o mysqld.
  2. Descarregar todas as tabelas: # mysqldump -A > dump.sql
  3. Descarte todos os bancos de dados que precisam de recuperação.
  4. Pare o mysqld.
  5. Remover / var / lib / mysql / ib *
  6. Comente innodb_force_recovery em /etc/my.cnf
  7. Reinicie o mysqld. Veja o log de erros do mysql. Por padrão, deve ser /var/lib/mysql/server/hostname.com.err para ver como ele cria novos arquivos ib *.
  8. Restaurar bancos de dados do dump: mysql < dump.sql
por 02.05.2014 / 21:29
2

Eu estava enfrentando esse mesmo erro ao usar a imagem do docker mysql: 5.7. O principal erro foi tentar criar um usuário root que existe por padrão. Mais informações: link

Conforme fornecido no link acima, a solução era NÃO definir MYSQL_USER e MYSQL_PASSWORD nas variáveis de ambiente ao iniciar a imagem do docker.

    
por 27.05.2018 / 07:35
1

Isso aconteceu comigo em Laravel Homestead (Vagrant após um pânico no kernel rodando o Mac OS Sierra 10.12.4 (16E195):

$ lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description:    Ubuntu 14.04.3 LTS
Release:    14.04
Codename:   trusty

$ mysql -V
mysql  Ver 14.14 Distrib 5.7.9, for Linux (x86_64) using  EditLine 
wrapper

Aqui estão alguns recursos que você pode experimentar, embora nenhuma das opções de reparo funcionou para mim :

link

link

link

Eu tentei adicionar a recuperação forçada ao mysql config (comece em 1 e aumente progressivamente, pois números supostamente mais altos podem causar danos permanentes):

sudo nano /etc/mysql/my.cnf

[mysqld]
innodb_force_recovery = 1
#innodb-read-only=1
#innodb_purge_threads=0
#key_buffer_size=16M
#event-scheduler=disabled

Em outra janela, execute:

tail -f /var/log/mysql/error.log

Em seguida, tente reiniciar o mysqld com as várias opções ativadas:

sudo /etc/init.d/mysql restart

Se expirar, você poderá forçar a reinicialização dos processos do mysql com:

# process id is first column with number, just ignore lines with grep because they list the process running 'grep mysql'
ps aux | grep mysql
sudo kill -9 <process-id>
sudo /etc/init.d/mysql restart

Se funcionar, o log mostrará algo como:

Version: '5.7.9' socket: '/var/run/mysqld/mysqld.sock' port: 3306 MySQL Community Server (GPL)

Se falhar, o log mostrará algo como:

InnoDB: Assertion failure in thread 140049488692992 in file log0recv.cc line 1420

Quando o pior veio, tentei remover os bancos de dados que provavelmente estavam corrompidos:

sudo ls -alt /var/lib/mysql

Descobri que o banco de dados em que eu estava trabalhando era o mais recentemente modificado no topo da lista. Felizmente eu tive um despejo SQL para ele a partir daquele dia, então foi capaz de removê-lo:

sudo rm -rf /var/lib/mysql/<database_name>

Eu deixei todos os outros arquivos, e o mysql foi capaz de iniciar de qualquer maneira.

UPDATE: lembre-se de desabilitar innodb_force_recovery = 1 quando o mysql estiver funcionando novamente, senão você obterá erros quando tentar modificar bancos de dados e tabelas.

Depois, recriou o banco de dados com o Sequel Pro, reimportou meus dados e foi capaz de prosseguir sem ter que jogar fora todos os bancos de dados de meus outros projetos.

Indo adiante, devo supor que qualquer banco de dados mysql pode ser corrompido e tentar manter backups diários e ter o script de recreação do banco de dados documentado ou codificado em minhas ferramentas de integração contínua.

    
por 15.06.2017 / 04:04

Tags