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

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


person Paris    schedule 27.03.2013    source источник
comment
Похоже, что в MySQL 5.5 (сервер) --no-data по умолчанию будет опускать значения auto_increment.   -  person Joey Adams    schedule 16.10.2014
comment
@JoeyAdams ты уверен? Это не то поведение, которое я испытываю   -  person aland    schedule 13.02.2016
comment
MySQL 5.7. * @JoeyAdams не пропускает auto_increment при использовании --no-data.   -  person Tiberiu-Ionuț Stan    schedule 30.08.2016


Ответы (5)


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

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) следующим образом:

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

(это работает, только если у вас установлены инструменты графического интерфейса: 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
person JoDev    schedule 27.03.2013
comment
Я не думаю, что --skip-auto-increment реальный вариант. Я не могу найти его в документации. Ни одна из двух ошибок MySQL, связанных с этой проблемой, не упоминает об этом: 20786, 30957. В какой версии mysqldump есть эта опция? - person Rich; 18.06.2013
comment
--skip-auto-increment - это опция, добавленная в MySQL GUI Tools, если вы правильно помните. (не уверен ^^) Так что на самом деле это не решение! Но вторая встроенная команда верна, я ее нашел здесь, где в теме говорится о проблеме автоинкремента и поделитесь идеей sed фильтрации! - person JoDev; 20.06.2013
comment
Параметр Sed не удаляет все автоматические приращения, если вы экспортируете несколько таблиц, только последнюю. Кроме того, --skip-auto-increment не существует. Как этот ответ получил такую ​​высокую оценку? - person Lex; 17.06.2015
comment
вам понадобится g в конце вашей команды sed: sed 's /.../.../ g', чтобы заменить все вхождения. - person p91paul; 25.07.2015
comment
Это неверная команда. --skip-auto-increment не существует. Регулярное выражение неверно. Как отметил p91paul, необходимо добавить модификатор g, чтобы заменить все вхождения. Вместо этого используйте решение @JohnW. - person Aalex Gabi; 20.05.2016
comment
У меня sed не работал, я использовал sed 's/ AUTO_INCREMENT=[0-9]* / /g' - person Janne Annala; 18.11.2019
comment
Предложил бы удалить все попытки и просто оставить последнюю, поскольку новым посетителям, прибывающим к этому из Google, не нужно будет знать об истории. - person Steve Chambers; 21.11.2020

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

mysqldump -d -h localhost -u<user> -p<password> <databaseName> | sed 's/ AUTO_INCREMENT=[0-9]*//g' > databaseStructure.sql
person JohnW    schedule 12.10.2014
comment
Да, я не уверен, что этот \b делает в инструкции sed, но, согласно предложению @JohnW, удаление этого переключателя также помогает мне. - person David; 25.06.2019

Это параметр --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
person Erin Schoonover    schedule 08.07.2014
comment
Обратите внимание, что при этом также удаляются все поля автоматического увеличения, drop table, наборы символов и т. Д. - person Deanna; 08.10.2015

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

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

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

person Gerardo Rosciano    schedule 28.06.2016

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

person Zio Panzu    schedule 14.03.2014
comment
Это также удалит флаг auto_increment в полях, для которых он включен, а не только значение auto_increment в конце. - person Aquarion; 01.04.2014
comment
--skip-opt обсуждалось здесь и здесь. - person Chris; 22.05.2014