Mysql

備份mysql數據庫的最佳實踐

  • December 4, 2015

這個問題涉及具有複製和大量數據庫的 mysql 備份的最佳實踐。我正在尋找您的觀點和建議:)

一、現狀

我的每一個應用伺服器上都有兩個數據庫主/從(mysql 複製)。我有一個客戶數據庫和一個“管理員”數據庫。

目前我總共有 500 個數據庫,很快就會超過 1K。

每個數據庫包括大約 100 個表,目前我在 mysqldump 操作(未壓縮)後通過數據庫到達大約 10 個月到 30 個月。

II - 我需要什麼

我現在正在尋找備份這些數據庫。主要目標是確定解決伺服器崩潰問題並建立災難恢復流程,但在此之前,我更擔心我的客戶弄亂了自己的數據。總而言之,我希望能夠:

  • 備份和恢復所有數據庫,以防伺服器崩潰或受到攻擊。(然後執行災難恢復)。
  • 當客戶弄亂他的帳戶數據時,備份所有數據庫並恢復特定數據庫以恢復新副本(假設不超過 24 小時)。

III - 我目前的想法和我的問題

1 - 備份位置

數據庫的備份不應與數據庫本身在同一台伺服器上進行。 由於我在兩台不同的伺服器上使用複制,您認為在另一台伺服器上備份我的數據是一個好習慣嗎?或者作為專用伺服器的其他解決方案是什麼,為什麼?

2 - 備份過程

首先,我將從備庫備份,遵循臨時停止複制並以“只讀”方式進行備份的原則。

我認為我必須在這裡考慮兩種不同類型的備份。第一次備份將是我每週都會執行的原始數據文件的備份(因為我正在使用複制,所以我很安全)。第二種類型的備份是我每 24 小時執行一次的每個數據庫的 mysqldump。這看起來合乎邏輯嗎?

還有其他我應該考慮的點嗎?增量備份對我來說很有趣嗎?

非常感謝!

最佳實踐取決於您需要恢復什麼。您絕對應該備份到不同的儲存,最好是在不同的地理位置。我有這個小腳本,它檢測所有數據庫並將每個數據庫備份到單獨的文件中,所以我只能恢復一個數據庫。

#!/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 中指定您不想備份的數據庫。

引用自:https://serverfault.com/questions/740759