Estou usando percona mysql 8.
Não uso nenhum tipo de replicação, mas li que os logs binários são úteis para recuperação de dados. Eu gostaria de desligar o binlogging e liberá-los enquanto corro pt-online-schema-change
para fazer a tabela OPTIMIZE sem impacto.
Depois disso, quero ativar o binlogging novamente (e, em seguida, fazer esforços para mover para um servidor com mais espaço).
Isso é seguro e recomendado? Eu preciso otimizar uma tabela e não posso ficar offline e fazer uma cópia da tabela me deixará sem espaço, a menos que eu remova os 50 GB de binlogs
O que você precisa fazer é definir
sql_log_bin
como 0 ao iniciar o pt-online-schema-change usando set-varsSeus logs binários nunca saberão a diferença.
Verifique se há espaço suficiente para a tabela temporária (
_tablename_new
).ATUALIZAÇÃO 2020-12-10 14:45 EST
Se você não estiver fazendo backups neste servidor, poderá executar
para manter os últimos 5 dias de logs binários ou se você quiser que todos os logs binários desapareçam, execute
AVISO !!!
Antes de fazer isso, descubra se o servidor está executando a replicação como mestre.
ATUALIZAÇÃO 2020-12-10 16:05 EST
Como você está executando pt-online-schema-change, você deve executá-lo assim
Isso apenas criará uma tabela temporária desfragmentada. Acontece que --analyze-before-swap é o valor padrão. Isso significa que a tabela temporária foi
ANALYZE TABLE
executada antes de trocar as tabelas antigas e novas. Isso tem exatamente o mesmo efeito queOPTIMIZE TABLE
em uma tabela InnoDB.Conforme mencionado no comentário do nbk , você deve ter certeza de ter backups. Você também faria muito bem a si mesmo configurando a replicação e fazendo os backups do escravo.
A resposta curta é NÃO, não é seguro e não é recomendado.
Entendo que esses logs não estão sendo usados para replicação, mas para recuperação de dados. Estes são úteis para fazer a recuperação "point in time". No entanto, você precisa ter um backup completo anterior válido para que os logs binários sejam úteis.
Minhas recomendações:
HTH
Ao excluir muitas linhas de uma tabela grande, é muito mais eficiente fazer isso
Se a tabela original foi construída com
innodb_file_per_table=ON
, então o espaço livre será devolvido ao SO por este processo; não precisaOPTIMIZE
.O
INSERT..SELECT
é muito mais rápido (por linha) do queDELETE
.Se você estiver excluindo dados "antigos" e precisar fazer a limpeza novamente, considere o particionamento.
Mais detalhes sobre essas e outras técnicas de exclusão: http://mysql.rjweb.org/doc.php/deletebig
O espaço no log binário --
DELETE
combinlog_format = ROW
: uma entrada por linha excluída.DELETE
comSTATEMENT
: uma entrada para a instrução inteira.INSERT
: uma entrada por linha.OPTIMIZE
: (eu acho) uma entrada para a declaração inteira.Ou seja,
DELETE
é isso que está inchando o log binário. OOPTIMIZE
está travando a mesa por um longo tempo.