Excluindo tabela MySQL com transações pendentes

10

Existe uma maneira de excluir uma tabela ou banco de dados do InnoDB com transações pendentes no MySQL (preferencialmente no nível do sistema de arquivos)?

O que aconteceu:

Eu uso o MySQL 5.5.28 e corri LOAD DATA INFILE…para importar um enorme conjunto de dados (300 milhões de linhas) para uma tabela do InnoDB. Eu não usei set autocommit = 0;antes. Infelizmente, mysqldfoi parado no meio da importação.

Quando eu reinicio mysql, ele tenta reverter a transação, preenchendo o log do sistema com mensagens como esta:

mysqld_safe [4433]: 121212 16:58:52 InnoDB: aguardando a conclusão de 1 transação ativa

O problema é que a reversão está em execução há mais de 25 horas, durante as quais mysqldnão está aceitando nenhuma conexão de soquete.

Não posso simplesmente excluir /var/lib/mysql/*e começar do zero, porque existem outros bancos de dados / tabelas do InnoDB nesta máquina também. No entanto, a tabela problemática é a única tabela em um banco de dados separado. Excluir a tabela inteira ou o banco de dados inteiro não é um problema, pois posso reimportar todos os dados posteriormente.

dasup
fonte

Respostas:

8

Não há nada que você possa realmente fazer porque uma reversão está sendo feita através do espaço de tabela UNDO no ibdata1 , que deveria ter crescido imensamente.

Se você interromper o processo do mysqld e reiniciar o mysql, ele simplesmente continuará onde parou como parte do ciclo de recuperação de falhas.

AVISO LEGAL: Não nos responsabilizamos pela perda de dados

O que você pode fazer pode resultar na perda de dados para outras tabelas, mas há algo que você pode fazer para contornar o ciclo normal de recuperação de falhas do InnoDB.

Existe uma opção de inicialização chamada innodb_force_recovery , que permite ignorar vários estágios da recuperação de falhas do InnoDB.

De acordo com a documentação do MySQL sobre como forçar a recuperação do InnoDB , aqui estão as configurações e seus efeitos:

1 (SRV_FORCE_IGNORE_CORRUPT)

Deixe o servidor funcionar mesmo se detectar uma página corrompida. Tente fazer o comando SELECT * FROM nome_tabela saltar sobre páginas e registros de índice corrompidos, o que ajuda a despejar tabelas.

2 (SRV_FORCE_NO_BACKGROUND)

Impedir a execução do encadeamento mestre. Se ocorrer uma falha durante a operação de limpeza, esse valor de recuperação o impede.

3 (SRV_FORCE_NO_TRX_UNDO)

Não execute reversões de transação após a recuperação de falhas.

4 (SRV_FORCE_NO_IBUF_MERGE)

Impedir operações de mesclagem de buffer de inserção. Se eles causariam um acidente, não os faça. Não calcule estatísticas da tabela.

5 (SRV_FORCE_NO_UNDO_LOG_SCAN)

Não olhe para desfazer logs ao iniciar o banco de dados: o InnoDB trata até mesmo transações incompletas como confirmadas.

6 (SRV_FORCE_NO_LOG_REDO)

Não faça o rollo de redo log em conexão com a recuperação.

Com as alterações transacionais ocultas nos logs UNDO e REDO, você corre o risco de

  • perda de dados destinados a serem gravados
  • mantendo os dados a serem excluídos

Caso você espere efeitos colaterais ruins, faça backup de todo o / var / lib / mysql e coloque-o em algum lugar, caso deseje copiar ibdata1, ib_logfile0 e ib_logfile1 e tente novamente a recuperação normal.

Se o mysql estiver totalmente ativo em um dos modos

  • mysqldump todos os dados, exceto a tabela incorreta
  • mysql de desligamento
  • remova tudo em / var / lib / mysql, exceto em / var / lib / mysql / mysql
  • inicie o mysql
  • recarregar o mysqldump

CAVEAT: Certifique-se de fazer backup de tudo !!!

Eu espero que isso ajude !!!

RolandoMySQLDBA
fonte
1

Eu tive uma situação semelhante esta semana.

E após quatro iterações de restauração de um backup completo em um servidor de teste e tentativa de eliminar, excluir ou eliminar as tabelas com as transações pendentes gigantes, chegamos à sexta-feira à tarde e decidimos deixá-lo em execução. Durante três dias, a transação foi concluída com carga insignificante do servidor e o banco de dados ficou bom. O que era muito melhor do que qualquer operação manual em arquivos .frm e tabelas mysql que tentaram e falharam.

Minha solução: não a exclua . Permita que as transações pendentes sejam concluídas, mesmo se você precisar adiar outras operações por alguns dias, encontrar algum espaço em disco em algum lugar ou deixar o servidor escravo carregar a carga.

andrew lorien
fonte