Como pausar o MySQL antes de obter um instantâneo LVM / ZFS?

4

Como posso instruir o MySQL a completar todas as transações "em andamento", mas atrasar a inicialização de novas (sem chutar os clientes) até que eu tire uma captura instantânea ZFS ou LVM (que leva menos de um segundo).

por exemplo,

  1. pause o MySQL, aguardando que as transações "em andamento" sejam concluídas
  2. sincronizar com o disco
  3. tire um instantâneo do ZFS / LVM
  4. resume o MySQL O objetivo disso é obter um instantâneo consistente para fins de backup. O passo 2 demora uma fração de segundo.

O primeiro passo não deve causar erros do cliente, apenas uma pausa muito curta até o passo 4 ser alcançado.

Existem comandos do MySQL que podem fazer 1 e 4? O que são eles?

    
por fadedbee 10.10.2016 / 09:48

2 respostas

3

Um jeito hacky seria esperar as transações terminarem:

mysql> FLUSH LOCAL TABLES; Query OK, 0 rows affected (11.31 sec)

e depois obtendo um bloqueio de leitura:

mysql> FLUSH TABLES WITH READ LOCK; Query OK, 0 rows affected (22.55 sec)

Agora, todas as consultas são bloqueadas (ou seja, esperam que o bloqueio seja liberado) até que sua sessão termine. Lembre-se - você ainda tem que esperar até que todas as transações terminem. Dependendo da sua carga de trabalho, isso pode demorar um pouco (ATUALIZANDO alguns milhões de linhas ...).

Você pode codificar isso na sua linguagem de script favorita.

Mas, falando sério, por que não usar Xtrabackup ? Ele cuida de um instantâneo consistente do mysql para você e você pode despejá-lo no sistema de arquivos, e o zfs / lvm faz um instantâneo dele.

    
por 10.10.2016 / 14:58
1

Esta é a minha solução de como criar um instantâneo do ZFS, mantendo o bloqueio global, para que os arquivos de dados MyISAM e InnoDB sejam consistentes.

mysql << EOF
    FLUSH TABLES WITH READ LOCK;
    system zfs snapshot data/db@snapname
    UNLOCK TABLES;
EOF
    
por 08.12.2017 / 16:32