Uno dei problemi ricorrenti di ogni sistemista è il recupero di dati da un backup senza che vi sia la necessità di disattivare il servizio e senza perdere, ovviamente, gli aggiornamenti dall'ultimo backup. Vediamo in questo articolo come procedere.
In primo luogo bisogna estrarre il backup del database, ad esempio:
Codice:
gunzip backup.sql.gz
per ottenere il file di testo backup.sql.
Poi, per rimuovere la creazione di tabelle e per creare una copia di lavoro, si esegue:
Codice:
cat backup.sql | grep 'INSERT INTO' > restore.sql
Ora sostituiamo INSERT INTO con INSERT IGNORE INTO. Questa sostituzione di codice inserisce soltanto le righe eliminate e lascia intatto le righe presenti. Per funzionare è necessario che tutte le tabelle abbiano un indice primario oppure unico (!):
Codice:
sed -i 's/INSERT INTO/INSERT IGNORE INTO/g' restore.sql
Qualora si debbano aggiornare i record con quelli del backup e aggiungere quelli mancanti, si fa questa sostituzione:
Codice:
sed -i 's/INSERT INTO/REPLACE INTO/g' restore.sql
A questo punto conviene fare un controllo sul file per evitare che vi siano dei problemi:
Se ci sono problemi, allora è necessario rimuovere le parti problematiche. Per chi voglia fare prima un backup del database, esegua:
Codice:
mysqldump -uroot -ppassword --host=host \
--opt --default-character-set=utf8 --skip-lock-tables \
--hex-blob --no-create-db --max_allowed_packet=16M \
--tz-utc \
nomedb | gzip -9 > backup2.sql.gz
Terminati i controlli e le modifiche, si può passare al ripristino:
Codice:
mysql -uroot -ppassword --database=nomedb --force < restore.sql
Da questo momento, il database risulta aggiornato, senza aver interrotto il servizio. Ci possono essere delle incongruenze e lievi effetti collaterali, ma se si fanno regolari backup, tipo una volta al giorno, sono di minore entità.