mysqldump - Експортувати структуру лише без автоінкременту


87

У мене є база даних MySQL, і я намагаюся знайти спосіб експортувати лише її структуру, без значень автоматичного збільшення. mysqldump --no-dataмайже зробив би роботу, але він зберігає значення auto_increment. Чи є спосіб зробити це без використання PHPMyAdmin (я знаю, що він може це зробити)?


Схоже, з MySQL 5.5 (сервер) --no-dataза замовчуванням опускає значення auto_increment.
Джої Адамс,

@JoeyAdams ти впевнений? Це не така поведінка, яку я відчуваю
2016 року

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 має цю опцію?
Багатий

1
--skip-auto-incrementце опція, додана в MySQL GUI Tools, якщо запам'ятати правильно. (не впевнений ^^) Тож насправді це насправді не рішення! Але друга вбудована команда правильна, я заснував її тут, де тема говорить про проблему автоінкременту , і пропоную ідею sedфільтрації!
JoDev

4
Параметр Sed не видалить усіх автоматичних приростів, якщо ви експортуєте кілька таблиць, лише останню. Крім того, --skip-auto-increment не є існуючим параметром. Як ця відповідь отримала такий високий рейтинг?
Лекс,

3
вам потрібно ag в кінці вашої команди sed: sed 's /.../.../ g', щоб замінити всі випадки.
p91paul

Ця команда неправильна. --skip-авто-збільшення не існує. Звичайний вираз неправильний. Як зазначив p91paul, модифікатор g потрібно додати, щоб замінити всі випадки. Замість цього використовуйте рішення @JohnW.
Aalex Gabi

52

Відповідь ДжоДева мені спрацювала ідеально, з невеликим пристосуванням до регулярного виразу 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, набори символів тощо
Deanna

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 я завжди перевіряю, чи є якісь структурні зміни, які я забув зробити на всіх базах даних.


-1

mysqldump -u [КОРИСТУВАЧ] -p [ПАРОЛЬ] -d --skip-opt --одномісна транзакція [DB_SCHEMA]> [FILE.ESTENSIONE]


6
Це також видалить прапор auto_increment з полів, для яких увімкнено, а не лише значення auto_increment в кінці.
Акваріон

--skip-optобговорювали тут і тут.
Кріс
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.