y18511664518
作者y185116645182017-09-14 16:31
技术总监, 长城超云

Oracle11g RAC下ASM 的管理与维护

字数 34141阅读 3324评论 2赞 6

Oracle11g RAC下ASM 的管理与维护

一, 基本维护 :

注意: 以下除OS之外的命令及过程基本都可以通过ASMCA中的ASM相关操作以及
Oracle Enterprise Mananger 来管理 .

  1. 查看ASM磁盘及磁盘组 :

--SQL查看有哪些磁盘组 .
[root@rac01 ~]# su - grid
[grid@rac01 ~]$ sqlplus "/as sysasm"

SQL> select group_number , name , state, type from v$asm_diskgroup ;

GROUP_NUMBER NAME STATE TYPE


1 OCR_VOTE MOUNTED EXTERN
2 ORADATA MOUNTED EXTERN
3 ORAFLASH MOUNTED EXTERN

通过一些字段total_mb及free_mb 等可以看出磁盘组的空间使用情况.

-- 通过SQL语句查看ASM磁盘
SQL> set line 2000
SQL> select group_number, name,failgroup, path from v$asm_disk;

GROUP_NUMBER NAME FAILGROUP PATH


2 ASMDATA01 ASMDATA01 ORCL:ASMDATA01
3 ASMDATA02 ASMDATA02 ORCL:ASMDATA02
1 OCR_VOTE01 OCR_VOTE01 ORCL:OCR_VOTE01

通过group_number可以将磁盘与磁盘组联系起来(一个磁盘组可以对应多个磁盘). 这里
可以看到磁盘OCR_VOTE01对应OCR_VOTE磁盘组, 磁盘ASMDATA01对应ORADATA
磁盘组, 磁盘ASMDATA02 对应ORAFLASH 磁盘组 (建议名称一致比较好) 。

--通过asmcmd查看磁盘组(每个磁盘组表现为一个目录) :
[root@rac01 ~]# su - grid
[grid@rac01 ~]$ asmcmd
ASMCMD> ls -al
State Type Rebal Name
MOUNTED EXTERN N OCR_VOTE/
MOUNTED EXTERN N ORADATA/
MOUNTED EXTERN N ORAFLASH/
备注 : 或者 ASMCMD> lsdg

-- 通过OS下oracleasm 命令查看ASM磁盘 .
[root@rac01 bin]# /usr/sbin/oracleasm listdisks
ASMDATA01
ASMDATA02
OCR_VOTE01

  1. 认识ASM相关路径 :

通过asmcm 命令可以看到ASM会根据dbca时制定的datafile路径, 在ORADATA磁盘组
下面建立一些默认的路径 (一般是 db_name 下ARCHIVELOG/ , CONTROLFILE/,
DATAFILE/ , ONLINELOG/ , PARAMETERFILE/ , TEMPFILE/ , 目录都是大写, 其
中后面小写的arch是用户自己建的, SYS字段为Y的都是系统自建的, N是用户定义
的 )

[root@rac01 bin]# su - grid
[grid@rac01 ~]$ asmcmd
ASMCMD> ls
OCR_VOTE/
ORADATA/
ORAFLASH/
ASMCMD> cd oradata
ASMCMD> ls
RACDB/
ASMCMD> cd racdb
ASMCMD> ls -l
Type Redund Striped Time Sys Name
Y ARCHIVELOG/
Y CONTROLFILE/
Y DATAFILE/
Y ONLINELOG/
Y PARAMETERFILE/
Y TEMPFILE/
N arch/
N control01.ctl => +ORADATA/RACDB/CONTROLFILE/Current.256.739387263
N control02.ctl => +ORADATA/RACDB/CONTROLFILE/Current.257.739387265
N redo01.log => +ORADATA/RACDB/ONLINELOG/group_1.258.739387273
N redo02.log => +ORADATA/RACDB/ONLINELOG/group_2.259.739387281
N redo03.log => +ORADATA/RACDB/ONLINELOG/group_3.266.739393547
N redo04.log => +ORADATA/RACDB/ONLINELOG/group_4.267.739393547
N spfileracdb.ora => +ORADATA/RACDB/PARAMETERFILE/spfile.268.739393555
ASMCMD>

--归档路径ARCHIVELOG :

通过Oracle数据库参数文件看到归档路径 :
SQL> show parameter log_archive_dest
log_archive_dest_1 string LOCATION=+ORADATA/RACDB/arch
可以看到归档路径 " +ORADATA/RACDB/arch " , 那么 +ORADATA/RACDB/ARCHIVELOG
下面又是保存的什么文件呢 ?

ASMCMD> pwd
+oradata/racdb/arch -- 查看参数中的归档路径
ASMCMD> ls -l
Type Redund Striped Time Sys Name
N 1_204_739387258.arc =>

+ORADATA/RACDB/ARCHIVELOG/2011_11_28/thread_1_seq_204.478.768441403
N 1_205_739387258.arc =>

+ORADATA/RACDB/ARCHIVELOG/2011_11_29/thread_1_seq_205.481.768443221
N 1_206_739387258.arc =>

+ORADATA/RACDB/ARCHIVELOG/2011_11_29/thread_1_seq_206.482.768443233
N 1_207_739387258.arc =>

+ORADATA/RACDB/ARCHIVELOG/2011_11_29/thread_1_seq_207.483.768443239
N 1_208_739387258.arc =>

+ORADATA/RACDB/ARCHIVELOG/2011_11_29/thread_1_seq_208.485.768443253
N 1_209_739387258.arc =>

+ORADATA/RACDB/ARCHIVELOG/2011_11_29/thread_1_seq_209.486.768443277
N 1_210_739387258.arc =>

+ORADATA/RACDB/ARCHIVELOG/2011_11_29/thread_1_seq_210.487.768443293
N 1_211_739387258.arc =>

+ORADATA/RACDB/ARCHIVELOG/2011_11_29/thread_1_seq_211.489.768443319
N 1_212_739387258.arc =>

+ORADATA/RACDB/ARCHIVELOG/2011_11_29/thread_1_seq_212.490.768511059
N 1_213_739387258.arc =>

+ORADATA/RACDB/ARCHIVELOG/2011_11_29/thread_1_seq_213.493.768512249
N 1_214_739387258.arc =>

+ORADATA/RACDB/ARCHIVELOG/2011_11_29/thread_1_seq_214.494.768512253
N 1_215_739387258.arc =>

+ORADATA/RACDB/ARCHIVELOG/2011_11_29/thread_1_seq_215.499.768522885
N 1_216_739387258.arc =>

+ORADATA/RACDB/ARCHIVELOG/2011_11_30/thread_1_seq_216.500.768530093
N 2_100_739387258.arc =>

+ORADATA/RACDB/ARCHIVELOG/2011_11_29/thread_2_seq_100.488.768443301
N 2_101_739387258.arc =>

+ORADATA/RACDB/ARCHIVELOG/2011_11_29/thread_2_seq_101.491.768511059
N 2_102_739387258.arc =>

+ORADATA/RACDB/ARCHIVELOG/2011_11_29/thread_2_seq_102.492.768511065
ASMCMD>
用户自己定义的归档格式以及归档路径指向ASM自动建立的目录及文件, 自定义生成的
归档相当于快捷方式(或软连接), 实际文件为ASM默认路径的归档文件。

也可以手工为oracle ASM Filename 生成别名:
ALTER DISKGROUP ORADATA ADD ALIAS
'+oradata/racdb/datafile/test01.dbf'
FOR '+oradata/racdb/datafile/TEST.340.740166807' ;

