Как исключить данные для конкретных таблиц - PullRequest
3 голосов
/ 22 октября 2010

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

- нет-данных

- игнорировать стол

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

EDIT:

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

Ответы [ 4 ]

4 голосов
/ 22 октября 2010

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

2 голосов
/ 23 октября 2010

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

В честь Х.П. Lovecraft, (и на основе Anuya хранимой процедуры для создания операторов 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 Bug # 44009 ...

0 голосов
/ 22 октября 2010

Вы можете найти то, что вам нужно здесь:

http://www.electrictoolbox.com/mysqldump-selectively-dump-data/

Использование операторов where - это, вероятно, самый простой способ добиться того, что вы пытаетесь сделать.

0 голосов
/ 22 октября 2010
mysqldump -u user -h host.example.com -p database table1 table2 table3
...