天天看點

MYSQL自動備份政策的選擇與實踐

目前流行幾種備份方式:

1、邏輯備份:使用mysql自帶的mysqldump工具進行備份。備份成sql檔案形式。

優點:最大好處是能夠與正在運作的mysql自動協同工作,

在運作期間可以確定備份是當時的點,它會自動将對應操作的表鎖定,不允許其他使用者修改(隻能通路)。可能會阻止修改操作。sql檔案通用友善移植。

缺點:備份的速度比較慢。如果是資料量很多的時候。就很耗時間。如果資料庫伺服器處在提供給使用者服務狀态,在這段長時間操作過程中,意味着要鎖定表(一般是讀鎖定,隻能讀不能寫入資料)。那麼服務就會影響的。

備注:所謂的與mysql伺服器能夠自動協同工作,實際上是指加參數來控制mysql伺服器,比如鎖定所有表隻能進行讀,不能進行寫操作。

--lock-all-tables

2、實體備份:直接拷貝mysql的資料目錄。

直接拷貝隻适用于myisam類型的表。這種類型的表是與機器獨立的。但實際情況是,你設計資料庫的時候不可能全部使用myisam類型表。你也不可能:因為myisam類型表與機器獨立,友善移植,于是就選擇這種表,這并不是選擇它的理由。

缺點:你不能去操作正在運作的mysql伺服器(在拷貝的過程中有使用者通過應用程式通路更新資料,這樣就無法備份當時的資料)可能無法移植到其他機器上去。

更多的情況是,你會根據業務特點(比如你需要支援事務機制就必須使用innodb),查詢速度和服務性能來選擇表類型的。

必須保證表不被使用中。

如果伺服器在你正在拷貝一個表時(某個使用者在進行update、insert操作)改變它,拷貝的資料就失去了備份的意義(沒法準确還原到當時的點)。

如果資料庫表在檔案系統備份過程中被修改,進入備份的表檔案主語不一緻的狀态,而對以後的恢複表将失去意義。

保證你的拷貝完整性的最好方法是:關閉伺服器,拷貝檔案,然後重新開機伺服器。

或者是,要鎖定對應的表(對前端使用者造成通路問題)。

解釋直接拷貝檔案,為什麼不具備可移植性?

mysqldump 産生可移植到其他機器、甚至具有不同硬體結構的機器上的文本檔案。直接拷貝檔案不能夠移植到其他機器上,除非要拷貝的表使用MyISAM 存儲格式。ISAM 表隻能在具有相同硬體結構的機器之間進行拷貝。例如,将檔案從S PARC 的Solaris 機器拷貝到Intel 的Solaris 機器(或者相反)是行不通的。由MySQL3.23 引進的MyISAM 表存儲格式可以解決這個問題,因為該格式與機器獨立。是以,如果以下兩個條件都滿足的話,直接拷貝檔案可以移植到具有不同硬體結構的機器上:即另一台機器上也必須運作MySQL3.23 以上的版本,并且檔案必須表示成MyISAM 表,而不是ISAM 表。

3、雙機熱備份。

mysql資料庫沒有增量備份的機制。當資料量太大的時候備份是一個很大的問題。還好mysql資料庫提供了一種主從備份的機制(也就是雙機熱備)

優點:适合資料量大的時候。現在明白了。大的網際網路公司對于mysql資料備份,都是采用熱機備份。搭建多台資料庫伺服器,進行主從複制。

主從複制經常遇到的問題就是,如何保證資料不堵塞,不延遲。這個問題還是可以容忍的,有一些方案可以改善。畢竟有得有失的。這已經是很省心省力的方式了。

================================================

我目前應該使用什麼樣的備份政策的權衡:

實體備份,恢複快,當然最好是存儲在一個機器上。我現在是用實體備份還是邏輯備份為好呢?

考慮到以後會遷移平台。為了保證通用性。恢複速度1分鐘左右的差距我是可以容忍的(sql檔案備份方式,恢複速度沒有實體配備快,實體備份直接拷貝覆寫掉原來檔案即可)。是以我為了跨平台,我更加願意使用邏輯備份。存儲sql檔案形式。

雙熱機備份方式,目前硬體沒有多個。技術人員有限,需要人力去維護,比較麻煩。是以排除在外。

方案:

1、總體政策:寫個定時執行任務。定時在晚上或淩晨自動備份(考慮資料庫伺服器在運作中不能停機)

代碼中做成備份成功後,把以前的删掉。避免很多資料占據磁盤。

2、考慮到初期資料量這麼小。使用mysqldump進行備份吧。設定在淩晨幾點(4-6點這個時候基本上沒什麼人通路)的時候自動備份。

3、使用邏輯備份方式:恢複速度1分鐘左右的差距我是可以容忍的。是以我為了跨平台,我更加願意使用邏輯備份。存儲sql檔案形式。

4、每天都進行備份。由于是在淩晨的時候mysqldump去鎖定,通路資料庫伺服器。對伺服器幾乎沒什麼影響。是以每天都可以備份。每天都一個sql檔案。那麼将會很多檔案。

是以,每次備份成功後。删除以前的檔案。保留最近一個星期的備份sql檔案。

備份工具的路徑:/usr/bin/mysqldump

備份資料儲存路徑:/data/backdata/

5、備份腳本的編寫

思路:

5.1 在shell腳本中調用mysqldump生成備份檔案(這個工具可以生成sql檔案到磁盤上去)

5.2 為了友善以後查找。每次備份的記錄記錄成日志形式。幾點進行了備份操作,生成了什麼檔案名稱。這樣可以友善以後查閱哪天是否沒有成功備份

删除的檔案作為日志資訊也記錄下來。

5.3  讓linux下的crontab程序調用腳本執行。

指令:crontab -e

打開的檔案中加入代碼:0 05 * * * 腳本的路徑/mysqlback.sh

mysqlback.sh的内容:

# /bin/bash

DB_NAME="****"

DB_USER="****"

DB_PASS="****"

BIN_DIR="/usr/bin"

BACK_DIR="/data/backdata"

DATE="mysql-`date +'%Y%m%d-%H:%M:%S'`"

LogFile="$BACK_DIR"/dbbakup.log #日志記錄儲存的目錄

BackNewFile=$DATE.sql

$BIN_DIR/mysqldump --opt --force -u$DB_USER  -p$DB_PASS $DB_NAME > $BACK_DIR/$DATE.sql

echo -----------------------"$(date +"%y-%m-%d %H:%M:%S")"----------------------- >> $LogFile

echo  createFile:"$BackNewFile" >> $LogFile

#find "/data/backdata/" -cmin +1 -type f -name "*.sql" -print > deleted.txt

#-ctime表示建立時間,這裡表示删除建立時間為多少天之前的檔案,也就是結果隻保留多少天的資料

find "/data/backdata/" -ctime +7 -type f -name "*.sql" -print > deleted.txt

echo -e "delete files:\n" >> $LogFile

#循環删除比對到的檔案

cat deleted.txt | while read LINE

do

    rm -rf $LINE

    echo $LINE>> $LogFile

done

echo "---------------------------------------------------------------" >> $LogFile