Mysql
備份mysql數據庫的最佳實踐
這個問題涉及具有複製和大量數據庫的 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 中指定您不想備份的數據庫。