У меня есть база данных MySQL, и я пытаюсь найти способ экспортировать только ее структуру без значений автоматического увеличения. mysqldump --no-data
почти выполнит свою работу, но сохраняет значения auto_increment. Есть ли способ сделать это без использования PHPMyAdmin (я знаю, что он может это сделать)?
87
--no-data
значения auto_increment по умолчанию опускаются.Ответы:
Ты можешь это сделать :
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
источник
--skip-auto-increment
это реальный вариант. Я не могу найти его в документации . Ни один из этих двух MySQL ошибок для этого вопроса не упоминать: 20786 , 30957 . В какой версии mysqldump есть эта опция?--skip-auto-increment
- это опция, добавленная в MySQL GUI Tools, если вы правильно помните. (не уверен ^^) Так что на самом деле это не решение! Но вторая встроенная команда верна, я основал ее здесь, где в теме говорится о проблеме автоинкремента , и предлагаю идеюsed
фильтрации!Ответ JoDev отлично сработал для меня с небольшой корректировкой регулярного выражения sed:
источник
\b
делает в инструкции sed, но, согласно предложению @ JohnW здесь, удаление этого переключателя также помогает мне.Это --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
источник
drop table
s, наборы символов и т. Д.Благодаря этому сообщению я смог ответить на свой вопрос:
Затем я просто создал этот скрипт:
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:
Затем в своем репо я добавил результат
db_structure.sql
в git, и перед тем, как вносить изменения в prod, я всегда проверяю, есть ли какие-либо структурные изменения, которые я забыл сделать во всех dbs.источник
mysqldump -u [ПОЛЬЗОВАТЕЛЬ] -p [ПАРОЛЬ] -d --skip-opt --single-transaction [DB_SCHEMA]> [FILE.ESTENSIONE]
источник
--skip-opt
обсуждается здесь и здесь.