Você quer saber o papel do log de desfazer aqui

Hoje vamos apresentar o log de desfazer do mysql para lhe dar uma compreensão mais profunda de sua função.

0 1. Por que precisamos de log de desfazer?

Considere uma pergunta. Durante a execução de uma transação, antes que a transação seja confirmada, se o mysql travar, como reverter para os dados antes da transação?

Se registrarmos as informações necessárias para a reversão em um log todas as vezes durante a execução da transação, depois que ocorrer uma falha do mysql no meio da execução da transação, não precisamos nos preocupar em não poder reverter para os dados antes da transação .Podemos passar Este log reverte para os dados antes da transação. Além disso, quando o usuário solicita uma reversão com uma instrução de reversão, as informações de desfazer podem ser usadas para reverter os dados para o estado anterior à modificação.

O mecanismo para isso é o undo log (rollback log), que garante a atomicidade nas características ACID da transação.

Além da operação de reversão do log de desfazer, outra função é o MVCC. Quando o usuário lê uma linha de registros, se o registro foi ocupado por outras transações, a transação atual pode ler as informações da versão da linha anterior por meio de desfazer, para para obter leitura sem bloqueio.

A implementação do MVCC é por meio de exibição de leitura + log de desfazer, log de desfazer salva várias cópias de dados históricos para cada registro, formando uma cadeia de versão . (a exibição de leitura falará sobre MVCC na próxima vez).

0 2.Desfazer cadeia de versões de log

Quando sempre houver transações alterando a linha, os logs de desfazer serão gerados o tempo todo e uma cadeia de versão de log de desfazer será eventualmente formada.

Quais são as colunas ocultas na próxima linha antes de falar sobre a coluna da versão?

Em cada linha do banco de dados, além de armazenar dados reais, existem 3 colunas ocultas row_id, trx_id e roll_pointer .

row_id (número da linha )

Se a tabela atual tiver uma chave primária do tipo inteiro, row_id será o valor da chave primária.

Se não houver chave primária do tipo inteiro, o mysql selecionará um índice exclusivo do tipo inteiro não vazio como row_id de acordo com a ordem dos campos.

Se o mysql não o encontrar, ele gerará automaticamente um número inteiro de aumento automático como row_id.

trx_id (número da transação )

Antes de uma transação começar a ser executada, o mysql atribuirá um ID de transação global de auto-incremento à transação. Posteriormente, quando a transação adicionar, excluir e modificar a linha atual, ela registrará seu próprio id de transação em trx_id.

roll_pointer ( ponteiro de reversão )

Quando uma transação altera a linha atual, ela grava os dados antigos no log de desfazer e, em seguida, grava os novos dados na linha atual, e o roll_pointer da linha atual aponta para o log de desfazer agora, então a versão anterior de a linha pode ser encontrada através do roll_pointer .

Criamos uma tabela de pessoas usando a seguinte instrução

CREATE TABLE `person` (  `id` int(11) NOT NULL,  `name` varchar(255) DEFAULT NULL,  `age` int(11) DEFAULT NULL,  PRIMARY KEY (`id`)) ENGINE=InnoDB

Agora inicie a primeira transação, o ID da transação é 1, execute a seguinte instrução de inserção.

INSERT INTO `person`(`id`, `name`, `age`) VALUES (1, '张三', 18);

Em seguida, um diagrama esquemático da linha atual é o seguinte:

Como os dados foram inseridos recentemente, o log de desfazer apontado por seu roll_pointer está vazio.

Em seguida, inicie a segunda transação, atribua o ID da transação a 2 e execute o seguinte comando de modificação.

UPDATE`person` SET `name` = '李四' WHERE `id` = 1

Quando a terceira transação for iniciada e o ID da transação atribuído for 3, execute o seguinte comando de modificação.

UPDATE`person` SET `age` = '22' WHERE `id` = 1

Quando cada transação alterar a linha, um log de undo será gerado para salvar a versão anterior e, em seguida, o roll_pointer da nova versão apontará para o log de undo recém gerado.

Portanto, roll_pointer pode concatenar essas diferentes versões de logs de desfazer para formar uma cadeia de versão de log de desfazer .

0 3. Desfazer é um log lógico ou um log físico?

Os usuários geralmente têm um mal-entendido sobre desfazer. Desfazer é usado para restaurar fisicamente o banco de dados ao estado anterior à execução da instrução ou transação, mas não é realmente verdadeiro. Desfazer é um log lógico, portanto, apenas restaura os dados logicamente ao original estado . Todas as modificações são desfeitas logicamente, mas as próprias estruturas de dados e páginas podem ser muito diferentes após a reversão.

Por exemplo, uma transação está modificando alguns registros na página atual, enquanto outras transações estão modificando outros registros na mesma página. Portanto, não é possível reverter uma página para o início da transação, pois isso afetará o trabalho contínuo de outras transações.

Supondo que o usuário execute uma transação de inserção de 100 registros, esta transação fará com que um novo segmento seja alocado, ou seja, o espaço da tabela aumentará. Quando o usuário executar o rollback, a transação inserida será revertida, mas o tamanho do espaço de tabela não diminuirá.

Portanto, quando a transação é revertida, na verdade ela está fazendo o inverso do que fazia antes.

