Oracle-ASM原理(2)
ASM支持以下三种冗余方式
ASM不仅仅要通过高效存取效率,还要提高数据安全。
– 外部冗余
• 表示Oracle不帮你管理镜像,功能由外部存储系统实现,比如通过RAID技术;有效磁盘空间是所有磁盘设备空间的大小之和。
外部冗余就是ASM不提供冗余,由硬件设备本身存储的机制提供冗余。现在的硬件提供了很多种的冗余,比如raid。好处在于利用现有的磁盘,ASM不再划出其余的空间来做冗余。这样做的好处就是最大的可以利用磁盘空间。
– 常规冗余
• (默认方式)表示Oracle提供2路镜像来保护数据,会损失一部分磁盘空间用于数据冗余。
如果额外的设备做冗余,那么就需要由ASM来做冗余了。这个是在ASM层面上提供冗余。也就是将磁盘里面的数据再备份一份。
– 高冗余
• Oracle提供3路镜像来保护数据,会损失更多磁盘空间用于数据冗余。
现在大部分都使用外部冗余,因为raid技术比成熟了,是值得信赖的。
ASM Failure Groups - External Redundancy
如果在外面做了冗余,那么就不需要磁盘的层面上面进行冗余了。那么磁盘的利用率就很高了,百分之百的利用率。
ASM Failure Groups - Normal Redundancy
这个像oracle的日志组一样,里面有两个日志其中坏了一个另外一个还可以用。
ASM Failure Groups - Normal Redundancy
ASM Failure Groups - High Redundancy
Normal Redundancy 1 Disk Per Failure Group
现在都使用底层的自身的存储冗余,比如raid,在ASM面做冗余太浪费了,所以在ASM上面使用外部冗余。
Normal Redundancy 2 Disks per Failure Group
ASM日常管理
ASM也是依靠参数来启动的。
SQL> startup nomount;
ASM instance started
Total System Global Area 1135747072 bytes
Fixed Size 2260728 bytes
Variable Size 1108320520 bytes
ASM Cache 25165824 bytes
在RAC环境下面ASM使用ASM实例,数据库使用数据库实例。
通过ps -ef | grep ora_可以查看到oracle后台进程。oradb就是数据库实例
[[email protected] ~]$ ps -ef | grep ora_
oracle 6330 1 0 21:53 ? 00:00:00 ora_pmon_oradb
oracle 6332 1 0 21:53 ? 00:00:00 ora_psp0_oradb
oracle 6337 1 1 21:53 ? 00:00:02 ora_vktm_oradb
oracle 6341 1 0 21:53 ? 00:00:00 ora_gen0_oradb
oracle 6343 1 0 21:53 ? 00:00:00 ora_diag_oradb
查看ASM后台进程
[[email protected] ~]$ ps -ef | grep asm
grid 4536 4488 0 21:44 pts/1 00:00:00 sqlplus as sysasm
grid 4596 1 0 21:45 ? 00:00:00 asm_pmon_+ASM
grid 4598 1 0 21:45 ? 00:00:00 asm_psp0_+ASM
grid 4600 1 2 21:45 ? 00:00:15 asm_vktm_+ASM
grid 4604 1 0 21:45 ? 00:00:00 asm_gen0_+ASM
SQL> show parameter name;
NAME TYPE
------------------------------------ ----------------------
VALUE
------------------------------
db_unique_name string
+ASM
instance_name string
+ASM
lock_name_space string
service_names string
+ASM
在RAC环境里面用sqlplus去连接oracle实例的时候,如果连接到空闲的实例,那么可能就是oracle环境变量ORACLE_SID和数据库实例名字不一样,先用ps -ef | grep ora_来查看数据库实例的名字,之后再去oracle的环境变量里面去查看ORACLE_ID名字。在一个数据库上面可以有多个实例,如果要连接到哪个实例可以在oracle用户下面使用[[email protected] ~]# export ORACLE_SID=oradb,不过也可以连接到ASM实例。在RAC环境里面也可以使用sqlplus username/[email protected]来连接RAC环境里面的一个数据库实例。
[[email protected] ~]# su - oracle
[[email protected] ~]$ echo $ORACLE_SID
oradb
[[email protected] ~]$ su - grid
Password:
[[email protected] ~]$ echo $ORACLE_SID
+ASM
SQL> select instance_name,status from v$instance;
INSTANCE_NAME STATUS
-------------------------------- ------------------------
+ASM STARTED
ASM实例的状态一直是STARTED的状态(这个状态就是将实例起来,分配内存),它只是一个实例,不会一直去关注数据的一致性问题,也不会将数据库打开执行SQL语句,ASM实例只是用来做数据的抽取和数据的传递。只是为数据库实例来服务的,所以不需要控制文件和数据文件。
在ASM里面,使用最多的就是两个视图,v$asm_diskgroup查看磁盘组信息,v$asm_disk查看磁盘信息。ASM实例的信息最好在ASM实例里面去查看,不要到oracle实例里面去查询,因为ASM实例的信息更加准确,要比在数据库上面查到的信息更加准确。
对ASM提供工具ASMCMD。
ASM管理的磁盘在操作系统下面是不可见的,所以oracle提供了工具ASMCMD这个工具来查看。进去之后就可以发现里面其实也像操作系统的文件一样。
[[email protected] ~]$ asmcmd
ASMCMD> ls
DATA/
LOG/
RECOVER/
ASMCMD> ls
CONTROLFILE/
DATAFILE/
ONLINELOG/
PARAMETERFILE/
TEMPFILE/
spfileoradb.ora这个就是数据库的spfile,放在ASM RAC上面,这样的好处是几个实例都可以使用同一个spfile来启动数据库。这样就可以保证各个实例的参数的一致性,好处是这样更改一个参数就对所有的实例都生效。
ASMCMD> cd DATAFILE/
ASMCMD> ls
EXAMPLE.265.972178091
SYSAUX.257.972177933
SYSTEM.256.972177933
UNDOTBS1.258.972177933(在RAC环境下面,有两个undo表空间,因为两个实例各自使用一个undo表空间)
USERS.259.972177933
通过lsct可以查看有那些实例连接到了ASM实例上面。
ASMCMD> lsct
DB_Name Status Software_Version Compatible_version Instance_Name Disk_Group
oradb CONNECTED 11.2.0.4.0 11.2.0.4.0 oradb DATA
oradb CONNECTED 11.2.0.4.0 11.2.0.4.0 oradb RECOVER
lsdg来查看磁盘组的信息,mount代表磁盘组挂载上了,是可以使用的。
ASMCMD> lsdg
State Type Rebal Sector Block AU Total_MB Free_MB Req_mir_free_MB Usable_file_MB Offline_disks Voting_files Name
MOUNTED EXTERN N 512 4096 1048576 20480 18498 0 18498 0 N DATA/
MOUNTED EXTERN N 512 4096 1048576 10244 10192 0 10192 0 N LOG/
MOUNTED EXTERN N 512 4096 1048576 9224 7665 0 7665
使用disk查看到的磁盘信息和df -h查看到的信息是不一样的,因为ASM磁盘不是操作系统的一部分。
如果先关ASM,再关数据库,这样很危险。
SQL> startup;
ASM instance started
Total System Global Area 1135747072 bytes
Fixed Size 2260728 bytes
Variable Size 1108320520 bytes
ASM Cache 25165824 bytes
ASM diskgroups mounted(ASM将数据库磁盘挂载好了,可以通过ASM来读取数据了)。