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


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

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

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

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.


-1

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


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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.