这几天反反复复的折腾ASM for AIX,深刻体会到书到用时方恨少,故作此文记录之。说来惭愧,学习RAC的时候没彻底搞清CRS、CSS、CLUSTERWARE之间的关系;学习ASM的时候没搞清在NON-RAC for AIX环境下的LV和RAW设备。在AIX上安装NON-RAC选用ASM作为存储的10.2的数据库,先是遇到CSS服务启不来,接着是在ASM创建磁盘组的时候发现不了raw设备,一切原于我没有明白AIX下raw设备是如何使用的,不同平台之间意义是不一样的,照葫芦画瓢是行不通的。废话少说,入正题,以下这段内容来自:http://bbs.chinaunix.net/archiver/?tid-1090407.html thesix’s said
在AIX里,每个LVM设备支持两种操作方式,分别被抽象为 Block Device (块设备)和 Character Device (字符设备),其中Character Device 又被称为 Raw Device (原因往下看):比如:
# ls -l /dev/*hdisk0
brw——- 1 root system 22, 2 May 15 2007 hdisk0
crw——- 2 root system 22, 2 May 15 2007 rhdisk0
# ls -l /dev/*hd3
brw-rw—- 1 root system 10, 7 May 15 2007 /dev/hd3
crw-rw—- 1 root system 10, 7 May 15 2007 /dev/rhd3
这里文件属性开头的’c'字母代表Character, 文件名开头的’r'字母代表Raw。
字符设备支持不定长的数据传输 (data transfers of arbitrary sizes),最小一个字节(但绝不是每次只能传一个字节或字符!),LVM和存储设备的单次最大I/O只受 LTG (logical track group) 大小的限制,缺省为128KB,可修改。
块设备只能做定长的数据传输,数据必须经过 ‘kernel buffer cache’。这个以512-byte block 为单位的buffer cache是传统的块设备的缓存,千万不要和文件系统的缓存混为一谈!这样的存取方式不仅效率低,而且带来诸多问题,严重影响大数据量传输的性能,所以现代操作系统中几乎不用块设备的方式进行高速存储设备的数据存取。
数据库建议直接使用裸设备,意指避开文件系统和文件系统的缓存管理,直接和字符设备打交道。
(注意:文件系统一定是建在字符设备上的,不可能建到块设备上)
这样做的好处主要是三个:
1. 实现每个I/O的代码大大减少:filesystem 和 virtual memory for filesystem 的代码都规避了。
2. 避免了重复缓存造成的内存浪费(数据库和文件系统都有自己的数据缓存)。
3. 避免了文件锁的问题:文件系统里的文件不能同时被多个进程或线程更新。
坏处也有:
1. 失去了通过对普通文件进行管理的易用性。
2. 不能利用文件系统的 Readahead 的功能,顺序读的速度可能做不到最优
自从有了DIO和CIO之后,基于文件系统的数据库性能得以大大提高。CIO是最接近与裸设备的一种基于文件系统的数据库运行方式,因为它解决了两个问题:
没有文件缓存(就是裸设备优势之2.);
没有文件锁(就是裸设备优势之3.)。
它保持了文件的可见性,所以不存在裸设备劣势之1。
当然DIO和CIO同样不支持Readahead。
综上所述:
- 字符设备和块设备是对同一个物理设备的两种不同的存储方式的抽象。
- 裸设备这个感念是针对其上有无文件系统来说的,和字符及块设备在概念上没有任何实质联系;
- 块设备的block buffer机制和文件系统的缓存是两回事;
- 块设备在现代操作系统中基本没有任何用途。
- 数据库用裸设备或文件系统mount with CIO, 结合AIO (异步I/O),可以达到最佳I/O性能
(在AIX 新版本中raw LV 和 CIO FS 均支持 AIO Fast Path );
注:相关概念或称谓在不同的操作系统中可能不尽相同,但原理是一样的。
现在看看我的环境:(AIX5310 + ORA10.2.0.4.0)
1. 创建可扩展的VG
# mkvg -S -y datavg hdisk1
2. 创建LV,使用raw设备
# mklv -y lv_dg1 -t raw datavg 40 (pp size 128MB)
# mklv -y lv_dg2 -t raw datavg 40
# mklv -y lv_flashback -t raw datavg 16
3. 修改属主、权限
# chown oracle:dba /dev/*lv_dg*
# chown oracle:dba /dev/rlv_flashback
# chmod 660 /dev/*lv_dg*
# chmod 660 /dev/rlv_flashback
4. 检查
# ls -al /dev/rlv*
crw-rw—- 1 oracle dba 42, 1 Nov 12 12:36 /dev/rlv_dg1
crw-rw—- 1 oracle dba 42, 2 Nov 12 12:37 /dev/rlv_dg2
crw-rw—- 1 oracle dba 42, 3 Nov 12 12:37 /dev/rlv_flashback
做完这些,在ASM创建磁盘组的时候指定相应路径 /dev/rlv_* 即可。

1 2 3 4 5 6 7 8 9 10 11 | SQL>select group_number,name,state FROM v$asm_diskgroup; GROUP_NUMBER NAME STATE ------------ --------------------- ----------- 1 DG1 CONNECTED 2 DG2 MOUNTED 3 DG_FLASHBACK CONNECTED |
-The End-