首页 > Linux操作系统 > Linux操作系统 > 玩转裸设备的备份恢复
近期在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博客 ” ,链接:https://blog.itpub.net/8334342/viewspace-446994/ ,如需转载,请注明出处,否则将追究法律责任。