AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / dba / Perguntas / 333232
Accepted
Rajat Aggarwal
Rajat Aggarwal
Asked: 2023-11-18 03:03:03 +0800 CST2023-11-18 03:03:03 +0800 CST 2023-11-18 03:03:03 +0800 CST

como funciona o backup quente percona / recuperação de falhas do innodb?

  • 772

Estou tentando entender o processo de como o percona faz backup a quente. pelo que entendi, eles usam o mecanismo de recuperação de falhas innodb e executam as etapas a seguir.

  1. armazenar/lembrar iniciar LSN a partir de logs de redo
  2. copiar arquivos de dados
  3. execute LOCK BINLOG FOR BACKUP: para bloquear todas as operações que possam alterar a posição do log binário
  4. copiando os arquivos de log REDO e buscando as coordenadas binárias do log
  5. o xtrabackup concluído desbloqueará o log binário e as tabelas.

Quero entender qual é a função do LSN nos redo logs. Não podemos verificar diretamente a posição do log binário na etapa 1?

E o LSN final, ele não é usado em nenhum lugar do processo?

mysql
  • 1 1 respostas
  • 50 Views

1 respostas

  • Voted
  1. Best Answer
    Bill Karwin
    2023-11-19T02:36:40+08:002023-11-19T02:36:40+08:00

    O LSN (Log Sequence Number) é análogo à posição do log binário, mas o redo log é um log diferente. Aplica-se apenas às páginas do InnoDB e contém diferenças físicas das páginas afetadas. Durante a recuperação de falhas, ele pode reconstruir páginas aplicando diferenças às páginas originais. Também pode detectar se uma alteração já foi aplicada a uma página, porque as páginas são carimbadas com o LSN. Ele lida com o caso de páginas que foram liberadas antes da falha, que não ocorrem necessariamente em qualquer ordem. Portanto, a partir do LSN anterior, não é necessário aplicar todas as alterações no redo log.

    O log binário se aplica a tabelas de qualquer mecanismo de armazenamento e contém alterações lógicas. Pode conter eventos baseados em linhas ou eventos baseados em instruções. Não é usado para recuperação de falhas. Os logs binários são estritamente ordenados, portanto, se você usá-lo para sincronizar um banco de dados (por exemplo, replicação ou recuperação pontual), ele assumirá que todas as alterações serão aplicadas a partir da posição inicial fornecida.

    Não há necessidade do Percona XtraBackup registrar o último LSN, porque a recuperação de falhas apenas processa todo o redo log até o final.


    [Eu] acho que o processo de um commit seria como: comando commit -> atualizar dados no buffer innodb (na memória) -> anexar a (arquivo de redo log + log binário) -> responder com sucesso ao cliente

    Não, isso não está correto. Lembre-se de que as transações não têm limite no número de linhas modificadas ou no número de alterações. Portanto, as alterações devem ser enfileiradas de alguma forma para permitir que o tamanho de uma transação seja grande.

    No caso do log binário, as alterações são gravadas em um cache de log binário. Cada sessão recebe seu próprio cache de log binário. Por padrão, isso está na memória, mas se a transação for maior que o cache na memória, ela poderá ser copiada para o disco. À medida que você executa INSERT/UPDATE/DELETE, essas alterações são anexadas ao cache de log binário da respectiva sessão.

    No COMMIT, todas as alterações são finalmente copiadas do cache do log binário da sessão para o log binário. Portanto, as alterações não aparecem no log binário até COMMIT.

    O redo log é separado e é implementado apenas no mecanismo de armazenamento InnoDB. Ao executar INSERT/UPDATE/DELETE, as páginas de dados no buffer pool são modificadas. Nesse momento, essas alterações não confirmadas nas páginas também são gravadas no redo log. Como o redo log tem tamanho fixo, você pode fazer muitas alterações para caber no redo log e ele volta para o início. Para evitar a perda de alterações no caso de uma falha, as páginas modificadas no buffer pool devem ser descarregadas no disco antes que o redo log seja finalizado.

    No COMMIT, o InnoDB não precisa copiar nenhum log ou liberar nenhuma página modificada. As páginas podem permanecer modificadas no buffer pool. Somente a transação é anotada como confirmada, gravando um pequeno registro no redo log. Portanto, se a recuperação de falhas for necessária, ele saberá quais páginas contêm alterações confirmadas. As páginas que não foram confirmadas no momento da falha são marcadas com um ID de transação que não é registrado como confirmado no redo log, portanto, essas páginas não precisam ser recuperadas.

    [Eu] quero entender em que ponto esse redo log seria útil e qual é o uso do LSN nisso.

    O redo log é gravado continuamente, conforme você faz INSERT/UPDATE/DELETE, e é gravado durante COMMIT para marcar cada transação como confirmada. Mas o redo log não é lido, exceto durante a recuperação de falhas. Seu único propósito é reconstruir páginas modificadas no buffer pool.

    O uso do LSN permite que a recuperação de falhas saiba por onde começar a processar o redo log. Por exemplo, se a maioria das páginas modificadas já foram liberadas no momento da falha, não há necessidade de processar o redo log antes da página mais antiga que ainda foi modificada no buffer pool. A recuperação de falhas pode pular diretamente para o LSN no redo log correspondente à página modificada mais antiga. Isso ajuda a recuperação de falhas a ser um pouco mais rápida.

    O Percona XtraBackup usa o mesmo código de processamento de redo log, porque preparar um backup é semelhante à recuperação de falhas. Quando o Percona XtraBackup inicia a cópia de páginas para backup, algumas dessas páginas podem ter cópias modificadas no buffer pool. A cópia demora um pouco e algumas páginas podem ser liberadas ou modificadas durante esse tempo, à medida que o tráfego de consulta subsequente executa INSERT/UPDATE/DELETE. Quando o preparo do XtraBackup é executado, ele deve inspecionar todo o redo log até a página modificada mais antiga correspondente ao LSN no momento do início do backup, pois qualquer uma delas pode ser páginas "perdidas", ou seja, apenas a página do disco foi copiado para o backup, sem a versão modificada no buffer pool.


    quando os dados atualizados são persistidos nas tabelas? (é quando o redo log é liberado?)

    As páginas modificadas são liberadas continuamente para o tablespace. Leia https://dev.mysql.com/doc/refman/8.0/en/innodb-buffer-pool-flushing.html

    Esperançosamente, a taxa de liberação de páginas modificadas é pelo menos rápida o suficiente para que o redo log não fique 100% cheio. O InnoDB não permite que páginas modificadas não liberadas existam no buffer pool se elas não forem recuperáveis ​​pelos redo logs em caso de falha.

    Se o log de redo atingir 100% cheio, as gravações no log de redo deverão ser pausadas até que alguma liberação de páginas possa ser alcançada. Isso significa que todas as ações INSERT/UPDATE/DELETE estão bloqueadas temporariamente. Você teria que sobrecarregar bastante sua instância do MySQL para chegar a esse estado (ou seja, carregá-la com uma taxa de gravação mais alta do que ela pode sustentar).

    • 1

