Tenho um banco de dados MySQL e estou tentando encontrar uma maneira de exportar apenas sua estrutura, sem os valores de incremento automático. mysqldump --no-data
quase faria o trabalho, mas mantém os valores de auto_increment. Existe alguma maneira de fazer isso sem usar PHPMyAdmin (que eu sei que pode fazer isso)?
87
--no-data
irá omitir os valores auto_increment por padrão.Respostas:
Você consegue fazer isso :
mysqldump -u root -p -h <db-host> --opt <db-name> -d --single-transaction | sed 's/ AUTO_INCREMENT=[0-9]*\b//' > <filename>.sql
Como mencionado por outros, se você quer
sed
a obras corretamente, adicione og
(para g parâmetro de substituição lobal) como este:mysqldump -u root -p -h <db-host> --opt <db-name> -d --single-transaction | sed 's/ AUTO_INCREMENT=[0-9]*\b//g' > <filename>.sql
(isso só funciona se você tiver ferramentas GUI instalado:
mysqldump --skip-auto-increment
)Novo ATUALIZAÇÃO graças aos comentários.
O
\b
é inútil e às vezes quebra o comando. Consulte este tópico do SO para obter explicações. Portanto, a resposta otimizada seria:mysqldump -u root -p -h <db-host> --opt <db-name> -d --single-transaction | sed 's/ AUTO_INCREMENT=[0-9]*//g' > <filename>.sql
fonte
--skip-auto-increment
seja uma opção real. Não consigo encontrar na documentação . Nenhum dos dois bugs do MySQL para esse problema o menciona: 20786 , 30957 . Qual versão do mysqldump tem essa opção?--skip-auto-increment
é uma opção adicionada no MySQL GUI Tools se lembrar corretamente. (não tenho certeza ^^) Então, na verdade, não é realmente uma solução! Mas o segundo comando inline está correto, eu o fundei aqui onde o tópico fala sobre o problema do incremento automático , e forneço a ideia desed
filtragem!A resposta de JoDev funcionou perfeitamente para mim com um pequeno ajuste à expressão regular sed:
fonte
\b
faz na instrução sed, mas de acordo com a sugestão de @JohnW aqui, a remoção dessa opção funciona para mim também.É --create-options, que está incluído com --opt, por padrão, que gera as definições da tabela AUTO_INCREMENT.
Se você quiser apenas as tabelas básicas,
mysql -hlocalhost -uuser -ppass --skip-column-names --batch \ -e "select table_name from tables where table_type = 'BASE TABLE' and table_schema = 'schemaname'" INFORMATION_SCHEMA \ | xargs mysqldump -hlocalhost -uuser -ppass \ --no-data --skip-triggers --skip-opt --no-create-db \ schemaname
Se você quiser visualizações, gatilhos e rotinas também,
mysqldump -hlocalhost -uuser -ppass \ --skip-opt --events --routines --no-data \ schemaname
fonte
drop table
s, conjuntos de caracteres, etc.Graças a esta postagem, pude responder à minha pergunta:
Então, acabei de criar este script:
db_bkp.sh
#!/bin/sh filename="db_structure.sql" backupfolder="/var/www/" fpath="$backupfolder/$filename" usr="DBUSER" pass="DBPASS" db="DBNAME" mysqldump --user=$usr --password=$pass --no-data $db | sed 's/ AUTO_INCREMENT=[0-9]*//g' > "$fpath"
Então eu adicionei isto ao crontab:
Então, em meu repo, adicionei o resultado
db_structure.sql
ao git e antes de enviar as alterações ao prod, sempre verifico se há alguma alteração estrutural que esqueci de fazer em todos os bancos de dados.fonte
mysqldump -u [USER] -p [PASSWORD] -d --skip-opt - single-transaction [DB_SCHEMA]> [FILE.ESTENSIONE]
fonte
--skip-opt
discutido aqui e aqui.