玩轉裸裝置的備份恢復

anycall2010發表於2008-09-13

近期在linux下測試了資料的備份和恢復:

1、裸裝置的建立:

在/etc/sysconfig/rawdevices 下新增如下:


/dev/raw/raw1   /dev/sdb1 (100M)
/dev/raw/raw2   /dev/sdb2 120M)
/dev/raw/raw3   /dev/sdb3 (130M)
/dev/raw/raw4   /dev/sdb4 (150M)
/dev/raw/raw5   /dev/sdc1 (200M)
/dev/raw/raw6   /dev/sdc2 (230M)
/dev/raw/raw7   /dev/sdc3 (250M)
/dev/raw/raw8   /dev/sdc4 (320M)
/dev/raw/raw9   /dev/sdd1 (100M)
2、要使對映立即生效,以 root 使用者身份執行以下命令: 
[root@dg ~]# /sbin/service rawdevices restart
Assigning devices:
           /dev/raw/raw1  --&gt   /dev/sdb1
/dev/raw/raw8:  bound to major 8, minor 17
           /dev/raw/raw2  --&gt   /dev/sdb2
/dev/raw/raw2:  bound to major 8, minor 18
           /dev/raw/raw3  --&gt   /dev/sdb3
/dev/raw/raw3:  bound to major 8, minor 19
           /dev/raw/raw4  --&gt   /dev/sdb4
/dev/raw/raw4:  bound to major 8, minor 20
           /dev/raw/raw5  --&gt   /dev/sdc1
/dev/raw/raw5:  bound to major 8, minor 33
           /dev/raw/raw6  --&gt   /dev/sdc2
/dev/raw/raw6:  bound to major 8, minor 34
           /dev/raw/raw7  --&gt   /dev/sdc3
/dev/raw/raw7:  bound to major 8, minor 35
           /dev/raw/raw8  --&gt   /dev/sdc4
/dev/raw/raw9:  bound to major 8, minor 36
           /dev/raw/raw9  --&gt   /dev/sdd1
