Área do cliente

Script de backup

banco de dados
Foto de gráficos em um tablet

[vc_row][vc_column][vc_column_text]A

ideia aqui é mostrar uma rotina de backup lógico alternativa ao convencional mysqldump, realizando um backup lógico na menor janela de disponibilidade possível se comparado ao dump convencional.

  • 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
  • Catalogo de backup
  • Monitoramento do backup
  • Backup lógico e organizado sem o uso do convencional Mysqldump

Lembrando que já foram postadas aqui soluções de backup iguais a essa utilizando o Xtrabackup e o Mysqldump, nesse tutorial vou abordar a solução Mydumper, sugiro a leitura dos artigos “Soluções de Backup no MySQL” e “Mydumper & Myloader- Substituindo o Mysqldump” para um melhor aproveitamento dos conceitos envolvidos neste artigo e também como guia de instalação do MyDumper, segue os links:

http://mathiasbrem.com.br/solucoes-de-backup-no-mysql/

http://mathiasbrem.com.br/mydumper-myloader-substituindo-o-mysqldump/[/vc_column_text][wgl_spacing spacer_size=”60px”][vc_column_text]

Retenção de logs binários

Para começar configure o log binário do MySQL, isso possibilitará o famoso “point-time-recovery”, ou seja, retornar o estado do banco de dados à um exato momento de seu histórico “antes de uma cagada por exemplo!”, não sendo necessário retornar o banco de dados apenas até o backup full e evitando assim a perda de dados:

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, especifiquei 7 dias como exemplo! Conforme mencionado no artigo “Soluções de Backup do MySQL”, o administrador deve definir uma janela de backup para execução do mesmo.

[/vc_column_text][wgl_spacing spacer_size=”60px”][vc_column_text]

Backup Full Online e Comprimido

Após as definições acima, 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_mydumper.sh

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

 

#!/bin/bash
#########################################################
#-------------------------------------------------------#
# Developed by: Mathias Brem Garcia     ----------------#
#-------------------------------------------------------#
# Using MyDumper                                        #
#########################################################
#-------------------------------------------------------#
#########################################################
#########################################################
#
#####SET VARIABLES
#
USER='backup';
PASSWORD='ASd09%*u';
HOST='roxpartner.com';
BACKUP_ROOT='/backup/mysql/mydumper/';
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 $USER -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 $USER -p$PASSWORD -D mysql -e"update backup_log set backup_retained='N' where backup_dir='$i';";
done
#
#### EXECUTED BACKUP
#
BACKUP_START_TIME_DMP=$(date +"%Y-%m-%d %H:%M:%S");
mydumper -t 8 -c -u $USER -p $PASSWORD -h $HOST --outputdir $BACKUP_DIR --less-locking
STATUS_BACKUP_DMP=$?
BACKUP_END_TIME_DMP=$(date +"%Y-%m-%d %H:%M:%S");
#
##### LOG BACKUP FOR MONITORING
#
if [ $STATUS_BACKUP_DMP == "0" ] ; then
        mysql -u $USER -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('Mydumper Full','$DATE','OK','Backup Executado com Sucesso! $DATE','$BACKUP_START_TIME_DMP','$BACKUP_END_TIME_DMP','$BACKUP_DIR');";
elif [ $STATUS_BACKUP_HOT != "0" ] ; then
        mysql -u $USER -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('Mydumper Full','$DATE','CRIT','Backup Falhou! $DATE, log em /var/log/mysqlbackup.log','$BACKUP_START_TIME_DMP','$BACKUP_END_TIME_DMP','$BACKUP_DIR');";
fi

[/vc_column_text][wgl_spacing spacer_size=”60px”][vc_column_text]

Catalogo de backup

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 catalogo:

 

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';

[/vc_column_text][wgl_spacing spacer_size=”60px”][vc_column_text]

Monitoramento do backup

O histórico deve ser algo parecido :

[/vc_column_text][wgl_spacing spacer_size=”20px”][vc_single_image image=”1564″ img_size=”full”][wgl_spacing spacer_size=”20px”][vc_column_text]

Basta escrever um plugin em shell script, nada muito complexo, buscando pelas informações nesse catalogo e validando de acordo com sua politica de backup se o mesmo está em atraso ou em conformidade com a politica.
O diretório de backup conterá arquivos e pastas como o exemplo a seguir:

[/vc_column_text][wgl_spacing spacer_size=”20px”][vc_single_image image=”1567″ img_size=”full”][wgl_spacing spacer_size=”20px”][vc_column_text]

Ainda como sugestão, segue uma apresentação útil para maior conhecimento sobre o Mydumper:

[/vc_column_text][/vc_column][/vc_row]