Назад | Перейти на главную страницу

Лучшие практики для резервного копирования баз данных mysql

Этот вопрос касается лучших практик резервного копирования mysql с репликацией и большим количеством баз данных. Ищу вашу точку зрения и предложения :)

I - Текущая ситуация

У меня есть две базы данных master / slave (репликация mysql) на каждом из моих серверов приложений. У меня есть одна база данных по клиентам и одна база данных администратора.

Сейчас у меня всего 500 баз данных, и скоро их количество превысит 1К.

Каждая база данных включает около 100 таблиц, и на данный момент я прихожу к 10-30 месяцам по базе данных после операции mysqldump (без сжатия).

II - Что мне нужно

Я сейчас ищу резервную копию этих баз данных. Основная цель - точно ответить на сбои сервера и построить процесс аварийного восстановления, но прежде всего меня больше беспокоят мои клиенты, которые испортили свои данные. Подводя итог, я хочу уметь:

III - Мои текущие идеи и мои вопросы

1 - Место резервного копирования

Резервное копирование базы данных не должно выполняться на том же сервере, что и сама база данных. Поскольку я использую репликацию на двух разных серверах, считаете ли вы, что резервное копирование моих данных на другом сервере - это хорошая практика? Или каковы были бы другие решения в качестве выделенного сервера и почему?

2 - Процесс резервного копирования

Сначала я сделаю резервную копию из подчиненной базы данных, следуя принципу временной остановки репликации и создания резервной копии в режиме «только для чтения».

Я думаю, что здесь я должен рассмотреть два разных типа резервного копирования. Первая резервная копия будет резервной копией файлов необработанных данных, которую я буду выполнять, скажем, каждую неделю (поскольку я использую репликацию, я в полной безопасности). И второй тип резервного копирования - это mysqldump каждой базы данных, который я буду выполнять каждые 24 часа. Это кажется логичным?

Есть ли еще какие-то моменты, которые мне следует рассмотреть? Интересно ли мне инкрементное резервное копирование?

Большое спасибо!

Передовой опыт зависит от того, что вам нужно восстановить. Вам определенно следует сделать резервную копию в другом хранилище, в идеале с другой геолокацией. У меня есть этот небольшой скрипт, который обнаруживает все базы данных и создает резервную копию каждой базы данных в отдельный файл, поэтому я могу восстановить только одну базу данных.

#!/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"

Каждая резервная копия хранится в структуре каталогов YEAR / MONTH / DAY / HOUR / DB_NAME.sql.gz. Вы можете указать, какую БД вы не хотите копировать в переменной BLACKLIST.