目标:在现有的文件系统中将一部分数据存储在裸设备中
1.为/dev/sdc创建磁盘分区/dev/sdc1和/dev/sdc2,各分配500M
[root@S01 ~]#fdisk /dev/sdc
这里对fdisk用法不多说了
2.绑定分区sdc1和sdc2到裸设备
[root@S01 ~]#raw /dev/raw/raw1 /dev/sdc1
[root@S01 ~]#raw /dev/raw/raw2 /dev/sdc2
3.修改裸设备的属主
[root@S01 ~]#chown oracle:oinstall /dev/raw/raw1
[root@S01 ~]#chown oracle:oinstall /dev/raw/raw2
4.配置重启生效,编辑/etc/rc.local,添加如下内容
raw /dev/raw/raw1 /dev/sdc1
raw /dev/raw/raw2 /dev/sdc2
chown oracle:oinstall /dev/raw/raw1
chown oracle:oinstall /dev/raw/raw2
5.创建链接到裸设备
[root@S01 ~]#ln -s /dev/raw/raw1 /oracle/oradata/oras01/rawts1.dbf
[root@S01 ~]#ln -s /dev/raw/raw2 /oracle/oradata/oras01/rawts2.dbf
6.在Oracle中创建表空间rawts
SQL> create tablespace rawts datafile '/oracle/oradata/oras01/rawts1.dbf' size 499M; --这里为什么不完全分配500M?大家可以思考一下,我在下面会给予解释
SQL> alter tablespace rawts add datafile '/oracle/oradata/oras01/rawts2.dbf' size 499M;
7.创建一个用户rawman,默认表空间为rawts
SQL> create user rawman identified by oracle default tablespace rawts quota unlimited on rawts;
8.赋予登录与建表权限给用户rawman
SQL> grant create table, create session to rawman;
9.用rawman登录,然后创建一张表
SQL> create table t1 (id number(1));
10.查看表的存储位置
SQL> select table_name,tablespace_name from user_tables where table_name='T1';

TABLE_NAME                     TABLESPACE_NAME
------------------------------ ------------------------------
T1                             RAWTS

这样配置后,用户rawman默认会将数据存储在裸设备。Oracle中也支持某个表空间把数据文件与裸设备混合使用,但是这样会带来一定的风险与维护难度,不建议这样做。使用裸设备要注意一个裸设备不能放置多个数据文件。
备份裸设备:
1.查看裸设备的大小
[root@S01 ~]#blockdev --getsize64 /dev/raw/raw1
524288000
这个获得的是字节数,524288000/1024/1024=500M
2.修改表空间状态为offline
SQL> alter tablespace rawts offline;
3.拷贝裸设备到其他目录
[root@S01 ~]#dd if=/dev/raw/raw1 of=/oracle/bak/rawts1_backup.dbf bs=4k
[root@S01 ~]#dd if=/dev/raw/raw2 of=/oracle/bak/rawts2_backup.dbf bs=4k
4.修改表空间状态为online
SQL> alter tablespace rawts online;
还原裸设备:
1.修改表空间状态为offline
SQL> alter tablespace rawts offline;
2.拷贝备份文件到裸设备
[root@S01 ~]#dd if=/oracle/bak/rawts1_backup.dbf of=/dev/raw/raw1 bs=4k
[root@S01 ~]#dd if=/oracle/bak/rawts2_backup.dbf of=/dev/raw/raw2 bs=4k
3.介质恢复
SQL> recover tablespace rawts;
4.修改表空间状态为online
SQL> alter tablespace rawts online;

回到在第6步提出的问题,为什么裸设备有500M的空间,我们只分配499M用来存储数据?
因为在Oracle中,数据文件占用空间=分配空间+保留空间,保留空间的大小需要2个block,一般来说1个block占用8k,所以我们剩余1M空间是给保留空间的。