por exemplo:

  1. Para cada inserção, o mecanismo de armazenamento InnoDB conclui uma exclusão.

  2. Para cada exclusão, o mecanismo de armazenamento InnoDB executa uma inserção.

  3. Para cada atualização, o mecanismo de armazenamento InnoDB executa uma atualização reversa, colocando de volta a linha antes da modificação.

0 4. Como armazenar undolog?

O mecanismo de armazenamento InnoDB também usa segmentos para gerenciar desfazer . O mecanismo de armazenamento InnoDB possui um segmento de reversão e 1.024 segmentos de log de desfazer são registrados em cada segmento de reversão , e os aplicativos de página de desfazer são executados em cada segmento de log de desfazer.

A partir do InnoDB1.2, o segmento de rollback pode ser definido por meio de parâmetros. Esses parâmetros incluem:

  1. innodb_undo_directory é usado para definir o caminho onde o arquivo de segmento de reversão está localizado.

    O valor padrão desse parâmetro é ".". O diretório do mecanismo de armazenamento InnoDB atual, que é armazenado no espaço de tabela compartilhado (ibdataX), pode ser configurado para outros locais por meio desse parâmetro.

  2. innodb_undo_logs é usado para definir o número de segmentos de reversão, o valor padrão é 128.

  3. innodb_undo_tablespaces é usado para definir o número de arquivos que compõem o segmento de reversão.

    Dessa forma, o segmento de reversão pode ser distribuído uniformemente entre vários arquivos.

    Depois de definir esse parâmetro, você verá um arquivo prefixado com undo no caminho innodb_undo_directory, que representa o arquivo de segmento de rollback.

  4. innodb_undo_log_truncate (novo em 5.7): fechado por padrão. Se habilitado, quando undo exceder innodb_max_undo_log_size, será truncado para o tamanho inicial, (premissa: 1: o undo dentro não é mais usado; 2: são necessários pelo menos 2 tablespaces de undo) Você pode ajustar a frequência de truncamento definindo innodb_purge_rseg_truncate_frequency.

O processo de gravar a transação no log de desfazer na página de alocação de segmento de log de desfazer também precisa ser gravado no log de refazer . Quando uma transação é confirmada, o mecanismo de armazenamento InnoDB faz as duas coisas a seguir:

  1. Coloque o log de desfazer na lista para operação de limpeza posterior

  2. Determine se a página onde o log de desfazer está localizado pode ser reutilizada, se pode ser alocada para a próxima transação

Após a confirmação da transação, o log de desfazer e a página onde o log de desfazer está localizado não podem ser excluídos imediatamente . Isso ocorre porque pode haver outras transações que precisam obter a versão anterior do registro de linha por meio do log de desfazer. Quando a transação é enviada, o log de desfazer é colocado em uma lista vinculada.Se o log de desfazer pode ser excluído e a página onde o log de desfazer está localizado é determinado pelo thread de limpeza (o thread de limpeza explicará em detalhes na próxima vez).

As páginas de desfazer podem ser reutilizadas no design do mecanismo innodb. Quando a transação for confirmada, primeiro coloque o log de desfazer na lista vinculada e, em seguida, julgue se o espaço usado pela página de desfazer é menor que 3/4; em caso afirmativo, significa que a página de desfazer pode ser reutilizada e, em seguida, o o novo log de undo é gravado atrás do log de undo atual, já que a lista que armazena logs de undo é organizada por registros, e as páginas de undo podem armazenar logs de undo de diferentes transações, então a operação de limpeza requer operações de leitura discretas envolvendo discos, o que é relativamente lento processo.

0 5. O undolog precisa ser persistido?

A geração do log de undo será acompanhada pela geração do log de redo, porque o log de undo também precisa de proteção persistente . (O redo log será detalhado na próxima vez)

0 6. formato de desfazer log

  • inserir registro de desfazer

  • atualizar log de desfazer

log de desfazer inerte refere-se ao log de desfazer gerado na operação de inserção. Como o registro da operação de inserção só é visível para a própria transação e não para outras transações, o log de desfazer pode ser excluído diretamente após a confirmação da transação. Nenhuma operação de purga é necessária.

O log de desfazer atualização registra o log de desfazer gerado para operações de exclusão e atualização. O log de desfazer pode precisar fornecer um mecanismo MVCC, portanto, não pode ser excluído quando a transação for confirmada. Coloque-o na lista vinculada de desfazer log ao enviar e aguarde o encadeamento de limpeza para executar a exclusão final.

Resuma as duas funções do log de desfazer:

Implemente a reversão da transação para garantir a atomicidade das transações . Durante o processamento da transação, se ocorrer um erro ou o usuário executar uma instrução de reversão, o mysql pode usar dados históricos no log de desfazer para restaurar os dados ao estado anterior ao início da transação .

Um dos principais fatores para realizar o MVCC (Multi-Version Concurrency Control) . O MVCC é implementado por meio de exibição de leitura + log de desfazer. O log de desfazer salva várias cópias de dados históricos para cada registro. Quando o MySQL executa uma leitura instantânea (instrução de seleção comum), ele seguirá a cadeia de versão do log de desfazer para encontrar registros que satisfaçam sua visibilidade de acordo com as informações na exibição de leitura da transação.

FIM

Acho que você gosta

Origin blog.csdn.net/s827292890/article/details/129463600
Recomendado
Clasificación