ASMCMD> pwd
+oradata/racdb/ARCHIVELOG --查看ASM系统自己默认的归档路径
ASMCMD> ls -l
Type Redund Striped Time Sys Name
Y 2011_11_28/
Y 2011_11_29/
Y 2011_11_30/

归档文件是按照每天来进行存储的 , 并且有目录分开 .

ASMCMD> cd 2011_11_29/
ASMCMD> ls -l
Type Redund Striped Time Sys Name
ARCHIVELOG UNPROT COARSE NOV 29 00:00:00 Y thread_1_seq_205.481.768443221
ARCHIVELOG UNPROT COARSE NOV 29 00:00:00 Y thread_1_seq_206.482.768443233
ARCHIVELOG UNPROT COARSE NOV 29 00:00:00 Y thread_1_seq_207.483.768443239
ARCHIVELOG UNPROT COARSE NOV 29 00:00:00 Y thread_1_seq_208.485.768443253
ARCHIVELOG UNPROT COARSE NOV 29 00:00:00 Y thread_1_seq_209.486.768443277
ARCHIVELOG UNPROT COARSE NOV 29 00:00:00 Y thread_1_seq_210.487.768443293
ARCHIVELOG UNPROT COARSE NOV 29 00:00:00 Y thread_1_seq_211.489.768443319
ARCHIVELOG UNPROT COARSE NOV 29 19:00:00 Y thread_1_seq_212.490.768511059
ARCHIVELOG UNPROT COARSE NOV 29 19:00:00 Y thread_1_seq_213.493.768512249
ARCHIVELOG UNPROT COARSE NOV 29 19:00:00 Y thread_1_seq_214.494.768512253
ARCHIVELOG UNPROT COARSE NOV 29 22:00:00 Y thread_1_seq_215.499.768522885
ARCHIVELOG UNPROT COARSE NOV 29 00:00:00 Y thread_2_seq_100.488.768443301
ARCHIVELOG UNPROT COARSE NOV 29 19:00:00 Y thread_2_seq_101.491.768511059
ARCHIVELOG UNPROT COARSE NOV 29 19:00:00 Y thread_2_seq_102.492.768511065
ARCHIVELOG UNPROT COARSE NOV 29 22:00:00 Y thread_2_seq_103.495.768522877
ARCHIVELOG UNPROT COARSE NOV 29 22:00:00 Y thread_2_seq_104.496.768522879
ARCHIVELOG UNPROT COARSE NOV 29 22:00:00 Y thread_2_seq_105.497.768522883
ARCHIVELOG UNPROT COARSE NOV 29 22:00:00 Y thread_2_seq_106.498.768522883
ARCHIVELOG UNPROT COARSE NOV 29 00:00:00 Y thread_2_seq_99.484.768443235
ASMCMD>

--控制文件路径 CONTROLFILE :
ASMCMD> cd racdb
ASMCMD> ls -l
Type Redund Striped Time Sys Name
N control01.ctl => +ORADATA/RACDB/CONTROLFILE/Current.256.739387263
N control02.ctl => +ORADATA/RACDB/CONTROLFILE/Current.257.739387265

查看初始化参数文件位置, 实际文件也是类似软链接方式 :
SQL> show parameter control

NAME TYPE VALUE


control_files string +ORADATA/racdb/control01.ctl,
+ORADATA/racdb/control02.ctl

如何增加控制文件呢 ? 例子如下:
SQL> alter database mount database;
SQL> alter database backup controlfile to '+ORADATA/racdb/control02.ctl';
SQL> alter database backup controlfile to '+ORADATA/racdb/control03.ctl';
SQL> alter system set control_files='+ORADATA/racdb/control01.ctl','+DATA/racdb/control02.ctl','+DATA/racdb/control03.ctl'

scope=spfile;
SQL> startup mount

--数据文件路径 DATAFILE :

ASMCMD> pwd
+oradata/racdb/datafile
ASMCMD>
ASMCMD> ls -l
Type Redund Striped Time Sys Name
DATAFILE UNPROT COARSE OCT 29 18:00:00 Y BASE_DATA.317.754072293
DATAFILE UNPROT COARSE OCT 29 18:00:00 Y BASE_DATA.318.754072319
DATAFILE UNPROT COARSE OCT 29 18:00:00 Y BASE_DATA.319.754072331
DATAFILE UNPROT COARSE OCT 29 18:00:00 Y BASE_DATA.320.754072345
N BASE_DATA01.DBF => +ORADATA/RACDB/DATAFILE/BASE_DATA.317.754072293
N BASE_DATA02.DBF => +ORADATA/RACDB/DATAFILE/BASE_DATA.318.754072319
N BASE_DATA03.DBF => +ORADATA/RACDB/DATAFILE/BASE_DATA.319.754072331
N BASE_DATA04.DBF => +ORADATA/RACDB/DATAFILE/BASE_DATA.320.754072345
DATAFILE UNPROT COARSE OCT 29 18:00:00 Y LOGMNRTS.321.754072935
DATAFILE UNPROT COARSE OCT 29 18:00:00 Y LOG_DATA.322.754072961
DATAFILE UNPROT COARSE OCT 29 18:00:00 Y LOG_DATA.323.754072985
DATAFILE UNPROT COARSE OCT 29 18:00:00 Y LOG_DATA.324.754073009
DATAFILE UNPROT COARSE OCT 29 18:00:00 Y LOG_DATA.325.754073035
DATAFILE UNPROT COARSE OCT 29 18:00:00 Y none => SYSAUX.261.754063795
DATAFILE UNPROT COARSE OCT 29 18:00:00 Y none => SYSTEM.263.754063787
DATAFILE UNPROT COARSE OCT 29 18:00:00 Y +ORADATA/RACDB/DATAFILE/undotbs101.dbf =>

UNDOTBS1.260.758741005
DATAFILE UNPROT COARSE OCT 29 18:00:00 Y none => UNDOTBS2.258.754063807
DATAFILE UNPROT COARSE OCT 29 18:00:00 Y none => UNDOTBS3.257.754063809
DATAFILE UNPROT COARSE OCT 29 18:00:00 Y none => USERS.256.754063811

可以看出链接的名称及对应的实体文件名称都出现在 datafile目录下, 当然并
不是每个实体文件都有一个对应的链接的文件名称, 例如初始建立数据库的
时候指定 +ORADATA 磁盘组后, 数据库会自动建立初始数据文件, 那时候的
文件就只有系统生成的, 而没有用户指定的名称(链接名称) , 例如上面例子中
的 LOGMNRTS.321.754072935 , SYSTEM.263.754063787 等 .

在加入datafile或建立表空间时, 如果只是指定 +ORADATA, 而不明确写出路径
及文件名称 , 那么就会生成系统自建文件而没有链接名称, 如果文件使用类似
' +ORADATA/racdb/datafile/mytbs01.dbf ' , 那么就会生成系统自建文件及对应的
链接文件 . 同样可以利用ALTER DISKGROUP XX ADD ALIAS 增加别名.


-- 认识文件名
BASE_DATA.317.754072293 是表空间名+文件编号.Incarnation .

+group/dbname/file type/tag.file.incarnation 格式中分别是磁盘组名, file type是Oracle

文件类型, tag一般对一个表空间名, file.incarnation 结合在一起确保唯一性.

测试 : 新增数据文件或表空间

