1. 程式人生 > >Linux數據備份與恢復 dump、restore、dd命令

Linux數據備份與恢復 dump、restore、dd命令

配套 mkdir 配置 輸出信息 iii 數據保存 sin pre 失敗

dump命令:備份分區、文件或目錄

在Linux系統中 dump 命令是沒有安裝的,所以先安裝一下 dump 命令,安裝命令如下:

[root@localhost ~]# yum -y install dump

dump 命令可以支持 0~9 共 10 個備份級別。其中,0 級別指的就是完全備份,1~9 級別都是增量備份級別。

也就是說,當我們備份一份數據時,第一次備份應該使用 0 級別,會把所有數據完全備份一次;第二次備份就可以使用 1 級別了,它會和 0 級別進行比較,把 0 級別備份之後變化的數據進行備份;第三次備份使用 2 級別,2 級別會和 1 級別進行比較,把 1 級別備份之後變化的數據進行備份;以此類推。

需要註意的是,只有在備份整個分區或整塊硬盤時,才能支持 1~9 的增量備份級別;如果只是備份某個文件或不是分區的目錄,則只能使用 0 級別進行完全備份。

dump 命令格式如下:

[root@localhost ~]# dump [選項] 備份之後的文件名 原文件或目錄

[選項]:

-level:就是我們說的 0~9 共 10 個備份級別;
-f 文件名:指定備份之後的文件名;
-u:備份成功之後,把備份時間記錄在 /etc/dumpdates 文件中;
-v:顯示備份過程中更多的輸出信息;
-j:調用 bzlib 庫壓縮備份文件,其實就是把備份文件壓縮為 .bz2 格式,默認壓縮等級是 2;

-W:顯示允許被 dump 的分區的備份等級及備份時間;

備份分區

我們先來看看如何使用 0 級別備份分區。命令如下:

[root@localhost ~]# df -h
文件系統  容量 已用 可用 已用% 掛載點
/dev/sda3   20G 3.0G 16G 17% /
tmpfs   30 6M 0 30 6M 0% /dev/shm
/dev/sda1   194M 26M 158M 15% /boot
/dev/sr0   3.5G 3.5G 0 100% /mnt/cdrom

系統中我們就分了/分區和/boot分區。根分區太大,備份速度太慢,所以只備份/boot分區

[rootSlocalhost ~]# dump -Ouj -f /root/boot.bak.bz2 /boot/
#備份命令。先執行一次完全備份,並壓縮和更新備份時間
DUMP: Date of this level 
0 dump: Wed Jun 5 03:08:22 2013 #備份的級別和時間 DUMP: Dumping /dev/sdal (/boot) to /root/boot.bak.bz2 #備份源和目標 DUMP: Label: none #分區沒有卷標 DUMP: Writing 10 Kilobyte records DUMP: Compressing output at compression level 2 (bzlib) #備份時壓縮 DUMP: mapping (Pass I) [regular files] DUMP: mapping (Pass II) [directories] DUMP: estimated 21846 blocks. DUMP: Volume 1 started with block 1 at: Wed Jun 5 03:08:22 2013 DUMP: dumping (Pass III) [directories] #開始dump 備份 DUMP: dumping (Pass XV) [regular files] DUMP: Closing /root/boot.bak.bz2 #備份結朿,生成備份文件 DUMP: Volume 1 completed at: Wed Jun 5 03:08:30 2013 DUMP: Volume 1 took 0:00:08 DUMP: Volume 1 transfer rate: 2370 kB/s DUMP: Volume 1 21930kB uncompressed, 18962kB compressed, 1.157:1 #數據容量 DUMP: 2X930 blocks (21.42MB) on 1 volume(s) DUMP: finished in 7 seconds, throughput 3132 kBytes/sec DUMP: Date of this level 0 dump: Wed Jun 5 03:08:22 2013 DUMP: Date this dump completed: Wed Jun 5 03:08:30 2013 DUMP: Average transfer rate: 2370 kB/s DUMP: Wrote 21930kB uncompressed, 18962kB compressed, 1.157:1

查看備份時間文件

