Quali sono le impostazioni ottimali di mysqldump? [chiuso]


14

Dopo alcune ricerche ho finito con le seguenti impostazioni:

    mysqldump\
    --host=localhost\
    --port=3306\
    --databases ****\
    --user=****\
    --password=****\
    --default-character-set=utf8\
    --add-drop-database\
    --add-drop-table\
    --add-locks\
    --complete-insert\
    --extended-insert\
    --lock-all-tables\
    --create-options\
    --disable-keys\
    --quick\
    --order-by-primary\
    --set-charset\
    --tz-utc\
    > dump/test.sql

Fin qui tutto bene, ma ho alcune domande riguardanti i parametri e l'esecuzione.

Per quanto riguarda la mia prima preoccupazione, voglio solo assicurarmi che siano necessari tutti e non causino conflitti se usati insieme. Alla fine, vorrei creare un file di dump molto robusto e coerente, con milioni di record, che crea tabelle, database e inserisce dati. La cosa buona è che rendere il database non disponibile per un po 'non è un problema per me. Il mio unico obiettivo è creare un file di dump robusto e coerente.

Per quanto riguarda il mio secondo concerto, vorrei sapere come essere informato quando poi il comando andrà storto e in tal caso lanciare un'eccezione.

Qualche idea?

MODIFICARE

Questo è il mio comando mysqldump aggiornato basato sul feedback di RolandoMySQLDBA.

mysqldump\
--host=localhost\
--port=3306\
--databases ****\
--user=****\
--password=****\
--default-character-set=utf8\
--opt\
--single-transaction\
--routines\
--triggers\
--events\
--add-drop-database\
--add-drop-table\
--complete-insert\
--delayed-insert\
--tz-utc\
> dump/test.sql

Leggi ogni argomento e i suoi vantaggi e scegli quale ti piacerebbe. Conosci anche gli script per innescare casi incorretti.
Mannoj,

Freddo. Ma questo non risponde davvero alla mia domanda. Ad esempio, quale di questi usi sempre?
user706838

Perdona la mia ignoranza, questa domanda non riguarda la raccomandazione di un libro o di un sito Web. Quindi penso che non dovrebbe essere un tipo di domanda basata sull'opinione. Detto questo, alcune risposte sarebbero sicuramente di qualità superiore a seconda dell'esperienza e supportate da test. A mio avviso, la domanda è perfettamente formulata con un obiettivo ben definito.
user10089632

Risposte:


30

Lo troverai scioccante, ma hai solo bisogno di una delle opzioni principali: --opt

Che cos'è --opt ?

Questa opzione, abilitata di default, è una scorciatoia per la combinazione di --add-drop-table --add-locks --create-options --disable-keys --extended-insert --lock-tables --quick - set-charset . Fornisce un'operazione di dump veloce e produce un file di dump che può essere ricaricato rapidamente in un server MySQL.

Poiché l' opzione - -opt è abilitata per impostazione predefinita , si specifica solo il contrario, --skip-opt per disattivare diverse impostazioni predefinite. Vedi la discussione sui gruppi di opzioni mysqldump per informazioni su come abilitare o disabilitare selettivamente un sottoinsieme delle opzioni interessate da --opt.

Poiché --opt è già abilitato, non è necessario specificare --opt . Nonostante ciò, potresti aver bisogno di alcune opzioni necessarie che non sono incluse.

Esegui questa query sul tuo database

SELECT engine,COUNT(1) TableCount
FROM information_schema.tables
WHERE engine IN ('InnoDB','MyISAM')
AND table_schema NOT IN ('information_schema','mysql','performance_schema')
GROUP BY engine;

Se hai tutte le tabelle di InnoDB, devi specificare --single-transazione . Ciò disattiverà automaticamente --lock-tables e ti consentirà di scaricare tutte le tabelle nello stesso punto temporale e di consentire la scrittura di nuove scritture contemporaneamente.

Se hai una o più tabelle MyISAM, devi specificare --lock-all-tables . Questo disattiverà automaticamente --lock-tables , disattiverà --single-transazione , bloccherà tutte le tabelle su tutti i database, quindi creerà il dump. Le scritture su tabelle InnoDB possono ancora verificarsi, ma verranno semplicemente messe in coda fino al rilascio dei blocchi. Qualsiasi connessione DB che tenta di scrivere su qualsiasi tabella MyISAM verrà effettivamente sospesa fino al rilascio di tutti i blocchi.

Esegui questa query: SELECT COUNT(1) Number_Of_Stored_Procedures FROM mysql.proc;

