Ao configurar
innodb_fast_shutdown=0
O MySQL descarta todas as transações incompletas antes de desligar/travar. O valor padrão é 1
, o que é compreensível para preservar transações incompletas.
No entanto, no modo de recuperação (por exemplo, innodb_force_recovery = 6
), o MySQL trata todas as transações incompletas como confirmadas. Isso obviamente danifica a mesa, pois as transações estão incompletas.
Qual é o propósito de preservar transações incompletas quando danifica a tabela inteira?
Se for necessário em alguns casos, por que não innodb_force_recovery
tem a opção de simplesmente descartar todas as transações incompletas (quando não podem ser confirmadas) como innodb_fast_shutdown=0
salvar a tabela? Ou eu estou esquecendo de alguma coisa?
innodb_fast_shutdown
controla o buffer de alteração, não o log de redo. Não importa o valor deinnodb_fast_shutdown
é, se uma transação não foi confirmada no momento do desligamento, ela não sobreviverá ao reinício.Se uma transação foi confirmada, se ela persistirá depende de
innodb_flush_log_at_trx_commit
. Se for o padrão 1, a transação persistirá. Se != 1, pode não persistir.Agora,
innodb_force_recovery
. Aqui está o que é possível. Quando você executa um UPDATE em uma transação, o novo registro é gravado em uma página (no buffer pool, a página fica suja). Mais tarde, a página de dados pode ser liberada para o disco mesmo que a transação ainda não tenha sido confirmada. Quando você tem que usarinnodb_force_recovery
isso significa que você está pronto para sacrificar a consistência dos dados (é o que você chama de tabela danificada?) apenas para obter alguns dados de volta. Cominnodb_force_recovery=6
o InnoDB tenta salvar o máximo de dados possível. Ele não pode concluir o processo de recuperação de falhas, mas o novo registro já está gravado na página - por que não disponibilizá-lo para um usuário?innodb_force_recovery
os valores de 1 a 5 devem ser tentados antes de recorrer a "6". Eles fazem menos "dano".O Change Buffer é uma espécie de "cache de gravação" para atualizar blocos de índice. Ele fornece velocidade
INSERTs/UPDATEs/DELETEs
ao atrasar tanto a leitura quanto a gravação de blocos para índices secundários. Mais especificamente, nem a leitura nem a gravação precisam ser feitas para índices não exclusivos durante essas consultas. Mas eles devem ser feitos eventualmente. E as 'mudanças' podem, em alguns casos, ser significativamente "agrupadas" para eficiência.Liberar ao desligar significa fazer todas as leituras, modificações e gravações para atualizar talvez milhares de blocos de índice. Mas a inicialização será mais rápida.
Esperar até o reinício significa descobrir o que se perdeu e reconstruí-lo.
Um compromisso que algumas pessoas usam é diminuir gradualmente
innodb_change_buffer_max_size
(padrão = 25, significando porcentagem de buffer_pool) para liberar o buffer de alteração gradualmente. Isso permite que o desligamento e a inicialização sejam relativamente "rápidos".A eliminação de transações incompletas é independente do
innodb_fast_shutdown
. Afeta apenas se eles forem revertidos antes do desligamento ou na recuperação na inicialização.innodb_force_recovery de >= 4 tem um comentário 'Este valor pode corromper permanentemente os arquivos de dados' no manual . Uma vez que você chegou a este nível, apenas seja grato se você receber algo de volta :-).