iT邦幫忙

0

在Linux上,關於Mysql備份,什麼方式最好呢? tar方式好久!

jianzi 2012-04-21 01:22:0522607 瀏覽

各位好

小弟想請教關於在Linux上的Mysql的備份方式
一直以來都是用tar把Mysql整個目錄壓縮備份起來,連權限也保留了
而有過硬碟損壞,重灌Centos後直接刪除原Mysql目錄
然後把備份壓縮檔解壓縮,cnf設定檔設定好後,啟動後ok正常

但有個疑惑,雖然這備份方式也有可能因為Mysql版本不同而有問題
但是也不乏是個不錯的方法,至少我復原過幾次都沒出過問題
但是唯一不方便的地方是必須要停止Mysql然後開始壓縮備份
一開始開站資料量非常小,沒什麼感覺
但是隨著網站成長,資料量越來越大,整個Mysql目錄壓縮起來已經有十幾G的大小了
停止Mysql開始備份到結束後啟動Mysql,已經要快到達兩個小時之久了
可否請各位前輩提供好的備份方法,或是對於此壓縮備份有改善時間長的方法
非常感謝

因為只有一台主機,沒辦法做異地備份,也沒法做master、slave

圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中
13
bizpro
iT邦大師 1 級 ‧ 2012-04-22 14:46:23
最佳解答

第一種方法: 停掉MySQL用tar+gzip, 開發系統時還可用用, 但是線上系統則不建議.

第二種方法: 用一般的rsync+mysqldump+cron應該可以達到備份的功能, 備份的高時間差依然有資料損失的風險, 同時對於備份管理不易, 災難復原後對資料的信任程度降低. 這不是只有rsync這樣單純, 更何況您對rsync這個基礎的指令尚不熟悉, 更會增加您管理的風險.

第三種方法: 有一個專案可以試試: http://sourceforge.net/projects/automysqlbackup/, 遞增備份, 壓縮並加密備份檔, 遠端備份, 備份完Email通知..等等, 看起來不錯, 找機會用用, mail的部份用的是mutt, 我想會內建一個msmtp, 再改直接用此內建的msmtp來送email, 如果改好後再回饋回去, 我剛好有系統可以用.

第四種方法: 也是建議的方法之一, 就是Replication, Master/Slave的Replication方式遠比rsync, tar, mysqldump,...好. 如果MySQL的資料對您很重要, 就必需要用另一台主機, 主機的規格看您的服務水平, 如果只求資料不失去, 可以用低規的.

第五種方法: 用drbd, 將資料庫所在的磁區實時同步, 這個方法加上heartbeat更可做到High Availibility, 這是我最喜歡的方法, 可以和第四種方法合併使用.

第六種方法: 用MariaDB或Percona, 使用XtraBackup. 我的MySQL資料庫都用Percona和MariaDB, MariaDB才剛推出整合官方"企業版功能"的MySQL, 而非官方的限制社區版的MySQL.

第七種方法: 雖然Oracle的Larry Ellison忙著上法庭和Google的Larry Page打官司, 上演Larry vs Larry大戲, 但是Ellison並沒有忘記MySQL, MySQL有付費的企業版, 有強大的備份功能.

其他方法: 請各位先進補充.

17
wiseguy
iT邦超人 1 級 ‧ 2012-04-21 10:37:36

mysql 在大部份情況下,是不必停止服務就可以做備份的。
如果 table 是用 MyISAM engine,只要 flush 再 read lock,就可以直接 copy,跟你停機再 tar,是一樣的效果。假如你不知道如何 flush & lock,mysql 已經提供一支程式給你用:mysqlhotcopy
http://dev.mysql.com/doc/refman/5.5/en/mysqlhotcopy.html
用它幫你 copy 整個資料庫就行了。不過因為會 lock table,所以還是得選擇在離峰時段做,以免 user 會覺得系統卡卡的。

另外就是若有使用 InnoDB engine,mysqlhotcopy 並不會 copy 這種 table,必須搭配 mysqldump 把這類型 table 的資料匯出成 SQL 檔。

基本上會建議你至少另裝一顆硬碟來備份,而不是備在同一顆硬碟上。mysql 在存取已經夠操了,還加備份讀寫會更操。而且同一顆硬碟壞掉也難保備份還能用。另外,假如硬碟夠用,就不必做 tar 的動作了,因為萬一 tar 檔損壞,解不回來也是一大麻煩。

其它官方站所建議的備份方法,請參考:
http://dev.mysql.com/doc/refman/5.5/en/backup-methods.html