[root@localhost ~]# cat /etc/dumpdates
/dev/sdal 0 Wed Jun 5 03:08:22 2013 +0800
#備份的分區 備份級別 備份曰期

生成的備份文件

[root@localhost @]# 11 -h /root/boot.bak.bz2
-rw-r--r--. 1 root root 19M 65 03:08 /root/boot.bak.bz2

如果 /boot 分區的內容發生了變化,則可以使用 1 級別進行增量備份。當然,如果數據會繼續發生變化,則可以繼續使用 2~9 級別增量備份。命令如下:

[root@localhost ~]# ll -h /root/install.log
-rw-r--r--.1 root root 25K 4月 10 2149 /root/install.log
#查看安裝軟件包日誌的大小為25KB
[root@localhost ~]# cp install.log /boot/
#復制日誌文件到/boot分區
[root@localhost ~]# dump -1uj -f /root/boot.bak1.bz2 /boot/
#增量備份/boot分區,並壓縮
[root@localhost ~]# ll -h boot.bak*
-rw-r--r--.1 root root 18K 6月 5 0316 boot.bak1.bz2
-rw-r--r--.1 root root 19M 6月 5 0308 boot.bak.bz2
#boot.bak1.bz2壓縮文件只有18KB,證明增量備份只備份了0級別以後變化的數據
#boot.bak1.bz2壓縮文件只有18KB,證明增量備份只備份了0級別以後變化的數據

如果備份的是整個分區,那麽是可以使用“dump -W”命令來查詢分區的備份時間及備份級別的。不過要註意,如果備份時沒有使用“-u”選項,那麽“dump -W”命令是不會記錄備份的時間和級別的。命令如下:

[root@localhost ~]# dump -W
Last dump(s) done (Dump > file systems):
/dev/sda3 ( /) Last dump:Level 1, Date Wed Jun 5 023150 2013
/dev/sda1 ( /boot) Last dump:Level 1, Date Wed Jun 5 031627 2013
#我的/分區和/boot分區都進行過dump備份,/boot分區的最新備份級別是1

dump命令可以非常方便地實現增量備份,但如果實現差異備份時,先使用 0 級別完全備份一次,以後的每次備份都使用 1 級別進行備份。

備份文件或目錄

dump 命令也可以文件或目錄,不過,只要不是備份分區,就只能使用 0 級別進行完全備份,而不再支持增量備份。同時,不能使用“-u”選項更新分區的備份時間,當然也不能使用“dump -W”命令查詢到文件或目錄的備份。我們說 /etc/ 目錄是重要的配置文件目錄,那麽我們就備份這個目錄來看看吧。命令如下:

[root@localhost ~]# dump -0j -f /root/etc.dump.bz2 /etc/
#完全備份/etc/目錄
[root@localhost ~]# ll -h /root/etc.dump.bz2
-rw-r--r--.1 root root 8.6M 6月 5 0326 /root/etc.dump.bz2
#查看備份文件

使用增量備份命令如下:

[root@localhost ~]# dump -1j -f /root/etc.dump1.bz2 /etc/
DUMP:Only level 0 dumps are allowed on a subdirectory
DUMP:The ENTIRE dump is aborted.
#備份失敗了,目錄備份只能使用0級別

restore命令:還原dump操作備份下的文件、目錄或分區

restore 命令是 dump 命令的配套命令,dump 命令是用來備份分區和數據的,而 restore 命令是用來恢復數據的,restore 命令的格式如下:

[root@localhost ~]# restore [模式選項] [選項]

[模式選項]

restore 命令常用的模式有以下 4 種,這 4 種模式不能混用:

  • -C:比較備份數據和實際數據的變化。如果實際數據中的現有數據發生了變化,那麽這個選項能夠檢測到這個變化。但是如果實際數據中新增了數據,那麽這個選項是不能檢測到變化的。舉個例子:別人給我了 100 萬元投資(實際數據),但是他有一個投資的賬本(備份數據),他要時不時地比對賬本和實際的 100 萬元投資,如果 100 萬元減少則馬上就能發現改變;但是如果投資增加,則不會報警;
  • -i:進入交互模式,手工選擇需要恢復的文件;
  • -t:查看模式,用於查看備份文件中擁有哪些數據;
  • -r:還原模式,用於數據還原;

