• Come ripristinare un database MySQL senza interrompere il servizio

    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:
    Codice:
    less restore.sql
    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à.