看更多先前的回應...收起先前的回應...
jianzi iT邦新手 5 級 ‧ 2012-04-21 12:29:46 檢舉

您好

小弟的主機是兩顆硬碟做Raid1
備份是備份到另一顆硬碟,所以總共是三顆硬碟

那如果是tar備份的話,有辦法讓時間少一些嗎?

您說的不必tar備份,意思是cp整個資料夾嗎?

謝謝您

wiseguy iT邦超人 1 級 ‧ 2012-04-21 17:24:51 檢舉

要讓 tar 備份快一點,沒別的方法,就是用快一點的 CPU。

是的。不必tar備份,意思就是cp整個資料夾,只不過是用 mysqlhotcopy 來做 cp 的功能。

jianzi iT邦新手 5 級 ‧ 2012-04-21 18:46:33 檢舉

rsync好像可以增量備份,那如果只有一台主機,可以用rsync嗎?

wiseguy iT邦超人 1 級 ‧ 2012-04-22 00:04:50 檢舉

可以。

  1. 先 copy 一份想備份的目錄到目的目錄 (X → X1)
  2. 第二次以後的備份,就是先在目的目錄,把備份目錄 X1 用 cp -al X1 X2 指令複製一份 X2,
  3. 再用 rsync 當做比對拷貝指令,把 X 跟 X2 不同的檔案,copy 過去覆蓋 X2 的檔案。rsync -va --delete --delete-excluded X X2
  4. 第三次當然就是重複 2,3 步,cp -al X2 X3rsync -va --delete --delete-excluded X X3
jianzi iT邦新手 5 級 ‧ 2012-04-22 00:50:53 檢舉

不好意思有些看不太懂
意思是用rsync要先複製好幾份嗎?
不能直接下一個指令直接增量備份??

wiseguy iT邦超人 1 級 ‧ 2012-04-22 11:34:54 檢舉

黑字就是指令啊!而且也才兩個指令而已唷
X 代表你要備份的目錄,X1 是第一次備份,X2 是第二次備份,以此類推

6
sunlinux
iT邦新手 4 級 ‧ 2012-04-22 10:56:00

rsync 用了好多年,是個好用的功能。

a 備份到 a1 資料夾,沒有什麼增不增量的問題,純粹使用覆蓋舊檔的方式進行即可。

a 目錄若有 10 個檔案,a1 有9個檔案,在 rsync 同步之後

a1 會變成10個和 a 目錄裏完全一樣的檔案。

rsync 會比對來源和目的的檔案是否相同,若不同,就會覆蓋目的檔案。

例如來源的 test.txt 的內容有修改,目的地的 test.txt 就會被覆蓋。

jianzi iT邦新手 5 級 ‧ 2012-04-22 11:23:16 檢舉

您好,請問可以教一下如何做嗎? 謝謝您

4
davihuan
iT邦新手 3 級 ‧ 2012-04-22 18:11:27

bizpro提到:
第四種方法: 也是建議的方法之一, 就是Replication, Master/Slave的Replication方式遠比rsync, tar, mysqldump,...好. 如果MySQL的資料對您很重要, 就必需要用另一台主機, 主機的規格看您的服務水平, 如果只求資料不失...(恕刪)

這個比較好, 主要的 master server 會繼續提供服務, slave 在備份的時間可以把 service 停掉之後 tar 整個目錄, 或者用 mysqldump 都可以, 作 mysqlbinlog 也會 lock table

jianzi iT邦新手 5 級 ‧ 2012-04-22 18:53:06 檢舉

可是礙於我只有一台主機,除了master,slave這種方式之外哪一種為更好?
可以媲美直接tar的

bizpro iT邦大師 1 級 ‧ 2012-04-22 22:57:04 檢舉

您可以用第三種, automysqlbackup, 別人寫好的. 花一些時間讀一下Readme和依照需求改改script就可以了.

2
pluto
iT邦研究生 1 級 ‧ 2012-04-22 21:20:21

MyMirror可以做 MySQL 的即時複製,使用的資源很少,一般可以做為即時的備份,高階的應用可以做為 HA 架構,有免費版的,參考這篇:
[http://twinpeak.blogspot.com/2010/03/mymirror-mymirror-for-mysql.html
](http://twinpeak.blogspot.com/2010/03/mymirror-mymirror-for-mysql.html<br />
)

jianzi iT邦新手 5 級 ‧ 2012-04-22 22:09:40 檢舉

謝謝您,可惜我的Mysql已經超過10G了落寞

我要發表回答

立即登入回答