INTRODUZIONE AL FARE BACKUP CON mysqldump
IMHO Fare backup è diventato più una forma d'arte se sai solo come affrontarlo
Hai delle opzioni
Opzione 1: mysqldump un'intera istanza mysql
Questo è il più semplice, il gioco da ragazzi !!!
mysqldump -h... -u... -p... --hex-blob --routines --triggers --all-databases | gzip > MySQLData.sql.gz
Tutto scritto in un unico file: strutture di tabelle, indici, trigger, procedure memorizzate, utenti, password crittografate. Altre opzioni di mysqldump possono anche esportare diversi stili di comandi INSERT, file di registro e coordinate di posizione da registri binari, opzioni di creazione del database, dati parziali (opzione --where) e così via.
Opzione 2: mysqldump database separati in file di dati separati
Inizia creando un elenco di database (2 tecniche per farlo)
Tecnica 1
mysql -h... -u... -p... -A --skip-column-names -e"SELECT schema_name FROM information_schema.schemata WHERE schema_name NOT IN ('information_schema','mysql')" > ListOfDatabases.txt
Tecnica 2
mysql -h... -u... -p... -A --skip-column-names -e"SELECT DISTINCT table_schema FROM information_schema.tables WHERE table_schema NOT IN ('information_schema','mysql')" > ListOfDatabases.txt
La tecnica 1 è il modo più veloce. La tecnica 2 è la più sicura e sicura. La tecnica 2 è migliore perché, a volte, gli utenti creano cartelle per scopi generali in / var / lib / mysql (datadir) che non sono correlate al database. Information_schema registra la cartella come database nella tabella information_schema.schemata. La tecnica 2 ignorerebbe le cartelle che non contengono dati mysql.
Una volta compilato l'elenco dei database, è possibile procedere a scorrere l'elenco e mysqldump, anche in parallelo, se desiderato.
for DB in `cat ListOfDatabases.txt`
do
mysqldump -h... -u... -p... --hex-blob --routines --triggers ${DB} | gzip > ${DB}.sql.gz &
done
wait
Se ci sono troppi database da avviare contemporaneamente, esegui il dump parallelo di 10 alla volta:
COMMIT_COUNT=0
COMMIT_LIMIT=10
for DB in `cat ListOfDatabases.txt`
do
mysqldump -h... -u... -p... --hex-blob --routines --triggers ${DB} | gzip > ${DB}.sql.gz &
(( COMMIT_COUNT++ ))
if [ ${COMMIT_COUNT} -eq ${COMMIT_LIMIT} ]
then
COMMIT_COUNT=0
wait
fi
done
if [ ${COMMIT_COUNT} -gt 0 ]
then
wait
fi
Opzione 3: mysqldump tabelle separate in file di dati separati
Inizia creando un elenco di tabelle
mysql -h... -u... -p... -A --skip-column-names -e"SELECT CONCAT(table_schema,'.',table_name) FROM information_schema.tables WHERE table_schema NOT IN ('information_schema','mysql')" > ListOfTables.txt
Quindi scaricare tutte le tabelle in gruppi di 10
COMMIT_COUNT=0
COMMIT_LIMIT=10
for DBTB in `cat ListOfTables.txt`
do
DB=`echo ${DBTB} | sed 's/\./ /g' | awk '{print $1}'`
TB=`echo ${DBTB} | sed 's/\./ /g' | awk '{print $2}'`
mysqldump -h... -u... -p... --hex-blob --triggers ${DB} ${TB} | gzip > ${DB}_${TB}.sql.gz &
(( COMMIT_COUNT++ ))
if [ ${COMMIT_COUNT} -eq ${COMMIT_LIMIT} ]
then
COMMIT_COUNT=0
wait
fi
done
if [ ${COMMIT_COUNT} -gt 0 ]
then
wait
fi
Opzione 4: USA LA TUA IMMAGINAZIONE
Prova le varianti delle opzioni sopra menzionate e le tecniche per istantanee pulite
Esempi
- Ordinare l'elenco delle tabelle in base alla dimensione di ciascuna tabella crescente o decrescente.
- Utilizzando un processo separato, eseguire "FLUSH TABLES WITH READ LOCK; SELECT SLEEP (86400)" prima di avviare mysqldumps. Uccidi questo processo dopo che mysqldumps è completo. Ciò è utile se un database contiene sia InnoDB che MyISAM
- Salvare i mysqldumps in cartelle datate e ruotare le vecchie cartelle di backup.
- Carica l'intera istanza mysqldumps in server autonomi.
AVVERTIMENTO
Solo l'opzione 1 porta tutto. Lo svantaggio è che mysqldumps creato in questo modo può essere ricaricato solo nella stessa versione di mysql di rilascio di mysqldump generata da mysqldump. In altre parole, un mysqldump da un database MySQL 5.0 non può essere caricato in 5.1 o 5.5. La ragione ? Lo schema mysql è totalmente diverso tra le versioni principali.
Le opzioni 2 e 3 non includono il salvataggio di nomi utente e password.
Ecco il modo generico per scaricare le sovvenzioni SQL per gli utenti che è leggibile e più portatile
mysql -h... -u... -p... --skip-column-names -A -e"SELECT CONCAT('SHOW GRANTS FOR ''',user,'''@''',host,''';') FROM mysql.user WHERE user<>''" | mysql -h... -u... -p... --skip-column-names -A | sed 's/$/;/g' > MySQLGrants.sql
L'opzione 3 non salva le procedure memorizzate, quindi è possibile effettuare le seguenti operazioni
mysqldump -h... -u... -p... --no-data --no-create-info --routines > MySQLStoredProcedures.sql &
Un altro punto che dovrebbe essere notato riguarda InnoDB. Se si dispone di un pool buffer InnoDB di grandi dimensioni, è consigliabile scaricarlo nel modo migliore prima di eseguire qualsiasi backup. Altrimenti, MySQL passa il tempo a svuotare le tabelle con la pagina sporca rimanente dal pool di buffer. Ecco cosa suggerisco:
Circa 1 ora prima di eseguire il backup eseguire questo comando SQL
SET GLOBAL innodb_max_dirty_pages_pct = 0;
In MySQL 5.5 il valore predefinito innodb_max_dirty_pages_pct è 75. In MySQL 5.1 e versioni precedenti, il valore predefinito innodb_max_dirty_pages_pct è 90. Impostando innodb_max_dirty_pages_pct su 0, questo accelererà il flusso di pagine sporche su disco. Ciò impedirà o almeno ridurrà l'impatto della ripulitura di eventuali commit incompleti a due fasi dei dati InnoDB prima di eseguire qualsiasi mysqldump su qualsiasi tabella InnoDB.
PAROLA FINALE SU mysqldump
Molte persone evitano mysqldump a favore di altri strumenti e questi strumenti sono davvero buoni.
Tali strumenti includono
- MAATKIT ( script di dump / ripristino paralleli , da Percona [obsoleto ma eccezionale])
- XtraBackup (TopNotch Snapshot Backup da Percona)
- CDP R1Soft ( opzione modulo MySQL che acquisisce istantanee temporizzate)
- MySQL Enterprise Backup (precedentemente InnoDB Hot Backups [commerciale])
Se hai lo spirito di un vero DBA MySQL, puoi abbracciare mysqldump e avere la padronanza completa su di esso che può essere raggiunta. Possano tutti i tuoi backup riflettere le tue capacità di DBA MySQL .