Come escludere i dati per tabelle specifiche
-
10-10-2019 - |
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 ??p>
- 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
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.