Contents
A necessidade de backups do banco de dados MySQL não é tão universal quanto a necessidade de backups regulares para usuários finais, mas quando necessário, torna-se uma parte especialmente importante da infraestrutura de uma empresa. O módulo do Bacula Enterprise para backups do MySQL permite aos usuários fazer backups e restaurações desse banco de dados de maneira fácil e eficiente, e mais importante ainda, em um tempo muito curto. Isso, é claro, é fundamental para o cumprimento de qualquer RTO (recovery time objectives). Esse artigo se aprofunda na própria natureza de um processo automático de backup do MySQL, incluindo abordagens gratuitas e pagas de backup e recuperação, e diferentes opções de personalização.
Diferentes maneiras de criar um backup do banco de dados MySQL
Antes de passarmos para a solução do Bacula Enterprise, vamos rever algumas das maneiras diferentes e não convencionais de criar um backup do banco de dados MySQL.
1. Backup automático do banco de dados MySQL baseado em Linux
Um certo utilitário baseado em Linux/Unix com o nome cron pode fazer backups do MySQL nesses sistemas. Ele é um utilitário relativamente simples que inicia com o sistema e lê suas instruções a partir de um arquivo específico. Esse arquivo de configuração é geralmente armazenado em /etc/crontab. Aqui está um exemplo de um backup configurado para 2:30 da manhã:
30 2 * * * root mysqldump -u root -pPASSWORD –all-databases | gzip >
/mnt/disk2/database_`data ‘ %m-%d-%Y’`.sql.gz
Os primeiros cinco dígitos do comando representam a hora e a data (minutos, horas, dias do mês, meses, dias da semana, respectivamente), e colocar “*” em vez de um desses números significa que qualquer número funciona.
2. Usando PHP para criar um arquivo XML
Também é possível recriar seu banco de dados como um arquivo XML, com a ajuda do PHP. Não é o formato mais seguro do mundo quando se trata de restaurar seus dados, mas algumas pessoas o preferem em relação a qualquer outra coisa. Esse trecho de código abaixo deve permitir à você exportar um banco de dados específico no arquivo com 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. Usando o PHP como um método de backup
Uma outra maneira de usar o PHP para suas necessidades de backup é pegar uma consulta de backup de banco de dados de um arquivo PHP e usá-la. A query no exemplo a seguir é 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, é claro, você também precisará de uma maneira de restaurar esse tipo de backup. Nesse caso, a 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 usando SSH
O backup via SSH é possível mesmo para um banco de dados MySQL particularmente grande. Em seu painel Plesk, comece por permitir o acesso via shell, e depois use qualquer ferramenta que possa obter acesso ao servidor em questão via SSH (PuTTY ou ferramenta similar). Porém, primeiro, você terá que especificar um diretório de destino para seu futuro backup:
CD wwwroot/dbbackup
E então você usará o mysqldump para exportar seu banco de dados em um arquivo específico dentro de um servidor:
mysqldump –add-drop-table -u db_username -p db_name > mybackup.sql
5. Usando Shell Script para fazer backup de um banco de dados MySQL via Ubuntu
Se você tem um servidor VPS dedicado com Ubuntu Linux, então tem outra opção de backup. Você pode usar um shell script específico para fazer backup de todos os seus bancos de dados em seu servidor FTP. Aqui está um exemplo:
#!/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
Depois que você tiver terminado de salvar esse segmento como um arquivo .sh, o próximo passo é estabelecer o nível de permissão correto para esse arquivo específico:
$ chmod +x /home/your-name/mysql.backup.sh
De agora em diante, você poderá inserir um dos dois comandos para iniciar seu processo de backup:
/home/your-name/mysql.backup.sh
Ou:
sudo /home/your-name/mysql.backup.sh
Você também pode configurar esse script para ser executado como um cron job. Aqui está um exemplo de script que funciona diariamente à meia-noite e consiste em dois comandos diferentes:
$ sudo crontab -e
E:
@midnight /home/you/mysql.backup.sh >/dev/null 2>&1
É possível que esses scripts funcionem também com diferentes distribuições UNIX ou Linux.
6. Usando a phpMyAdmin
phpMyAdmin é uma ferramenta de código aberto que também é gratuita, e funciona com bancos de dados MySQL e MariaDB. A ordem correta dos passos necessários é o seguinte:
- Abrir a ferramenta em questão;
- Selecionar o banco de dados do qual deseja criar um backup;
- Selecionar a opção “export” na barra de navegação;
- Clicar na linha “display all possible options”;
- Escolher as tabelas específicas que deseja fazer backup;
- Mudar o tipo de compressão (ou deixar em gzipped, que é o mais recomendado);
- Iniciar o backup clicando no botão “go”.
Isso conclui nossa lista das opções de backup relativamente mais populares para suas necessidades básicas de backup do banco de dados MySQL.
A finalidade do módulo de backup para MySQL com o Bacula Enterprise
O objetivo geral do módulo de backup para MySQL do Bacula Enterprise é automatizar os processos de backup e restauração. Ao usar esse módulo, o administrador de backup não precisa conhecer todos os detalhes das técnicas de backup do MySQL, e também não há nenhuma exigência de habilidade para escrever scripts. O módulo em si é capaz de executar uma variedade de funções diferentes, incluindo backup automático para arquivos de configuração e outros dados importantes do sistema. Existem dois métodos principais de backup: dump e binary.
Binary ou Dump?
Como há duas técnicas principais de backup, é melhor apresentar uma comparação direta de algumas de suas características em uma tabela abaixo.
Funcionalidades | Binary | Dump |
Restauração de um único objeto | Não | Sim* |
Tamanho do backup | Grande | Pequeno |
Velocidade de backup | Rápido | Lento |
Velocidade de restauração | Rápido | Muito lento |
Capaz de restaurar a qualquer momento | Sim | Sim |
Suporte para backup diferencial e incremental | Sim | Sim |
Consistência | Sim | Sim |
Backup online | Sim | Sim |
Restauração à versão anterior principal do MySQL | Não | Sim** |
Restauração de uma versão mais recente do MySQL | Não | Sim |
* A edição manual de um arquivo dump é necessária para realizar uma restauração de um único objeto.
** A edição manual do arquivo SQL pode ser necessária para restaurar um SQL dump para uma versão mais antiga do MySQL, se você estiver usando recursos que não estão disponíveis na versão mais antiga. Em geral, a restauração para uma versão mais antiga do MySQL não é garantida e não é suportada.
Como funciona: Modo binary
O princípio central do modo binário é sua interação com o Percona XtraBackup, que lhe permite realizar o processo de backup sem precisar pará-lo para começar. Ele consegue trabalhar com InnoDB, XtraDB, MyISAM e outras tabelas de um MySQL não modificado, ou com um servidor Percona do XtraDB.
Anteriormente, havia duas formas principais de se fazer uma cópia de um banco de dados. A primeira implicava em copiar o banco de dados ativo, e esse método tinha uma grande chance de ter todo tipo de discrepâncias na cópia, ou ficar faltando todas as mudanças que aconteceram enquanto a cópia estava sendo criada. A segunda implicava em parar completamente o banco de dados para fazer uma cópia consistente. Mas o problema com essa segunda maneira é que potencialmente (e geralmente) cada segundo em que o banco de dados de uma empresa não funciona representa uma perda de receita, não importa quão pequeno seja esse período de parada.
Para esse exato propósito, o módulo MySQL Percona do Bacula e a ferramenta Percona XtraBackup oferece uma solução efetiva para esse problema, tendo a capacidade de criar backups completos ou incrementais de qualquer tipo de banco de dados MySQL ativo e em funcionamento. Uma outra vantagem do modo Percona conectado é que ele não precisa usar grandes arquivos temporários, que são as cópias dos dados que você está fazendo backup ou restaurando.
O processo de restauração é relativamente simples, com os dados sendo restaurados para um local temporário e depois alterados para serem consistentes com a ajuda da função “prepare”. Essa função seria, com outras soluções, muito pesada em termos de recursos, e não algo que você desejaria realizar durante uma situação de recuperação urgente. Portanto, para evitar acrescentar muito tempo ao processo de restauração, a função “prepare” do Bacula é executada automaticamente e com antecedência, logo após a criação do backup. Isso acrescenta um pouco de tempo ao processo de backup, mas torna o processo de restauração muito mais rápido. Em caso de emergências, o tempo de restauração é muito mais crítico do que o tempo de backup. E numa situação em que o banco de dados em questão é extremamente grande e de alta transação, esse pequeno aumento de tempo pode até mesmo ser a diferença para uma organização permanecer em atividade.
A necessidade dessa combinação do módulo MySQL Percona do Bacula Enterprise e das ferramentas Percona vem da existência problemática do MySQL tradicional. O principal problema de criar um “mysqldump” é que ele não é um verdadeiro binary backup dos dados. De fato, o processo consiste na conversão de todo o banco de dados na grande quantidade de instruções SQL e seu processamento posterior como parte do processo de restauração. Esse processo, exatamente assim, vai ficando mais lento à medida que seu banco de dados cresce.
As ferramentas Percona são úteis quando há uma situação que coloca uma carga pesada sobre o MySQL e, tanto o desempenho, quanto a estabilidade são necessários para que o sistema funcione corretamente.
Qualquer empresa que precise restaurar seu servidor com segurança e rapidez para proteger seus negócios de falhas graves, ou mesmo ir à falência, pode tirar vantagem dessa combinação especial de ferramentas Percona com as funcionalidades do Bacula para tornar o processo de restauração o mais rápido possível em um ambiente empresarial.
Como funciona: Modo Dump
O modo dump é mais ou menos a opção de backup “legado” que ainda é relevante em casos específicos. Ele se baseia nos arquivos de log que são criados no processo de existência do banco de dados MySQL, e esses logs são utilizados pelo sistema de recuperação point in time para realizar várias coisas com seus dados, como replicação, proteção, e assim por diante.
O método padrão de backup é fazer dump de cada um de seus bancos de dados separadamente, o que significa que seus dados não serão completamente consistentes se você restaurar vários bancos de dados que foram copiados em diferentes períodos e não têm consistência entre si. Essa é uma questão significativa se você estiver trabalhando com vários bancos de dados ao mesmo tempo, e a solução do Bacula para isso é salvar os arquivos de log que são gerados durante cada um dos processos de backup e depois reproduzir esses arquivos para garantir que todos os bancos de dados sejam globalmente consistentes uns com os outros ao mesmo tempo.
Há também outra solução, mais global, para o problema: a opção all_databases. Ela permite que seja feito dump de todos os bancos de dados de uma só vez, permitindo que você tenha certeza de que seus bancos de dados são consistentes e consiga fazer múltiplos backups incrementais após esse completo, sem medo de inconsistências globais.
Há uma lista específica de arquivos que o agente MySQL gera no catálogo Bacula para um único “teste” de seu banco de dados. Você pode ver essas entradas de arquivos e para que eles são necessários na tabela abaixo.
Nome do arquivo | Aplicação | Descrição |
global-grants.sql | global | Lista unificada que especifica todos os usuários, suas senhas e outros dados específicos |
createdb.sql | banco de dados | Script sobre a criação do banco de dados |
grants.sql | banco de dados | Uma lista que especifica cada usuário que está associado a esse banco de dados |
data.sql | banco de dados | Os dados de seu banco de dados em formato dump |
settings.txt | global | Variáveis atuais do servidor MySQL |
schema.sql | banco de dados | Script sobre a criação do esquema do banco de dados |
my.cnf | global | Dados de configuração do servidor para o MySQL |
Modos de restauração MySQL
O agente MySQL do Bacula é capaz de fornecer vários modos diferentes de restauração, como por exemplo:
- Restauração de banco de dados individual;
- Restauração de logs dump ou binary;
- Restauração point in time;
- Restauração de usuários e funções.
Como mencionado, o Bacula Enterprise utiliza ferramentas Percona com seu agente MySQL para restaurar qualquer informação através de um backup em modo binário.
Conclusão
Novas tecnologias são desenvolvidas em todos os ambientes o tempo todo. Por esse motivo, a maioria das empresas se beneficia de uma solução de backup que inova regularmente, e assegura que ela possa abranger todos os tipos de tecnologias em um departamento de TI ou data center , sejam essas tecnologias novas ou antigas. O resultado do uso de uma solução de backup moderna e inovadora é normalmente RTOs e RPOs mais curtos, menor manutenção, menores custos, e muito mais segurança. O Bacula Enterprise é um bom exemplo desse tipo de provedor de soluções de backup.