Práticas recomendadas para backup de bancos de dados mysql

2

Esta questão diz respeito às melhores práticas para backup do mysql com replicação e grande número de bancos de dados. Eu estou procurando o seu ponto de vista e sugestões:)

I - Situação atual

Eu tenho dois bancos de dados mestre / escravo (replicação mysql) em cada um dos meus servidores de aplicativos. Eu tenho um banco de dados por cliente e um banco de dados "admin".

Atualmente, recebo um total de 500 bancos de dados e, em breve, excederá 1 K.

Cada banco de dados inclui cerca de 100 tabelas e, no momento, chego a cerca de 10 milhões a 30 meses por banco de dados após a operação do mysqldump (descompactado).

II - O que eu preciso

Agora estou procurando fazer backup desses bancos de dados. O principal objetivo é, com certeza, responder a falhas do servidor e criar um processo de recuperação de desastres, mas antes de tudo isso, estou mais preocupado com meus clientes que se atrapalharam com os dados. Para resumir, quero poder:

  • Backup e recuperação de todos os bancos de dados em caso de queda ou ataque de servidores. (E depois para executar uma recuperação de desastres).
  • Faça backup de todos os bancos de dados e recupere um banco de dados específico para restaurar uma nova cópia (digamos que não tenha mais de 24 horas) quando um cliente interfere nos dados de sua conta.

III - Minhas idéias atuais e minhas perguntas

1 - local de backup

O backup do banco de dados não deve ser feito no mesmo servidor que o próprio banco de dados. Como estou usando a replicação em dois servidores diferentes, você acha que é uma boa prática fazer backup de meus dados no outro servidor? Ou quais seriam as outras soluções como servidor dedicado e por quê?

2 - Processo de backup

Primeiro, vou fazer backup do banco de dados escravo seguindo o princípio de parar a replicação temporária e fazer um backup em "somente leitura".

Acho que tenho aqui para considerar dois tipos diferentes de backup. O primeiro backup será um backup de arquivos de dados brutos que eu executarei, digamos, toda semana (como estou usando a replicação, estou bem seguro). E o segundo tipo de backup seria um mysqldump de cada banco de dados que eu executaria a cada 24 horas. É algo que parece lógico?

Existe algum outro ponto que eu deva considerar? O backup incremental é algo interessante para mim?

Muito obrigado!

    
por maxime_039 04.12.2015 / 11:55

1 resposta

0

As práticas recomendadas dependem do que você precisa recuperar. Você definitivamente deve fazer backup para armazenamento diferente, idealmente em geolocalização diferente. Eu tenho este pequeno script, que detecta todos os bancos de dados e faz backup de cada banco de dados em um arquivo separado, para que eu possa recuperar apenas um banco de dados.

#!/bin/bash
echo "Starting..."
ROOTDIR="/backup/mysql/es2"
YEAR='date +%Y'
MONTH='date +%m'
DAY='date +%d'
HOUR='date +%H'
SERVER="mysql.local"
BLACKLIST="information_schema performance_schema"
if [ ! -d "$ROOTDIR/$YEAR/$MONTH/$DAY/$HOUR" ]; then
    mkdir -p "$ROOTDIR/$YEAR/$MONTH/$DAY/$HOUR"
fi
echo "running dump"
dblist='mysql -u backuper -pXXXXXXXXXXX -h $SERVER -e "show databases" | sed -n '2,$ p''
for db in $dblist; do
    echo "Backuping $db"
    isBl='echo $BLACKLIST |grep $db'
    if [ $? == 1 ]; then
        mysqldump --single-transaction -u backuper -pXXXXXXXXXX -h $SERVER $db | gzip --best > "$ROOTDIR/$YEAR/$MONTH/$DAY/$HOUR/$db.sql.gz"
        echo "Backup $db ends with return code $?"
    else
        echo "Database $db is on blacklist, skip"
    fi
done

echo "dump completed"

Cada backup é mantido na estrutura de diretório YEAR / MONTH / DAY / HOUR / DB_NAME.sql.gz. Você pode especificar qual DB você não deseja fazer backup na variável BLACKLIST.

    
por 04.12.2015 / 13:32