dd工具使用
重要引數
引數 | 含義 |
if | 輸入裝置或者檔案 |
of | 輸出裝置或檔案 |
bs | dd緩衝區。設定dd時一次io複製多少資料,它與輸入檔案和輸出檔案的block size都沒有直接聯絡。 一般來說,bs越大,複製速度越快 |
skip | 設定dd時從輸入檔案中跳過多少個dd緩衝區開始複製資料。一般在裸裝置有offset時使用 |
seek | 設定dd時從輸出檔案中跳過多少個dd緩衝區開始寫入資料。一般在裸裝置有offset時使用 |
count | 設定dd的io數量。如果省略了count,表示完全複製輸入檔案到輸出檔案上 |
引數適用範圍
備份源 | 備份目的地 | 適用引數 |
裸裝置 | 裸裝置 | if of bs skip seek count |
裸裝置 | 檔案系統 | if of bs skip count |
檔案系統 | 裸裝置 | if of bs seek |
檔案系統 | 檔案系統 | if of bs |
複製oracle資料檔案需要考慮的因素
因素 | 含義 |
block size | dd一次io的buffer大小 |
offset | 只適用於裸裝置,有些作業系統在裸裝置上保留一定的空間給內部使用,複製時要跳過這部分內容 |
block 0 | 每一個oracle資料檔案的頭都包含一個與資料檔案所在表空間的blocksize的相等的block 這個block是不計算入oracle資料檔案的bytes的,但在作業系統中,它是會佔用空間的。 |
測試磁碟速度?
首先要了解兩個特殊的裝置:
/dev/null:回收站、無底洞
/dev/zero:產生字元
Ø 測試磁碟寫能力
time dd if=/dev/zero of=/test.dbf bs=8k count=300000
因為/dev//zero是一個偽裝置,它只產生空字元流,對它不會產生IO,所以,IO都會集中在of檔案中,of檔案只用於寫,所以這個命令相當於測試磁碟的寫能力。
Ø 測試磁碟讀能力
time dd if=/dev/sdb1 of=/dev/null bs=8k
因為/dev/sdb1是一個物理分割槽,對它的讀取會產生IO,/dev/null是偽裝置,相當於黑洞,of到該裝置不會產生IO,所以,這個命令的IO只發生在/dev/sdb1上,也相當於測試磁碟的讀能力。
Ø 測試同時讀寫能力
time dd if=/dev/sdb1 of=/test1.dbf bs=8k
這個命令下,一個是物理分割槽,一個是實際的檔案,對它們的讀寫都會產生IO(對/dev/sdb1是讀,對/test1.dbf是寫),假設他們都在一個磁碟中,這個命令就相當於測試磁碟的同時讀寫能力。
資料檔案的block 0?
不需要。
因為block 0位於offset之後,而block 0是所有資料檔案都需要的,無論它是基於裸備還是檔案系統,且block0的大小隻與oracle的block size有關,所以,把block 0也dd出來是必要的,不需要skip資料檔案的block 0。
?
不是。aix和Turbo unix要注意offset,其他的一般沒有。
實際的資料檔案大小是在dba_data_files中的bytes + 1* blocksize。
如:
SQL> select file_name,bytes from dba_data_files;
FILE_NAME BYTES BLOCKSIZE
---------------------------------------- ---------- ----------
/opt/oracle/oradata/test1/system01.dbf 360710144 8192
在作業系統檢視檔案大小:
[root@suk1 soft]# ls -l system01.dbf
-rw-r--r-- 1 oracle oinstall 360718336 Nov 15 11:53 system01.dbf
360718336 = 360710144 + 8192 (8192是資料檔案所在表空間的blocksize)
這個和具體的作業系統和資料檔案所在表空間的blocksize有關。
假設裸裝置的大小是r,作業系統裸裝置的offset為f,資料檔案所在表空間的blocksize是b,則資料檔案的最大大小為:
d=r – f – b*1 (1為block 0)
如裸裝置大小為1008k,offset為0,表空間的blocksize為4k,則在此裸裝置的資料檔案的最大大小為:
d=1008-0-1*4=1004(k)
本例測試在裸裝置之間複製oracle資料檔案的步驟,並考慮兩個問題:
1) 假設舊裝置比新裝置小,把大的裸裝置資料檔案複製到小的裸裝置是否可行?
2) 舊裸裝置比新裸裝置小,是否可以複製資料檔案到新裸裝置上?
測試步驟:
#建立邏輯卷
[root@suk1 ~]# lvcreate -L 10m -n lv10_old vgdata
Logical volume "lv10_old" created
[root@suk1 ~]# lvcreate -L 20m -n lv20_new vgdata
Logical volume "lv20_new" created
[root@suk1 ~]# lvcreate -L 40m -n lv40_old vgdata
Logical volume "lv40_old" created
[root@suk1 ~]# lvcreate -L 30m -n lv30_new vgdata
Logical volume "lv30_new" created
#繫結裸裝置
[root@suk1 ~]# raw /dev/raw/raw100 /dev/vgdata/lv10_old
/dev/raw/raw100: bound to major 253, minor 2
[root@suk1 ~]# raw /dev/raw/raw200 /dev/vgdata/lv20_new
/dev/raw/raw200: bound to major 253, minor 3
[root@suk1 ~]# raw /dev/raw/raw400 /dev/vgdata/lv40_old
/dev/raw/raw400: bound to major 253, minor 4
[root@suk1 ~]# raw /dev/raw/raw300 /dev/vgdata/lv30_new
/dev/raw/raw300: bound to major 253, minor 5
#基於裸裝置建立表空間
SQL> create tablespace mytest datafile '/dev/raw/raw100' size 9m,'/dev/raw/raw400' size 20m;
Tablespace created.
#從小裸裝置到大裸裝置
[root@suk1 ~]# dd if='/dev/raw/raw100' of='/dev/raw/raw200'
20480+0 records in
20480+0 records out
#從大裸裝置到小裸裝置,但資料檔案比小裸裝置小
[root@suk1 ~]# dd if='/dev/raw/raw400' of='/dev/raw/raw300' bs=1024k count=25
25+0 records in
25+0 records out
注意:這裡bs*count要大於原裸裝置上的資料檔案尺寸
SQL> startup mount
ORACLE instance started.
Total System Global Area 167772160 bytes
Fixed Size 1260696 bytes
Variable Size 138412904 bytes
Database Buffers 25165824 bytes
Redo Buffers 2932736 bytes
Database mounted.
#重新命名資料檔案
SQL> alter database rename file '/dev/raw/raw100' to '/dev/raw/raw200';
Database altered.
SQL> alter database rename file '/dev/raw/raw400' to '/dev/raw/raw300';
Database altered.
SQL> alter database open;
Database altered.
從這個測試可以看出:
1) 從小裸裝置到大裸裝置,只需把小裸裝置的所有資料塊dd到大裸裝置即可
2) 是否可以把大裸裝置上的資料檔案dd到小裸裝置,取決於位於大裸裝置上的資料檔案尺寸(+block 0)是否比小裸裝置小。如果資料檔案小於小裸裝置,則可以把資料檔案從大裸裝置dd到小裸裝置上,在dd過程中不需要太準確計算原來資料檔案的大小,只要保證dd的總量大於資料檔案並小於小裸裝置的尺寸即可。
3) 如果資料檔案大於小裸裝置的尺寸,則肯定不能把它從大裸裝置複製到小裸裝置上
4) 裸裝置之間複製資料檔案比裸裝置到檔案系統之間複製的有點在於:不需要精確計算要複製多少資料,只需要保證覆蓋了資料檔案+block 0即可;而從裸裝置到檔案系統複製資料檔案時,必須準確計算出要複製的資料量(資料檔案+block 0),dd多一點或者少一點都會報錯。
5) 如果有offset的話,在裸裝置之間複製資料檔案的時候都要考慮(skip、seek)
資料檔案
這個比較簡單,首先要保證裸裝置的大小要大於等於oracle資料檔案大小 + block 0,如果裸裝置需要offset的話,則要保證更大,然後直接用dd就可以。
如:
#原始檔大小為10m
[root@suk1 ~]# ls -l /opt/oracle/oradata/test1/users02.dbf
-rw-r----- 1 oracle oinstall 10493952 Nov 30 11:07 /opt/oracle/oradata/test1/users02.dbf
#建立一個20m的裸裝置
[root@suk1 ~]# lvcreate -L 20m -n lv20 vgdata
Logical volume "lv20" created
[root@suk1 ~]# raw /dev/raw/raw20 /dev/vgdata/lv20
/dev/raw/raw20: bound to major 253, minor 1
#dd檔案到裸裝置上
[root@suk1 ~]# dd if=/opt/oracle/oradata/test1/users02.dbf of=/dev/raw/raw20
20496+0 records in
20496+0 records out
注意:從檔案系統到裸裝置不用設定count
#重新命名資料檔案,開啟資料庫
SQL> alter database rename file '/opt/oracle/oradata/test1/users02.dbf' to '/dev/raw/raw20';
Database altered.
SQL> alter database open;
Database altered
資料檔案
這裡用用到兩個工具:
dbfsize 求出在裸裝置或者檔案系統上的oracle資料檔案的大小,由oracle提高。
blockdev 求出裸裝置的大小,作業系統自帶。
要計算出要要複製的大小,否則報錯,如:
[oracle@suk1 soft]$ dbfsize /dev/raw/raw1
Database file: /dev/raw/raw1
Database file type: raw device
Database file size: 44032 8192 byte blocks
[oracle@suk1 soft]$ time dd if=/dev/raw/raw1 of=system01.dbf bs=8k count=44032
SQL> alter database rename file '/opt/oracle/oradata/test1/system01.dbf' to '/soft/system01.dbf';
Database altered.
SQL> alter database open;
alter database open
*
ERROR at line 1:
ORA-01122: database file 1 failed verification check
ORA-01110: data file 1: '/soft/system01.dbf'
ORA-01200: actual file size of 44031 is smaller than correct size of 44032 blocks
--不要忘了block 0
[oracle@suk1 soft]$ rm system01.dbf
[oracle@suk1 soft]$ dd if=/dev/raw/raw1 of=system01.dbf bs=8k count=44033
SQL> startup
ORACLE instance started.
Total System Global Area 167772160 bytes
Fixed Size 1260696 bytes
Variable Size 100664168 bytes
Database Buffers 62914560 bytes
Redo Buffers 2932736 bytes
Database mounted.
Database opened.
SQL> select file_name from dba_data_files;
FILE_NAME
------------------------------------------------------------
/soft/system01.dbf
/opt/oracle/oradata/test1/undotbs01.dbf
/opt/oracle/oradata/test1/sysaux01.dbf
/opt/oracle/oradata/test1/users01.dbf
/opt/oracle/oradata/test1/users02.dbf
有時候可能需要把裸裝置的資料檔案遷移到檔案系統中,那遷移的時候是否可以把整個裸裝置拷出來?
不一定,要看裸裝置是否有offset,如果有offset,則肯定不能全複製出來;如果沒有offset,也要分情況:
1)裸裝置中的資料檔案 + block 0比裸裝置小。
如果資料檔案大小 + block 0比裸裝置小,則不能將整個裸裝置拷到檔案系統的檔案中。
[root@suk1 soft]# dd if=/dev/raw/raw1 of=system01.dbf bs=8k
SQL> startup mount
ORACLE instance started.
Total System Global Area 167772160 bytes
Fixed Size 1260696 bytes
Variable Size 75498344 bytes
Database Buffers 88080384 bytes
Redo Buffers 2932736 bytes
Database mounted.
SQL> alter database rename file '/opt/oracle/oradata/test1/system01.dbf' to '/soft/system01.dbf';
Database altered.
SQL> alter database open;
alter database open
*
ERROR at line 1:
ORA-01157: cannot identify/lock data file 1 - see DBWR trace file
ORA-01110: data file 1: '/soft/system01.dbf'
Errors in file /opt/oracle/admin/test1/bdump/test1_dbw0_9564.trc:
ORA-01157: cannot identify/lock data file 1 - see DBWR trace file
ORA-01110: data file 1: '/soft/system01.dbf'
ORA-27046: file size is not a multiple of logical block size
Additional information: 1
ORA-1157 signalled during: ALTER DATABASE OPEN...
這是因為裸裝置已被資料檔案使用部分的邏輯塊與未使用部分的邏輯塊大小不一致。這種情況下,只能複製裸裝置中資料檔案大小 + block 0部分。
2)裸裝置中的資料檔案 + block 0等於裸裝置大小
這種情況是可以完全複製的。
[root@suk1 soft]# lvcreate -L 1008k -n test1008 vgdata
Logical volume "test1008" created
[root@suk1 soft]# raw /dev/raw/raw1008 /dev/vgdata/test1008
/dev/raw/raw1008: bound to major 253, minor 0
SQL> create tablespace test blocksize 4k datafile '/dev/raw/raw1008' size 1004k;
Tablespace created.
SQL> select file_name,bytes,bytes/blocks blocksize from dba_data_files;
FILE_NAME BYTES BLOCKSIZE
------------------------- ---------- ----------
/dev/raw/raw1008 1028096 4096
1028096 + 4096 =1008(k)
SQL> startup mount
ORACLE instance started.
[oracle@suk1 soft]$ dd if=/dev/raw/raw1008 of=test.dbf
2016+0 records in
2016+0 records out
Total System Global Area 167772160 bytes
Fixed Size 1260696 bytes
Variable Size 130024296 bytes
Database Buffers 33554432 bytes
Redo Buffers 2932736 bytes
Database mounted.
SQL> alter database rename file '/dev/raw/raw1008' to '/soft/test.dbf';
Database altered.
SQL> alter database open;
Database altered.
Ø 裸裝置到裸裝置
需要考慮裸裝置的offset;要保證新裝置的大小滿足資料檔案的需求;不需要精確計算要複製的尺寸,保證大於等於資料檔案大小+block 0即可(必須從資料欄位中才能查出oracle資料檔案的大小)
Ø 裸裝置到檔案系統
需要考慮裸裝置的offset;必須精確計算要複製的尺寸,包括的尺寸必須剛好等於資料檔案大小+block 0(因為無法透過作業系統命令看資料檔案的大小,必須透過oracle資料字典檢視)
Ø 檔案系統到裸裝置
需要考慮裸裝置的offset;不需要精確計算要複製的尺寸,把檔案全部拷到裸裝置即可。
Ø 檔案系統到檔案系統
不用考慮offset。不需要精確計算要複製的尺寸,把檔案全部複製過去就可以。
Oracle提高dbv工具來驗證備份檔案是否有損壞:
[oracle@suk1 ~]$ dbv file=/dev/raw/raw300
DBVERIFY: Release 10.2.0.3.0 - Production on Fri Nov 30 16:49:59 2007
Copyright (c) 1982, 2005, Oracle. All rights reserved.
DBVERIFY - Verification starting : FILE = /dev/raw/raw300
DBVERIFY - Verification complete
Total Pages Examined : 2560
Total Pages Processed (Data) : 0
Total Pages Failing (Data) : 0
Total Pages Processed (Index): 0
Total Pages Failing (Index): 0
Total Pages Processed (Other): 8
Total Pages Processed (Seg) : 0
Total Pages Failing (Seg) : 0
Total Pages Empty : 2552
Total Pages Marked Corrupt : 0
Total Pages Influx : 0
Highest block SCN : 487492 (0.487492)
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/231499/viewspace-63889/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 加強版dd工具dc3dd3D
- 使用 dd 檢查儲存效能
- 學習使用.dd.gz檔案
- dd for windowsWindows
- dd命令
- 在其他框架中使用 dump () & dd () 函式框架函式
- 使用dd命令進行遠端備份
- 使用 dd 和 gzip 代替 Ghost 做磁碟映象
- Coach Shane Daily Dictation - DD1~DD15AI
- PHP 全域性使用 Laravel 輔助函式 ddPHPLaravel函式
- HTML中DL、DT、DD、em標記的使用HTML
- Ubuntu使用dd命令實現硬碟級複製Ubuntu硬碟
- Backup And Recovery User's Guide-示例:在Linux或UNIX系統上使用dd工具備份GUIIDELinux
- Linux dd 命令Linux
- dd命令說明
- dd命令詳解
- 將格式為yyyy-MM-dd轉換成yyyy/MM/dd
- MM-DD-RRRR / MM-DD-YYYY 的區別 (Date format)ORM
- MM-DD-RRRR / MM-DD-YYYY 的區別【Blog 搬家】
- dd命令的解釋
- dd應用例項
- dd引數詳解
- js 將時間戳轉yyyy-MM-dd HH-mm-ss工具類JS時間戳
- Linux 下使用 dd 命令進行硬碟 I/O 效能檢測Linux硬碟
- linux磁碟管理命令--ddLinux
- Linux dd命令全面解析Linux
- Redhat下dd命令測試Redhat
- Linux dd建立分割槽Linux
- 【問題解決】使用YYYY-MM-dd時間轉換問題
- 【LINUX】正確的使用dd進行磁碟讀寫速度測試Linux
- 1. 輔助函式 dd()函式
- Linux中DD命令詳解Linux
- Linux-dd命令詳解Linux
- linux下dd命令詳解Linux
- dd和nc遠端備份
- Linux/UNIX命令dd簡介Linux
- linux/unix dd命令詳解Linux
- HTML5中div、p、ol、li、ul、dl、dd、form、span的使用案例HTMLORM