CREATE TABLESPACE MYTBS DATAFILE
'+ORADATA/racdb/datafile/mytbs01.dbf' SIZE 10M AUTOEXTEND OFF
LOGGING
ONLINE
PERMANENT
EXTENT MANAGEMENT LOCAL UNIFORM. SIZE 5M
BLOCKSIZE 16K
SEGMENT SPACE MANAGEMENT AUTO
FLASHBACK ON ;

或者

CREATE TABLESPACE TONYTBS DATAFILE
'+ORADATA' SIZE 10M AUTOEXTEND ON NEXT 5M MAXSIZE 1024M
LOGGING
ONLINE
PERMANENT
EXTENT MANAGEMENT LOCAL UNIFORM. SIZE 5M
BLOCKSIZE 16K
SEGMENT SPACE MANAGEMENT AUTO
FLASHBACK ON ;

增加数据文件
ALTER TABLESPACE MYTBS ADD DATAFILE
'+ORADATA' SIZE 10M AUTOEXTEND OFF ;

如果设置了初始化参数db_create_file_dest(默认为空),连磁盘组名都不
需要写了,例如:
SQL> show parameter db_create_file_dest
NAME TYPE VALUE


db_create_file_dest string +ORADATA

SQL> ALTER TABLESPACE MYTBS ADD DATAFILE SIZE 10M AUTOEXTEND OFF ;
ablespace altered.

Tips :
对于现有系统想迁入ASM存储,最简单的方式,莫过于使用RMAN了

3个语句建立完毕后, 查看系统文件:
[root@rac01 ~]# su - grid
[grid@rac01 ~]$
[grid@rac01 ~]$ asmcmd
ASMCMD> ls
OCR_VOTE/
ORADATA/
ORAFLASH/
ASMCMD> cd oradata/racdb

ASMCMD> ls -l
Type Redund Striped Time Sys Name
DATAFILE UNPROT COARSE NOV 30 17:00:00 Y MYTBS.504.768590521
DATAFILE UNPROT COARSE NOV 30 17:00:00 Y MYTBS.505.768590741
DATAFILE UNPROT COARSE NOV 30 17:00:00 Y SYSAUX.261.739387301
DATAFILE UNPROT COARSE NOV 30 17:00:00 Y SYSTEM.260.739387283
DATAFILE UNPROT COARSE NOV 30 17:00:00 Y TEST.340.740166807
DATAFILE UNPROT COARSE NOV 30 17:00:00 Y TEST.341.740166937
DATAFILE UNPROT COARSE NOV 30 17:00:00 Y TONYTBS.506.768590761
DATAFILE UNPROT COARSE NOV 30 17:00:00 Y UNDOTBS1.262.739387315
DATAFILE UNPROT COARSE NOV 30 17:00:00 Y UNDOTBS2.264.739387351
DATAFILE UNPROT COARSE NOV 30 17:00:00 Y USERS.265.739387361
N mytbs01.dbf => +ORADATA/RACDB/DATAFILE/MYTBS.504.768590521
N test01.dbf => +ORADATA/RACDB/DATAFILE/TEST.340.740166807
N test02.dbf => +ORADATA/RACDB/DATAFILE/TEST.341.740166937

我们可以看到, mytbs01 指定了路径 '+ORADATA/racdb/datafile/mytbs01.dbf' , 所以
显示时既有mytbs01.dbf, 也有对应的 MYTBS.504.768590521 , 新加入的 MYTBS表
空间文件只是写了 '+ORADATA' , 生成文件为 MYTBS.505.768590741 , 同样建立
的TONYTBS也是, 对应文件为 TONYTBS.506.768590761 , 没有链接文件 .

修改数据文件大小 (与文件系统操作相似) :
ALTER DATABASE DATAFILE '+DATA/wsjdell/datafile/users.256.754063811' RESIZE 200M;

对于归档目录及数据文件目录, 还有一个比较关心的问题就是空间问题, 我们如
何来判断磁盘组需要加入新的磁盘或新建磁盘组来满足数据增长呢 ?

ASMCMD> pwd
+oradata/racdb/datafile
ASMCMD> du
Used_MB Mirror_used_MB
2949 2949

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 10236 9840 0 9840 0 N OCR_VOTE/
MOUNTED EXTERN N 512 4096 1048576 10236 465 0 465 0 N ORADATA/
MOUNTED EXTERN N 512 4096 1048576 4094 3999 0 3999 0 N ORAFLASH/

[root@rac01 ~]# su - grid
[grid@rac01 ~]$ sqlplus "/as sysasm"
SQL> select name , total_mb, free_mb,cold_used_mb from v$asm_diskgroup ;
NAME TOTAL_MB FREE_MB COLD_USED_MB


OCR_VOTE 10236 9840 396
ORADATA 10236 465 9771
ORAFLASH 4094 3999 95

可以看到通过asmcmd 及 asm 实例中的 sql 语句查询出来的 free_mb(或Usable_file_MB)
大小是一致的 .

表空间的使用情况需要通过数据库SQL或辅助工具(如Toad)来进行查看.

--在线日志文件路径 ONLINELOG

ASMCMD> pwd
+oradata/racdb
ASMCMD> ls -l
Type Redund Striped Time Sys Name
Y ARCHIVELOG/
Y CONTROLFILE/
Y DATAFILE/
Y ONLINELOG/
Y PARAMETERFILE/
Y TEMPFILE/
N arch/
N control01.ctl => +ORADATA/RACDB/CONTROLFILE/Current.256.739387263
N control02.ctl => +ORADATA/RACDB/CONTROLFILE/Current.257.739387265
N redo01.log => +ORADATA/RACDB/ONLINELOG/group_1.258.739387273
N redo02.log => +ORADATA/RACDB/ONLINELOG/group_2.259.739387281
N redo03.log => +ORADATA/RACDB/ONLINELOG/group_3.266.739393547
N redo04.log => +ORADATA/RACDB/ONLINELOG/group_4.267.739393547
N spfileracdb.ora => +ORADATA/RACDB/PARAMETERFILE/spfile.268.739393555
ASMCMD> cd onlinelog
ASMCMD> ls -l
Type Redund Striped Time Sys Name
ONLINELOG UNPROT COARSE NOV 30 17:00:00 Y group_1.258.739387273
ONLINELOG UNPROT COARSE NOV 30 17:00:00 Y group_2.259.739387281
ONLINELOG UNPROT COARSE NOV 30 17:00:00 Y group_3.266.739393547
ONLINELOG UNPROT COARSE NOV 30 17:00:00 Y group_4.267.739393547

和其他关键文件一样, 在建库的时候手工指定了目录 +oradata/racdb , 所以毕竟
好辨认的名称 redo01.log, redo02.log 等都以链接名称方式存在 .

Redo logfile的冗余设置可以设置在不同的磁盘组上, 比如 ORADATA和ORAFLASH .
加入冗余组的方式和文件系统下一样(唯一的区别是不能在file上加括号, 如果只加入
一个member的话 ) .

alter database add logfile member '+ORAFLASH' to group 1 ;
alter database add logfile member '+ORAFLASH' to group 2 ;
alter database add logfile member '+ORAFLASH' to group 3 ;
alter database add logfile member '+ORAFLASH' to group 4 ;

加入后查询 v$logfile 可以看到每组2个成员 .

ASMCMD> cd +oraflash
ASMCMD> ls
RACDB/
ASMCMD> cd racdb
ASMCMD> ls
ONLINELOG/
ASMCMD> ls -l
Type Redund Striped Time Sys Name
ONLINELOG UNPROT COARSE NOV 30 20:00:00 Y group_1.256.768602255
ONLINELOG UNPROT COARSE NOV 30 21:00:00 Y group_2.257.768603599
ONLINELOG UNPROT COARSE NOV 30 21:00:00 Y group_3.258.768603683
ONLINELOG UNPROT COARSE NOV 30 21:00:00 Y group_4.259.768603705

