mysqldump - Exportar estrutura apenas sem incremento automático

87

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-dataquase 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)?

Paris
fonte
Parece com o MySQL 5.5 (servidor), --no-datairá omitir os valores auto_increment por padrão.
Joey Adams
@JoeyAdams tem certeza? Esse não é o comportamento que experimento
aland
2
@JoeyAdams MySQL 5.7. * Do mysqldump não omite o auto_increment ao usar --no-data.
Tiberiu-Ionuț Stan

Respostas:

68

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 seda obras corretamente, adicione o g(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
JoDev
fonte
11
Não acho que --skip-auto-incrementseja 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?
Rico de
1
--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 de sedfiltragem!
JoDev de
4
A opção sed não removeria todos os incrementos automáticos se você exportar várias tabelas, apenas a última. Além disso, --skip-auto-increment não é uma opção existente. Como essa resposta foi classificada tão bem?
Lex de
3
você precisa de ag no final do comando sed: sed 's /.../.../ g' para substituir todas as ocorrências.
p91paul
Este comando não está correto. --skip-auto-incremento não existe. O regex não está correto. Como p91paul observou, o modificador g precisa ser adicionado para substituir todas as ocorrências. Use a solução @JohnW em vez disso.
Aalex Gabi
52

A resposta de JoDev funcionou perfeitamente para mim com um pequeno ajuste à expressão regular sed:

mysqldump -d -h localhost -u<user> -p<password> <databaseName> | sed 's/ AUTO_INCREMENT=[0-9]*//g' > databaseStructure.sql
JohnW
fonte
1
Sim, não tenho certeza do que isso \bfaz 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.
David
4

É --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
Erin Schoonover
fonte
3
Observe que isso também elimina quaisquer campos de incremento automático, drop tables, conjuntos de caracteres, etc.
Deanna,
2

Graças a esta postagem, pude responder à minha pergunta:

Como posso controlar a versão do meu banco de dados?

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:

30 5 * * * sh /home/scripts/db_bkp.sh

Então, em meu repo, adicionei o resultado db_structure.sqlao 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.

Gerardo Rosciano
fonte
-1

mysqldump -u [USER] -p [PASSWORD] -d --skip-opt - single-transaction [DB_SCHEMA]> [FILE.ESTENSIONE]

Zio Panzu
fonte
6
Isso também removerá o sinalizador auto_increment nos campos em que está habilitado, não apenas o valor auto_increment no final.
Aquarion de
--skip-optdiscutido aqui e aqui.
Chris