mysqldump - экспортирует только структуру без автоинкремента


87

У меня есть база данных MySQL, и я пытаюсь найти способ экспортировать только ее структуру без значений автоматического увеличения. mysqldump --no-dataпочти выполнит свою работу, но сохраняет значения auto_increment. Есть ли способ сделать это без использования PHPMyAdmin (я знаю, что он может это сделать)?


Похоже, что в MySQL 5.5 (сервер) --no-dataзначения auto_increment по умолчанию опускаются.
Джои Адамс,

@JoeyAdams ты уверен? Это не то поведение, которое я испытываю
aland

2
@JoeyAdams MySQL 5.7. * Mysqldump не пропускает auto_increment при использовании --no-data.
Tiberiu-Ionuț Stan

Ответы:


68

Ты можешь это сделать :

mysqldump -u root -p -h <db-host> --opt <db-name> -d --single-transaction | sed 's/ AUTO_INCREMENT=[0-9]*\b//' > <filename>.sql

Как уже упоминалось другими, если вы хотите sedработать правильно, добавьте параметр g(для замены g lobal) следующим образом:

mysqldump -u root -p -h <db-host> --opt <db-name> -d --single-transaction | sed 's/ AUTO_INCREMENT=[0-9]*\b//g' > <filename>.sql

(это работает только если вы установили GUI Tools: mysqldump --skip-auto-increment)

Новое ОБНОВЛЕНИЕ благодаря комментариям.

Это \bбесполезно и иногда нарушает команду. См. Эту тему SO для объяснений. Итак, оптимизированный ответ будет:

mysqldump -u root -p -h <db-host> --opt <db-name> -d --single-transaction | sed 's/ AUTO_INCREMENT=[0-9]*//g' > <filename>.sql

11
Я не думаю, что --skip-auto-incrementэто реальный вариант. Я не могу найти его в документации . Ни один из этих двух MySQL ошибок для этого вопроса не упоминать: 20786 , 30957 . В какой версии mysqldump есть эта опция?
Rich

1
--skip-auto-increment- это опция, добавленная в MySQL GUI Tools, если вы правильно помните. (не уверен ^^) Так что на самом деле это не решение! Но вторая встроенная команда верна, я основал ее здесь, где в теме говорится о проблеме автоинкремента , и предлагаю идею sedфильтрации!
JoDev

4
Параметр Sed не удаляет все автоматические приращения, если вы экспортируете несколько таблиц, только последнюю. Кроме того, --skip-auto-increment не существует. Как этот ответ получил такую ​​высокую оценку?
Lex

3
вам нужен ag в конце вашей команды sed: sed 's /.../.../ g', чтобы заменить все вхождения.
p91paul

Это неверная команда. --skip-auto-increment не существует. Регулярное выражение неверно. Как отметил p91paul, необходимо добавить модификатор g, чтобы заменить все вхождения. Вместо этого используйте решение @JohnW.
Aalex Gabi

52

Ответ JoDev отлично сработал для меня с небольшой корректировкой регулярного выражения sed:

mysqldump -d -h localhost -u<user> -p<password> <databaseName> | sed 's/ AUTO_INCREMENT=[0-9]*//g' > databaseStructure.sql

1
Да, я не уверен, что это \bделает в инструкции sed, но, согласно предложению @ JohnW здесь, удаление этого переключателя также помогает мне.
Дэвид

4

Это --create-options, который по умолчанию включен в --opt, генерирует определения таблицы AUTO_INCREMENT.

Если вам нужны только базовые таблицы,

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

Если вам тоже нужны представления, триггеры и процедуры,

mysqldump -hlocalhost -uuser -ppass \
    --skip-opt --events --routines --no-data \
    schemaname

3
Обратите внимание, что при этом также удаляются все поля автоматического увеличения, drop tables, наборы символов и т. Д.
Дина

2

Благодаря этому сообщению я смог ответить на свой вопрос:

Как я могу управлять версиями моей БД?

Затем я просто создал этот скрипт: 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"

Затем я добавил это в crontab:

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

Затем в своем репо я добавил результат db_structure.sqlв git, и перед тем, как вносить изменения в prod, я всегда проверяю, есть ли какие-либо структурные изменения, которые я забыл сделать во всех dbs.


-1

mysqldump -u [ПОЛЬЗОВАТЕЛЬ] -p [ПАРОЛЬ] -d --skip-opt --single-transaction [DB_SCHEMA]> [FILE.ESTENSIONE]


6
Это также удалит флаг auto_increment в полях, для которых он включен, а не только значение auto_increment в конце.
Aquarion

--skip-optобсуждается здесь и здесь.
Крис
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.