Как исключить данные для определенных таблиц

Я использую mysqldump для создания канонического сценария установки для базы данных MySQL. Я хотел бы сбросить данные для половины таблиц в базе данных, но исключить данные из других таблиц. Мне известны две следующие команды:

--нет данных

--ignore-table

Но первый применяется ко всем таблицам, и я считаю, что второй полностью исключает таблицу из дампа (например, операторы создания), а не только данные в таблице. Кто-нибудь знает, как использовать mysqldump для достижения моей цели?

РЕДАКТИРОВАТЬ:

нашел почти повторяющийся вопрос: mysqldump вся структура, но только данные из выбранных таблиц одной командой


person Stephen Swensen    schedule 22.10.2010    source источник
comment
Примечание: вы не можете использовать --ignore-table с несколькими базами данных. Вы можете подумать, что из-за того, что вы указали db и таблицу в переключателе, вы можете использовать его в дампе с несколькими базами данных, но вы получите Не удалось найти таблицу   -  person Joseph Lust    schedule 23.05.2013


Ответы (4)


Как насчет выполнения двух отдельных вызовов mysqldump? Один для создания базы данных и игнорирования таблиц, данные из которых вам не нужны. Другой - просто создать оставшиеся таблицы без данных. Вы можете запустить два сценария по отдельности или объединить их вместе, чтобы создать окончательный сценарий.

person Don Kirkby    schedule 22.10.2010
comment
это хорошая идея, я все еще буду следить за другими решениями на данный момент - person Stephen Swensen; 22.10.2010

Есть еще один вариант, чтобы все сделать (за один вызов самого mysql), но, вероятно, его никогда не следует предпринимать.

В честь Х. Лавкрафта (и на основе Ануи хранимая процедура для создания операторов INSERT) здесь Хранимая процедура, которую нельзя вызывать:

Примечание. Эту нечестивую, загадочную хранимую процедуру может запустить только сумасшедший, и она представлена ​​ниже исключительно в образовательных целях.

DELIMITER $$
DROP PROCEDURE IF EXISTS `pseudoDump` $$
CREATE DEFINER=`root`@`localhost` PROCEDURE `pseudoDump`(
  in_db varchar(20),
  in_tables varchar(200),
  in_data_tables varchar(200)
)
BEGIN
DECLARE Whrs varchar(500);
DECLARE Sels varchar(500);
DECLARE Inserts varchar(200);
DECLARE tablename varchar(20);
DECLARE ColName varchar(20);
SELECT `information_schema`.`TABLE_NAME` INTO tablename FROM TABLES WHERE TABLE_SCHEMA = in_db AND TABLE_NAME IN ( in_tables );
tabdumploop: LOOP
  SHOW CREATE TABLE tablename;
  LEAVE tabdumploop;
END LOOP tabdumploop;
SELECT `information_schema`.`TABLE_NAME` INTO tablename FROM TABLES WHERE TABLE_SCHEMA = in_db ;
datdumploop: LOOP
  SELECT group_concat(concat('concat(\'"\',','ifnull(',column_name,','''')',',\'"\')')) INTO @Sels from `information_schema`.`COLUMNS` where table_schema=in_db and table_name=tablename;
  SELECT group_concat('`',column_name,'`') INTO @Whrs from `information_schema`.`COLUMNS` where table_schema=in_db and table_name=tablename;
  SET @Inserts=concat("select concat('insert IGNORE into ", in_db,".",tablename," values(',concat_ws(',',",@Sels,"),');') as MyColumn from ", in_db,".",tablename, " where 1 group by ",@Whrs, ";");
  PREPARE Inserts FROM @Inserts;
  EXECUTE Inserts;
  LEAVE datdumploop;
END LOOP datdumploop;
END $$
DELIMITER ;

... к счастью, я был спасен от того, чтобы стать свидетелем душераздирающего ужаса, который эта процедура, несомненно, должна вызвать Ошибка MySQL № 44009 ...

person danlefree    schedule 22.10.2010


person    schedule
comment
ваш пример не ясен, предполагается ли, что в таблице 1-3 их данные включены или исключены здесь (я предполагаю, что первое)? Кроме того, просто для двойной проверки, получу ли я операторы создания таблиц и т. д. для всех других таблиц, которых нет в этом списке? - person Stephen Swensen; 22.10.2010
comment
@Stephen, посмотрите переключатели, доступные для mysqldump - person Andrew Sledge; 22.10.2010
comment
У меня есть, но их много, и я не мог найти то, что ищу. Но, как я вижу в документации, ваш пример полностью исключит все таблицы, кроме table1-3, что я не хочу делать. - person Stephen Swensen; 22.10.2010
comment
Список таблиц не исключает, а включает их, и он полностью удаляет их из дампа, а не только их данные, покидающие структуру для дампа. Этот ответ в принципе бесполезен. - person j4k3; 29.05.2015