Come saltare i dati esistenti durante il ripristino del file mysqldump?

Aug 24 2020

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

2 RolandoMySQLDBA Aug 24 2020 at 22:42

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 INSERTa INSERT IGNOREalla 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 INTOa REPLACE INTOalla 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 !!!

1 RickJames Aug 24 2020 at 23:14

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 DELETEalcune delle "nuove" righe, quindi INSERT .. SELECTspalare 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 KEYspotrebbe causare problemi.

Fai attenzione a PRIMARY KEYseventuali JOIN presenti nel tuo codice, anche se FOREIGN KEYsnon sono presenti.

IODKU è solitamente migliore di REPLACE. E può essere fatto tramite:

INSERT INTO t2 (...)
    SELECT ... FROM t1 WHERE ...
    ON DUPLICATE KEY UPDATE ... ;