Oracle Datafiles & Block Device & Parted & Udev

需求:
1. 使用裸设备作为Oracle数据文件,而且要跳过操作系统或者其它软件提供的卷管理(比如Linux下的LVM)。
2. 由于small datafile限制,有大量磁盘分区需要创建。

以下测试环境操作系统为CentOS 6.0,如果你的操作是RHEL6或者OEL6,也同样适用,如果是RHEL5或者OEL5,那么udev部分的命令是不相同的。但是只需要在操作系统中man udev,查看一下相应的语法即可,思路是相同的。

解决方案:
1. 使用parted命令,脚本式创建多个分区,使用gpt类型分区表,这样可以创建大量primary分区,而如果使用msdos分区,则必须要要创建extend分区,然后再创建logical分区,这样在后面的udev规则文件中,还需要将extend分区排除出去,比较麻烦。

在我的测试环境中,对于/dev/sdc磁盘进行操作,分了11个分区,每个50M。

parted -s /dev/sdc mklabel gpt 
parted -s /dev/sdc unit MB mkpart primary 1 50 
parted -s /dev/sdc unit MB mkpart primary 50 100 
parted -s /dev/sdc unit MB mkpart primary 100 150 
parted -s /dev/sdc unit MB mkpart primary 150 200 
parted -s /dev/sdc unit MB mkpart primary 250 300 
parted -s /dev/sdc unit MB mkpart primary 300 350 
parted -s /dev/sdc unit MB mkpart primary 350 400 
parted -s /dev/sdc unit MB mkpart primary 400 450 
parted -s /dev/sdc unit MB mkpart primary 450 500 
parted -s /dev/sdc unit MB mkpart primary 500 550 
parted -s /dev/sdc unit MB mkpart primary 550 600

如果在生产环境的Oracle数据库中,block_size=2K的表空间,单个数据文件最大8G,可以使用:

parted -s /dev/sdc unit GB mkpart primary 1 8 

2. 设置udev规则。如何在CentOS 6中设置udev,可以参看我之前的文章 - How to use udev for Oracle ASM in Oracle Linux 6

vi /etc/udev/rules.d/99-oracle.rules

添加如下行:

KERNEL=="sd?[1-9]", SUBSYSTEM=="block", PROGRAM=="/sbin/scsi_id --whitelisted --replace-whitespace --device=/dev/$name", RESULT=="36000c293bd690056ce6834434765d3f4", NAME="oradisk0$number", SYMLINK="mapper/$name", OWNER="oracle",  GROUP="dba", MODE="0660"
KERNEL=="sd?1[0-9]", SUBSYSTEM=="block", PROGRAM=="/sbin/scsi_id --whitelisted --replace-whitespace --device=/dev/$name", RESULT=="36000c293bd690056ce6834434765d3f4", NAME="oradisk$number", SYMLINK="mapper/$name", OWNER="oracle",  GROUP="dba", MODE="0660"

重启udev服务:

start_udev

然后可以发现/dev/mapper下的链接都成功创建,并且指向规则中定义的块设备名称。

# ls -l /dev/mapper/
total 0
crw-rw----. 1 root root 10, 58 Dec 29 03:29 control
lrwxrwxrwx. 1 root root     12 Dec 29 03:29 oradisk01 -> ../oradisk01
lrwxrwxrwx. 1 root root     12 Dec 29 03:29 oradisk02 -> ../oradisk02
lrwxrwxrwx. 1 root root     12 Dec 29 03:29 oradisk03 -> ../oradisk03
lrwxrwxrwx. 1 root root     12 Dec 29 03:29 oradisk04 -> ../oradisk04
lrwxrwxrwx. 1 root root     12 Dec 29 03:29 oradisk05 -> ../oradisk05
lrwxrwxrwx. 1 root root     12 Dec 29 03:29 oradisk06 -> ../oradisk06
lrwxrwxrwx. 1 root root     12 Dec 29 03:29 oradisk07 -> ../oradisk07
lrwxrwxrwx. 1 root root     12 Dec 29 03:29 oradisk08 -> ../oradisk08
lrwxrwxrwx. 1 root root     12 Dec 29 03:29 oradisk09 -> ../oradisk09
lrwxrwxrwx. 1 root root     12 Dec 29 03:29 oradisk10 -> ../oradisk10
lrwxrwxrwx. 1 root root     12 Dec 29 03:29 oradisk11 -> ../oradisk11

