詳細検索

Notas sobre como fazer backup de ambientes com MyISAM misto de MySQL

Avatar
por komi

Notas sobre como fazer backup de ambientes com MyISAM misto de MySQL
Traduzido do 日本語 • Ver original

Por favor, note que este é um artigo antigo
Olá. Aqui é a Komiya.

Em um serviço que mistura as tabelas MyISAM da empresa,
Consultei você sobre um incidente em que um backup com mysqldump falhou e um backup frio foi feito, mas saiu inconsistente.
Gostaria de registrar a história e resumir as precauções.
 (Lembro de ter contado isso de forma leve no passado, então pensei que todo mundo soubesse, mas a facilidade de entender e a capacidade de transmitir,
 Parece que me faltou o reconhecimento de que o meu e o de outras pessoas no MySQL são um pouco diferentes.
 Problemas acontecem, e o fracasso é sinal de desafio e fonte de sucesso, mas precisamos garantir que não repitamos a mesma coisa. )

O que importa é a consistência dos dados entre o mestre e o escravo.
 Em outras palavras,
 ⇒ O alvo reserva nunca deve ser atualizado.
 ⇒ A posição no momento da aquisição do backup e o nome do arquivo binário de log devem estar claros.
 é super importante.
 Em um ambiente misto MyISAM, será inconsistente se você não tomar cuidado.
 Se houver uma inconsistência, será bastante difícil, como o conteúdo que deveria ter sido comprado não será comprado.
 Se você usar apenas o InnoDB, não precisa se preocupar com inconsistências se adicionar uma única transação.

・Causas da falha do mysqldump

mysqldump: Erro 1317: A execução da consulta foi interrompida ao despejar a tabela

Esse erro é causado por
Esse é o que aparece quando a consulta é interrompida enquanto lê dados no mysqldump. Ctrl + C ou kill matou a thread.
(Me contaram no Twitter.) Obrigado.

Então, para manter a consistência, decidi pegar os dados do master com o mysqldump,
Naquela época, o método de parar a replicação no slave e usá-la sem atualizações também causava inconsistências.
(Mesmo que o MyISAM seja um ambiente misto, TABELAS DE FLUSH COM LOCK DE LEITURA; Eu não fiz isso)

No caso de um ambiente misto com MyISAM, as transações não podem ser usadas, então
A parada de replicação ou bloqueio de compartilhamento requer parar a atualização.

ex)
TABELAS NIVELADAS COM BLOQUEIO DE LEITURA; 
Espere o modo de suspensão ou a sincronização terminar o bloqueio (definitivamente pare de atualizar)
Registro de posições e nomes de arquivos
mysqldump
DESBLOQUEAR MESAS; 

Em particular, foi apontado que a consulta não é interrompida (a consistência da interrupção é errada), e eu realmente não entendo isso.
Se você tentar não atualizar, não haverá interrupção, então acho que a única forma de lidar com isso é parar de atualizar.

・Causas de inconsistências entre o mestre e o escravo após backup frio

Recebi o seguinte erro e não consegui iniciar a replicação

Last_IO_Error: Recebi o erro fatal 1236 do mestre ao ler dados do log binário: 'Não foi possível encontrar o nome do primeiro arquivo de log no arquivo índice binário' 

A atualização veio entre o momento em que foi iniciada imediatamente após começar com o master original; (Não consigo pensar em mais nada, então estou supondo)
A repetição começa na posição inicial após o master de reset,
 Parece que o número de mesas era diferente entre o mestre e o escravo.
resetar o mestre; Se fizer isso, o log binário mestre será esvaziado no arquivo de dados e desaparecerá.
O escravo que olha para o log binário será apagado e não poderá ser lido, então
Tenha cuidado ao jogar com um mestre que tem um escravo.

・Contramedidas