加入一个redo log group .
alter database add logfile group 5 ('+ORADATA' , '+ORAFLASH') size 50M ;

SQL> select member from v$logfile;

MEMBER

+ORADATA/racdb/redo01.log
+ORADATA/racdb/redo02.log
+ORADATA/racdb/redo03.log
+ORADATA/racdb/redo04.log
+ORAFLASH/racdb/onlinelog/group_1.256.768602255
+ORAFLASH/racdb/onlinelog/group_2.257.768603599
+ORAFLASH/racdb/onlinelog/group_3.258.768603683
+ORAFLASH/racdb/onlinelog/group_4.259.768603705
+ORADATA/racdb/onlinelog/group_5.508.768604159
+ORAFLASH/racdb/onlinelog/group_5.260.768604161

10 rows selected.
SQL>

--参数文件路径 PARAMETERFILE (DB参数文件, 非ASM实例参数文件)

ASMCMD> pwd
+oradata/racdb/parameterfile
ASMCMD> ls -l
Type Redund Striped Time Sys Name
PARAMETERFILE UNPROT COARSE NOV 30 17:00:00 Y spfile.268.739393555
ASMCMD>

--临时文件路径 TEMPFILE

ASMCMD> cd tempfile
ASMCMD> ls -l
Type Redund Striped Time Sys Name
TEMPFILE UNPROT COARSE NOV 30 17:00:00 Y TEMP.263.739387321

  1. 扩充磁盘组大小

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 10236 9840 0 9840 0 N OCR_VOTE/
MOUNTED EXTERN N 512 4096 1048576 10236 414 0 414 0 N ORADATA/
MOUNTED EXTERN N 512 4096 1048576 4094 3737 0 3737 0 N ORAFLASH/

通过lsdg或v$asm_diskgroup视图我们发现磁盘组空间可能不够了, 那么我们
是新加入一个磁盘组呢, 还是在原来磁盘组基础上加入新的磁盘呢 ? 为了
更好的得到I/O性能 , 一般采用在磁盘组中加入新的磁盘 . ASM磁盘组支持
动态扩展,我们可以向现有的磁盘组动态加入新的磁盘,新磁盘加入后,Oracle
通过后台RBAL进行Rebalance,将当前的数据均衡到新增加的磁盘上。Drop磁
盘亦会Rebalance。

asm_power_limit 参数用于控制Rebalance的速度,取值1~11,power表示启动的
rebalance的进程RBAL的个数数字越大,平衡速度越快,默认值是1。但是该数
字越大,可能因为Rebalance而影响性能, 一般为了平衡, 设置为 3~6之间。

加入新磁盘后, 假设为 /dev/sde, /dev/sdf , fdisk 划分分区为 /dev/sde1, /dev/sdf1 .

[grid@rac01 ~]$ sqlplus "/as sysasm"
SQL*Plus: Release 11.2.0.1.0 Production on Wed Nov 30 23:04:08 2011
Copyright (c) 1982, 2009, Oracle. All rights reserved.
Connected to:
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - Production
With the Real Application Clusters and Automatic Storage Management options

SQL> show parameter asm_power_limit

NAME TYPE VALUE


asm_power_limit integer 1

SQL> alter system set asm_power_limit=5 ; -- 修改power值 .
System altered.
或者使用
ALTER DISKGROUP diskgroupname REBALANCE POWER 5 ;

-- 查看已有的磁盘 .
SQL> select group_number, name from v$asm_disk order by 1;

GROUP_NUMBER NAME


0
1 OCR_VOTE01
2 ASMDATA01
3 ASMDATA02

-- 查看已有的磁盘组 .
SQL> select group_number, name from v$asm_diskgroup order by 1 ;

GROUP_NUMBER NAME


1 OCR_VOTE
2 ORADATA
3 ORAFLASH

创建新磁盘:
[root@rac01 ~]# /usr/sbin/oracleasm createdisk ASMDATA03 /dev/sde1
Writing disk header: done
Instantiating disk: done

[root@rac01 ~]# /usr/sbin/oracleasm listdisks
ASMDATA01
ASMDATA02
ASMDATA03
OCR_VOTE01

其他节点上:
[root@rac02 ~]# /usr/sbin/oracleasm scandisks
Reloading disk partitions: done
Cleaning any stale ASM disks...
Scanning system for ASM disks...

[root@rac02 ~]# /usr/sbin/oracleasm listdisks
ASMDATA01
ASMDATA02
ASMDATA03
OCR_VOTE01

新磁盘ASMDATA03 需要加入到 ORADATA 磁盘组中:

[grid@rac01 ~]$ sqlplus "/as sysasm"
SQL> ALTER DISKGROUP ORADATA ADD DISK 'ORCL:ASMDATA03' ;
Diskgroup altered .

或者( 需要在初始参数指定 ASM_DISKSTRING = '/dev/*' )
SQL>ALTER DISKGROUP ORADATA ADD DISK '/dev/sde1' name ASMDATA03 ;

速度还是非常快的(可能是没有多少数据需要在各磁盘间转移), 大家可以
找一些大的测试库进行不同power值时的速度及性能测试 . 注意完毕后将
asm_power_limit 值修改为默认的 1 .
SQL> alter system set asm_power_limit=1 ;
System altered.


注意, 如果扩容的磁盘组是Normal Redundant 的, 那么还需要failure group.
修改及新增磁盘组相关的语句类似 (需要设置初始参数ASM_DISKSTRING='/dev/*'):
具体参考:
http://docs.oracle.com/cd/E11882_01/server.112/e18951/asmdiskgrps.htm#CHDHHABI

一个磁盘组成failgroup (Normal):
ALTER DISKGROUP dgroup1 NORMAL REDUNDANCY
FAILGROUP fg1 DISK '/dev/sde1' NAME ASMDATA05
FAILGROUP fg2 DISK '/dev/sdf1' NAME ASMDATA06 ;

一个磁盘组成failgroup (High):
create diskgroup data2 high redundancy
failgroup fg1 disk '/dev/raw/raw3' name d2a
failgroup fg2 disk '/dev/raw/raw4' name d2b
failgroup fg3 disk '/dev/raw/raw5' name d2c;

多个磁盘组成failgroup (Normal):
CREATE DISKGROUP dgroup1 NORMAL REDUNDANCY
FAILGROUP controller1 DISK
'/dev/diska1',
'/dev/diska2',
'/dev/diska3',
'/dev/diska4'
FAILGROUP controller2 DISK
'/dev/diskb1',
'/dev/diskb2',
'/dev/diskb3',
'/dev/diskb4';

语法:
CREATE DISKGROUP diskgroup_name
[ { HIGH | NORMAL | EXTERNAL } REDUNDANCY ]
[ FAILGROUP failgroup_name ]

DISK [ NAME disk_name ] [ SIZE size_clause ] [ FORCE | NOFORCE ] ...;

可以通过v$asm_operation视图来查看正在进行的操作 .

这里有几点要注意:
(1), 首先 sqlplus登入需要 sysasm角色, 因为sysdba只能查看, 不能修改.
(2), add disk 后接的磁盘信息为 'ORCL:XXX' , XXX是listdisks看到的ASM磁盘label .
如果只是 add disk 'XXX' 会报错.

(3), 同样 add disk 后面直接写 '/dev/sde1' 也是不行的, 会报权限错误.

