备份 mysql 数据库的最佳实践

备份 mysql 数据库的最佳实践

这个问题涉及使用复制和大量数据库的 mysql 备份的最佳实践。我期待您的观点和建议 :)

I-当前情况

我的每个应用服务器上都有两个主/从数据库(mysql 复制)。我有一个客户数据库和一个“管理员”数据库。

目前我总共获得了 500 个数据库,很快就会超过 1K。

每个数据库包含大约 100 个表,目前,我通过 mysqldump 操作(未压缩)得到大约 10mo 到 30mo 的数据库。

II - 我需要什么

我现在想备份这些数据库。主要目标肯定是解决服务器崩溃问题并建立灾难恢复流程,但在此之前,我更担心我的客户弄乱了他们的数据。总而言之,我希望能够:

  • 在服务器崩溃或受到攻击时备份并恢复所有数据库。(然后执行灾难恢复)。
  • 当客户弄乱其帐户的数据时,备份所有数据库并恢复特定数据库以恢复新副本(假设不超过 24 小时)。

III-我目前的想法和我的问题

1 - 备份位置

数据库的备份不应与数据库本身在同一台服务器上进行。 由于我在两台不同的服务器上使用复制,您认为在另一台服务器上备份我的数据是一种好的做法吗?或者作为专用服务器的其他解决方案是什么?为什么?

2 - 备份过程

首先,我将按照暂时停止复制并以“只读”方式进行备份的原则从从数据库进行备份。

我认为我在这里要考虑两种不同类型的备份。第一种备份是原始数据文件的备份,我将每周执行一次(因为我使用复制,所以很安全)。第二种备份是每个数据库的 mysqldump,我将每 24 小时执行一次。这看起来合乎逻辑吗?

我还需要考虑其他方面吗?增量备份对我来说有趣吗?

多谢!

答案1

最佳实践取决于您需要恢复什么。您绝对应该备份到不同的存储,最好是在不同的地理位置。我有这个小脚本,它可以检测所有数据库并将每个数据库备份到单独的文件中,因此我只能恢复一个数据库。

#!/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 中指定您不想备份的数据库。

相关内容