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 soluções de backup iguais a essa utilizando o Xtrabackup e o Mysqldump. Neste artigo vou abordar a solução Mydumper, então 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.
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.
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='localhost'; 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
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';
Monitoramento do backup
O histórico deve ser algo parecido:
O diretório de backup conterá arquivos e pastas como o exemplo a seguir:
Ainda como sugestão, segue uma apresentação útil para maior conhecimento sobre o Mydumper: http://pt.slideshare.net/prkart/mydumper