玩轉裸裝置的備份恢復
近期在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 --> /dev/sdb1
/dev/raw/raw8: bound to major 8, minor 17
/dev/raw/raw2 --> /dev/sdb2
/dev/raw/raw2: bound to major 8, minor 18
/dev/raw/raw3 --> /dev/sdb3
/dev/raw/raw3: bound to major 8, minor 19
/dev/raw/raw4 --> /dev/sdb4
/dev/raw/raw4: bound to major 8, minor 20
/dev/raw/raw5 --> /dev/sdc1
/dev/raw/raw5: bound to major 8, minor 33
/dev/raw/raw6 --> /dev/sdc2
/dev/raw/raw6: bound to major 8, minor 34
/dev/raw/raw7 --> /dev/sdc3
/dev/raw/raw7: bound to major 8, minor 35
/dev/raw/raw8 --> /dev/sdc4
/dev/raw/raw9: bound to major 8, minor 36
/dev/raw/raw9 --> /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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- oracle rac在裸裝置下的恢復Oracle
- oracle rac在裸裝置下的備份Oracle
- ORACLE備份&恢復案例(轉)Oracle
- Oracle備份與恢復(轉)Oracle
- 備份與恢復--利用備份的控制檔案恢復
- 【備份恢復】從備份恢復資料庫資料庫
- 【管理篇備份恢復】備份恢復基礎
- Oracle備份恢復之熱備份恢復及異機恢復Oracle
- ORACLE備份&恢復案例三(轉)Oracle
- ORACLE備份&恢復案例二(轉)Oracle
- 完整的oraclerman備份恢復的例子(轉)Oracle
- oracle 裸裝置(轉載)Oracle
- 備份與恢復系列 十一 控制檔案的備份與恢復
- MySQL備份與恢復——基於Xtrabackup物理備份恢復MySql
- 【轉】 RMAN備份與恢復實踐
- Oracle備份與恢復總結[轉]Oracle
- mysql簇備份與恢復(轉載)MySql
- Mysql備份恢復MySql
- Postgresql 備份恢復SQL
- redis備份恢復Redis
- mysql 備份恢復MySql
- 備份和恢復
- 備份&恢復之四:非歸檔模式下的備份與恢復模式
- Oracle資料庫的備份與恢復(轉)Oracle資料庫
- 【轉載】SCN 備份與恢復的關係
- Oracle 資料庫的備份與恢復(轉)Oracle資料庫
- 備份與恢復:polardb資料庫備份與恢復資料庫
- 【備份恢復】Oracle 資料備份與恢復微實踐Oracle
- Mysql的備份與恢復MySql
- 揭密備份恢復的原理
- Backup And Recovery User's Guide-備份和恢復概覽-備份和恢復介紹-備份和恢復的目的GUIIDE
- 備份與恢復系列 十 引數檔案spfile的備份與恢復
- 備份與恢復--從備份的歸檔日誌中恢復資料
- controlfile備份恢復總結(轉)
- 【物理熱備】(下)備份恢復系統表空間 手工備份恢復
- 詳解叢集級備份恢復:物理細粒度備份恢復
- 【備份恢復】noarchive模式下使用增量備份恢復資料庫Hive模式資料庫
- windwos server 路由備份和恢復 路由表備份和恢復Server路由