Para garantir que as tabelas MyISAM sejam atualizadas e que o mysqldump não falhe, recomendamos as seguintes medidas:

  1. TABELAS DE ALINHAMENTO COM BLOQUEIO DE LEITURA;) (Se o MyISAM for misto, travar com --opt sozinho não será consistente como um todo)
     (Se você parar a replicação em uma máquina escrava e despejá-la, não há possibilidade de ser atualizada, então não precisa bloquear o compartilhamento.)
  2. mostrar status mestre; para garantir que não foi atualizado
     (Parece que o bloqueio compartilhado pode não ser bom se você esperar alguns segundos, como esperar por uma consulta em execução
     http://d.hatena.ne.jp/jitsu102/20110423/1303553133)、
  3. Bloco 3306 em iptables (iptables -A INPUT -p tcp --dport 3306 -j DROP) e
     (Ou, se puder reiniciar, escreva skip-networking no my.cnf e refleta isso)
  4. mostrar status mestre; Apertei várias vezes para garantir que não foi atualizado,
  5. Use o bkup com mysqldump. Se fizer isso, ele não será atualizado de forma confiável e você poderá evitar inconsistências.

Ou com um backup frio.

・Como verificar a posição ao usar dados para fins de replicação
 Se você tem um uso de replicação, precisa verificar os arquivos de log binários e as posições de alguma forma.

 mysqldump (buscado do mestre),
  Se você escrever --master-data, a sintaxe CHANGE MASTER TO será escrita no início do arquivo dump, então você pode iniciar a rep a partir daí.

 mysqldump (retirado do slave),
  A partir da versão 5.5, você pode usar as seguintes opções úteis:
  --dump-slave: Se você pegar um dump de um slave, inclua as informações do master que o slave está referenciando como CHANGE MASTER no dump.
  --aplicação-escravo-sentenças: Adicione os comandos STOP SLALLOW e START SLAVE antes e depois do CHANGE MASTER.
  --include-master-host-port: Inclua o nome de host e a porta do mestre no comando CHANGE MASTER.
  Em versões anteriores, seria bom registrar a posição quando a replicação era interrompida (ela também deveria estar no registro de erros).

 Para backups a frio (do master),
  Se você olhar o log binário no diretório de dados descompactados com mysqlbinlog com tail, encontrará o nome e a posição do arquivo de log binário.
 Ao fazer backup a frio do slave, a posição provavelmente deveria estar escrita no registro de erros. (Por favor, confira)

  • reiniciar o mestre; Se você atingir o mestre, os dados que deseja replicar no escravo serão perdidos, então
     É essencial garantir que ele não tenha sido atualizado desde o momento em que você fez backup antecipadamente.

・O que eu gostaria de recomendar para confirmar a consistência
 Se você não sabe quando será atualizado e não sabe se é difícil parar ou se não compreende totalmente, etc.,
 mostrar status do mestre; Seria uma boa ideia verificar várias vezes para verificar a consistência dos dados.
 (Do master, o tempo de inatividade do serviço quando o mysqldump é desperdiçado.) )
 Depois disso, parece rápido bloquear na rede.
 Pode haver uma opinião que define leitura global _only=1, mas tenha cuidado porque usuários com privilégios SUPER podem atualizá-la.

Opção ・Mysqldump usada no caso de misturar apenas InnoDB e MyISAM Details
InnoDB:
--todos-bancos de dados ---nomes-aspas --opt --transação única --dados-mestre=2 --hex-blob --logs de limpeza -R --ordenar-por-primário
MyISAM:
--todos-bancos de dados --nomes-aspas --lock-all-tables --hex-blob --flush-logs -R --master-data=2 --ordem-por-primário

O InnoDB é --transação única, MyISAM é --bloquear-tudo-tabelas! Seria bom lembrar.

Se você pegar do master: --master-data=2 para mostrar o status do mestre; a posição da sintaxe MUDAR MESTRE PARA será registrada no início do arquivo dump.
Se você escolher entre um escravo: --dump-slave=2 (*MySQL 5.5 ou posterior), a posição do mestre será registrada no início do arquivo dump.

Referência ao mysqldump:
 MySQL ::MySQL 5.5 Manual de Referência ::4.5.4 mysqldump — Um Programa de Backup de Bancode Dados sobre mysqldump --dump-slave - Studio3104::BLOG.newmysqldump --single-transaction Não adicionar ---flush-logs - @tmtms nota

A propósito, o motivo pelo qual precisei fazer dump de dados do mestre em primeiro lugar foi
Parece que foi porque o escravo tinha cerca de metade da especificação baixa do mestre, e o processamento pesado (uma grande quantidade de Delete) se sobrepunha, causando um atraso significativo.
Parece ser comum que o processamento concluído imediatamente no mestre seja atrasado no escravo.
Economizar é necessário para lucrar, mas também é importante ter espaço e equilíbrio, como não causar perda de oportunidades de serviço.
Excluir no MySQL parece ser uma categoria muito pesada, então acho que será um processo leve se você fizer isso com frequência ou particionar a tabela e eliminar a partição.

Referência de Particionamento:
 Processamento mais rápido! Vamos usar a função de particionamento do MySQL | LIG Co., Ltd. Tentei a função de particionamento do MySQL agora - (゚∀゚)blog de o sasata299Introdução ao MySQL para Jogos Sociais - Tecnologia da Computer Road da DeNA Han: Casos de Uso de Partição - informações da sessão http

Obrigado por dar uma olhada no que foi dito acima.          

Related Articles