通过asmcmd 查看磁盘组空间扩展情况 :
[root@rac02 ~]# su - grid
[grid@rac02 ~]$
[grid@rac02 ~]$ asmcmd
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 10236 9840 0 9840 0 N OCR_VOTE/
MOUNTED EXTERN Y 512 4096 1048576 30709 20694 0 20694 0 N ORADATA/
MOUNTED EXTERN N 512 4096 1048576 4094 3737 0 3737 0 N ORAFLASH/
ASMCMD>
可以看到ORADATA 磁盘组的 Total_MB变成了30G (30709M), 显然是
成功加入了20G 的 /dev/sde1 .

删除磁盘组中的磁盘(同样也需要设置power值来使RBAL速度加快) :
SQL> ALTER DISKGROUP ORADATA DROP DISK 'ASMDATA03' ;
Diskgroup altered.

如果执行后立刻查看的话, 可能ORADATA磁盘组大小不会变, 需要观察
v$asm_operation视图来查看正在进行的操作, 完毕后才会变化, 执行drop
命令后不等待和等待3分钟后查看的结果如下:

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 10236 9840 0 9840 0 N OCR_VOTE/
MOUNTED EXTERN Y 512 4096 1048576 30709 20694 0 20694 0 N ORADATA/
MOUNTED EXTERN N 512 4096 1048576 4094 3737 0 3737 0 N ORAFLASH/
ASMCMD>
ASMCMD> lsdg -- 等待3分钟后查看 (当然数据量大的话等待时间更久)
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 10236 9840 0 9840 0 N OCR_VOTE/
MOUNTED EXTERN N 512 4096 1048576 10236 223 0 223 0 N ORADATA/
MOUNTED EXTERN N 512 4096 1048576 4094 3737 0 3737 0 N ORAFLASH/
可以看到 ORADATA 的total_mb 又变回 10G了 .

如希望ALTER DISKGROUP语句完成所有工作才返回用户控制权的话,可在执行时附加
REBALANCE WAIT子句,这样该语句就会等待自动平衡的操作,直接所有操作完成才
返回结果,当然在等待期间,如果你改主意了不愿意继续等待,CTRL+C中断即可获得
控制权,此时平衡的操作不受影响,会在后台继续进行。

ASMCMD> lsdsk -- ASMDATA03 磁盘消失.
Path
ORCL:ASMDATA01
ORCL:ASMDATA02
ORCL:OCR_VOTE01

注意 DROP DISK 只是将ASMDATA03 从磁盘组中删除 :
[root@rac02 ~]# /usr/sbin/oracleasm listdisks
ASMDATA01
ASMDATA02
ASMDATA03
OCR_VOTE01


备注:
(1), 也可以只对某个diskgroup设置rebalance power, 比如:
alter diskgroup ORADATA rebalance power 8 ;
(2), 或者在命令中设置
alter diskgroup ORADATA add disk 'ORCL:ASMDATA03' rebalance power 8;

alter diskgroup ORADATA drop disk 'ASMDATA03' rebalance power 8;

需要注意的是, add 及 drop之后都需要等待一些时间再做针对此磁盘
或磁盘组的动作, 否则可能报错, 或者观察v$asm_operation 来查看事务.
如下:
SQL> select * from v$asm_operation ;

GROUP_NUMBER OPERA STAT POWER ACTUAL SOFAR EST_WORK EST_RATE


EST_MINUTES ERROR_CODE


2 REBAL RUN 8 8 173 6680 741
8

隔一段时间再次查看(直到相关事务从此视图消失) :

SQL> select * from v$asm_operation ;

GROUP_NUMBER OPERA STAT POWER ACTUAL SOFAR EST_WORK EST_RATE


EST_MINUTES ERROR_CODE


2 REBAL RUN 8 8 2674 6677 1028
3

SQL> select * from v$asm_operation ;

GROUP_NUMBER OPERA STAT POWER ACTUAL SOFAR EST_WORK EST_RATE


EST_MINUTES ERROR_CODE


2 REBAL RUN 8 8 6458 6663 1254
0

SQL> select * from v$asm_operation ;
no rows selected

由于前面提到的ASM自动平衡的特性,上述语句返回后并不代表磁盘已经被删
除,此时后台可能由于正忙碌地执行着IO重平衡的工作,因此如果在这个时候,
DBA忽然意识到操作失误,其实磁盘并不需要被删除,那也可以马上
通过alter diskgroup dgname undrop disks语句来取消删除的操作,例如:

SQL> alter diskgroup ORADATA undrop disks;
Diskgroup altered.

  只要删除操作还没有真正完成,任务就会被取消,否则的话,上述语句
也挽回不了什么了,如果希望挽回,那DBA只能再通过ADD语句将该磁盘重
新加入到磁盘组了。

  1. 增加新的磁盘组

-- 查看已有的磁盘 .
SQL> select group_number, name from v$asm_disk order by 1;
GROUP_NUMBER NAME


1 OCR_VOTE01
2 ASMDATA01
2 ASMDATA03
3 ASMDATA02

-- 查看已有的磁盘组 .
SQL> select group_number, name from v$asm_diskgroup order by 1 ;

GROUP_NUMBER NAME


1 OCR_VOTE
2 ORADATA
3 ORAFLASH

创建新磁盘 (/dev/sdf1):
[root@rac01 ~]# /usr/sbin/oracleasm createdisk ASMDATA04 /dev/sdf1
Writing disk header: done
Instantiating disk: done

[root@rac01 ~]# /usr/sbin/oracleasm listdisks
ASMDATA01
ASMDATA02
ASMDATA03
ASMDATA04
OCR_VOTE01

其他节点上:
[root@rac02 ~]# /usr/sbin/oracleasm scandisks
Reloading disk partitions: done
Cleaning any stale ASM disks...
Scanning system for ASM disks...
Instantiating disk "ASMDATA04"

[root@rac02 ~]# /usr/sbin/oracleasm listdisks
ASMDATA01
ASMDATA02
ASMDATA03
ASMDATA04
OCR_VOTE01

开始建立磁盘组(这里是external模式, 具体语法参考文档) :

在节点1 上建立新的磁盘组:

SQL> CREATE DISKGROUP ORAINDX EXTERNAL REDUNDANCY
DISK 'ORCL:ASMDATA04' ;

SQL> select group_number, name from v$asm_diskgroup ;
GROUP_NUMBER NAME


1 OCR_VOTE
2 ORADATA
3 ORAFLASH
4 ORAINDX

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 10236 9840 0 9840 0 N OCR_VOTE/
MOUNTED EXTERN N 512 4096 1048576 30709 20694 0 20694 0 N ORADATA/
MOUNTED EXTERN N 512 4096 1048576 4094 3737 0 3737 0 N ORAFLASH/
MOUNTED EXTERN N 512 4096 1048576 10236 10186 0 10186 0 N ORAINDX/
ASMCMD>

可以看到在节点1上都生效了. 但是其他节点没有生效(lsdg, lsdsk都看不到),
需要手工挂载新磁盘组 .

SQL> ALTER DISKGROUP ORAINDX MOUNT ;
Diskgroup altered.

在其他节点上查看即可以看到了 :
SQL> select name from v$asm_diskgroup;
SQL> select name from v$asm_disk;
ASMCMD> lsdsk
ASMCMD> lsdg

5 , 删除磁盘组

语法:drop diskgroup gpname, 如果删除的diskgroup非空的话,直接执行上述
语句会报错,这时候可以通过附加including contents子句,来自动删除该磁盘
组中包含的文件。删除磁盘组的操作会自动修改spfile中ASM_DISKGROUPS
初始化参数的值(如果使用了SPFILE的话) .

