也談Linux下的數據備份

數據的價值自不待言,損壞後重新生成需要花費寶貴的時間和令人絕望的努力,有時甚至不可能重新產生,例如一些一次性不可逆測試實驗的。由於數據是一種投資,你必須保護它,並採取措施避免丟失。否則並且要花費高昂的金錢來挽救,有時也得配上淚水——看看“9.11事件的悲慘一幕,這樣的話語可不是危言聳聽——衆多的服務器被摧毀,對於在備份管理上有漏洞的公司,只好自吞苦果。相反,有很好的備份措施,則可以將災難損失降低到最低點。

丟失數據一般有幾個個原因:硬件失敗、軟件曲線、人爲因素或自然災害。雖然現代硬件已經相當可靠,但仍可能自然損壞。存儲數據起決定性作用的硬件是硬盤,它依賴微小的磁道和扇區在充滿電子干擾信號的世界裏保存脆弱的數據。同時,現代軟件依然不可靠,不夠強壯。更糟糕的是,人更不可靠,他們很隨意,有時會疲倦,他們很容易犯錯誤,甚至爲某種目的惡意地破壞數據——就是那些以攻擊別人的數據庫爲樂的可惡的入侵者。而不可抗拒的自然可能不是邪惡的,但也可能造成破壞。所以寄希望理想的數據安全,幾乎是不可能做到的,未雨綢繆,早打算纔是上策。

備份是保護數據投資的方法。有數據的多個拷貝,就不怕某個損壞(所需做的僅僅是從備份中恢復丟失的數據)。

備份所需的最重要的策略是選擇備份介質。一般用軟盤和磁帶。軟盤很便宜,還算可靠,不太快,很容易得到,但數據量大時不容易使用。磁帶也很便宜,比較可靠,存儲速比較算快,很容易得到。

備份工具

有很多備份工具可以選擇。傳統的Unix備份工具是tarcpiodump。另外,還可以使用大量第三方軟件包(包括自由軟件和商業軟件)。不同的備份介質的選擇可能影響工具的選擇。

