Ответ 1
В соответствии с mysqldump docs:
mysqldump name_of_db --ignore-table=name_of_db.name_of_table
Возможно ли, используя mysql dump для экспорта всей структуры базы данных, но исключая определенные данные таблиц из экспорта.
Скажем, что в базе данных 200 таблиц, я хочу экспортировать структуру из всех 200 таблиц, но я хочу игнорировать данные из 5 конкретных таблиц.
Если это возможно, как это сделать?
В соответствии с mysqldump docs:
mysqldump name_of_db --ignore-table=name_of_db.name_of_table
Это создаст export.sql со структурой из всех таблиц и данных из всех таблиц, исключая table_name
mysqldump --ignore-table=db_name.table_name db_name > export.sql
mysqldump --no-data db_name table_name >> export.sql
Я думаю, что решение AmitP уже здорово - чтобы еще больше улучшить его, я думаю, что имеет смысл сначала создать все таблицы (структуру), а затем заполнить его данными, кроме тех, которые были исключены
mysqldump --no-data db_name > export.sql
mysqldump --no-create-info --ignore-table=db_name.table_name db_name >> export.sql
если вы хотите исключить более 1 таблицы, просто используйте директиву --ignore-table
чаще (в команде 2nc) - см. справку mysqldump:
--ignore-table=name Do not dump the specified table. To specify more than one
table to ignore, use the directive multiple times, once
for each table. Each table must be specified with both
database and table names, e.g.,
--ignore-table=database.table
Я новый пользователь и не имею достаточной репутации для голосования или комментариев по ответам, поэтому я просто передаю это как ответ.
@kantholy, безусловно, имеет лучший ответ.
@Метод AmitP выгружает всю структуру и data
в file
, а затем в drop/create table
statement в конце. В результате файл по-прежнему потребует от import
всех ваших нежелательных данных, прежде чем просто уничтожить его.
Метод @kantholy сначала выгружает всю структуру, а затем только data
для table
, которую вы не игнорируете. Это означает, что ваш следующий import
не должен тратить время на import
все data
, которые вам не нужны, особенно важно, если у вас есть очень большие суммы data
, которые вы хотите игнорировать, чтобы сэкономить время.
Чтобы напомнить, самый эффективный ответ:
mysqldump --no-data db_name > export.sql
mysqldump --no-create-info --ignore-table=db_name.table_name1 [--ignore-table=db_name.table_name2, ...] db_name >> export.sql
Другая возможность, которую я использую, состоит в том, чтобы избежать вставки строк в нужную таблицу.
Принцип состоит в том, чтобы отфильтровать строки INSERT INTO, используя grep -v
mysqldump name_of_db | grep -v 'INSERT INTO \'name_of_table\' VALUES'
или же
mysqldump name_of_db | grep -v 'INSERT INTO \'name_of_db\'.\'name_of_table\' VALUES'
Что вы можете легко попасть в файл gziped и отдельный файл ошибок
mysqldump name_of_db | grep -v 'INSERT INTO \'name_of_db\'.\'name_of_table\'' | gzip > /path/dumpfile.sql.gz 2> /path/name_of_db.err
и, следовательно, получить хорошую резервную копию того, что вы хотите, и знать, что не удалось, если таковые имеются :-)
Предыдущие ответы не устраняют проблему с AUTO_INCREMENT
при экспорте структуры и не показывают, как экспортировать некоторые конкретные данные в таблицы.
Чтобы идти дальше, мы должны сделать:
1/Экспорт структуры
mysqldump --no-data db_name | sed 's/ AUTO_INCREMENT=[0-9]*\b//g' > export-structure.sql
2/Экспорт только данных и игнорирует некоторые таблицы
mysqldump --no-create-info --ignore-table=db_name.table_name1 [--ignore-table=db_name.table_name2, ...] db_name >> export-data.sql
3/Экспорт конкретных данных в одну таблицу
mysqldump --no-create-info --tables table_name --where="id not in ('1', '2', ...)" > export-table_name-data.sql
Я пытался использовать --skip-opt
для сброса AUTO_INCREMENT
но это также AUTO_INCREMENT
определение AUTO_INCREMENT
для поля, CHARSET
и других вещей.
Может быть, этот инструмент может помочь вам:
https://github.com/webfactory/slimdump
Отказ от ответственности Я один из сопровождающих.
На мой взгляд, лучший ответ от Стейка, единственный ответ, который действительно работает в любом случае.
Все ответы, предполагающие наличие двух дампов, неверны, или, по крайней мере, они могут работать только в определенных помещениях.
Как уже указывалось выше, у вас могут быть проблемы с последовательностями.
Но я считаю более критическим, что база данных может иметь триггеры, которые проверяют или обрабатывают информацию (предположим, триггер, который вставляет записи в таблицу B при вставке в таблицу A) - в этом случае последовательность создания полной схемы (включая триггеры), а затем вставка данных создаст другой набор результатов.