-- Tips :
如果删除的是文件的话,其关联的别名(Alias)也会被自动删除。
SQL> alter diskgroup asmdisk2 drop file '+ASMDISK2/repdb/datafile/temp01.dbf';
Diskgroup altered.

二 , ASM 实例相关

  1. ASM 相关的权限及角色

安装Grid Infrastructure时候的常用用户及组:
Grid Infrastructure 操作系统用户grid , 主组为oinstall, 辅助组为asmadmin, asmdba, asmoper
Oracle RAC 操作系统用户 oracle , 主组为oinstall , 辅助组为dba, oper , asmdba

11g release2中oracle建议独立地管理Grid Infrastructure和ASM实例 .

OSASM(asmadmin)用户组
如果使用ASM,我们必须创建osasm(asmadmin)用户组,该OSASM用户组的成员将被赋予
SYSASM权限,以满足组成员管理Oracle Clusterware和 ASM的权限需求。

OSDBA for ASM group(asmdba)用户组
OSDBA(asmdba)用户组的成员将被赋予读写访问ASM文件的权限。GI/CRS拥有者用户和
所有oracle数据库软件的拥有者必须是该组的成员。同时所有OSDBA(dba)用户组的成员也
必须是asmdba组的成员。

OSOPER for ASM(asmoper)用户组
asmoper和osoper类似都是额外的可选择创建的用户组,创建该独立的用户组以满足赋予
用户一套受限的ASM实例管理权限(ASM的SYSOPER角色),该权限包括了启动和停止ASM
实例,默认情况下OSASM(asmadmin)组成员将拥有所有SYSOPER的ASM管理权限。

grid用户单独安装集群,比如包括asm实例,监听资源,节点资源等
oracle用户就只安装oracle代码

groupadd oinstall

groupadd asmadmin

groupadd asmdba

groupadd asmoper

groupadd dba

groupadd oper

useradd -g oinstall -G asmadmin,asmdba,asmoper grid

useradd -g oinstall -G dba, oper, asmdba oracle

具体代表含义参考 :
http://www.oracledatabase12g.com/archives/oracle-installation-os-user-groups.html

用户组 所属该组的用户 用户组描述
oinstall grid, oracle Oracle Inventory and Software Owner
dba oracle Database Administrator
asmadmin grid Oracle ASM Group
asmdba grid, oracle ASM Database Administrator Group
asmoper grid ASM Operator Group
oper oracle Database Operator

如果对oracle用户没赋予asmdba组的话,则会导致oracle用户认不到diskgroup,
启动对应节点实例失败。


备注 :
Oracle10g中还是使用sysdba管理asm实例,Oracle11g中使用一个新角色sysasm, 专用于
管理asm, 相当于针对asm实例的sysdba角色。 在Oracle11g RAC 中以grid用户登入后 , 以
sysdba登入也是可以查看asm实例相关的状态, 但是不能做变更, sysasm 角色连接后才

可以。

  1. ASM 实例

ASM 实例与 ORACLE 数据库实例差不多, 都是由SGA和后台进程组成, 区别在于
oracle实例管理的是数据库,而asm实例只管理ASM磁盘组. 这里grid用户是属于
asmadmin组, 用于管理ASM,

[root@rac01 ~]# su - grid
[grid@rac01 ~]$ id
uid=501(grid) gid=501(oinstall) groups=501(oinstall),504(asmadmin),506(asmdba),507(asmoper)
[grid@rac01 ~]$ORACLE_SID=+ASM1 (一般不用,因为grid用户下只有一个ASM实例)
[grid@rac01 ~]$ env | grep ORA
ORA_NLS11=/u01/grid/11.2.0/nls/data
ORACLE_SID=+ASM1
ORACLE_BASE=/u01/grid/crs
ORACLE_TERM=vt100
ORACLE_HOME=/u01/grid/11.2.0

[grid@rac01 ~]$ sqlplus / as sysasm
SQL*Plus: Release 11.2.0.1.0 Production on Sat Dec 3 07:13:39 2011
Copyright (c) 1982, 2009, Oracle. All rights reserved.
Connected to:
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - Production
With the Real Application Clusters and Automatic Storage Management options

SQL> show parameter instance_name
NAME TYPE VALUE


instance_name string +ASM1

以grid用户身份, 连接到ASM实例 , 使用sysdba 及 sysasm 角色都可以,
以sysdba登入也是可以查看asm实例相关的状态 , 但是不能做变更,
sysasm 角色连接后才可以 .

A. ASM实例开启及关闭
同样的, ASM 实例也可以 startup nomount / mount / open / force .
nomount : 只是启动实例 ;
mount / open : 启动实例及加载磁盘组, open和mount一样 ;
force : 先执行shutdown abort , 然后再startup ;

测试 :
[grid@rac01 ~]$ sqlplus / as sysasm
SQL> startup nomount
ASM instance started
Total System Global Area 120023424 bytes
Fixed Size 2082208 bytes
Variable Size 102775392 bytes
ASM Cache 25165824 bytes

SQL> select name,state from v$asm_diskgroup;
NAME STATE


ASMDISK1 DISMOUNTED
ASMDISK2 DISMOUNTED

SQL> select instance_name,status from v$instance;
INSTANCE_NAME STATUS


+ASM1 STARTED

然后加载磁盘组,注意,不是alter database:

SQL> alter diskgroup all mount;
Diskgroup altered.

SQL> select name,state from v$asm_diskgroup;
NAME STATE


ASMDISK1 MOUNTED
ASMDISK2 MOUNTED

关闭ASM实例 : NORMAL/IMMEDIATE/TRANSACTIONAL/ABORT 几个选项
与关闭普通数据库实例一样 :
SQL> shutdown immediate
ASM diskgroups dismounted
ASM instance shutdown

B. ASM 实例的初始化参数

ASM初始化也分spfile及pfile, 操作也相同. 和RDBMS数据库比起来, 还是有一些差异
参数.
SQL> create pfile='/tmp/asminit.ora' from spfile;
File created.

因为ASM实例在内存占用方面非常小, 基本上100M内存空间就足够了, 内存相关就不提了.

INSTANCE_TYPE : 在ASM中值为ASM , 在数据库实例中是RDBMS .

ASM_POWER_LIMIT :指定磁盘rebalance的程度,有0-11个级别,默认值为1,指定
的级别越高,则rebalance的操作就会越快被完成(当然这也意味着这个时间段内将
占用更多的资源),指定级别较低的话,虽然rebalance操作会耗时更久,但对当前
系统的IO及负载影响会更少,这中间的度需要DBA根据实际情况衡量。另外,这个参
数指定的只是一个默认值,在操作过程中,即可以动态修改,也可以在语句级命令行
时指定power,覆盖该默认值。

