Eu uso este comando para "bloquear" meu banco de dados, liberar logs, tirar um instantâneo do LVM e liberá-lo.
Testando o recovery + binlogs , parece que não está funcionando.
(Eu descobri isso quando durante a recuperação, aplicando os binlogs dá erro de chave duplicada onde suponho que não deveria existir naquele momento)
O comportamento que recebo é que os arquivos de dados ainda estão sendo gravados após a descarga. Então, o que há de errado aqui? Eu perdi alguma coisa?
# echo "FLUSH TABLES WITH READ LOCK ; flush logs" | mysql -vvv
--------------
FLUSH TABLES WITH READ LOCK
--------------
Query OK, 0 rows affected (0.00 sec)
# mysql --version
mysql Ver 14.14 Distrib 5.6.25, for Linux (x86_64) using EditLine wrapper
Não tenho certeza, mas depois de liberar com bloqueio de leitura, se eu conectar a qualquer banco de dados e tentar criar uma tabela, ela deve bloquear e aguardar até o UNLOCK, não é?
Isso não acontece, cria a tabela com sucesso.
EDITAR
Encontrei uma documentação onde digo para executar SET GLOBAL read_only = ON
após o flush e SET GLOBAL read_only = OFF
.
Todas as outras sugestões, blogs, tutoriais, manuais não mencionam que isso é necessário.
Mais dúvidas!!!
EDITAR 2
Inserções e atualizações ainda funcionando também...
Encontrei a razão pela qual meu script falhou.
A trava é liberada quando a conexão é finalizada.
Parece ser bastante óbvio, mas não me lembro de ter lido em nenhum lugar sobre esse comportamento e, como poucos comandos são capazes de executar a partir do prompt com mysqladmin (não neste caso), induzem a uma interpretação errada do comportamento FLUSH.
Meu primeiro script, onde falha ao bloquear, fica assim:
O problema é o FLUSH rodando em sessão standalone, quando essa sessão fecha ele é liberado.
Para resolver eu corro tudo em sessão única.
É assim que eu reescrevo e trabalho corretamente
Eu me sentiria mais seguro para realmente desligar o mysqld pela breve duração do instantâneo.