Script de backup para o MySQL ou MariaDB

Segue um script simples de backup para o MySQL ou o MariaDB. O script tem como pré-requisito a criação de um usuário específico para backup, com privilégios restritos (altere o que está em vermelho e itálico):

#!/bin/bash

# backup_mysql.sh
# Script para backup simples de um ou mais bancos de dados MySQL/MariaDB

# Dados de conexão:
#------------------
host="localhost"
bancos="nome_do_banco" # Se mais de um, separar por espaços
usuario="nome_do_usuario"
senha="senha_do_usuario"
data=`date +"%Y-%m-%d_%H-%M-%S"`
arquivo="/path/do/diretorio/de/backup/${data}"

# Configura opções:
#------------------
opcoes="--add-drop-database --add-drop-table --add-locks --comments --complete-insert --create-options --disable-keys --default-character-set=utf8 --extended-insert --dump-date --lock-tables --order-by-primary --quick --routines --set-charset --triggers"

# Faz backup:
#------------
for i in `echo $bancos`
do
  mysqldump -h $host -u $usuario --password=$senha --databases $i -r ${arquivo}_${i}.sql
done

O script acima fará um backup de todos os bancos listados, gerando arquivos com o nome de: YYYY-MM-DD_HH-MI-SS_nome_do_banco.sql.

Obviamente o usuário que faz o backup deve ter permissão em todos os bancos de dados.

Agora configure o cron para rodar automaticamente o script e apagar os backups mais velhos que 5 dias. Coloque isso em seu crontab (altere o que está em vermelho itálico):

# Faz o backup do MySQL, todo dia as 19:00h:
00 19 * * * /path/ate/o/script/backup_mysql.sh


# Apaga os backups antigos do MySQL (backups com mais de 5 dias),
# todo dia as 19:30h:
30 19 * * * find /path/do/diretorio/de/backup -name "*.sql" -mtime +5 -exec rm -f {} \;

Agora você já tem um script simples para o backup de seus bancos de dados. Obviamente você deverá copiar esse backup para algum outro host ou mídia de backup.

Usuário específico para backup no MySQL (MariaDB)

Muitas vezes precisamos escrever scripts de backup para o MySQL (ou o MariaDB) que armazenam a senha de acesso ao banco de dados. Obviamente se seu servidor for comprometido e o hacker tiver acesso ao script de backup, ele pegará a senha do banco de dados de presente.

Um jeito mais seguro de usar scripts com senhas de usuários para backup é criar um usuário específico para backup, com dois privilégios: SELECT e de LOCK TABLES. Um hacker que conseguisse essa senha específica do usuário de backup ainda conseguiria fazer algum estrago (dar um lock me alguma tabela), mas não conseguiria apagar um banco de dados ou alterar os dados.

Para aumentar um pouco a segurança de seus scripts de backup, crie o usuário específico, dê os grants e use esse usuário/senha em seus scripts. Entre no MySQL (ou MariaDB) como usuário root e faça o seguinte (substitua os nomes em itálico sublinhado de acordo com seu sistema):

CREATE USER usuario@localhost
IDENTIFIED BY 'senha';

GRANT SELECT, LOCK TABLES
ON nome_do_banco_de_dados.*
TO usuario;

FLUSH PRIVILEGES;

Agora você tem um usuário que só pode dar SELECT e LOCK TABLES, e apenas para o banco de dados que você especificou.

Use esse usuário/senha menos privilegiado em seus scripts de backup.