ASM_DISKSTRING :用最简单的话说,就是设置ASM启动时检查的磁盘,该选项可以
同时指定多个值,并且支持通配符。比如说,只检查/dev/dsk/下的设备,可以设置
该参数如下:/dev/dsk/*,默认情况下该参数为空,为空的话,表示ASM将查找系统
中所有ASM拥有读写权限的设备。

ASM_DISKGROUPS : 指定实例启动或alter diskgroup all mount语句时要加载的磁
盘组,如果为空的话,那么实际就仅启动到NOMOUNT状态了。如果是使用SPFILE的话,
该参数一般不需要手动修改,ASM能够自动更新该初始化参数中的值。

[grid@rac01 tmp]$ sqlplus / as sysasm

SQL*Plus: Release 11.2.0.1.0 Production on Tue Nov 29 05:24:38 2011
Copyright (c) 1982, 2009, Oracle. All rights reserved.
Connected to:
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - Production
With the Real Application Clusters and Automatic Storage Management options

SQL> show parameter

NAME TYPE VALUE


asm_diskgroups string ORADATA, ORAFLASH
asm_diskstring string
asm_power_limit integer 1
......

  1. ASM 相关视图

[root@rac01 ~]# su - oracle
[oracle@rac01 ~]$ sqlplus "/as sysdba"

SQL> select TABLE_NAME from dict where table_name like 'V$ASM_%';

TABLE_NAME

V$ASM_ACFSSNAPSHOTS
V$ASM_ACFSVOLUMES
V$ASM_ALIAS -- 记录文件别名
V$ASM_ATTRIBUTE -- 记录ASM磁盘组的属性
V$ASM_CLIENT -- 当前连接的客户端实例信息
V$ASM_DISK -- ASM管理的磁盘及磁盘组信息
V$ASM_DISKGROUP -- ASM磁盘组
V$ASM_DISKGROUP_STAT -- ASM磁盘组状态, 大小
V$ASM_DISK_IOSTAT -- ASM磁盘组I/O状态
V$ASM_DISK_STAT
V$ASM_FILE

TABLE_NAME

V$ASM_FILESYSTEM
V$ASM_OPERATION -- 当前磁盘的操作信息
V$ASM_TEMPLATE
V$ASM_USER
V$ASM_USERGROUP
V$ASM_USERGROUP_MEMBER
V$ASM_VOLUME
V$ASM_VOLUME_STAT

19 rows selected.

  1. ASM 体系结构

ASM实例 :
1) RBAL: rebalancer进程,负责规划ASM磁盘组的Reblance活动
2) ABRn: 是RBAL进程的子进程,真正完成Reblance活动

RDBMS实例 :
1) RBAL: 负责打开每个磁盘组的所有磁盘
2) ASMB: 这个进程作为ASM实例和数据库实例之间的信息通道.这个进程负责与
ASM实例的通信,它先利用Diskgroup name从CSS获得管理该Diskgroup的ASM实例的
连接串,然后建立到ASM的持久连接,两个实例通过这条连接定期交换信息,同时也
是一种心跳机制.
3)O0nn 01-10:这组进程建立到ASM实例的连接,某些长时间操作比如创建数据文件,
RDBMS会通过这些进程向ASM发送信息

ASM Instance 与RDBMS 的交互
当ASM实例挂载一个磁盘组之后,ASM会把Disk Group Name, ASM Instance Name,
Oracle Home Path等信息注册到CSS(Cluster Sychronization Service), 这些信息会被用
来构造Connect String. 当RDBMS启动过程中需要访问某个ASM File时, RDBMS会
和CSS联系, 从CSS中获取Connect String,然后发起一个到ASM实例的连接, 这条
ASM和RDBMS实例之间的初始连接叫作Umbilicu(脐带), 只要RDBMS打开ASM File,
这个连接就会保持活动. 直到所有ASM File都被RDBMS实例关闭之后,这个连接才
会关闭.

对ASM的理解, ASM其实就是LVM披上了Oracle的马甲, Disk 对应PV, Diskgroup 对应VG,

  1. ASM 高效存储技术

   自动存储管理直接在Oracle 内核提供了文件系统和卷管理器的垂直整合,
从而带来了存储区域网系统提供的“虚拟化”类型的优点(易于管理、更高的可用性),
并专门用于Oracle 数据库文件。ASM 提供了配置数据库的快捷方法,以达到最佳性能
和资源利用率。它通过Oracle 内核自动管理数据库文件和这些文件的放置,不再需要
第三方文件系统和卷管理器来管理Oracle 文件。ASM 免去了耗时的手动I/O 性能与调
整任务,大大节省了DBA 的时间。

ASM的镜像(mirroring)与条带化(striping):ASM 将文件分成1MB 大小的区(extent, AU),
并将所有文件的区平均分布到磁盘组的所有磁盘中。ASM 不使用数学函数跟踪每个区的
放置,而使用指针记录区的位置。这样,ASM 就可以在磁盘组配置变化时移动某个文
件的某些区,而不必按照公式并根据磁盘数来移动所有的区。对于需要低延迟的文件
(例如日志文件),ASM 提供了细粒度(128k) 分段,以便由多个磁盘并行分隔并处理较
大的I/O。ASM 在所有可用的资源中分布I/O 负载,在免除手动I/O 调节需要(通过分
散数据库文件来避免热点)的同时优化性能。
ASM的镜像比操作系统的磁盘镜像更为灵活,因为ASM可基于文件设置冗余级别,
也就是说在同一磁盘组中的两个文件可以一个是镜像的, 而另一个不做镜像。ASM镜
像发生在区级。

  ASM的动态存储配置:ASM使得在线调整存储配置成为可能,即它帮助DBA 管理
动态数据库环境,让DBA 能够在扩大或缩小数据库规模的情况下,无需关闭数据库
以调整存储配置。而在往磁盘组中增加磁盘或从磁盘组中删除磁盘后,ASM将自动
重新平衡――均衡地在磁盘组中的所有磁盘上重新分布文件数据。

三, ASM 磁盘冗余及故障处理

ASM的磁盘冗余策略可以分成三类:外部冗余、标准冗余和高度冗余,
其中外部冗余不需要failure 磁盘组, 标准和高度冗余必须要有failure磁盘组,

  比如说对于标准冗余(Normal Redundancy),ASM要求该磁盘组至少要拥有
两个failure磁盘组,即提供双倍镜像保护,对于同一份数据(ASM中镜像单位
不是磁盘,也不是块,而是一种AU的单位,该单位大小默认是1M)将有主从两
份镜像,并且ASM通过算法来自动确保主、从镜像不会存在于同一份failure磁
盘组,这样就保障了就算整个failure磁盘组都损坏,数据也不会丢失。至于高
度冗余(High Redundancy)就更安全了,它至少需要三个failure磁盘组,也就
是一份AU有一主多从的镜像,理论上将更加安全。

  如果磁盘发生损坏,那么损坏的磁盘默认自动offline并被drop掉,不过该
磁盘所在的磁盘组仍将保持MOUNT状态,如果该盘有镜像的话,那么应用不会有
影响,镜像盘将自动实现接管 (只要不是所有failure磁盘组都损坏掉),否则的话,
该磁盘组将自动DISMOUNT。 比如,某标准冗余的failure组有6个盘(对应6个裸设
备),假如说此时坏了一块盘,没关系,操作继续,坏了那块会被自动dropped,剩
下的5块盘仍然能够负担起正常的读写操作。

ASM 扩展性:
最多支持63个磁盘组;
最多支持10000个磁盘;
最大支持4pb/磁盘;
最大支持40 exabyte/ASM存储;
最大支持1百W个文件/磁盘组;
外部冗余时单个文件最大35tb,标准冗余时单个文件最大5.8tb,高冗余度时单个
文件最大3.9tb。

加载及卸载磁盘组

UNMOUNT磁盘组的话务必慎重操作,要确保UNMOUNT的磁盘组中保存的
文件对应的数据库当前未启动,而且该操作也会直接导致数据库SHUTDOWN。
只有mount的磁盘组才能被数据库使用兵执行add/drop操作, ASM中的磁盘组默
认会在ASM实例启动时自动加载 .

SQL> select group_number,name,state,total_mb,free_mb from v$asm_diskgroup;

GROUP_NUMBER NAME STATE TOTAL_MB FREE_MB


1 ASMDATA1 MOUNTED 20472 18667
2 ASMDATA2 MOUNTED 16378 14621

将ASMDATA2磁盘组UNMOUNT:
SQL> alter diskgroup ASMDATA2 dismount;
Diskgroup altered.

SQL> select group_number,name,state from v$asm_diskgroup;

GROUP_NUMBER NAME STATE


1 ASMDATA1 MOUNTED
0 ASMDATA2 DISMOUNTED

SQL> alter diskgroup ASMDATA2 mount; -- 再挂载.
Diskgroup altered.

四 , ASM 在Linux下的相关命令ORACLEASM , ASMCMD, ASMCA

  1. ORACLEASM命令

安装asm lib后我们可以通过man 来查看相关命令:
[grid@rac01 tmp]$ man oracleasm

使用 ASMLib 创建 ASM Disks , 语法如下:

/usr/sbin/oracleasm createdisk disk_name device_partition_name

其中 disk_name 是你为 ASM Disk 选择的一个名字,名字只能包含数字字母及下划线,
比如OCR01 , DATA01 等. device_partition_name 标示为 ASM 的系磁盘分区,如
/dev/sdb1 , /dev/sdc1 等
如果你发现设置错误或需要 unmark这个磁盘,可以运行如下命令:

/usr/sbin/oracleasm deletedisk disk_name

设置共享磁盘。

/usr/sbin/oracleasm createdisk OCR_VOTE01 /dev/sdb1

/usr/sbin/oracleasm createdisk ASM_DATA01 /dev/sdc1

使用 listdisks 命令确认他们的可用性。
[root@rac001 ~]# /usr/sbin/oracleasm listdisks
ASM_DATA01
ASM_DATA02
ASM_FRA
OCR_VOTE01

在所有其他节点上以 root 用户身份,使用 scandisks 命令扫描已经创建的 ASM
磁盘,也就是说,我们只需要在节点 1 上创建 ASM 磁盘,其他节点不需要。
[root@rac002 ~]# /usr/sbin/oracleasm scandisks
Reloading disk partitions: done
Cleaning any stale ASM disks...
Scanning system for ASM disks...
Instantiating disk "OCR_VOTE01"
Instantiating disk "ASM_DATA01"
Instantiating disk "ASM_DATA02"
Instantiating disk "ASM_FRA"

最后在其他节点通过 listdisks 检查 ASM 磁盘的可用性。
[root@rac002 ~]# /usr/sbin/oracleasm listdisks
ASM_DATA01
ASM_DATA02
ASM_FRA
OCR_VOTE01

2 . ASMCMD 命令

[root@rac01 ~]# su - grid
[grid@rac01 ~]$ id
uid=501(grid) gid=501(oinstall) groups=501(oinstall),504(asmadmin),506(asmdba),507(asmoper)
[grid@rac01 ~]$ asmcmd
ASMCMD>

如果 asm -p 进入的话, 就会带路径 (path)
[grid@rac01 ~]$ asmcmd -p
ASMCMD [+] > cd oradata
ASMCMD [+oradata] >

获取帮助 help [command] :
ASMCMD [+oradata] > help du
du [-H] [dir]
Display total space used for files located recursively under [dir],
similar to "du -s" under UNIX; default is the current directory. Two
values are returned, both in units of megabytes. The first value does
not take into account mirroring of the diskgroup while the second does.
For instance, if a file occupies 100 MB of space, then it actually
takes up 200 MB of space on a normal redundancy diskgroup and 300 MB
of space on a high redundancy diskgroup.
[dir] can also contain wildcards.
The -H flag suppresses the column headers from the output.
ASMCMD [+oradata] >

3 . ASMCA 命令

运行ASMCA创建磁盘组。

以grid用户登入开始ASMCA配置磁盘组,因为是图形界面,我们使用grid用户的
vnc session ( 如果是root的vnc进入到su 到grid会报错 ) .

[grid@rac001 bin]$ pwd
/u01/grid/11.2.0/bin
[grid@rac001 bin]$ ./asmca

图形界面显示到Disk Groups 。我们可以看到先前配置的OCR_VOTE已经在列。点击
下面的create 创建datafile及flash recovery area的ASM磁盘组。

磁盘组名称ORADATA, 冗余部分选择External, 点击磁盘为ORCL:ASMDATA01,点击OK.
继续create
磁盘组名称ORAFLASH, 冗余部分选择External, 磁盘为ORCL:ASMDATA02,点击OK.
全部OK后点击QUIT退出。

4 . ASMLib 及其他常用命令

ORCL关键字说明:

Linux ASMLib 的发现字符串
ASMLib 使用发现字符串来确定 ASM 正在请求哪些磁盘。一般的 linux ASMLib 使用
glob 字符串。字符串必须以 "ORCL:" 为前缀。磁盘通过名称来指定。可以通过发现字
符串 "ORCL:VOL1" 在 ASM 中,发现以名称 "VOL1" 创建的磁盘。类似地,可以用发
现字符串 "ORCL:VOL*" 来查询所有以字符串 "VOL" 开始的磁盘。

不能在发现字符串中用路径名称来发现磁盘。如果缺少前缀,那么一般的 Linux ASMLib
将完全忽略发现字符串,认为它适用于一个不同的 ASMLib。唯一的例外是空字符串 (""),
它被认为是一个全通配符。这与发现字符串 "ORCL:*" 完全等价。

其他常用命令 :

SQL>create diskgroup dg2 external redundancy disk 'ORCL:VOL3';

SQL>drop diskgroup dg2 including contents; 默认是可以删除empty的diskgroup , 如果磁盘组
不是空的, 不接including contents 会报错 . 指定 including contents 即删除磁盘组中所有文件,
即使不是为空 .

SQL>alter diskgroup dg1 add disk 'ORCL:VOL3';
Diskgroup altered.

SQL>alter diskgroup dg1 rebalance power 8 ;
Diskgroup altered.

SQL>alter diskgroup dg1 check all ; -- 检查ASM磁盘组内部consistency
Diskgroup altered.

SQL>alter diskgroup dg1 check all repair; -- 检查并通知ASM修复错误
Diskgroup altered.

5 . ASM与文件系统之间的迁移及文件传输/拷贝

A, 文件传输或拷贝

10g 下ASM下的文件和OS文件系统是不能互相拷贝的 。
11g 下从ASM到文件系统或文件系统到ASM 都很方便 。

ASMCMD> cp spfileracdb.ora /tmp
copying +oradata/racdb/spfileracdb.ora -> /tmp/spfileracdb.ora
[root@rac01 tmp]# ls -al spfileracdb.ora
-rw-r----- 1 grid oinstall 4096 Dec 4 06:05 spfileracdb.ora

10g 下如果需要实现文件拷贝有以下方式 :
具体参考 http://space.itpub.NET/35489/viewspace-712638

(1). http://www.oracle.com/global/il/ ... ro_asm_access1.html
ASM Access Through FTP and HTML Using XDB Configuration
(2). rman
(3). dbms_file_transfer

如果觉得我的文章对您有用,请点赞。您的支持将鼓励我继续创作!

6

添加新评论2 条评论

wuwenpinwuwenpin软件开发工程师, 南京
2019-02-23 19:05
不错的材料
vampirefathervampirefather其它, 哼哈
2019-02-12 12:07
赞 很详细
Ctrl+Enter 发表

作者其他文章

相关文章

相关问题

相关资料

X社区推广