FreeBSD連載(32):系統備份

1999年12月5日 17:50 王波

系統備份

  不管系統是多麼可靠,總會發生一些意想不到的事情,致使系統數據丟失。例如硬體故障或人為操作失誤等。因此使 用備份來保護數據不丟失是一種非常重要的手段,尤其在系統數據非常重要的時候。經常進行數據備份能夠減少偶然破壞造成 的損失,保証系統能夠從錯誤中恢復正常運行。

  • 備份策略

  在進行備份之前,首先要選擇使用的備份策略,這將決定何時需要進行備份,以及出現故障時進行恢復的方式。通常 使用的備份方式有三種:

  完全備份:每隔一定時間就對系統進行一次全面的備份,這樣在備份間隔期間出現數據丟失等問題,可以使用上一次 的備份數據恢復到前次備份時情況。這是最基本的備份方式,但是每次都需要備份所有的數據,並且每次備份的工作量也很大 大,需要太多的備份介質,因此這種備份不能進行的太頻繁,只能每隔一段較長時間才進行一次完整的備份,例如以一個月為 一個備份周期。但是這樣一旦發生數據丟失,只能恢復到上次備份的數據,這個月內更新的數據就有可能丟失。

  增量備份:首先進行一次完全備份,然後每隔一個較短時間進行一次備份,但僅僅備份在這個期間更改的內容。當經 過一個較長的時間後再重新進行一次完全備份,開始前面的循環過程。由於只有每個備份周期的第一次進行完全備份,其他只 進行改變的檔案的備份,因此工作量小,就能夠進行更頻繁的備份。例如以一個月為一個周期,一個月進行一次完全備份,每 天晚上0點進行這一天改變的數據備份。這樣一旦發生數據丟失,首先恢復前一個完全備份,然後按日期一個一個恢復每天的 備份,就能恢復到前一天的情況。這種備份方法比較經濟。

  更新備份:這種備份方法與增量備份相似,首先每月進行一次完全備份,然後每天進行一次更新數據的備份。但不同 在於,增量備份是備份該天更改的數據,而更新備份是備份從上次進行完全備份後更改的全部數據檔案。一旦發生數據丟失, 可以使用前一個完全備份恢復到前一個月的狀態,再使用前一個更新備份恢復到前一天的情況。這樣做的缺點是每次作小備份 工作的任務比增量備份的工作量要大,但好處在於,增量備份每天都有備份,因此要保存數據備份數量太多,而更新備份則不 然,只需保存一個完全備份和一個更新備份就可以恢復故障以前的狀態。另外在進行恢復工作時,增量備份要順序進行多次備 份的恢復,而更新備份只需兩次恢復,因此它的恢復工作相對簡單。

  增量備份和更新備份都能以比較經濟的方式對系統進行完全備份,在這些不同的策略之間進行選擇不但與系統數據更 新的方式相關,也依賴於管理員的習慣。通常在系統數據更新不是太頻繁的話,可以選用更新備份的方式。但是如果系統數據 更新太快,使每個備份周期後面幾次更新備份的數據量已經相當大,這樣使用更新備份已經不太經濟了。這時候可以考慮增量 備份或混用更新備份和增量備份的方式,或者縮短備份周期。

  • 操作磁帶設備

  FreeBSD下SCSI接口的磁帶設備檔案名為/dev/rsa0或/dev/nrsa0,其中n代表非回 卷類型,每次在nrsa0上存儲數據之後磁帶沒有回卷,這樣就能在磁帶中保存多次備份。而rsa0設備在每次保存數據 並關閉磁帶時會回卷,這樣只能存儲一次備份。由於磁帶容量大,一次不會用完一個磁帶的容量,因此一般使用nrsa0設 備,以進行多次備份。

  3.1-release之前使用老SCSI驅動程序的磁帶設備為st,對應的設備檔案就為rst0和nrst 0,而非SCSI的磁帶設備有rwt0,rft0,分別為IDE和軟碟控制器接口的磁帶設備。

  n表示非回卷模式,r代表raw方式,代表字符設備。而sa為磁帶設備的驅動程序名。0表示設備序號,如果有 多個磁帶,下一個設備將為rsa1。

  一般使用/dev/nrsa0作為備份設備,因為這個設備是非回卷的,那麼每次備份之後磁帶仍然停留在最後移 動的位置上,這樣就可以在下次備份時接續往磁帶中寫入,使用一個磁帶進行多次備份。但是如果讀取具體的備份,必須使磁 帶卷到具體備份的起始位置才行。需要回卷磁帶要使用mt命令來完成。

  # mt /dev/nrsa0 rewind

  回卷磁帶到最開始地方﹔

  # mt /dev/nrsa0 reten

  先向前卷到尾部再回卷磁帶,保持磁帶前後松緊一致﹔

  # mt /dev/nrsa0 fsf 1

  跳到下一個備份檔案,使用2將跳到下面第二個檔案﹔因此要定位一個磁帶上第4次備份的檔案,可以使用rete n回卷磁帶,再使用fsf 4跳到第4個備份。

  每次使用mt均需使用mt來確定磁帶的位置,一般的應用程序並不能自動確定檔案的開頭,而在磁帶上每兩個備份 檔案當中必然有一段無用的數據,如果再讀完一個備份之後立即去讀取下一個備份檔案,就不能識別這些備份檔案之間的無用 信息,必然導致報告錯誤。

  • 使用tar進行備份

  選定了備份方式之後,可以使用tar、cpio、dump等備份工具軟體將數據備份到磁帶上。對於一般的備份 ,使用tar就足夠了。tar的參數有:

  參數c是創建備份(Create)

  參數v表示回顯模式(Verbose),將產生一系列所備份的檔案列表

  參數f指定使用的備份檔案,它後面的參數為輸出的備份檔案名

  參數x是展開備份檔案

  參數t是顯示備份檔案的內容

  參數T後面跟隨一個檔案參數,指定從這個檔案中讀取要備份的各個檔案的路徑

  參數z是使用壓縮方式創建和解開備份檔案,這是GNU的新版tar的功能,需要同時安裝gzip

  如果不使用T參數,那麼就需要一個參數,指明進行備份檔案和目錄的路徑

  這些選項參數可以使用Unix下的標準參數符號 “-” 進行引導,如 “-c” 、 “-f” 等,大部分 參數都是單獨使用的參數,而有些如 “-f” 、 “-T” ,其後面還要跟隨一個檔案名作參數。因此可以將單獨的參 數寫在一起,如 “-cv” 就等同於 “-c -v” ,也可以與一個需要參數的選項寫在一起,如 “-cvf f ilenam” 就等同於 “-c -v -f filename” 。如果不使用 “-” 引導參數,tar也能識 別這些命令選項。如 “tar tvf filename” 就等同於 “tar -cvf filename” 。 tar能夠創建備份文檔,能夠備份到磁帶上或者產生一個檔案,如:

  # tar cf root.tar /root

  將/root目錄下的所有文檔備份到root.tar檔案中,root.tar指定輸出的備份檔案,/roo t指出要做備份的目錄。如果要備份到磁帶上,將輸出的備份檔案指定為磁帶設備檔案即可:

  # tar cf /dev/nrsa0 /root

  如果設置了環境變量TAPE,則可以不使用參數f指定輸出磁帶設備名字。

  # TAPE=/dev/nrsa0; export TAPE

  # tar c /root

  從備份文檔中解出所有檔案或某個檔案,只需要使用x選項替換前面的c選項,例如從磁帶中解出hello.c文 件:

  tar xv hello.c

  列出tar備份文檔中的內容,可以使用t選項,tar tv將列出磁帶上的所有檔案內容,而tar tf r oot.tar將root.tar檔案上的內容列出。

  tar本身不支持檔案壓縮,因此創建的檔案要比較大。但tar可以和GNU的壓縮軟體gzip合作,直接生成 壓縮檔案,所需要的是在參數中增加z選項。壓縮的備份檔案和普通tar備份是不同的,因此凡是壓縮的備份操作,均需使 用z參數。如:

  # tar czvf root.tar.gz /root

  # tar xzvf root.tar.gz hello.c

  # tar tzvf root.tar.gz

  要進行增量備份和更新備份,必須找出那些檔案在這個期間進行更新。這個任務可以由程序find來完成,例如查 找過去七天更改的檔案,並使用tar的-T參數制定進行備份的檔案,進行備份:

  # find / -mtime -7 -print > /tmp/filelist

  # tar -c -T /tmp/filelist -f /dev/nrsa0

  由於要使用find來找出需要備份的檔案列表,那麼就需要使用檔案的修改時間進行查詢,需要使用-mtime 參數。另一個更有用的參數是-newer,可以查找出所有比某個檔案更新的檔案,由於備份是周期進行的,因此可以在完 全備份之後生成一個標記檔案,那麼所有比這個檔案新的檔案都需要進行更新備份。

  # find / -newer full_back_tag_file -print > /tmp /filelist

  進行備份需要定期執行,不能完全依賴於管理員手工進行備份。備份也應該選擇在系統比較空閑時進行,以免影響系 統的正常處理任務。通常可以選擇半夜0:00點之後進行備份,這樣更不能將這個任務由管理員手工完成了。Unix提供 了定時服務cron,能夠在確定的時間中執行一系列任務,因此備份必須和cron合作來完成,或者使用/etc下的d aily,weekly,monthly檔案定時操作。