[選項]

  • -f:指定備份文件的文件名;

比較備份數據和實際數據的變化

數據比較只有在原有數據減少或發生變化時才能檢測到變化,而新增的數據是不會被檢測到的。命令如下:

[root@localhost ~]# touch /boot/abc
#在/boot/目錄中新建abc文件
[root@localhost ~]# restore -C -f /root/boot.bak.bz2
Dump tape is compressed.
Dump date:Wed Jun 5 082002 2013
Dumped from:the epoch
Level 0 dump of /boot on localhost:/dev/sda1
Label:none
filesys = /boot

restore檢測,沒有發現任何變化,因為備份數據在備份時沒有abc文件,所以restore命令是不能識別新建文件的

查看模式

查看備份文件中到底包含什麽內容。命令如下:

[root@localhost ~]# restore -t -f boot.bak.bz2
Dump tape is compressed.
#備份數據是壓縮的
Dump date:Wed Jun 5 082002 2013
#數據備份時間
Dumped from:the epoch
Level 0 dump of /boot on localhost:/dev/sda1
#備份等級
Label:none
#分區的卷標,沒有設定卷標
2.
11 ./lost+found
12 ./grub
24 ./grub/grub.conf
13 ./grub/splash.xpm.gz
…省略部分輸出…

還原模式

restore 命令的還原模式既可以用於還原整個分區,也可以用於還原文件或目錄。命令格式是一樣的,不過要註意,如果要還原增量備份的數據,則一定要先還原完全備份的數據。命令如下:

#還原boot.bak.bz2分區備份
#先還原完全備份的數據
[root@localhost ~]# mkdir boot.test
#建立準備解壓縮的目錄。當然,如果這個目錄是我新建的分區,就可以直接把數據恢復到分區中
[root@localhost ~]# cd boot.test/
#進入解壓縮目錄
[root@localhost boot.test]# restore -r -f /root/boot.bak.bz2
Dump tape is compressed.
#備份數據是壓縮數據
#解壓縮

查看一下解壓縮的文件

[root@localhost boot.test]#ll
總用量21300
-rw-r--r--. 1 root root 106611 6月 22 2012 config-2.6.32-279.el6.i686 drwxr-xr-x. 3 root root 4096 410 21:47 efi drwxr-xr-x. 2 root root 4096 410 21:49 grub
-rw-r--r--. 1 root root 14708399 410 21:49 initrara£s-2.6.32-279.el6.i686.img
drwx------. 2 root root 4096 410 21:44 lost+found
-rw-------. 1 root root 47504 65 09:44 restoresymtable
-rw-r--r--. 1 root root 175903 622 2012 symvers-2.6.32-279.el6.i686.gz
-rw-r--r--. 1 root root 1846041 622 2012 System.map-2.6.32-279.el6.i686
-rw-r--r--. 1 root root 1048576 65 02:38 test
-rwxr-xr-x. 1 root root 3856608 622 2012 vmlinuz-2.6.32-279.el6.i686
#再還原增量備份的數據

恢復增量備份的數據

[root@localhost boot.test]# restore -r -f /root/boot.bakl.bz2
Dump tape is compressed.

查看一下解壓縮的文件

[root@localhost boot.test]# ll
總用量21328
-rw-r--r--. 1 root root 106611 622 2012 config-2.6.32-279.el6.i686
drwxr-xr-x. 3 root root 4096 410 21:47 efi
drwxr-xr-x. 2 root root 4096 410 21:49 grub
-rw-r--r--. 1 root root 14708399 410 21:49 initramfs-2.6.32-279.eX6.i686.img
-rw-r--r--. 1 root root 24772 65 08:20 install. log
#增量備份的install.log文件被恢復了
drwx------. 2 root root 4096 410 21:44 lost+found
-rw-------. 1 root root 47552 65 09:57 restoresymtable
-rw-r--r--. 1 root root 175903 622 2012 symvers-2.6.32-279.el6.i686.gz
-rw-r--r--. 1 root root 1846041 622 2012 System.map-2.6.32-279.el6.i686
-rw-r--r--. 1 root root 1048576 65 02:38 test
-rwxr-xr-x. 1 root root 3856608 6月  22 2012 vmlinuz-2.6.32-279.el6.i686