tarcpio類似,從備份來看二者功能基本等效。都能將文件存到磁帶並取出文件。都能使用幾乎所有備份介質,因爲其核心設備驅動能處理底層設備操作,而對用戶級程序看來所有設備都差不多。有一些Unix版本的tarcpio備份工具對非普通文件的處理可能有問題((比如在連接、設備文件、極長路徑名的文件等等的處理),但Linux上的這些命令則能正確處理所有文件。

dump則與tarcpio不同,它直接讀文件系統,而不通過文件系統。它本事直接針對備份而開發的而tarcpio實際上是針對存檔文件的,儘管它們也勝任備份工作。

直接讀文件系統有許多優點,它可不考慮對備份文件的時間標記;對於tarcpio ,必須先將文件系統只讀安裝。而直接讀文件系統更有效,如果所有東西都要備份,它的備份時間相對比較短,因爲它使磁頭移動最少。它的主要缺點是每個文件系統種類需要特定的備份程序。另外Linuxdump程序只識別ext2文件系統。

dump也直接支持備份級;而對於對tar cpio ,這必須用其他工具實現。

tar備份命令

一個全備份可以很容易地用tar 實現:


<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

# tar -create -file /dev/ftape /usr/src
tar: Removing leading / from absolute path names in the archive
#



上面的例子使用GNU版本的tar及其長選項名。傳統版本的tar只識別單字符選項。 GNU版還能處理一卷磁帶或一張磁盤不能容納的備份,及很長的路徑名;這不是所有傳統的版本能作到的。

如果你的備份一盤磁帶不能容納,你需要使用-multi-volume (-M)選項:


# tar -cMf /dev/fd0H1440 /usr/src
tar: Removing leading / from absolute path names in the archive
Prepare volume #2 for /dev/fd0H1440 and hit return:
#



注意開始備份前要格式化所有軟盤,或在tar命令需要新軟盤時用另一個虛擬控制檯或虛擬終端格式化它。

備份完後,應該檢查它是否完好,用-compare (-d)選項:


# tar -compare -verbose -f /dev/ftape
usr/src/
usr/src/linux
usr/src/linux-1.2.10-includes/
....
#



失敗的備份檢查意味着如果你丟失了原始數據,備份也無法恢復。

增量備份可用帶-newer (-N)選項的tar 來實現:


# tar -create -newer '8 Sep 1995' -file /dev/ftape /usr/src -verbose
tar: Removing leading / from absolute path names in the archive
usr/src/
usr/src/linux-1.2.10-includes/
usr/src/linux-1.2.10-includes/include/
usr/src/linux-1.2.10-includes/include/linux/
usr/src/linux-1.2.10-includes/include/linux/modules/
usr/src/linux-1.2.10-includes/include/asm-generic/
usr/src/linux-1.2.10-includes/include/asm-i386/
usr/src/linux-1.2.10-includes/include/asm-mips/
usr/src/linux-1.2.10-includes/include/asm-alpha/
usr/src/linux-1.2.10-includes/include/asm-m68k/
usr/src/linux-1.2.10-includes/include/asm-sparc/
usr/src/patch-1.2.11.gz
#



遺憾的是,tar命令不能知道一個文件的i節點信息變化。例如,文件的權限位變化,或文件名變化。不過好在可用find命令和比較當前文件系統狀態和先前備份的文件列表來解決。

tar的展開

tar -extract (-x)選項展開文件:


# tar -extract -same-permissions -verbose -file /dev/fd0H1440
usr/src/
usr/src/linux
usr/src/linux-1.2.10-includes/
usr/src/linux-1.2.10-includes/include/
usr/src/linux-1.2.10-includes/include/linux/
usr/src/linux-1.2.10-includes/include/linux/hdreg.h
usr/src/linux-1.2.10-includes/include/linux/kernel.h
...
#



也可以用命令行只展開特定的文件和目錄(及其中的文件和子目錄)


# tar xpvf /dev/fd0H1440 usr/src/linux-1.2.10-includes/include/linux/hdreg.h
usr/src/linux-1.2.10-includes/include/linux/hdreg.h
#



-list (-t)選項看一個備份卷中有什麼文件:


# tar -list -file /dev/fd0H1440
usr/src/
usr/src/linux
usr/src/linux-1.2.10-includes/
usr/src/linux-1.2.10-includes/include/
usr/src/linux-1.2.10-includes/include/linux/
usr/src/linux-1.2.10-includes/include/linux/hdreg.h
usr/src/linux-1.2.10-includes/include/linux/kernel.h
...
#



注意tar是順序讀一個備份卷,因此碰到龐大的卷則費時頗多。另外使用磁帶機或其他存儲介質時不可能使用隨機存取數據庫技術。

壓縮備份

備份佔用大量空間,要花費大量金錢。爲了降低空間需求,備份可以壓縮。有幾種方法可以解決。有些程序內置支持壓縮,例如GNU tar-gzip (-z)選項,通過管道(pipe)命令,在寫到備份介質前,先用gzip壓縮程序壓縮數據。

不幸的是,壓縮備份可能導致問題。基於壓縮工作的原理,如果一個bit錯誤,可能導致所有其他壓縮數據不可用。有些備份程序內置錯誤校正,但沒有辦法處理大量的錯誤。就是說,如果用GNU tar壓縮備份,一個單獨的錯誤回導致整個備份丟失。備份必須可靠,這樣的壓縮方法不好。

還有一個方法是單獨壓縮每個文件,這也回導致一個文件的丟失,但不會影響其他文件。丟失的文件可能已經損壞,因此這種情況比不使用壓縮差不了多少。 afio 程序(cpio 的一個變種)可以這樣。

壓縮需要時間,對某些類型的磁帶機,備份程序寫數據就變得非常慢,當然這可以靠輸出緩衝來避免(如果備份程序足夠聰明,可以內置處理,或者可以通過其他程序來實現), 當及時這樣也可能效率不高,這也是備份的一個問題。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章