Error setting raw device (Device or resource busy)
done
3、修改許可權:
# chown oracle:dba /dev/raw/raw[1-9]
# chmod 660 /dev/raw/raw[1-9]
[root@dg ~]# ls -lat /dev/raw/raw*
crw-rw----  1 oracle oinstall 162, 9  9ÔÂ 13 12:19 /dev/raw/raw9
crw-rw----  1 oracle oinstall 162, 7  9ÔÂ 13 12:19 /dev/raw/raw8
crw-rw----  1 oracle oinstall 162, 6  9ÔÂ 13 12:19 /dev/raw/raw7
crw-rw----  1 oracle oinstall 162, 5  9ÔÂ 13 12:19 /dev/raw/raw6
crw-rw----  1 oracle oinstall 162, 4  9ÔÂ 13 12:19 /dev/raw/raw5
crw-rw----  1 oracle oinstall 162, 3  9ÔÂ 13 12:19 /dev/raw/raw4
crw-rw----  1 oracle oinstall 162, 2  9ÔÂ 13 12:19 /dev/raw/raw3
crw-rw----  1 oracle oinstall 162, 8  9ÔÂ 13 12:19 /dev/raw/raw2
crw-rw----  1 oracle oinstall 162, 1  9ÔÂ 13 11:44 /dev/raw/raw1
4、修改 /etc/udev/permissions.d/50-udev.permissions。原始裝置在引導時會重新對映。預設情況下,在引導時原始裝置的擁有者將更改為 root 使用者。如果擁有者不是 oracle 使用者,則 ASM 在訪問共享分割槽時會出現問題。在 /etc/udev/permissions.d/50-udev.permissions 中為原始行“raw/*:root:disk:0660”新增註釋,然後新增一個新行“raw/*:oracle:dba:0660”。
/etc/udev/permissions.d/50-udev.permissions 
# raw devices
ram*:root:disk:0660
#raw/*:root:disk:0660
raw/*:oracle:dba:0660
(備註:第4步非常重要,如果沒有第4步,那麼機器重啟後:
[root@dg ~]# ls -lat /dev/raw/raw*
crw-rw----  1 root disk  162, 9  9ÔÂ 13 12:19 /dev/raw/raw9
crw-rw----  1 root disk 162, 7  9ÔÂ 13 12:19 /dev/raw/raw8
crw-rw----  1 root disk 162, 6  9ÔÂ 13 12:19 /dev/raw/raw7
 
解決的辦法:只有將上述裸磁碟都重新重做第三步。否則如果在裸裝置建了表空間使用到裸裝置檔案,那麼資料庫一定會報錯而啟動不了。在dg_dbwr_5903.trc報如下錯誤:

Instance name: dg
Redo thread mounted by this instance: 1
Oracle process number: 5
Unix process pid: 5903, image:
oracle@dg (DBW0)
*** 2008-09-13 10:05:48.436
*** SERVICE NAME:() 2008-09-13 10:05:48.412
*** SESSION ID:(167.1) 2008-09-13 10:05:48.411
ORA-01157: ????/?????? 5 - ??? DBWR ????
ORA-01110: ???? 5: '/dev/raw/raw1'
ORA-27041: ??????
Linux Error: 13: Permission denied
Additional information: 2
如果修改完許可權,任然啟動不了資料庫,那麼只能藉助RMAN的全備份進行恢復。
做如下測試:
SQL> create tablespace test datafile '/dev/raw/raw1' size 102300
  2  autoextend on next 10M maxsize unlimited
  3  extent management local;
表空間已建立。
SQL> conn sys/oracle@dg as sysdba
已連線。
SQL> @insert
PL/SQL 過程已成功完成。
測試一:裸裝置備份的三種方法:
1、採用dd命令拷貝:
使用dd命令拷貝到檔案系統,或者裸裝置都可以;
例如:拷貝到檔案系統
dd if=/dev/raw/raw1 f=/oracle/test.dbf
拷貝到裸裝置:
dd if=/dev/raw/raw1 f=/dev/raw/raw2
2、 採用RMAN的COPY
RMAN>copy datafile '/dev/raw/raw1' to '/oracle/test.dbf'
恢復的時候使用:
dd if=/oracle/test.dbf f=/dev/raw/raw1
3、採用RMAN的全備方式
RMAN>backup database;
測試二:資料庫故障恢復的過程:
SQL> startup
ORACLE 例程已經啟動。
Total System Global Area  432013312 bytes
Fixed Size                  1219808 bytes
Variable Size             125829920 bytes
Database Buffers          297795584 bytes
Redo Buffers                7168000 bytes
資料庫裝載完畢。
ORA-01122: 資料庫檔案 5 驗證失敗
ORA-01110: 資料檔案 5: '/dev/raw/raw1'
ORA-01251: 讀取了檔案號 5 的未知檔案頭部版本
將原有test1.dbf的資料全部拷貝到raw1中.
dd [root@dg ~]# dd if=/oracle/test1.dbf f=/dev/raw/raw1
讀入了 204768+0 個塊
讀出了 204768+0 個塊
SQL> startup
ORACLE 例程已經啟動。
Total System Global Area  432013312 bytes
Fixed Size                  1219808 bytes
Variable Size             125829920 bytes
Database Buffers          297795584 bytes
Redo Buffers                7168000 bytes
資料庫裝載完畢。
ORA-01113: 檔案 5 需要介質恢復
ORA-01110: 資料檔案 5: '/dev/raw/raw1'
SQL> recover database;
完成介質恢復。
資料庫能夠正常啟動。
正常啟動的DUMP檔案(節選介質恢復過程):
/oracle/admin/dg/udump/dg_ora_6440.trc
Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production
With the Partitioning, OLAP and Data Mining options
Start recovery at thread 1 ckpt scn 555262 logseq 6 block 1080
*** 2008-09-14 09:13:03.560
Media Recovery add redo thread 1
*** 2008-09-14 09:13:03.757
Recovery of Online Redo Log: Thread 1 Group 2 Seq 6 Reading mem 0
*** 2008-09-14 09:13:03.991
Recovery of Online Redo Log: Thread 1 Group 3 Seq 7 Reading mem 0
Read rate (ASYNC): 4106Kb in 0.81s => 4.95 Mb/sec
Total physical reads: 5261Kb
Longest record: 11Kb, moves: 0/9716 (0%)
Change moves: 13/185 (7%), moved: 0Mb
Longest LWN: 144Kb, moves: 0/1792 (0%), moved: 0Mb
Last redo scn: 0x0000.0008dda0 (581024)
分析出:資料庫從最後一次CKPT點為555262,聯機日誌保留最近的為581024,顯然資料庫做的聯機日誌恢復,恢復到581024狀態。
----------------------------------------------
*** 2008-09-14 09:13:04.380
Media Recovery drop redo thread 1
File 5 (stop scn 581025) completed recovery at checkpoint scn 581025
ARCH: Connecting to console port...
Successfully allocated 2 recovery slaves
Using 543 overflow buffers per recovery slave
Thread 1 checkpoint: logseq 7, block 4191, scn 580116
  cache-low rba: logseq 7, block 5270

    on-disk rba: logseq 7, block 5884, scn 581025
  start recovery at logseq 7, block 5270, scn 0
資料檔案的介質恢復,當察看到cache最低的RbA為580116,需要恢復到581025,因此資料庫會提示要介質恢復。
資料庫啟動後的SCN:
SQL> select dbms_flashback.get_system_change_number from dual;
GET_SYSTEM_CHANGE_NUMBER
------------------------
                  580242
最終資料庫達到580242的狀態,介質恢復完畢。
測試三:SEEK和SKIP到底是否有區別:
[root@dg ~]# dd if=/dev/raw/raw1 f=/dev/raw/raw2 bs=4k skip=1
讀入了 25595+0 個塊
輸出了 25595+0 個塊
SQL> startup
ORACLE 例程已經啟動。
Total System Global Area  432013312 bytes
Fixed Size                  1219808 bytes
Variable Size             134218528 bytes
Database Buffers          289406976 bytes
Redo Buffers                7168000 bytes
資料庫裝載完畢。
ORA-01122: 資料庫檔案 5 驗證失敗
ORA-01110: 資料檔案 5: '/dev/raw/raw1'
ORA-01251: 讀取了檔案號 5 的未知檔案頭部版本
分析原因:在LIUNX下沒有4K的保留塊,所以直接這樣拷貝肯定會將檔案頭跳過一個位元組.

[root@dg ~]# dd if=/dev/raw/raw1 f=/dev/raw/raw3 bs=4k seek=1
讀入了 25596+0 個塊
輸出了 25596+0 個塊
SQL> startup
ORACLE 例程已經啟動。
Total System Global Area  432013312 bytes
Fixed Size                  1219808 bytes
Variable Size             134218528 bytes
Database Buffers          289406976 bytes
Redo Buffers                7168000 bytes
資料庫裝載完畢。
ORA-01122: 資料庫檔案 5 驗證失敗
ORA-01110: 資料檔案 5: '/dev/raw/raw1'
ORA-01251: 讀取了檔案號 5 的未知檔案頭部版本
拷貝出來檔案的位元組數沒錯,但是檔案頭跳出了一個位元組,所以找不到檔案頭故抱錯。
[root@dg udump]# dd if=/dev/raw/raw10 f=/dev/raw/raw1 bs=4k
讀入了 25596+0 個塊
輸出了 25596+0 個塊
SQL> startup
ORACLE 例程已經啟動。
Total System Global Area  432013312 bytes
Fixed Size                  1219808 bytes
Variable Size             134218528 bytes
Database Buffers          289406976 bytes
Redo Buffers                7168000 bytes
資料庫裝載完畢。
資料庫已經開啟。
分析原因: 如果不考慮保留塊,拷貝正常,說明在LINUX下沒有保留塊.針對BS=4K來講,在AIX上保留塊設定不對,報不讓拷貝錯誤,但是在LIUNX上,可以不用考慮.

結論:SEEK和SKIP果然有區別,如果有4K保留空間的話,備份裸裝置的時候考慮使用SKIP;恢復的時候使用SEEK進行恢復。
 

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/8334342/viewspace-446994/,如需轉載,請註明出處,否則將追究法律責任。

相關文章