У меня есть база данных MySQL, и я пытаюсь найти способ экспортировать только ее структуру без значений автоматического увеличения. mysqldump --no-data
почти выполнил бы свою работу, но сохраняет значения auto_increment. Есть ли способ сделать это без использования PHPMyAdmin (я знаю, что он может это сделать)?
mysqldump - экспортирует только структуру без автоинкремента
Ответы (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
--skip-auto-increment
реальный вариант. Я не могу найти его в документации. Ни одна из двух ошибок MySQL, связанных с этой проблемой, не упоминает об этом: 20786, 30957. В какой версии mysqldump есть эта опция?
- person Rich; 18.06.2013
--skip-auto-increment
- это опция, добавленная в MySQL GUI Tools, если вы правильно помните. (не уверен ^^) Так что на самом деле это не решение! Но вторая встроенная команда верна, я ее нашел здесь, где в теме говорится о проблеме автоинкремента и поделитесь идеей sed
фильтрации!
- person JoDev; 20.06.2013
sed 's/ AUTO_INCREMENT=[0-9]* / /g'
- person Janne Annala; 18.11.2019
Ответ JoDev отлично сработал для меня с небольшой корректировкой регулярного выражения sed:
mysqldump -d -h localhost -u<user> -p<password> <databaseName> | sed 's/ AUTO_INCREMENT=[0-9]*//g' > databaseStructure.sql
\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
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.
mysqldump -u [ПОЛЬЗОВАТЕЛЬ] -p [ПАРОЛЬ] -d --skip-opt --single-transaction [DB_SCHEMA]> [FILE.ESTENSIONE]
--no-data
по умолчанию будет опускать значения auto_increment. - person Joey Adams   schedule 16.10.2014