[linux][command] linux 中的測試硬盤讀寫速度的命令: time dd 使用介紹

//from : http://hll142475.blog.163.com/blog/static/621382009249558136/

// if have some question . mail me.



dd工具使用


dd重要參數

參數

含義

if

輸入設備或者文件

of

輸出設備或文件

bs

dd緩衝區。設定dd時一次io拷貝多少數據,它與輸入文件和輸出文件的block size都沒有直接聯繫。

一般來說,bs越大,拷貝速度越快

skip

設定dd時從輸入文件中跳過多少個dd緩衝區開始拷貝數據。一般在裸設備有offset時使用

seek

設定dd時從輸出文件中跳過多少個dd緩衝區開始寫入數據。一般在裸設備有offset時使用

count

設置ddio數量。如果省略了count,表示完全拷貝輸入文件到輸出文件上

dd參數適用範圍

備份源

備份目的地

適用參數

裸設備

裸設備

if of bs skip seek count

裸設備

文件系統

if of bs skip count

文件系統

裸設備

if of bs seek

文件系統

文件系統

if of bs

dd拷貝oracle數據文件需要考慮的因素

因素

含義

block size

dd一次iobuffer大小

offset

只適用於裸設備,有些操作系統在裸設備上保留一定的空間給內部使用,拷貝時要跳過這部分內容

block 0

每一個oracle數據文件的頭都包含一個與數據文件所在表空間的blocksize的相等的block

這個block是不計算入oracle數據文件的bytes的,但在操作系統中,它是會佔用空間的。

如何用dd測試磁盤速度?

首先要了解兩個特殊的設備:

/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是寫),假設他們都在一個磁盤中,這個命令就相當於測試磁盤的同時讀寫能力。

是否需要skip數據文件的block 0

不需要。

因爲block 0位於offset之後,而block 0是所有數據文件都需要的,無論它是基於裸備還是文件系統,且block0的大小隻與oracleblock size有關,所以,把block 0dd出來是必要的,不需要skip數據文件的block 0

是否所有系統都有offset

不是。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數據文件

這個比較簡單,首先要保證裸設備的大小要大於等於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

從裸設備到文件系統拷貝ORACLE數據文件

這裏用用到兩個工具:

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)


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章