注意,此时/dev目录下,sdc1至sdc11设备都不再存在了,但是我们可以通过比较设备的major号和minor号来确认绑定是正确的。

# ls -l /dev/mapper/oradisk01
lrwxrwxrwx. 1 root root 12 Dec 29 03:29 /dev/mapper/oradisk01 -> ../oradisk01
# ls -l /dev/oradisk01
brw-rw----. 1 oracle dba 8, 33 Dec 29 03:29 /dev/oradisk01
# cat /proc/partitions | grep 33
   8       33      48128 sdc1

3. 直接使用/dev/mapper/oradisk*作为数据文件
由于在Oracle 10.2.0.2以后,Oracle已经可以用O_DIRECT标志直接打开块设备,而不是像以前版本那样,如果要跳过操作系统缓存直接读写磁盘设备,必须要用使用字符设备。在以前的版本中,因为要使用字符设备,所以才需要用raw命令去将某一个块设备映射为一个裸设备(字符设备)。而在Oracle 10.2.0.2以后则可以直接使用块设备(比如/dev/sdc1,比如udev映射以后的/dev/oradisk01,这些都是块设备),不过,虽然Oracle 10.2.0.2以后,Oracle可以直接读取块设备,但是在Oracle 11g以前,这个特性还不被OUI支持,如果要在OUI中使用,则需要使用符号链接(symbolic links),如我们用udev创建的/dev/mapper/oradisk*。
也就是在Oracle 10.2.0.2以后,Oracle 11g以前,需要使用/dev/mapper/oradisk*这样的符号链接作为数据文件。
在Oracle 11g以后,可以使用符号链接,也可以直接使用/dev/oradisk*作为数据文件。

如果你们认为有更优的最佳实践,欢迎讨论。当然我们也可以使用lvm或者Oracle ASM来处理数据文件的存储,这不在本文讨论范围内。

BTW: 一个有趣的bug?在测试中发现,如果在udev创建完符号链接之后,再使用parted来查看链接的分区情况,则会导致链接消失,而映射前的sdc1设备名重新出现。重启udev服务也无法将链接重新创建,但是用parted重新查看sdc1设备,则链接又重新出现,sdc1又重新消失。求解释。

--正常情况下有符号链接
[root@localhost ~]# ls -l /dev/mapper/oradisk01
lrwxrwxrwx. 1 root root 12 Dec 29 03:29 /dev/mapper/oradisk01 -> ../oradisk01
--映射前的sdc1设备是不存在的
[root@localhost ~]# ls -l /dev/sdc1
ls: cannot access /dev/sdc1: No such file or directory
--用parted检查链接,或者检查/dev/oradisk01块设备,效果是一样的
[root@localhost ~]# parted /dev/mapper/oradisk01
GNU Parted 2.1
Using /dev/mapper/oradisk01
Welcome to GNU Parted! Type 'help' to view a list of commands.
(parted) q                                                                
--链接消失
[root@localhost ~]# ls -l /dev/mapper/oradisk01
ls: cannot access /dev/mapper/oradisk01: No such file or directory
--映射的块设备还在
[root@localhost ~]# ls -l /dev/oradisk01
brw-rw----. 1 oracle dba 8, 33 Dec 29 03:29 /dev/oradisk01
--原先的sdc1设备出现
[root@localhost ~]# ls -l /dev/sdc1
brw-rw----. 1 root disk 8, 33 Dec 29 04:29 /dev/sdc1
--重新用parted检查sdc1
[root@localhost ~]# parted /dev/sdc1
GNU Parted 2.1
Using /dev/sdc1
Welcome to GNU Parted! Type 'help' to view a list of commands.
(parted) q                                                                
--符号链接重新出现
[root@localhost ~]# ls -l /dev/mapper/oradisk01
lrwxrwxrwx. 1 root root 12 Dec 29 04:38 /dev/mapper/oradisk01 -> ../oradisk01
--sdc1重新消失
[root@localhost ~]# ls -l /dev/sdc1
ls: cannot access /dev/sdc1: No such file or directory

3 thoughts on “Oracle Datafiles & Block Device & Parted & Udev

  1. 请教个问题,文中的代码块样式如何调出来的呢?我在wp后台始终没找到,使用html模式下的标签也不起作用,囧。。。

Leave a Reply

Your email address will not be published. Required fields are marked *