relate perguntas

  • Existem ferramentas de benchmarking do MySQL? [fechado]

  • Onde posso encontrar o log lento do mysql?

  • Como posso otimizar um mysqldump de um banco de dados grande?

  • Quando é o momento certo para usar o MariaDB em vez do MySQL e por quê?

  • Como um grupo pode rastrear alterações no esquema do banco de dados?

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host

    • 12 respostas
  • Marko Smith

    Como fazer a saída do sqlplus aparecer em uma linha?

    • 3 respostas
  • Marko Smith

    Selecione qual tem data máxima ou data mais recente

    • 3 respostas
  • Marko Smith

    Como faço para listar todos os esquemas no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Listar todas as colunas de uma tabela especificada

    • 5 respostas
  • Marko Smith

    Como usar o sqlplus para se conectar a um banco de dados Oracle localizado em outro host sem modificar meu próprio tnsnames.ora

    • 4 respostas
  • Marko Smith

    Como você mysqldump tabela (s) específica (s)?

    • 4 respostas
  • Marko Smith

    Listar os privilégios do banco de dados usando o psql

    • 10 respostas
  • Marko Smith

    Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Como faço para listar todos os bancos de dados e tabelas usando o psql?

    • 7 respostas
  • Martin Hope
    Jin conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane Como faço para listar todos os esquemas no PostgreSQL? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh Por que o log de transações continua crescendo ou fica sem espaço? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland Listar todas as colunas de uma tabela especificada 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney O MySQL pode realizar consultas razoavelmente em bilhões de linhas? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx Como posso monitorar o andamento de uma importação de um arquivo .sql grande? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison Como você mysqldump tabela (s) específica (s)? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas Como posso cronometrar consultas SQL usando psql? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas Como faço para listar todos os bancos de dados e tabelas usando o psql? 2011-02-18 00:45:49 +0800 CST

Hot tag

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve