Quais são as configurações ideais do mysqldump? [fechadas]

14

Após algumas pesquisas, acabei com as seguintes configurações:

    mysqldump\
    --host=localhost\
    --port=3306\
    --databases ****\
    --user=****\
    --password=****\
    --default-character-set=utf8\
    --add-drop-database\
    --add-drop-table\
    --add-locks\
    --complete-insert\
    --extended-insert\
    --lock-all-tables\
    --create-options\
    --disable-keys\
    --quick\
    --order-by-primary\
    --set-charset\
    --tz-utc\
    > dump/test.sql

Até aí tudo bem, mas eu tenho algumas perguntas sobre os parâmetros, bem como a execução.

Em relação à minha primeira preocupação, quero apenas garantir que todas elas sejam necessárias e que não causem conflitos quando usadas em conjunto. Por fim, gostaria de criar um arquivo de despejo muito robusto e consistente, com milhões de registros, que crie tabelas, bancos de dados e insira dados. O bom é que tornar o banco de dados indisponível por um tempo não é um problema para mim. Meu único objetivo é criar um arquivo de despejo robusto e consistente.

Em relação ao meu segundo concerto, eu gostaria de saber como ser informado quando o comando sair errado e, em caso afirmativo, lançar uma exceção.

Alguma ideia?

EDITAR

Este é o meu comando mysqldump atualizado com base nos comentários de RolandoMySQLDBA.

mysqldump\
--host=localhost\
--port=3306\
--databases ****\
--user=****\
--password=****\
--default-character-set=utf8\
--opt\
--single-transaction\
--routines\
--triggers\
--events\
--add-drop-database\
--add-drop-table\
--complete-insert\
--delayed-insert\
--tz-utc\
> dump/test.sql
user706838
fonte
Leia cada argumento e seus benefícios e escolha qual seria sua suíte. Conheça também os scripts para acionar o caso de falhas.
Mannoj
Legal. Mas isso realmente não responde à minha pergunta. Por exemplo, qual deles você sempre usa?
user706838
Perdoe minha ignorância, esta pergunta não é sobre recomendar um livro ou um site. Então eu acho que não deve ser um tipo de pergunta baseada em opinião. Dito isto, algumas respostas certamente teriam mais qualidade, dependendo da experiência e apoiadas em testes. Na minha opinião, a questão está perfeitamente formulada com um objetivo bem definido.
precisa saber é o seguinte

Respostas:

30

Você vai achar isso chocante, mas você só precisa de uma opção importante: --opt

O que é --opt ?

Esta opção, ativada por padrão, é uma abreviação para a combinação de --add-drop-table --add-locks --create-options --disable-keys --extended-insert --lock-tables --lock-tables --quick - set-charset . Ele fornece uma operação de despejo rápido e produz um arquivo de despejo que pode ser recarregado rapidamente em um servidor MySQL.

Como a opção - -opt está ativada por padrão , você especifica apenas o inverso, o --skip-opt para desativar várias configurações padrão. Veja a discussão dos grupos de opções do mysqldump para obter informações sobre como ativar ou desativar seletivamente um subconjunto das opções afetadas pelo --opt.

Como --opt já está ativado, você não precisa especificar --opt . Não obstante, você pode precisar de algumas opções necessárias que não estão incluídas.

Execute esta consulta no seu banco de dados

SELECT engine,COUNT(1) TableCount
FROM information_schema.tables
WHERE engine IN ('InnoDB','MyISAM')
AND table_schema NOT IN ('information_schema','mysql','performance_schema')
GROUP BY engine;

Se você tiver todas as tabelas do InnoDB, precisará especificar --single-transaction . Isso desativará automaticamente --lock-tables e permitirá que você despeje todas as tabelas no mesmo momento e permita que novas gravações ocorram ao mesmo tempo.

Se você possui uma ou mais tabelas MyISAM, precisa especificar --lock-all-tables . Isso desativa automaticamente --lock-tables , desativa - Única transação , bloqueia todas as tabelas em todos os bancos de dados e cria o dump. As gravações nas tabelas do InnoDB ainda podem ocorrer, mas elas serão enfileiradas até que os bloqueios sejam liberados. Qualquer conexão com o banco de dados que tente gravar em qualquer tabela MyISAM será realmente suspensa até que todos os bloqueios sejam liberados.

Execute esta consulta: SELECT COUNT(1) Number_Of_Stored_Procedures FROM mysql.proc;

Se Number_Of_Stored_Proceduresfor maior que zero, use --rotines .

Execute esta consulta: SELECT COUNT(1) Number_Of_Triggers FROM information_schema.triggers;

Se Number_Of_Triggersfor maior que zero, use --triggers .

CAVEAT : Por favor, não use --order-by-primary para descarregar todos os bancos de dados, pois ele pode potencialmente tornar os índices BTREE bastante desequilibrados na recarga. --order-by-primary deve ser usado apenas ao descarregar uma tabela individual que você sabe que possui uma chave primária inteira e terá várias varreduras de intervalo do seu aplicativo.

Se você precisar de mais tipos criativos de backups do mysqldump, consulte a minha antiga postagem Como otimizar um mysqldump de um banco de dados grande? .

Por favor, leia todas as opções para o mysqldump .

UPDATE 2014-12-29 09:44 EST

Eu atualizei meu comando mysqldump (veja minha edição). Eu tenho uma última pergunta, no entanto. Você acha que valeria a pena usar todos os argumentos a seguir também? --add-drop-database \ --add-drop-table \ --complete-insert \ --delayed-insert \ --tz-utc

Observando seu comentário e sua edição mais recente, vamos analisar cada uma dessas opções e ver se você precisa de alguma delas.

  • --opt : Eu já disse que você não precisa especificá-lo porque está ativado por padrão.
  • --delayed-insert : permanentemente me afasto disso com um banco de dados totalmente InnoDB. De fato, eu permaneço firmemente longe deste PERÍODO !!! . Como 1) é possível que INSERT DELAYED possa perder dados, 2) é convertido em INSERT para escravos de replicação do MySQL, 3) existe um relatório de erro aberto sobre o uso com gatilhos no MySQL 5.6 e não é considerado um bug , 4 ) foi descontinuado no MySQL 5.6 e 5) O Morgan Tocker (conhecido MySQL Guru) previu sua descontinuação em 2012 , você deve esquecer que essa opção já existiu. Nunca, nunca (infinito) use-o !!!
  • --complete-insert : será usado em INSERT INTO tblname (colnam_1,colnam_2,...colnam_n) VALUES ...vez de INSERT INTO tblname VALUES .... Isso pode inchar o mysqldump se houver muitas colunas na definição da tabela e muitas linhas na tabela. Não use.
  • --add-drop-table : Como --opt habilita isso para você, você não precisa especificá-lo.
  • --add-drop-database : Se você soltar o --add-drop-database , ele faz com que o DROP TABLE IF EXISTS(que foi adicionado pela --add-drop-table ) vá mais rápido. Não usá-lo simplesmente permite DROP TABLE IF EXISTSocorrer para cada tabela. Portanto, o uso de --add-drop-database é uma questão de escolha pessoal.
  • --tz-utc : se você planeja restaurar os dados no mesmo servidor de backup, não precisa --tz-utc . Se você restaurar os dados para outro data center em um fuso horário diferente e ...
    • se você deseja manter o mesmo fuso horário do qual faz backup, não precisa --tz-utc .
    • se você deseja que os dados usem o fuso horário de um novo datacenter, você precisa --tz-utc .
    • EXEMPLO: Digamos que você faça backup de um banco de dados em Nova York. Isso é EST. Se você tiver outro data center em Seattle, seria o PST. Se você deseja que o New York Backup seja restaurado em Seattle e os carimbos de data e hora no banco de dados ainda representem Nova York, não deseja usar --tz-utc .
  • --default-character-set

Ajustando sua edição mais recente, é disso que você precisa especialmente

mysqldump\
--host=localhost\
--port=3306\
--databases ****\
--user=****\
--password=****\
--single-transaction\
--routines\
--triggers\
--events\
--add-drop-database\
> dump/test.sql

Novamente, eu digo, por favor leia todas as opções para mysqldump .

RolandoMySQLDBA
fonte
Sobre --add-drop-database: isso também não garante que não haja outras tabelas aleatórias no banco de dados que não estejam no seu dump? Se alguém criou manualmente uma tabela de teste aleatória no seu banco de dados, ela ainda existiria após o recarregamento do dump sem essa opção. Então, depende se você quer ou não. Certo?
Jschultz410
Que tal --add-drop-trigger?
lonix