Data

3 ago, 2015

Script de backup (Xtrabackup + retenção + monitoramento)

Publicidade

A ideia desse artigo é mostrar um processo/ política de backup por completo, contemplando:

  • Backup full online e comprimido;
  • Retenção de logs binários;
  • Controle de espaço em disco através do expurgo dos backups mais antigos;
  • Catálogo de backup;
  • Monitoramento do backup;

Para que seja possível acompanhar esse artigo, recomendo que leia primeiramente este e este artigo. Eles lhe darão uma base conceitual de DBA e uma apresentação inicial das capacidades da ferramenta Xtrabackup. Instale o Xtrabackup como mencionado no artigo “backup com xtrabackup”. Para começar, configure o log binário do MySQL; isso possibilitará o famoso “point-time-recovery”, ou seja, voltar o banco de dados à um exato momento antes do erro. Dessa forma, não é necessário retornar o banco de dados apenas até o backup full:. Edite o arquivo “my.cnf” e insira as linhas a seguir:

[mysqld]
logbin
expire_logs_days=7

Lembre de alterar a retenção conforme desejado. Como mencionado no artigo “Soluções de Backup do MySQL”, o administrador deve definir uma janela de backup para execução do mesmo. Após essa definição, edite a “crontab” do usuário que executará o backup. No meu exemplo será o “root”:. Insira as seguintes linhas:

# BACKUP MYSQL
00 00 * * * sh /root/mysqlbackup.sh

Crie  o script “mysqlbackup.sh” no diretório que será invocado pela “crontab”:

#!/bin/bash
#########################################################
#-------------------------------------------------------#
# Developed by: Mathias Brem Garcia     ----------------#
#-------------------------------------------------------#
#             Using Percona Xtrabackup                  #
#########################################################
#-------------------------------------------------------#
#########################################################
#########################################################
#
#####SET VARIABLES
#
USER='backup';
PASSWORD='ASd09%*u';
HOST='localhost';
BACKUP_ROOT='/backup/mysql/hotbackup/';
DATE=$(date +"%Y-%m-%d %H:%M:%S");
BACKUP_DIR=$BACKUP_ROOT$(date +"%Y-%m-%d_%H:%M:%S");
CLEAR_BACKUPS_LAST_DAYS=1;
#
#### CLEAR BACKUP DIR
#
OLD_BACKUPS=$(mysql -u backup -p$PASSWORD -s -D mysql -e"select backup_dir from backup_log where backup_retained='Y' and backup_date <= DATE_SUB(CURDATE(),INTERVAL $CLEAR_BACKUPS_LAST_DAYS DAY)");
 
for i in $OLD_BACKUPS
do
rm -rf $i
mysql -u backup -p$PASSWORD -D mysql -e"update backup_log set backup_retained='N' where backup_dir='$i';";
done
#
#### EXECUTED BACKUP
#
BACKUP_START_TIME_HOT=$(date +"%Y-%m-%d %H:%M:%S");
innobackupex --user=$USER --password=$PASSWORD $BACKUP_DIR --no-timestamp --parallel=4 --compress --compress-threads=4 --defaults-file=/etc/my.cnf 2>> /var/log/mysqlbackup.log
STATUS_BACKUP_HOT=$?
BACKUP_END_TIME_HOT=$(date +"%Y-%m-%d %H:%M:%S");
#
##### LOG BACKUP FOR MONITORING
#
if [ $STATUS_BACKUP_HOT == "0" ] ; then
 mysql -u backup -p$PASSWORD -D mysql -e"insert into backup_log(backup_type,backup_date,backup_status,backup_log,backup_start_time,backup_end_time,backup_dir) values('Xtrabackup Full','$DATE','OK','Backup Executado com Sucesso! $DATE','$BACKUP_START_TIME_HOT','$BACKUP_END_TIME_HOT','$BACKUP_DIR');";
elif [ $STATUS_BACKUP_HOT != "0" ] ; then
 mysql -u backup -p$PASSWORD -D mysql -e"insert into backup_log(backup_type,backup_date,backup_status,backup_log,backup_start_time,backup_end_time,backup_dir) values('Xtrabackup Full','$DATE','CRIT','Backup Falhou! $DATE, log em /var/log/mysqlbackup.log','$BACKUP_START_TIME_HOT','$BACKUP_END_TIME_HOT','$BACKUP_DIR');";
fi

Para monitorar e catalogar os backups, crie a tabela a seguir no database “mysql”:

CREATE TABLE `backup_log` (
  `backup_date` datetime NOT NULL,
  `backup_type` char(75) NOT NULL,
  `backup_status` char(8) NOT NULL,
  `backup_dir` varchar(400) NOT NULL,
  `backup_retained` char(1) NOT NULL DEFAULT 'Y',
  `backup_log` varchar(400) DEFAULT NULL,
  `backup_start_time` datetime DEFAULT NULL,
  `backup_end_time` datetime DEFAULT NULL,
  PRIMARY KEY (`backup_date`,`backup_type`),
  UNIQUE KEY `backup_dir` (`backup_dir`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 COMMENT='Table for log backup history'

Atribua os privilégios ao usuário que gerencia os backups e administra o catálogo:

CREATE USER 'backup'@'localhost' IDENTIFIED BY 'Password';
GRANT SELECT, INSERT, UPDATE ON mysql.backup_log TO 'backup'@'localhost';
GRANT REPLICATION CLIENT ON *.* TO 'backup'@'localhost';

O histórico deve ser algo parecido :

backup_log

backup_history

Bem, agora fique tranquilo, pois você já terá uma rotina de backup alto gerenciada, que excluirá os backups mais velhos automaticamente, limpando a unidade para novos backups. Falta monitorar! Isso é muito importante, para garantir que o ambiente tenha sempre backups atualizados e disponíveis (não se esqueça de manipular as variáveis do script, alterando o período de retenção e o diretório de destino dos backups). Basta fazer um plugin do nagios que analise esse log estruturado, em tabela, utilize o usuário “backup” que criamos acima para fazer as querys de verificação.

Perguntas?