我們再來還原/etc/目錄的備份etc.dump.bz2,其實還原的方法是完全一樣的。命令如下:

[root@localhost ~]# restore -r -f etc.dump.bz2
Dump tape is compressed.
#還原etc.dump.bz2備份
[root@localhost ~]# ll -d /root/etc
drwxr-xr-x.103 root root 12288 6月 5 0745 /root/etc
#在root下生成了etc目錄,裏面的數據和/etc/目錄中的數據完全一致

dd命令:數據備份,並在備份過程中進行格式轉換

dd 命令主要用來進行數據備份,並且可以在備份的過程中進行格式轉換。其實 dd 命令可以把源數據復制成目標數據,而且不管源數據是文件、分區、磁盤還是光盤,都可以進行數據備份。dd 命令格式如下:

[root@localhost ~]# dd if="輸入文件" of="輸出文件" bs="數據塊" count="數量"

參數:

  1. if:定義輸入數據的文件,也可以是輸入設備;
  2. of:定義輸出數據的文件,也可以是輸出設備;
  3. bs:指定數據塊的大小,也就是定義一次性讀取或寫入多少字節。模式數據塊大小是 512 字節;
  4. count:指定 bs 的數量;
  5. conv=標誌:依據標誌轉換文件。標誌有以下這些:
    • ascii:由 EBCDIC 碼轉換至 ASCII 碼;
    • ebcdic:由 ASCII 碼轉換至 EBCDIC 碼;
    • ibm:由 ASCII 碼轉換至替換的 EBCDIC 碼;
    • block:將結束字符塊裏的換行替換成等長的空格;
    • unblock:將 cbs 大小的塊中尾部的空格替換為一個換行符;
    • lcase:將大寫字符轉換為小寫;
    • notrunc:不截斷輸出文件;
    • ucase:將小寫字符轉換為大寫;
    • swab:交換每一對輸入數據字節;
    • noerror:讀取數據發生錯誤後仍然繼續;
    • sync:將每個輸入數據塊以 NUL 字符填滿至 ibs 的大小;當配合 block 或 unblock 時,會以空格代替 NUL 字符填充;

備份文件

[root@localhost ~]# dd if=/etc/httpd/conf/httpd.conf of=/tmp/httpd.bak
記錄了67+1 的讀入
#數據占了寫滿的67個數據塊,以及1個沒有寫滿的數據塊
記錄了67+1 的寫出
#默認數據塊大小是512字節
34439字節(34 kB)已復制,0.0524897 秒,656 kB/秒
#如果要備份文件,那麽dd命令和cp命令非常類似

查看一下生成的備份文件的大小

[root@localhost ~]# ll -h /tmp/httpd.bak
-rw-r--r--.1 root root 34K 6月 5 1804 /tmp/httpd.bak

備份分區為一個備份文件

查看一下分區容量,我們備份/boot分區

[root@localhost ~]# df -h
文件系統 容量 已用 可用 已用%% 掛載點
/dev/sda3 20G 2.0G 17G 11% /
tmpfs 306M 0 306M 0% /dev/shm
/dev/sda1 194M 27M 157M 15% /boot
/dev/sr0 3.5G 3.5G 0 100% /mnt/cdrom

備份完成

[root@localhost ~]# dd if=/dev/sda1 of=/tmp/boot.bak

查看生成的備份文件

[root@localhost ~]# ll -h /tmp/boot.bak
-rw-r--r--.1 root root 200M 6月 5 1814 /tmp/boot.bak

#如果需要恢復,則執行以下命令

[root@localhost ~]# dd if=/tmp/boot.bak of=/dev/sda1

