ASM:AutomaticStorageManagement,是Oracle主推的一种面向Oracle的存储解决方案,ASM和RDBMS非常相似,ASM也是由实例和文件组成,也可以通过sqlplus工具来维护。
ASM实例的创建和删除也可以用DBCA这个命令来操作。在dbca的第一个界面选择配置自动存储管理就可以了。ASM实例需要CSS进程,如果是非RAC环境,在启动ASM实例之前会提示用脚本
$ORACLE_HOME/bin/localconfigadd启动CSS。
1.ASM实例由SGA和后台进程组成。
1.1SGA组成:
ASM实例的SGA包括BufferCache,SharePool,LargePool等。需要注意的是SharePool,因为ExtentMap要放在这部分的内存中,需要更具数据量来估计ExtentMap的大小做相应的调整。
ExtentMap的大小可以根据所有文件大小的和来估算,使用下面的语句来计算所有文件和:
Selectsum(bytes)/(1024*1024*1024)fromv$datafile;
Selectsum(bytes)/(1024*1024*1024)fromv$logfilea,v$logbwherea.Group#=b.Group#;
Selectsum(bytes)/(1024*1024*1024)fromv$tempfilewherestatus='online';
这3个sum的总和对应着数据库存放ASM中所有文件大小总和,对于使用ExternalRedundancy的磁盘组,每100G需要1MB的ExtentMap,根据这个比例计算ExtentMap所需要的空间,在加上额外的2MB就可以了。在实际工作中一般不需要考虑ASMSGA的配置,使用Oracle提供的缺省值就可以了。
1.2后台进程
ASM实例比RDBMS实例多2个进程:RBAL和ABRn。
RBAL:这个进程也叫Rebalancer进程,负责规划ASM磁盘组的Reblance活动。
ABRn:是RBAL进程的子进程,这个进程在数量上可以有多个,n从1~9,这组进程负责真正完成Reblance活动。
使用ASM作为存储的RDBMS实例也会多出2个进程:RBAL和ASMB
RBAL:这个进程的主要功能是打开每个磁盘的所有磁盘和数据的Rebalance。
ASMB:这个进程作为ASM实例和数据库实例之间的信息通道。这个进程负责与ASM实例的通信,它先利用DiskgroupName从CSS获得管理该Diskgroup的ASM实例的连接串,然后建立到ASM的持久连接,两个实例之间通过这条连接定期交换信息,同时也是一种心跳机制。
RDBMS实例要想使用ASM作为存储,RDBMS实例必须在启动时从ASM实例获得ExtentMap,以后发生磁盘组的维护操作,ASM实例还要把ExtentMap的更新信息通知给RDBMS实例,这2个实例间的信息交换就是他你哦刚过ASMB进程完成的。这也就为什么:ASM实例必须要先于数据库实例启动,和数据库实例同步运行,迟于数据库实例关闭。
注意:ASM实例和数据库实例的关系可以是1:1,也可以是1:n。如果是1:n,最好为ASM安装单独的ASM_HOME。
2.ASM配置
ASM可以使用裸设备或者ASMLib方式,因为裸设别的维护比较复杂,在此只讲解ASMLib方式。
对应不同的操作系统,需要不同的包,下载的时候一定要和操作系统内核一致。我的操作系统是Redhat4update7.内核版本是2.6.9-78.ELSMP。
oracleasmlib-2.0.4-1.el4.i386.rpm
oracleasm-support-2.1.3-1.el4.i386.rpm
oracleasm-2.6.9-78.EL-2.0.5-1.el4.i686.rpm
http://www.oracle.com/technology/tech/linux/asmlib/index.html
该页面有下载地址,注意选择CPU类型。asmlib和support,在同一个页面下载。
安装包:
#rpm-ivh*.rpm
安装完之后进行配置:
#/etc/init.d/oracleasmconfigure
会有相应的提示,回答oracle,dba,y,y就可以了
分别对应默认用户,默认组,随系统自启动,启动时设置权限。
/etc/init.d/oracleasmcreatediskVOL1/dev/sdc1
/etc/init.d/oracleasmscandisks
/etc/init.d/oracleasmlistdisks
关于oracleasm的更多用法参考help:
[root@node1~]#/etc/init.d/oracleasm--help
Usage:/etc/init.d/oracleasm{start|stop|restart|enable|disable|configure
|createdisk|deletedisk|querydisk|listdisks|scandisks|status}
3.ASM实例配置
3.1初始化参数
[oracle@node1bin]$exportORACLE_SID=+ASM1
[oracle@node1bin]$sqlplus/assysdba
SQL*Plus:Release10.2.0.1.0-ProductiononSunFeb2119:10:512010
Copyright(c)1982,2005,Oracle.Allrightsreserved.
Connectedto:
OracleDatabase10gEnterpriseEditionRelease10.2.0.1.0-Production
WiththePartitioning,RealApplicationClusters,OLAPandDataMiningoptions
SQL>createpfilefromspfile;
Filecreated.
SQL>showparameterasm
NAMETYPEVALUE
-----------------------------------------------------------------------------
asm_diskgroupsstringFLASH_RECOVERY_AREA,DATA
asm_diskstringstring
asm_power_limitinteger1
[oracle@node2dbs]$pwd
/u01/app/oracle/product/10.2.0/db_1/dbs
[oracle@node2dbs]$ls
ab_+ASM2.dathc_rac2.datinitrac2.oraorapwrac2
hc_+ASM2.datinit+ASM2.oraorapw+ASM2
[oracle@node2dbs]$moreinit+ASM1.ora
+ASM2.asm_diskgroups='FLASH_RECOVERY_AREA'#ManualDismount
+ASM1.asm_diskgroups='FLASH_RECOVERY_AREA','DATA'#ManualMount
*.asm_diskgroups='FLASH_RECOVERY_AREA','DATA'
*.background_dump_dest='/u01/app/oracle/admin/+ASM/bdump'
*.cluster_database=true
*.core_dump_dest='/u01/app/oracle/admin/+ASM/cdump'
+ASM2.instance_number=2
+ASM1.instance_number=1
*.instance_type='asm'
*.large_pool_size=12M
*.remote_login_passwordfile='exclusive'
*.user_dump_dest='/u01/app/oracle/admin/+ASM/udump'
相关说明:
ASM实例的SGA需要的内存很小,一般默认值即可,无需修改。ASMSGA的默认值如下:
SHARED_POOL_SIZE=48M
LARGE_POOL_SIZE=12M
SHARED_POOL_RESERVED_SIZE=24M
SGA_MAX_SIZE=88M
这些默认值可以在sqlplus中通过showparameter查看。
Instance_type:对于ASM实例,这个应该设置成ASM,如果是数据库实例,则是RDBMS.
DB_UNIQUE_NAME:这个参数使用缺省值+ASM即可
SQL>showparameterasm_power_limit
NAMETYPEVALUE
-----------------------------------------------
asm_power_limitinteger1
ASM_POWER_LIMIT:当在磁盘组中添加删除磁盘时,磁盘组会自动对数据在新旧磁盘间重新分配,从而实现分散IO,这个过程就叫再平衡(Rebalance);
这个动作会在磁盘间移动数据,因此虽然是联机操作,仍然会影响部分性能,所以要在系统空闲的时候进行。该参数控制Rebalance速度,取值范围0-11.最小值0代表不做Rebalance,最大值11代表最快的速度,也意味着严重影响性能,1代表最慢的速度和最小的性能影响。除了在初始化参数中定义该参数,也可以在操作时指定。
比如:
SQL>alterdiskgroupDATArebalancepower5;
DiskgroupscanberebalancedmanuallyusingtheREBALANCEclauseoftheALTERDISKGROUPstatement.IfthePOWERclauseisomittedtheASM_POWER_LIMITparametervalueisused.Rebalancingisonlyneededwhenthespeedoftheautomaticrebalancingisnotappropriate.
ASM_DISKSTRING:定义哪些磁盘可以被ASM使用,ASM实例启动时就根据这个参数值扫描发现ASM磁盘,配置了这个参数以后,还必须确认ORACLE用户对这些磁盘有操作的权限
1.如果使用裸设备,用逗号分隔每个设备名:
Asm_diskstring='/dev/raw/raw1','/dev/raw/raw2','/dev/raw/raw3'
2.如果使用ASMLib时,就需要使用"ORCL:磁盘名"
Asm_diskstring='ORCL:VOL1'
3.使用ASMLib时,也可以使用通配符
Asm_diskstring='ORCL:VOL*'
ASM_DISKGROUPS:这个参数用于定义ASM实例启动后自动挂载的磁盘组,如果不自动挂载,也可以使用命令挂载。
注意:ASM实例启动即可以通过pfile,也可以通过spfile,如果使用spfile启动,那么如果创建新的磁盘组,这个参数会被自动修改,下次启动时会自动挂载这个新建的磁盘组,如果是使用pfile,这个参数不会自动更新,需要手工的更新。
3.2CSS进程
无论是否在RAC环境下,ASM实例都是需要CSS进程的,所以,如果是非RAC环境,在启动ASM实例之前用脚本
$ORACLE_HOME/bin/localconfigadd启动CSS,否则ASM实例启动时会报ORA-29701:unabletoconnecttoClusterManager,并提示执行该脚本
3.3ASM实例的相关操作
ASM管理登录,启动,关闭:
[oracle@node2dbs]$exportORACLE_SID=+ASM2
[oracle@node2dbs]$sqlplus/assysdba
SQL>startup
SQL>shutdownimmediate;
检查diskgroup信息的SQL:
SQL>colstateformata10
SQL>colnameformata15
SQL>colfailgroupformata20
SQL>setline200
SQL>selectSTATE,REDUNDANCY,TOTAL_MB,FREE_MB,NAME,FAILGROUP
fromv$asm_disk;
SQL>selectGROUP_NUMBER,NAME,STATE,TYPE,TOTAL_MB,FREE_MB,
UNBALANCEDfromv$asm_diskgroup;
创建新的diskgroup
SQL>creatediskgroupdgtestnormalredundancy
2failgroupDATA1disk'/dev/oracleasm/VOL5'nameDATA1
3failgroupDATA2disk'/dev/oracleasm/VOL6'nameDATA2;
删除diskgroup
SQL>dropdiskgroupDATAincludingcontents;
--对于多结点的diskgroup,只能有在一个asm实例上挂载之后才能被dorp,其他结点必须dismount。
手动mount命令
ALTERDISKGROUPALLDISMOUNT;
ALTERDISKGROUPALLMOUNT;
ALTERDISKGROUPDATADISMOUNT;
ALTERDISKGROUPDATAMOUNT;
为diskgroup增加disk
SQL>alterdiskgroupDATAadddisk'/dev/oracleasm/VOL5'name
VOL5,'/dev/oracleasm/VOL6'nameVOL6;
从diskgroup删除disk
SQL>alterdiskgroupDATAdropdiskVOL5;
取消删除disk的命令,只能在上述命令没执行完成的时候有效
ALTERDISKGROUPDATAUNDROPDISKS;
TheUNDROPDISKSclauseoftheALTERDISKGROUPstatementallowspendingdiskdropstobeundone.Itwillnotrevertdropsthathavecompleted,ordiskdropsassociatedwiththe
droppingofadiskgroup.
数据文件的管理
AliasesallowyoutoreferenceASMfilesusinguser-friendlynames,ratherthanthefully
qualifiedASMfilenames.
--Createanaliasusingthefullyqualifiedfilename.
ALTERDISKGROUPdisk_group_1ADDALIAS'+disk_group_1/my_dir/my_file.dbf'
FOR'+disk_group_1/mydb/datafile/my_ts.342.3';
--Createanaliasusingthenumericformfilename.
ALTERDISKGROUPdisk_group_1ADDALIAS'+disk_group_1/my_dir/my_file.dbf'
FOR'+disk_group_1.342.3';
--Renameanalias.
ALTERDISKGROUPdisk_group_1RENAMEALIAS'+disk_group_1/my_dir/my_file.dbf'
TO'+disk_group_1/my_dir/my_file2.dbf';
--Deleteanalias.
ALTERDISKGROUPdisk_group_1DELETEALIAS'+disk_group_1/my_dir/my_file.dbf';
--Dropfileusinganalias.
ALTERDISKGROUPdisk_group_1DROPFILE'+disk_group_1/my_dir/my_file.dbf';
--Dropfileusinganumericformfilename.
ALTERDISKGROUPdisk_group_1DROPFILE'+disk_group_1.342.3';
--Dropfileusingafullyqualifiedfilename.
ALTERDISKGROUPdisk_group_1DROPFILE'+disk_group_1/mydb/datafile/my_ts.342.3';
--createdatafile
SQL>createtablespaceusers2datafile'+TESTDB_DATA1'size100m;
注意事项:
1.ASM实例在配置好并且创建了ASM磁盘组之后,还必须保证已经注册到Listener中后才能在数据库实例中使用,否则就需要手工注册ASM实例:
SQL>altersystemregister;
2.一旦数据库实例使用ASM作为存储,那么在数据库实例运行时是无法关闭ASM实例的。否则会报ORA-15097:cannotSHUTDOWNASMinstancewithconnectedRDBMSinstance.错误。
4.Oracle中删除ASM实例
删除自动存储管理实例+ASM实例+ASM的删除是在数据库被卸载之后完成的,并删除/ORACLE_HOME/dbs目录下的所有文件(除了与ASM相关的)。因此必须完成下列步骤:
4.1在命令提示符中,设置oracle_sid环境变量为+ASM实例:
#exportoracle_sid=+ASM
4.2启动SQL*Plus并以sys用户连接到自动存储管理+ASM实例:
#sqlplus/assysdba
4.3使用下列命令来确定是否有数据库实例正在使用自动存储管理实例+ASM:
SQL>selectinstance_namefromv$asm_client;
该命令结果列出所有正在运行并使用+ASM实例的数据库实例。只要+ASM包含正在支持的数据库实例,就不能删除该+ASM实例。(其实可以先shutdown对应的数据库实例,然后从asmcmd进入磁盘组所在目录,删掉对应的数据库目录和文件就可以了)。
4.4如果没有与+ASM相关联的数据库实例,则删除与该实例相关联的磁盘组。
首先,识别与+ASM相关联的磁盘组:
SQL>selectnamefromv$asm_diskgroup;
其次,用下列命令删除每个要删除的磁盘组:
SQL>dropdiskgroup<disk_group_name>includingcontents;
4.5关闭+ASM实例并退出SQL*Plus:
SQL>shutdown
SQL>exit
4.6在命令提示符中输入下列命令,删除+ASM服务(我没找到这个命令,所以没有运行):
oradim-delete-asmsid+ASM
5.ASMCMD工具
ASM实例的管理除了sqlplus,Oracle还提供了asmcmd命令,具体参考help。
[oracle@node1bin]$whichasmcmd
/u01/app/oracle/product/10.2.0/db_1/bin/asmcmd
[oracle@node1bin]$cd/u01/app/oracle/product/10.2.0/db_1/bin/
[oracle@node1bin]$./asmcmd
ASMCMD>ls
DATA/
FLASH_RECOVERY_AREA/
ASMCMD>help
asmcmd[-p][command]
TheenvironmentvariablesORACLE_HOMEandORACLE_SIDdeterminethe
instancetowhichtheprogramconnects,andASMCMDestablishesa
bequeathconnectiontoit,inthesamemannerasaSQLPLUS/AS
SYSDBA.TheusermustbeamemberoftheSYSDBAgroup.
Specifyingthe-poptionallowsthecurrentdirectorytobedisplayed
inthecommandprompt,likeso:
ASMCMD[+DATAFILE/ORCL/CONTROLFILE]>
[command]specifiesoneofthefollowingcommands,alongwithits
parameters.
Type"help[command]"togethelponaspecificASMCMDcommand.
commands:
--------
cd
du
find
help
ls
lsct
lsdg
mkalias
mkdir
pwd
rm
rmalias
ASMCMD>
----- 2010年9月23日补充--------
里面有删除别名的语法, 现在已经不支持了。 之前没有测试,写文章不严禁。 在google上搜这个问题的时候,发现有人转载了我的文章,但是这个错误还是没有发现。
刚查阅了一下Oracle 的联机文档, 删除别名用的也是drop。
Example 7-5 Dropping an alias name for an Oracle ASM filename
ALTER DISKGROUP data DROP ALIAS '+data/payroll/compensation.dbf';
地址:
http://download.oracle.com/docs/cd/E11882_01/server.112/e16102/asmfiles.htm#CHDDHIGG
这里面有对ASM 有详细的说明。 可以参考。
顺便补充一点知识:
C:/Users/Administrator.DavidDai>sqlplus /nolog
SQL*Plus: Release 11.2.0.1.0 Production on星期四9月
Copyright (c) 1982, 2010, Oracle.All rights reserved
SQL> conn sys/oracle@rac2 as sysdba;
已连接。
SQL> select file_name from dba_data_files;
FILE_NAME
------------------------------------------------------
+DATA/orcl/datafile/users.279.730181053
+DATA/orcl/datafile/sysaux.277.730181053
+DATA/orcl/datafile/undotbs1.278.730181053
+DATA/orcl/datafile/system.276.730181051
+DATA/orcl/datafile/undotbs2.284.730181347
ASM文件名字的格式是固定的:+group/dbname/file type/tag.file.incarnation
在创建db时系统自动创建的几个表空间(system,undotbs,sysaux,users)对应的都是真实的数据文件,即ASM文件默认的命名格式。而且这个信息都写到了控制文件里。如果我们使用别名的话,会方便很多。对于这些创建数据库时自动创建的表空间,我们要他们使用别名,除了手工创建对应别名外,还需要重建控制文件,并且在重建时,datafile里写别名的信息。这样数据库也就使用别名了。