dd工具使用

space6212發表於2019-01-07

dd重要引數... 1

dd引數適用範圍... 1

dd複製oracle資料檔案需要考慮的因素... 2

如何用dd測試磁碟速度?... 2

是否需要skip資料檔案的block 0... 2

是否所有系統都有offset... 3

如何計算資料檔案的佔用的實際空間大小?... 3

一個裸裝置的資料檔案最多可以是多大?... 3

在裸裝置之間複製資料檔案... 3

從檔案系統到裸裝置複製ORACLE資料檔案... 5

從裸裝置到檔案系統複製ORACLE資料檔案... 6

是否可以把整個裸裝置複製到檔案中?... 7

各種複製方式的比較... 9

驗證備份... 9


重要引數

引數

含義

if

輸入裝置或者檔案

of

輸出裝置或檔案

bs

dd緩衝區。設定dd時一次io複製多少資料,它與輸入檔案和輸出檔案的block size都沒有直接聯絡。

一般來說,bs越大,複製速度越快

skip

設定dd時從輸入檔案中跳過多少個dd緩衝區開始複製資料。一般在裸裝置有offset時使用

seek

設定dd時從輸出檔案中跳過多少個dd緩衝區開始寫入資料。一般在裸裝置有offset時使用

count

設定ddio數量。如果省略了count,表示完全複製輸入檔案到輸出檔案上

引數適用範圍

備份源

備份目的地

適用引數

裸裝置

裸裝置

if of bs skip seek count

裸裝置

檔案系統

if of bs skip count

檔案系統

裸裝置

if of bs seek

檔案系統

檔案系統

if of bs

複製oracle資料檔案需要考慮的因素

因素

含義

block size

dd一次iobuffer大小

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的大小隻與oracleblock size有關,所以,把block 0dd出來是必要的,不需要skip資料檔案的block 0

不是。aixTurbo 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,作業系統裸裝置的offsetf,資料檔案所在表空間的blocksizeb,則資料檔案的最大大小為:

d=r – f – b*1 (1block 0)

如裸裝置大小為1008koffset0,表空間的blocksize4k,則在此裸裝置的資料檔案的最大大小為:

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的話,在裸裝置之間複製資料檔案的時候都要考慮(skipseek

資料檔案

這個比較簡單,首先要保證裸裝置的大小要大於等於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/,如需轉載,請註明出處,否則將追究法律責任。

相關文章