Contents
L’esigenza di backup del database MySQL non è così universale come quella dei backup regolari degli utenti finali, ma quando è necessario, diventa una parte particolarmente importante dell’infrastruttura di un’azienda. Il modulo di Bacula Enterprise per i backup MySQL consente agli utenti di eseguire backup di database MySQL efficienti e facili da usare – e soprattutto ripristini – in un tempo molto breve. Questo, ovviamente, è fondamentale per soddisfare gli obiettivi RTO (recovery time objectives). Questo articolo approfondisce la natura stessa di un processo di backup automatico di MySQL, compresi gli approcci gratuiti e a pagamento al backup e al ripristino, e le diverse opzioni di personalizzazione.
Diversi modi per creare un backup del database MySQL
Prima di passare alla soluzione di Bacula Enterprise, esaminiamo alcuni modi diversi e non convenzionali di creare un backup del database MySQL.
1. Backup automatico del database MySQL basato su Linux
Una certa utility basata su Linux/Unix con il nome di cron può eseguire backup di MySQL su questi sistemi. Si tratta di un’utility relativamente semplice che si avvia con il sistema e legge le sue istruzioni da un file specifico. Questo file di configurazione è solitamente memorizzato in /etc/crontab. Ecco un esempio di backup giornaliero impostato alle 2:30 del mattino:
30 2 * * * root mysqldump -u root -pPASSWORD –all-databases | gzip >
/mnt/disk2/database_`data ‘ %m-%d-%Y’`.sql.gz
Le prime cinque cifre del comando rappresentano l’ora e la data (minuti, ore, giorni del mese, mesi, giorni della settimana, rispettivamente), e mettere “*” al posto di uno di questi numeri significa che qualsiasi numero funziona.
2. Utilizza PHP per creare un file XML
È anche possibile ricreare il database come file XML, con l’aiuto di PHP. Non è il formato più sicuro al mondo quando si tratta di ripristinare i suoi dati, ma alcune persone lo preferiscono a qualsiasi altro. Questo frammento di codice qui sotto dovrebbe permetterle di esportare un database specifico nel file con formato .XML:
//connect
$link = mysql_connect($host,$user,$pass);
mysql_select_db($name,$link);
//get all the tables
$query = ‘SHOW TABLES FROM ‘.$name;
$result = mysql_query($query,$link) or die(‘cannot show tables’);
if(mysql_num_rows($result))
{
//prep output
$tab = “\t”;
$br = “\n”;
$xml = ‘<?xml version=”1.0″ encoding=”UTF-8″?>’.$br;
$xml.= ‘<database name=”‘.$name.'”>’.$br;
//for every table…
while($table = mysql_fetch_row($result))
{
//prep table out
$xml.= $tab.'<table name=”‘.$table[0].'”>’.$br;
//get the rows
$query3 = ‘SELECT * FROM ‘.$table[0];
$records = mysql_query($query3,$link) or die(‘cannot select from table: ‘.$table[0]);
//table attributes
$attributes = array(‘name’,’blob’,’maxlength’,’multiple_key’,’not_null’,’numeric’,’primary_key’,’table’,’type’,’default’,’unique_key’,’unsigned’,’zerofill’);
$xml.= $tab.$tab.'<columns>’.$br;
$x = 0;
while($x < mysql_num_fields($records))
{
$meta = mysql_fetch_field($records,$x);
$xml.= $tab.$tab.$tab.'<column ‘;
foreach($attributes as $attribute)
{
$xml.= $attribute.’=”‘.$meta->$attribute.'” ‘;
}
$xml.= ‘/>’.$br;
$x++;
}
$xml.= $tab.$tab.'</columns>’.$br;
//stick the records
$xml.= $tab.$tab.'<records>’.$br;
while($record = mysql_fetch_assoc($records))
{
$xml.= $tab.$tab.$tab.'<record>’.$br;
foreach($record as $key=>$value)
{
$xml.= $tab.$tab.$tab.$tab.'<‘.$key.’>’.htmlspecialchars(stripslashes($value)).'</’.$key.’>’.$br;
}
$xml.= $tab.$tab.$tab.'</record>’.$br;
}
$xml.= $tab.$tab.'</records>’.$br;
$xml.= $tab.'</table>’.$br;
}
$xml.= ‘</database>’;
//save file
$handle = fopen($name.’-backup-‘.time().’.xml’,’w+’);
fwrite($handle,$xml);
fclose($handle);
}
3. Utilizzare PHP come metodo di backup in primo luogo
Un altro modo di utilizzare PHP per le sue esigenze di backup è quello di prendere una query di backup del database da un file PHP e utilizzarla. La query nell’esempio seguente è SELECT INTO OUTFILE.
<?php
include ‘config.php’;
include ‘opendb.php’;
$tableName = ‘mypet’;
$backupFile = ‘backup/mypet.sql’;
$query = “SELECT * INTO OUTFILE ‘$backupFile’ FROM $tableName”;
$result = mysql_query($query);
include ‘closedb.php’;
?>
E naturalmente, avrà bisogno di un modo per ripristinare quel tipo di backup. Ecco la query per questo, è una query LOAD DATA INFILE:
<?php
include ‘config.php’;
include ‘opendb.php’;
$tableName = ‘mypet’;
$backupFile = ‘mypet.sql’;
$query = “LOAD DATA INFILE ‘backupFile’ INTO TABLE $tableName”;
$result = mysql_query($query);
include ‘closedb.php’;
?>
4. Backup con SSH
Il backup tramite SSH è fattibile anche per un database MySQL particolarmente grande. Nel suo pannello Plesk, inizi ad abilitare l’accesso alla shell e poi utilizzi qualsiasi strumento che possa accedere al server in questione tramite SSH (PuTTY o uno strumento simile). Per prima cosa, però, dovrà specificare una directory di destinazione per il suo futuro backup:
CD wwwroot/dbbackup
E poi utilizzerà mysqldump per esportare il database in un file specifico all’interno di un server:
mysqldump –add-drop-table -u db_username -p db_name > mybackup.sql
5. Script Server Shell per il backup di un database MySQL tramite Ubuntu
Se dispone di un server VPS dedicato con Ubuntu Linux a bordo, ha un’ulteriore opzione. Può utilizzare uno script di shell specifico per eseguire il backup di tutti i database sul suo server FTP. Ecco un esempio:
#!/bin/bash
### MySQL Server Login Info ###
MUSER=”root”
MPASS=”MYSQL-ROOT-PASSWORD”
MHOST=”localhost”
MYSQL=”$(which mysql)”
MYSQLDUMP=”$(which mysqldump)”
BAK=”/backup/mysql”
GZIP=”$(which gzip)”
### FTP SERVER Login info ###
FTPU=”FTP-SERVER-USER-NAME”
FTPP=”FTP-SERVER-PASSWORD”
FTPS=”FTP-SERVER-IP-ADDRESS”
NOW=$(date +”%d-%m-%Y”)
### See comments below ###
### [ ! -d $BAK ] && mkdir -p $BAK || /bin/rm -f $BAK/* ###
[ ! -d “$BAK” ] && mkdir -p “$BAK”
DBS=”$($MYSQL -u $MUSER -h $MHOST -p$MPASS -Bse ‘show databases’)”
for db in $DBS
do
FILE=$BAK/$db.$NOW-$(date +”%T”).gz
$MYSQLDUMP -u $MUSER -h $MHOST -p$MPASS $db | $GZIP -9 > $FILE
done
lftp -u $FTPU,$FTPP -e “mkdir /mysql/$NOW;cd /mysql/$NOW; mput /backup/mysql/*; quit” $FTPS
Dopo aver salvato questo segmento come file .sh, il passo successivo è impostare il livello di autorizzazione corretto per questo file specifico:
$ chmod +x /home/your-name/mysql.backup.sh
D’ora in poi potrà inserire uno dei due comandi per avviare il processo di backup:
/home/your-name/mysql.backup.sh
Oppure:
sudo /home/your-name/mysql.backup.sh
Può anche impostare questo script affinché venga eseguito come un lavoro cron. Ecco un esempio di script in esecuzione ogni giorno a mezzanotte, composto da due diversi prompt di comando:
$ sudo crontab -e
E:
@midnight /home/you/mysql.backup.sh >/dev/null 2>&1
È possibile che questi script funzionino anche con diverse distribuzioni UNIX o Linux.
6. Utilizzo di phpMyAdmin
phpMyAdmin è uno strumento open source che è anche gratuito e funziona con i database MySQL e MariaDB. L’ordine corretto degli input è il seguente:
- Apra lo strumento in questione;
- Selezioni il suo database di cui desidera creare un backup;
- Scegliere l’opzione “export” nella barra di navigazione;
- Clicchi sulla riga “display all possible options”;
- Scegliere le tabelle specifiche di cui si vuole vedere il backup;
- Modificare il tipo di compressione (o lasciarlo a gzipped, si consiglia di farlo);
- Inizi il backup cliccando sul pulsante “go”
Questo conclude il nostro elenco delle opzioni di backup relativamente più popolari per le sue esigenze di backup di base del database MySQL.
Lo scopo del modulo di backup MySQL con Bacula Enterprise
Lo scopo generale del modulo di backup MySQL di Bacula Enterprise è quello di automatizzare i processi di backup e ripristino. Utilizzando questo modulo, l’amministratore di backup non deve conoscere tutti i dettagli delle tecniche di backup di MySQL e non è nemmeno richiesta la capacità di scrivere script. Il modulo stesso è in grado di eseguire una serie di funzioni diverse, tra cui il backup automatico dei file di configurazione e di altri dati di sistema importanti. Esistono due metodi di backup principali: dump e binario.
Binario o Dump?
Poiché esistono due tecniche di backup principali, è meglio presentare un confronto diretto di alcune delle loro caratteristiche in una tabella qui sotto.
Capacità | Binario | Dump |
Ripristino di un singolo oggetto | No | Sì* |
Dimensioni di backup | Grande | Piccolo |
Velocità di backup | Veloce | Lento |
Ripristino della velocità | Veloce | Molto lento |
Capace di ripristinare in qualsiasi momento | Sì | Sì |
Supporto di tipi di backup differenziali e incrementali | Sì | Sì |
Consistenza | Sì | Sì |
Backup online | Sì | Sì |
Ripristino alla versione principale precedente di MySQL | No | Sì** |
Ripristino alla versione principale più recente di MySQL | No | Sì |
* Per eseguire il ripristino di un singolo oggetto è necessaria la modifica manuale di un file di dump.
** Potrebbe essere necessaria una modifica manuale del file SQL per ripristinare un dump SQL a una versione precedente di MySQL, se sta utilizzando funzioni non disponibili sulla versione precedente. In generale, il ripristino a una versione precedente di MySQL non è garantito e non è supportato.
Come funziona: Modalità binaria
Il principio di funzionamento principale della modalità binaria è la sua interazione con Percona XtraBackup, che le consente di eseguire il processo di backup senza interromperlo all’inizio. È in grado di lavorare con InnoDB, XtraDB, MyISAM e altre tabelle con MySQL non modificato, o con un server Percona con XtraDB.
In precedenza esistevano due modi principali per eseguire una copia del database. Il primo implicava la copia del database attivo, e questo metodo aveva un’alta probabilità di avere ogni sorta di discrepanze nella copia, oppure poteva mancare tutte le modifiche avvenute nel database per il periodo di tempo in cui la copia veniva creata. Il secondo metodo implicava l’arresto completo del database per creare una copia coerente. Ma il problema del secondo modo è che potenzialmente (e di solito) ogni secondo in cui il database di un’azienda non funziona rappresenta una perdita di entrate, a prescindere da quanto piccolo sia il periodo di arresto.
Proprio a questo scopo, il modulo MySQL Percona di Bacula e lo strumento Percona XtraBackup offrono una soluzione efficace a questo problema, grazie alla possibilità di creare backup completi o incrementali di qualsiasi tipo di database MySQL attivo e funzionante. Un ulteriore vantaggio della modalità collegata a Percona è che non deve utilizzare file temporanei di grandi dimensioni, che sono i duplicati dei dati di cui si sta eseguendo il backup o il ripristino.
Il processo di ripristino è relativamente semplice: i dati vengono ripristinati in una posizione temporanea e poi modificati per essere coerenti con l’aiuto della funzione “prepara”. Questa funzione, con altre soluzioni, sarebbe molto onerosa in termini di risorse e non è qualcosa che si desidera eseguire durante una situazione di ripristino urgente. Pertanto, per evitare di aggiungere molto tempo al processo di ripristino, la funzione “prepara” di Bacula viene eseguita automaticamente e in anticipo, subito dopo la creazione del backup. Questo aggiunge un po’ di tempo al processo di backup, ma rende il processo di ripristino molto più veloce. In caso di emergenza, il tempo di ripristino è molto più critico del tempo di backup. E in una situazione in cui il database in questione è estremamente grande e ad alte transazioni, questa differenza di tempo può addirittura fare la differenza tra la capacità di un’organizzazione di rimanere in attività.
La necessità di questa combinazione del modulo Bacula Enterprise MySQL Percona e degli strumenti Percona deriva dall’esistenza problematica del MySQL tradizionale. Il problema principale della creazione di un “mysqldump” è che non si tratta di un vero backup binario dei dati; l’intero processo consiste nel convertire l’intero database in una grande quantità di istruzioni SQL e nell’elaborarle successivamente come parte del processo di ripristino. Questo processo, così com’è, diventa estremamente lento quanto più grande è il database.
Gli strumenti Percona sono utili quando c’è una situazione che comporta un carico pesante su MySQL in generale e sono necessarie sia le prestazioni che la stabilità per il corretto funzionamento del sistema.
Tutte le aziende che hanno bisogno di ripristinare il proprio server guasto in modo sicuro e rapido per proteggere la propria attività da un grave fallimento o addirittura dalla bancarotta, possono approfittare di questa speciale combinazione di strumenti Percona con le funzionalità di Bacula per rendere il processo di ripristino il più rapido possibile in un ambiente aziendale.
Come funziona: Modalità Dump
La modalità Dump è più o meno l’opzione di backup “legacy” che è ancora rilevante in casi specifici. Si basa sui file di registro che vengono creati nel processo di esistenza del database MySQL, e questi registri vengono utilizzati dal sistema di ripristino point-in-time per eseguire varie operazioni con i suoi dati, come la replica, la protezione e così via.
Il metodo di backup predefinito consiste nell’eseguire il dump di ciascuno dei database separatamente, il che significa che i dati non saranno completamente coerenti se ripristina diversi database di cui è stato eseguito il backup in periodi di tempo diversi e che non hanno alcuna coerenza tra loro. Questo è un problema significativo se si lavora con più database contemporaneamente, e la soluzione di Bacula consiste nel salvare i file di registro generati durante ciascuno dei processi di backup e poi riprodurre questi file per assicurarsi che tutti i database siano globalmente coerenti tra loro.
Esiste anche un’altra soluzione al problema, più globale: l’opzione all_databases. Consente di eseguire il dump di tutti i database in una sola volta, in modo da essere sicuri che i database siano coerenti e da poter eseguire più backup incrementali dopo questo backup completo senza temere l’inconsistenza globale.
Esiste un elenco specifico di file che l’agente MySQL genera nel catalogo Bacula per un singolo “test” del suo database. Può vedere queste voci di file e il loro scopo nella tabella sottostante.
Nome del file | Apparecchio | Descrizione |
global-grants.sql | global | Un elenco unificato che specifica tutti gli utenti, le loro password e altri dati specifici. |
createdb.sql | database | Script sulla creazione del database |
grants.sql | database | A list that specifies every user that is associated with this database |
data.sql | database | I dati del suo database in formato dump |
settings.txt | global | Variabili attuali del server MySQL |
schema.sql | database | Script sulla creazione dello schema del database |
my.cnf | global | Dati di configurazione del server per MySQL |
Modalità di ripristino MySQL
L’agente MySQL di Bacula è in grado di fornire diverse modalità di ripristino, come ad esempio:
- Ripristino di un singolo database;
- Ripristino di dump o log binari;
- Ripristino point-in-time;
- Ripristino di utenti e ruoli.
Come detto, Bacula Enterprise utilizza gli strumenti di Percona con il suo agente MySQL per ripristinare qualsiasi informazione su un backup in modalità binaria.
Conclusione
Le nuove tecnologie in tutti gli ambienti AII vengono sviluppate costantemente. Per questo motivo, la maggior parte delle aziende trae vantaggio da una soluzione di backup che si innova regolarmente e che garantisce la copertura di tutti i tipi di tecnologie in un reparto IT o in un centro dati, siano esse nuove o vecchie. Il risultato dell’utilizzo di una soluzione di backup moderna e innovativa è in genere un RTO e un RPO più brevi, una minore manutenzione, costi inferiori e una sicurezza molto più elevata. Bacula Enterprise è un buon esempio di un fornitore di soluzioni di backup di questo tipo.