Se Number_Of_Stored_Proceduresè maggiore di zero, utilizzare --routines .

Esegui questa query: SELECT COUNT(1) Number_Of_Triggers FROM information_schema.triggers;

Se Number_Of_Triggersè maggiore di zero, utilizzare --triggers .

CAVEAT : Per favore non usare - ordina per primario per scaricare tutti i database perché può potenzialmente rendere gli indici BTREE piuttosto sbilenco al ricaricamento. --order-by-primary dovrebbe essere usato solo quando si esegue il dump di una singola tabella che si conosce ha una chiave primaria intera e avrà molte scansioni di intervallo dall'applicazione.

Se hai bisogno di più tipi creativi di backup mysqldump, vedi il mio vecchio post Come posso ottimizzare un mysqldump di un database di grandi dimensioni? .

Si prega di leggere tutte le opzioni per mysqldump .

AGGIORNAMENTO 2014-12-29 09:44 EST

Ho aggiornato il mio comando mysqldump (vedere la mia modifica). Ho un'ultima domanda però. Pensi che varrebbe la pena usare anche tutti i seguenti argomenti? --add-drop-database \ --add-drop-table \ --complete-insert \ --delayed-insert \ --tz-utc

Guardando il tuo commento e la tua ultima modifica, diamo un'occhiata a ciascuna di queste opzioni e vediamo se ne hai bisogno

  • --opt : ho già detto che non è necessario specificarlo perché è abilitato per impostazione predefinita.
  • --delayed-insert : sto decisamente lontano da questo con un database tutto InnoDB. In effetti, sto decisamente lontano da questo PERIODO !!! . Poiché 1) è possibile che INSERT DELAYED possa perdere dati, 2) viene convertito in INSERT per gli slave di replica MySQL, 3) esiste una segnalazione di bug aperta sull'utilizzo con i trigger di nuovo in MySQL 5.6 e non è considerato un bug , 4 ) è deprecato in MySQL 5.6 e 5) Morgan Tocker (noto MySQL Guru) ha previsto la sua deprecazione nel 2012 , dovresti dimenticare che questa opzione è mai esistita. Non usarlo mai (infinito) !!!
  • --complete-insert : utilizzerà INSERT INTO tblname (colnam_1,colnam_2,...colnam_n) VALUES ...invece di INSERT INTO tblname VALUES .... Questo potrebbe gonfiare il mysqldump se ci sono molte colonne nella definizione della tabella e molte righe nella tabella. Non usarlo.
  • --add-drop-table : poiché --opt lo abilita per te, non è necessario specificarlo.
  • --add-drop-database : se rilasciate --add-drop-database , rende il DROP TABLE IF EXISTS(che è stato aggiunto da --add-drop-table ) più veloce. Non utilizzarlo semplicemente si DROP TABLE IF EXISTSverifica per ogni tabella. Pertanto, l'utilizzo di --add-drop-database è una questione di scelta personale.
  • --tz-utc : se si prevede di ripristinare i dati sullo stesso server da cui si esegue il backup, non è necessario --tz-utc . Se ripristini i dati in un altro centro dati in un fuso orario diverso e ...
    • se si desidera mantenere lo stesso fuso orario da cui si esegue il backup, non è necessario --tz-utc .
    • se si desidera che i dati utilizzino il fuso orario di un nuovo centro dati, è necessario --tz-utc .
    • ESEMPIO: supponi di aver effettuato il backup di un database a New York. Questo è EST. Se hai un altro data center a Seattle, sarebbe PST. Se si desidera ripristinare il backup di New York a Seattle e si desidera che i timestamp nel database rappresentino ancora New York, non si desidera utilizzare --tz-utc .
  • --default-character-set

Modifica la tua ultima modifica, questo è ciò di cui hai particolarmente bisogno

mysqldump\
--host=localhost\
--port=3306\
--databases ****\
--user=****\
--password=****\
--single-transaction\
--routines\
--triggers\
--events\
--add-drop-database\
> dump/test.sql

Ancora una volta, dico per favore leggi tutte le opzioni per mysqldump .


Informazioni su --add-drop-database: questo non garantisce anche che non ci siano altre tabelle casuali nel database che non sono nel dump? Se qualcuno creasse manualmente una tabella di test casuale nel database, sarebbe ancora presente dopo aver ricaricato dal dump senza questa opzione. Quindi, dipende se lo vuoi o no. Giusto?
jschultz410,

Che dire --add-drop-trigger?
lonix,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.