如果想要把分區直接備份成另一個分區,就需要生成一個新的分區,這個分區的大小不能比源分區小,只能和源分區大小一致或比它大。命令如下:

[root@localhost ~]# dd if=/dev/sda1 of=/dev/sdb1

#如果需要恢復,則只需把輸入項和輸出項反過來即可,命令如下

[root@localhost ~]# dd if=/dev/sdb1 of=/dev/sda1

整盤備份

把磁盤a備份到磁盤b

[root@localhost ~]# dd if=/dev/sda of=/dev/sdb

把磁盤a備份成文件disk.bak

[root@localhost ~]# dd if=/dev/sda of=/tmp/disk.bak

#備份恢復
#如果要備份到另一塊硬盤上,那麽,當源硬盤數據損壞時,只需用備份硬盤替換源硬盤即可
#如果要備份成文件,那麽在恢復時需要把備份數據復制到其他Linux中,然後把新硬盤安裝到這臺Linux
#服務器上,再把磁盤備份數據復制到新硬盤中。命令如下

[root@localhost ~]# dd if=/tmp/disk.bak of=/dev/sdb

復制軟盤

在Linux中軟盤的設備文件名是/dev/fd0,這條命令先把軟盤中的數據保存為臨時數據文件

[root@localhost ~]# dd if=/dev/fd0 of=/tmp/fd.bak

然後更換新的軟盤,把數據備份復制到新軟盤中,就實現了軟盤的復制

[root@localhost ~]# dd if=/tmp/fd.bak of=/dev/fd0

如果需要備份的是光盤,那麽在 Linux 中就是使用 dd 命令制作光盤的 ISO 鏡像的。命令如下:

#制作光盤ISO鏡像
[root@localhost ~]# dd if=/dev/cdrom of-/tmp/cd.iso #把光盤中所有的數據制作成ISO鏡像
[root@localhost ~J # mkdir /mnt/cd
#建立一個新的掛載點
[root@localhost ~]# mount -o loop /tmp/cd.iso /mnt/cd #掛栽ISO文件到掛載點
[root@localhost ~]# cd /mnt/cd
#進入掛栽點
[root@localhost cd]# ls
CentOS_BuildTag images RELEASE-NOTES-en-tJS.html RPM-GPG-KEY-CentOS-Debug-6 TRANS.TBL
EULA    isolinux repodata   RPM-GPG-KEY-CentOS-Security-6
GPL Packages RPM-GPG-KEY-CentOS-6 RPM-GPG-KEY-CentOS-Testing-6
#數據是光盤當中的數據,這個ISO鏡像是可以被當作真正的光盤使用的

我們有時需要制作指定大小的文件,比如,在增加 swap 分區時,就需要建立指定大小的文件,這時也使用 dd 命令。命令如下:

[root@localhost ~]# dd if=/dev/zero of=/tmp/testfile bs=1M count=10
#數據輸入項是/dev/zero會向目標文件中不停地寫入二進制的0
#指定數據塊大小是1MB
#指定生成10個數據塊。也就是定義輸出的文件大小為10MB
記錄了10+0 的讀入
#顯示數據占滿了10個數據塊
記錄了10+0 的寫出
#不過這裏數據塊的大小已經是1MB了
10485760字節(10 MB)已復制,0.00709902 秒,1.5 GB/秒
[root@localhost ~]# ll -h /tmp/testfile
-rw-r--r--.1 root root 10M 6月 5 1846 /tmp/testfile
#生成的testfile文件的大小剛好是10MB

dd 命令在進行整盤復制時,類似於 GHOST 工具的功能,不過通過 dd 命令復制出來的硬盤數據要比 GHOST 復制出來的硬盤數據穩定得多。雖然 dd 命令功能強大,不過也有一個明顯的缺點,就是復制的時間較長,復制 100GB 的數據需要 15~25 分鐘(根據服務器的性能不同而不同)。

實現數據備份還有非常多的方法和工具,比如 tar 和 cpio 命令。至於網絡復制工具,如 rsync 和 scp 等,需要較完善的網絡知識才能夠學習,這裏不再介紹。

Linux數據備份與恢復 dump、restore、dd命令