web-dev-qa-db-ja.com

mysqlデータベースをバックアップするためのベストプラクティス

この質問は、レプリケーションと多数のデータベースを使用したmysqlバックアップのベストプラクティスに関するものです。私はあなたの視点と提案を探しています:)

I-現在の状況

アプリサーバーのそれぞれに2つのデータベースマスター/スレーブ(mysqlレプリケーション)があります。私は顧客ごとに1つのデータベースと1つの「管理者」データベースを持っています。

現在、合計500のデータベースを取得していますが、まもなく1Kを超える予定です。

各データベースには約100個のテーブルが含まれており、現時点では、mysqldump操作(非圧縮)後にデータベースで約10か月から30か月に到達します。

II-必要なもの

私は今、これらのデータベースをバックアップしようとしています。主な目標は、サーバーのクラッシュに確実に対応し、ディザスタリカバリプロセスを構築することですが、何よりもまず、顧客がデータを台無しにしてしまうことを心配しています。要約すると、私はできるようになりたいです:

  • サーバーがクラッシュまたは攻撃した場合に備えて、すべてのデータベースをバックアップおよび回復します。 (そして、災害復旧を実行します)。
  • すべてのデータベースをバックアップし、特定のデータベースを回復して、顧客が自分のアカウントのデータを台無しにしたときに新しいコピーを復元します(24時間以内としましょう)。

III-私の現在の考えと私の質問

1-バックアップ場所

データベースのバックアップは、データベース自体と同じサーバー上で実行しないでください。 2つの異なるサーバーでレプリケーションを使用しているので、他のサーバーにデータをバックアップすることをお勧めしますか?または、専用サーバーとして他のソリューションは何で、その理由は何ですか?

2-バックアッププロセス

まず、一時的なレプリケーションを停止し、「読み取り専用」でバックアップを作成するという原則に従って、スレーブデータベースからバックアップします。

ここでは、2つの異なるタイプのバックアップを検討する必要があると思います。最初のバックアップは、毎週実行する生データファイルのバックアップです(レプリケーションを使用しているので、非常に安全です)。そして、2番目のタイプのバックアップは、24時間ごとに実行する各データベースのmysqldumpです。 論理的に見えるものですか?

他に考慮すべき点はありますか?増分バックアップは私にとって興味深いものですか?

どうもありがとう!

3
maxime_039

ベストプラクティスは、何を回復する必要があるかによって異なります。理想的には異なる地理的位置にある、異なるストレージにバックアップする必要があります。私はこの小さなスクリプトを持っています。これはすべてのデータベースを検出し、各データベースを別々のファイルにバックアップするので、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に保持されます。バックアップしたくないDBを変数BLACKLISTで指定できます。

1