Come saltare i dati esistenti durante il ripristino del file mysqldump?
Uso questa query per importare dati utilizzando MySQL Dump (prompt dei comandi / riga di comando)
mysql -u root -p database_name < database_name.sql
Voglio importare il database di grandi dimensioni (solo nuovi delta) fin d'ora elimino il database e reimporto ma voglio importare solo nuovi delta.
Risposte
Ho quattro (4) suggerimenti:
SUGGERIMENTO N. 1: ricrea il dump conINSERT IGNORE
Usa --insert-ignore
Scrivi istruzioni INSERT IGNORE anziché istruzioni INSERT.
Cosa succede alla ricarica???
- Vengono inseriti nuovi dati.
- Le chiavi primarie già esistenti vengono ignorate
SUGGERIMENTO N. 2: passare INSERT
a INSERT IGNORE
alla ricarica
Invece di caricare normalmente
mysql -u root -p database_name < database_name.sql
basta convogliare il dump in sed e ricaricare in questo modo:
cat database_name.sql|sed 's/^INSERT/INSERT IGNORE/'|mysql -u root -p database_name
SUGGERIMENTO #3: Ricrea il dump conREPLACE INTO
Usa --sostituisci
Scrivi le istruzioni REPLACE piuttosto che le istruzioni INSERT.
Cosa succede alla ricarica???
- Vengono inseriti nuovi dati.
- Le chiavi primarie già esistenti verranno eliminate e reinserite
SUGGERIMENTO N. 4: passare INSERT INTO
a REPLACE INTO
alla ricarica
Invece di caricare normalmente
mysql -u root -p database_name < database_name.sql
basta convogliare il dump in sed e ricaricare in questo modo:
cat database_name.sql|sed 's/^INSERT INTO/REPLACE INTO/'|mysql -u root -p database_name
RIEPILOGO
- Usa i suggerimenti 1 o 3 se riesci a ricreare il dump
- Utilizzare i suggerimenti 2 o 4 se non è possibile ricreare il dump
PROVACI !!!
Inizierei non fidandomi della discarica. Quindi, caricherei i dati in un database separato (o almeno tabelle separate). Quindi eseguirei alcune query SQL per verificare che i delta siano ciò che mi aspettavo, indipendentemente dal fatto che si tratti di "nuove" righe, nessun ID univoco "dup", ecc. Se trovo problemi, creerei SQL per affrontare i problemi . Come suggerisce Rolando, alcuni INSERT/REPLACE [IGNORE] ecc. potrebbero essere ciò di cui hai bisogno.
Potrei DELETE
alcune delle "nuove" righe, quindi INSERT .. SELECT
spalare il resto nei tavoli principali. Oppure, in modo equivalente (ma possibilmente più veloce): INSERT .. SELECT .. WHERE ..
spalare solo le file desiderate.
Nota anche che FOREIGN KEYs
potrebbe causare problemi.
Fai attenzione a PRIMARY KEYs
eventuali JOIN presenti nel tuo codice, anche se FOREIGN KEYs
non sono presenti.
IODKU è solitamente migliore di REPLACE
. E può essere fatto tramite:
INSERT INTO t2 (...)
SELECT ... FROM t1 WHERE ...
ON DUPLICATE KEY UPDATE ... ;