Come posso eseguire il backup di un database mysql, ma a bassa priorità?


15

Voglio fare il backup di un database, ma durante il giorno in cui c'è carico sul server. È fondamentale che il backup non influisca su Apache e altri database in esecuzione sullo stesso server.

Dovrebbe essere possibile utilizzare il comando mysqldump , ma eseguire il comando con priorità bassa.

Come posso fare questo?

Aggiornamento: sembra che usare semplicemente Nice con mysqldump non funzioni poiché mysqldump genera un nuovo processo.


hai visto mysqlhotcopy?

@fsb come supporta mysqlhotcopy ciò che l'OP vuole?
Tomas,

Risposte:


8

Se si dispone di un server di riserva in grado di far fronte al carico di scrittura del server, è possibile impostare la replica su quel server e quindi eseguire il backup dal server slave. Ciò ha anche il vantaggio di poter interrompere la replica mentre si esegue il backup e ottenere un'istantanea coerente dei dati in tutti i database o tutte le tabelle in un database senza influire sul server del database. Questa è la configurazione che consiglio sempre di eseguire il backup di MySQL se si dispone delle risorse.

Come bonus, ora hai uno slave di sola lettura che puoi usare per query lente di lunga durata.


Sfortunatamente questa opzione sembra essere la maggior parte del lavoro, ma immagino sia l'unica vera opzione se voglio un impatto minimo sul server principale.
Andyuk,

2
È quasi l'unico modo per ottenere un backup correttamente sospeso se non si desidera influire sulle operazioni. Dal momento che il rallentamento mysqldumpprovoca un blocco prolungato o la mancata sincronizzazione dei tavoli.
Dan Carley,

15

Andy, ormai credo che tu abbia avuto un sacco di tempo per trovare una soluzione. Recentemente ho trovato una soluzione a questo che sta funzionando alla grande per me su tsheets e ho pensato di condividerla.

cstream è uno strumento di gestione del flusso per scopi generici come UNIX dd, generalmente utilizzato in tubi costruiti da riga di comando. La cosa che ci rende utili per cstream è che ti permette di specificare la massima larghezza di banda per tutti gli input. Ciò significa che puoi limitare l'IO del disco del tuo comando mysqldump con un semplice comando come questo:

mysqldump --single-transaction --quick -u <USER> -p<PASS> <Database> | cstream -t 1000000 > backup.sql

Supponendo che si stia eseguendo il backup di un database che utilizza tutte le tabelle InnoDB, il comando sopra è sicuro (non influirà su altre query) e eseguirà mysqldump limitando le letture del disco a un solo megabyte al secondo. Regola la larghezza di banda con il parametro -t su qualsiasi valore consentirà al tuo ambiente di eseguire il backup senza influire sull'esperienza del cliente.


Appena testato e io lavoro come un incantesimo! Grazie per aver condiviso Brandon!
sucotronic,

4

FWIW dovresti anche essere in grado di farlo con pv ( http://linux.die.net/man/1/pv )

mysqldump --single-transazione --quick -u -p | pv --rate-limit 1m> destination (o | nc o | tar cfj backup.bz2 -)

La cosa bella di questo sono le varie opzioni per monitorare i progressi e l'opzione -R che consente di passare le opzioni a un processo già in esecuzione, ad es. --rate-limit per modificare la velocità di trasferimento.


1

se usi innodb puoi provare xtrabackup con l' opzione --throttle .

puoi anche guardare ionice ed eseguire mysqldump con esso.

o forse vuoi abilitare la registrazione binaria in mysql ed eseguire il dump completo una volta alla settimana / notte, mentre copi i registri bin in un luogo sicuro ogni 1-2 ore. e .. slave di sola lettura per scopi di solo backup è un'opzione pure.


0

Se lo stai eseguendo su Linux, o un'altra variante * nix, potresti farlo con il seguente:

bello -n ## mysqldump

Ciò gli darà una priorità di programmazione inferiore. Pianificando la gamma di priorità da -20 (priorità più alta) a 19 (priorità più bassa) il valore predefinito per nice è 10 se l'argomento -n viene omesso.


0

cron.d / mysql_dump:

17 22 * * * backup touch /home/backup/all_databases.sql && chmod 600 /home/backup \ 
/all_databases.sql && ionice -n 7 /usr/bin/mysqldump -u root -ppassword --opt --all- \
databases > /home/backup/all_databases.sql && nice -n 20 bzip2 -f \
/home/backupall_databases.sql

ionice per priorità I / O e piacevole per priorità CPU.

Esegui vmstat 5, controlla la colonna che dice WA. Un valore alto indica che la CPU è in attesa di I / O. Usa ionice, se è solo carico della CPU, usa nice.

Risposta all'aggiornamento:

Sembra che tu abbia ragione. Chiama mysql che non è bello. Immagino che potresti usare renice per questo e impostare il buon valore dopo che è stato eseguito.

Non ho un database sufficientemente grande per scaricare atm per creare uno script utile per te.

La replica, come suggerisce il tuo link, è una strada da percorrere. Replicate, stop and dump, su anthoer host.


0

Metti i tuoi dati MySQL su un LV e usa un lavoro mylvmbackup che prende un'istantanea dell'LV e annulla i file di dati MySQL. In questo modo non si bloccano le tabelle, riducendo al minimo l'impatto sulle applicazioni al solo carico di I / O.


0

Puoi sempre provare a non eseguirlo nelle ore di punta. Qualunque sia la priorità che usi, il dump richiederà comunque un blocco su tutti i tuoi tavoli.


Questo non è vero: se le tabelle sono InnoDB, nessun blocco viene inserito su di esse per la lettura.
dr01,
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.