Oracle Database 10g中出现的ASM(Automatic Storage Management,自动存储管理)技术提供了一种镜像冗余的方法,用以保护可能出现的磁盘故障而导致的数据丢失。要知道,以前也许我们需要RAID来达到这样的目的,但是现在Oracle数据库本身就提供给你这样的选项了,Oracle的意思是,把所有的鸡蛋都放到Oracle这个篮子里面吧,我们是Unbreakable的。 ASM提供了3种冗余方法。 external redundancy表示Oracle不帮你管理镜像,功能由外部存储系统实现,比如通过RAID技术。 normal redundancy(默认方式)表示Oracle提供2路镜像来保护数据。 high redundancy表示Oracle提供3路镜像来保护数据。 先预告一下,有时间再写吧,相信我,有内部资料的(本文用词很多来自某些metalink internal资料的翻译,因为inernal所以就不做link了),呵呵。 什么是 ASM failure group? Oracle通过failure group来提供数据的高可用性。ASM使用的镜像算法并不是镜像整个disk,而是作extent级的镜像。所以很明显如果为各个failure group使用不同容量的disk是不明智的,因为这样在Oracle分配下一个extent的时候可能就会出现问题。在normal redundancy模式下,ASM环境中每分配一个extent都会有一个primary copy和一个second copy,ASM的算法保证了second copy和primary copy一定是在不同的failure group中,这就是failure group的意义。通过这个算法,ASM保证了即使一个failure group中的所有disk都损坏了,数据也是毫发无伤的。 Oracle在分配extent的时候,所有failure group中的这个将拥有相同数据的extent称为一个extent set,当Oracle将数据写入文件的时候,primary copy可能在任何一个failure group中,而second copy则在另外的failure group中,当Oracle读取数据的时候,除非是primary copy不可用,否则将优先从primary copy中读取数据,通过这种写入无序,读取有序的算法,Oracle保证了数据读取尽量分布在多个disk中。 因为公用一个硬件模块的磁盘很可能会同时损坏或者失效,所以通常我们在设计failure group时,应该把一个大的盘阵中在一个tray中的磁盘放在一个failure group中,这样我们就可以拿走一个tray,失效这个failure group,然后换上新的tray和磁盘,这跟RAID的思想是一样的。 ASM的冗余方式一经设定就无法更改,如果我们想把normal redundancy改为high redundancy就只能是创建一个新的failure group,然后把旧failure group中的文件通过RMAN或者DBMS_FILE_TRANSFER的方法移动到新failure group中去。 如果在ASM环境中没有创建failure groups情况会怎样? 即使没有显式指定,failure groups也是始终会创建的。在这种情况下,每个disk都属于一个failure group,在创建磁盘组的时候,failure group也会默认创建,名称就是disk的名字。 应该创建多少failure…