Domanda

Sto usando mysqldump per creare uno script di installazione canonica per un database MySQL. Vorrei scaricare i dati per la metà in grado delle tabelle del database, ma esclude i dati dalle altre tabelle. Sono consapevole dei seguenti due comandi:

- no-data

- ignore-table

Ma il primo si applica a tutte le tabelle, e credo che il secondo esclude la tabella del tutto dalla discarica (per esempio creare istruzioni) non solo i dati nella tabella. Qualcuno sa come utilizzare mysqldump per raggiungere il mio obiettivo?

EDIT:

ha trovato una domanda duplicato vicino: mysqldump intera struttura, ma solo i dati dalle tabelle selezionate in un unico comando

È stato utile?

Soluzione

Come sull'esecuzione di due chiamate separate per mysqldump? Uno per creare il database e ignorare le tabelle che non si desidera i dati. L'altro per creare solo le tabelle rimanenti senza dati. Si potrebbe o eseguire i due script separatamente, oppure li concatena insieme per creare uno script finale.

Altri suggerimenti

C'è un'altra possibilità per fare tutto (in una singola chiamata a mysql se stesso), ma probabilmente dovrebbe mai essere tentata.

In omaggio a H.P. Lovecraft, (e in base al Anuya 's stored procedure per creare istruzioni INSERT ) qui di La stored procedure che non deve essere chiamato :

Nota. Questa diabolica, arcani stored procedure potrebbe essere eseguito solo da un pazzo e si presenta sotto puramente per scopi didattici

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 ;

... per fortuna, mi è stato salvato dalla testimoniare l'orrore dell'anima straziante Questa procedura deve sicuramente wreak da MySQL Bug # 44009 ...

mysqldump -u user -h host.example.com -p database table1 table2 table3

Si può trovare quello che vi serve qui:

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

Utilizzando Se le dichiarazioni è probabilmente il modo più semplice per ottenere ciò che si sta cercando di fare.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top