说明,以下实验操作系统版本为RHEL 5.4没有offset Raw offset 在一些os上,在裸设备上的文件的开头是被os使用的。这些存储空间被叫做raw offset,Oracle不会备份和恢复这些内容(字节)。因此,备份的时候要跳过含有offset的字节。 目前只有AIX和Tru64系统的裸设备存在offset,详细信息如下 UNIX OS Reserved Size ------------ ---------------- SUN Solaris 0 HP-UX 0 IBM AIX 4k Tru64 UNIX 64k Linux 0
实例测试 从裸设备到裸设备拷贝ORACLE数据文件 1、创建裸设备 # fdisk /dev/sdd The number of cylinders for this disk is set to 25856. There is nothing wrong with that, but this is larger than 1024, and could in certain setups cause problems with: 1) software that runs at boot time (e.g., old versions of LILO) 2) booting and partitioning software from other OSs (e.g., DOS FDISK, OS/2 FDISK)
Command (m for help): n Command action l logical (5 or over) p primary partition (1-4) l First cylinder (4201-4485, default 4201): Using default value 4201 Last cylinder or +size or +sizeM or +sizeK (4201-4485, default 4485): +10M
Command (m for help): n Command action l logical (5 or over) p primary partition (1-4) l First cylinder (4212-4485, default 4212): Using default value 4212 Last cylinder or +size or +sizeM or +sizeK (4212-4485, default 4485): +20M
Command (m for help): n Command action l logical (5 or over) p primary partition (1-4) l First cylinder (4232-4485, default 4232): Using default value 4232 Last cylinder or +size or +sizeM or +sizeK (4232-4485, default 4485): +30M
Command (m for help): n Command action l logical (5 or over) p primary partition (1-4) l First cylinder (4262-4485, default 4262): Using default value 4262 Last cylinder or +size or +sizeM or +sizeK (4262-4485, default 4485): +40M
Command (m for help): p
Disk /dev/sdd: 27.1 GB, 27111981056 bytes 64 heads, 32 sectors/track, 25856 cylinders Units = cylinders of 2048 * 512 = 1048576 bytes
Device Boot Start End Blocks Id System /dev/sdd1 1 3816 3907568 83 Linux /dev/sdd4 3817 4485 685056 5 Extended /dev/sdd5 3817 3912 98288 83 Linux /dev/sdd6 3913 4008 98288 83 Linux /dev/sdd7 4009 4104 98288 83 Linux /dev/sdd8 4105 4200 98288 83 Linux /dev/sdd9 4201 4211 11248 83 Linux /dev/sdd10 4212 4231 20464 83 Linux /dev/sdd11 4232 4261 30704 83 Linux /dev/sdd12 4262 4300 39920 83 Linux
Command (m for help): w The partition table has been altered!
Calling ioctl() to re-read partition table. The new table will be used at the next reboot. Syncing disks.
# partprobe
# raw /dev/raw/raw3 /dev/sdd9 /dev/raw/raw3: bound to major 8, minor 57 # raw /dev/raw/raw4 /dev/sdd10 /dev/raw/raw4: bound to major 8, minor 58 # raw /dev/raw/raw5 /dev/sdd11 /dev/raw/raw5: bound to major 8, minor 59 # raw /dev/raw/raw6 /dev/sdd12 /dev/raw/raw6: bound to major 8, minor 60
3、从小裸设备到大裸设备 # dd if='/dev/raw/raw3' of='/dev/raw/raw4' 22496+0 records in 22496+0 records out 11517952 bytes (12 MB) copied, 104.599 seconds, 110 kB/s
4、从大裸设备到小裸设备,但数据文件比小裸设备小 # dd if='/dev/raw/raw6' of='/dev/raw/raw5' bs=1024k count=12 12+0 records in 12+0 records out 12582912 bytes (13 MB) copied, 3.34273 seconds, 3.8 MB/s 注意:这里bs*count要大于原裸设备上的数据文件尺寸
2、dd文件到裸设备上 # dd if='/dev/zero' of='/dev/raw/raw3' bs=1024k dd: writing `/dev/raw/raw3': No space left on device 11+0 records in 10+0 records out 11517952 bytes (12 MB) copied, 7.63555 seconds, 1.5 MB/s # dd if=/home/oracle/mytest1.dbf of=/dev/raw/raw3 10256+0 records in 10256+0 records out 5251072 bytes (5.3 MB) copied, 35.9816 seconds, 146 kB/s 注意:从文件系统到裸设备不用设置count
3、重命名数据文件,打开数据库 SQL> alter database rename file '/home/oracle/mytest1.dbf' to '/dev/raw/raw3'; Database altered. SQL> alter database open; Database altered 从裸设备到文件系统拷贝ORACLE数据文件
1、在mytest1表空间上创建表,并填充数据,然后将整个裸设备备份到文件系统 SQL> create table test tablespace mytest1 2 as 3 select * from dba_users; Table created.
#dd if='/dev/raw/raw3' of='/home/oracle/mytest2.dbf' bs=512k 21+1 records in 21+1 records out 11517952 bytes (12 MB) copied, 0.804403 seconds, 14.3 MB/s
2、重启数据库,并充命名数据文件 SQL> shutdown immediate; Database closed. Database dismounted. ORACLE instance shut down. SQL> startup mount; ORACLE instance started. Total System Global Area 369098752 bytes Fixed Size 1219472 bytes Variable Size 134218864 bytes Database Buffers 230686720 bytes Redo Buffers 2973696 bytes Database mounted. SQL> alter database rename file '/dev/raw/raw3' to '/home/oracle/mytest2.dbf'; Database altered. SQL> alter database open; alter database open * ERROR at line 1: ORA-01113: file 9 needs media recovery ORA-01110: data file 9: '/home/oracle/mytest2.dbf' 可以看到数据库无法打开,这是因为裸设备已被数据文件使用部分的逻辑块与未使用部分的逻辑块大小不一致。这种情况下,只能拷贝裸设备中数据文件大小 + block 0部分。这里用到两个工具 dbfsize 求出在裸设备或者文件系统上的oracle数据文件的大小,由oracle提供。 blockdev 求出裸设备的大小,操作系统自带。 要计算出要要拷贝的大小,否则报错,如: $ dbfsize /dev/raw/raw3 Database file: /dev/raw/raw3 Database file type: raw device Database file size: 640 8192 byte blocks
-dsync Use synchronized I/O for data. For the output file, this forces a physical write of output data on each write. For the input file, this flag can matter when reading from a remote file that has been written to synchronously by some other process. Metadata (e.g., last-access and last-modified time) is not necessarily synchronized.
-sync likewise, but also for metadata
the CONV参数
1 2
-fsync Synchronize output data and metadata just before finishing. This forces a physical write of output data and metadata
conv=fsync Synchronize output data and metadata just before finishing 意思也就是在dd命令结束前同步data和metadata,那就是不是每一次写都同步一次咯,也就是如果我们在dd命令中写了100次,他可能是等到最后的时候才把他们同步到磁盘。而oflag=dsync是说Use synchronized I/O for data. For the output file, this forces a physical write of output data on each write,注意这里边用词 a physical write of output data on each write,那就是他是每一次写都得等到这一次写写到了磁盘才进行下一个写,也就是如果我们使用dd写100次,他每次写都是写到磁盘后才进行下一次写的。所以这样当然要比conv=fsync慢一些吧。那么自己感觉如果只是写一次的话,两者应该是差别不大的,后来做了下小实验,证实确实是这样的。