この質問は、レプリケーションと多数のデータベースを使用したmysqlバックアップのベストプラクティスに関するものです。私はあなたの視点と提案を探しています:)
アプリサーバーのそれぞれに2つのデータベースマスター/スレーブ(mysqlレプリケーション)があります。私は顧客ごとに1つのデータベースと1つの「管理者」データベースを持っています。
現在、合計500のデータベースを取得していますが、まもなく1Kを超える予定です。
各データベースには約100個のテーブルが含まれており、現時点では、mysqldump操作(非圧縮)後にデータベースで約10か月から30か月に到達します。
私は今、これらのデータベースをバックアップしようとしています。主な目標は、サーバーのクラッシュに確実に対応し、ディザスタリカバリプロセスを構築することですが、何よりもまず、顧客がデータを台無しにしてしまうことを心配しています。要約すると、私はできるようになりたいです:
1-バックアップ場所
データベースのバックアップは、データベース自体と同じサーバー上で実行しないでください。 2つの異なるサーバーでレプリケーションを使用しているので、他のサーバーにデータをバックアップすることをお勧めしますか?または、専用サーバーとして他のソリューションは何で、その理由は何ですか?
2-バックアッププロセス
まず、一時的なレプリケーションを停止し、「読み取り専用」でバックアップを作成するという原則に従って、スレーブデータベースからバックアップします。
ここでは、2つの異なるタイプのバックアップを検討する必要があると思います。最初のバックアップは、毎週実行する生データファイルのバックアップです(レプリケーションを使用しているので、非常に安全です)。そして、2番目のタイプのバックアップは、24時間ごとに実行する各データベースのmysqldumpです。 論理的に見えるものですか?
他に考慮すべき点はありますか?増分バックアップは私にとって興味深いものですか?
どうもありがとう!
ベストプラクティスは、何を回復する必要があるかによって異なります。理想的には異なる地理的位置にある、異なるストレージにバックアップする必要があります。私はこの小さなスクリプトを持っています。これはすべてのデータベースを検出し、各データベースを別々のファイルにバックアップするので、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で指定できます。