author:skate
time:2009/11/30
oracle10g自动存储管理(ASM)
在常规的文件管理中,我们都要指定文件的名称和路径,操作每一个文件,都需要数据库管理员指出具体的文件路径和名称,而且
在磁盘的优化也需要数据库管理员的参与,oracle公司在oracle10g推出来ASM,把文件的操作封装起来,外部使用时,只要指定具
体的目标磁盘即可,而且asm还自动均匀存储数据,是I/O平衡;asm还有一个很重要的功能是支持并发,使oracle的rac摆脱了第三方
公司
在ASM之前,为了防止磁盘的失败,一般采用硬件或者操作系统的raid1镜像;现在asm也提供三种防止磁盘损坏的冗余级别
外部冗余:asm不对数据库文件镜像,可以通过raid磁盘镜像;所用磁盘最少,有效磁盘空间是所有磁盘设备的大小之和
常规冗余:asm使用2份镜像存储,以提高性能和数据的安全,最少需要两块磁盘(两个failure group);有效磁盘空间是所有磁盘设备
大小之和的1/2,一般用常规冗余就ok
高冗余:asm使用3份镜像存储,以提高性能和数据的安全,最少需要三块磁盘(三个failure group);有效磁盘空间是所有磁盘设备
大小之和的1/3,虽然冗余级别高了,但是硬件的代价也最高
在硬件安装的时候,一定要把不同的磁盘组安装在不同的磁盘控制器上,防止因为磁盘控制器的损坏而使数据保护失效
磁盘组的要求:asm磁盘组的所有磁盘具有大小相同,磁盘不得有的多个逻辑分区,每个磁盘设备就是一个独立的物理磁盘
asm磁盘组中可以指定逻辑卷设备,但是不建议用户使用,因为逻辑卷隐藏了磁盘的物理机构,对于asm通过物理磁盘优化系统
I/O是不利的.
oracle建议优先使用文件系统和asm,尽量不用裸设备,因为裸设备难于管理,但对于数据的I/o。洛裸设备还是有优势的
什么是ASM实例
在oracle10g中,有两种实例,分别是ASM实例和数据库实例,ASM实例对磁盘组进行管理,增加或删除磁盘设备时,会重新平衡磁盘组
中的存储
asm实例工作原理
asm实例是在数据库实例启动前就启动的,asm实例启动过程中必须确认数据库的磁盘组和文件,然后asm实例装载(mount)磁盘组
然后再创建一个区位图(extent map),再将区位图传递到数据库实例,然后asm就处于修状态;当在创建和删除文件,增加或删除
磁盘时,asm实例才会被调用,用于重新平衡磁盘组的存储,并刷新数据库实例SGA的区位图;asm实例不处理事务,对数据库实例影响
很小,在SGA中占用的内存大小不超过60MB
如何配置asm磁盘组
asm磁盘组是多个可管理的磁盘设备的逻辑集合,组成足够大的磁盘组,当磁盘组采用数据数据冗余时,可以实现数据的镜像和数据的
分散存储,创建磁盘组时要考虑众多因素,如磁盘的块数,控制器及冗余级别,数据库的性能和可恢复性
创建磁盘组时,考虑的因素
1. asm的磁盘组中的磁盘大小及型号要相同,如果是不同型号,可以创建不同的磁盘组
2. 磁盘阵列和asm共存时, 尽量不要是磁盘阵列,因为阵列隐藏了磁盘的物理结构,对asm优化磁盘系统的I/0是不利的
3. asm将数据分散在磁盘组中的不同磁盘中,以实现负载平衡,,所以磁盘的存取性能相同很重要
4. 在增加或删除磁盘时,asm自动重新负载平衡,删除磁盘时,直到数据从磁盘中移动并完成重新平衡后,磁盘才会被释放
5. 可以在数据库运行时,增加或删除磁盘,但是会影响I/O
asm实例重要的参数
instance_type
db_unique_name
asm_power_limit
asm_diskstring
asm_diskgroups
asm实例的创建
我用的windows2003做的测试,这个比较简单,安装os系统,安装oracle数据库,然后用DBCA创建ASM实例
然后用vmware创建磁盘,我记得在挂盘的时候,我刚开始遇到个小问题,就是在创建了物理分区,逻辑分区
之后,用asmtoolg工具对于磁盘标识时,找不到磁盘,原来是我在创建磁盘后,没有挂载,所以系统没有
识别到
只要执行如下语句,然后重启系统,就ok了
C:/Documents and Settings/Administrator>diskpart
Microsoft DiskPart Copyright (C) 1999-2001 Microsoft Corporation.
On computer: ASM
DISKPART> help
Microsoft DiskPart 版本 5.2.3790.1830
ADD - 将镜像添加到一个简单卷。
ACTIVE - 将当前基本分区标记为活动的分区。
ASSIGN - 给所选卷指派一个驱动器号或装载点。
AUTOMOUNT - 启用和禁用基本卷的自动装载。
BREAK - 中断镜像集。
CLEAN - 从磁盘清除配置信息或所有信息。
CONVERT - 在不同的磁盘格式之间转换。
CREATE - 创建卷或分区。
DELETE - 删除对象。
DETAIL - 提供对象详细信息。
ATTRIBUTES - 操纵卷属性。
EXIT - 退出 DiskPart
EXTEND - 扩展卷。
GPT - 给选择的 GPT 分区分配属性。
HELP - 打印命令列表。
IMPORT - 导入磁盘组。
INACTIVE - 将当前的基本分区标为不活动。
LIST - 打印对象列表。
ONLINE - 使当前标为脱机的磁盘联机。
REM - 不起任何作用。用来注解脚本。
REMOVE - 删除驱动器号或装载点指派。
REPAIR - 用失败的成员修复一个 RAID-5 卷。
RESCAN - 重新扫描计算机,查找磁盘和卷。
RETAIN - 在一个简单卷下放置一个保留分区。
SELECT - 将焦点移到一个对象。
DISKPART> automount enable
已经启用自动装载新卷。
DISKPART>
asm实例的维护
sqlplus维护磁盘组
asmcmd维护磁盘组
1. 创建磁盘组
2. 删除磁盘组
3. 磁盘组增加磁盘成员
4. 磁盘组删除磁盘成员
5. 挂载/卸载磁盘组
6.创建目录
1. 创建磁盘组
1.1 创建外部冗余磁盘组
SQL> create diskgroup dg_skate1 external redundancy
2 disk '//./orcldiskdisk10' ;
磁盘组已创建。
SQL> select name,type,total_mb,free_mb from v$asm_diskgroup;
NAME TYPE
------------------------------------------------------------ ------------
TOTAL_MB FREE_MB
---------- ----------
DG_SKATE1 EXTERN
1019 969
SQL>
1.2 创建常规冗余磁盘组
SQL> create diskgroup dg2 normal redundancy
2 failgroup fdisk1 disk '//./orcldiskdisk11' name disk11
3 failgroup fdisk2 disk '//./orcldiskdisk12' name disk12;
磁盘组已创建。
SQL> select name,failgroup,path,disk_number from v$asm_disk;
NAME FAILGROUP PATH DISK_NUMBER
DISK11 FDISK1 //./ORCLDISKDISK11 0
DISK12 FDISK2 //./ORCLDISKDISK12 1
1.3 创建高冗余磁盘组
SQL> create diskgroup dg3 high redundancy
2 failgroup fdisk1 disk '//./orcldiskdisk13' name disk13
3 failgroup fdisk2 disk '//./orcldiskdisk14' name disk14
4 failgroup fdisk3 disk '//./orcldiskdisk15' name disk15;
磁盘组已创建。
SQL> select name,failgroup,path,disk_number from v$asm_disk;
NAME FAILGROUP PATH DISK_NUMBER
1 DG_SKATE1_0000 DG_SKATE1_0000 //./ORCLDISKDISK10 0
2 DISK11 FDISK1 //./ORCLDISKDISK11 0
3 DISK12 FDISK2 //./ORCLDISKDISK12 1
4 DISK13 FDISK1 //./ORCLDISKDISK13 0
5 DISK14 FDISK2 //./ORCLDISKDISK14 1
6 DISK15 FDISK3 //./ORCLDISKDISK15 2
2. 删除磁盘组
首先确认数据库是否使用磁盘组
SQL> select * from v$asm_client;
未选定行
没有数据库实例使用asm实例中的磁盘组,然后就可以删除与该实例连接的磁盘组
SQL> select name,type,state,total_mb,free_mb from v$asm_diskgroup;
NAME TYPE
------------------------------------------------------------ ------------
STATE TOTAL_MB FREE_MB
---------------------- ---------- ----------
DG_SKATE1 EXTERN
MOUNTED 1019 969
DG2 NORMAL
MOUNTED 1004 902
DG3 HIGH
MOUNTED 1527 1374
SQL> drop diskgroup dg3 including contents;
磁盘组已删除。
SQL> select name ,type,state,total_mb,free_mb from v$asm_diskgroup;
NAME TYPE
------------------------------------------------------------ ------------
STATE TOTAL_MB FREE_MB
---------------------- ---------- ----------
DG_SKATE1 EXTERN
MOUNTED 1019 969
DG2 NORMAL
MOUNTED 1004 902
SQL>
3. 磁盘组增加磁盘成员
SQL> select name,failgroup,path,disk_number from v$asm_disk;
NAME FAILGROUP PATH DISK_NUMBER
1 //./ORCLDISKDISK13 0
2 //./ORCLDISKDISK14 1
3 //./ORCLDISKDISK15 2
4 DG_SKATE1_0000 DG_SKATE1_0000 //./ORCLDISKDISK10 0
5 DISK11 FDISK1 //./ORCLDISKDISK11 0
6 DISK12 FDISK2 //./ORCLDISKDISK12 1
4. 磁盘组删除磁盘成员
SQL> alter diskgroup dg2 drop disk disk13;
磁盘组已变更。
5. 挂载/卸载磁盘组
SQL> select name,state from v$asm_diskgroup;
NAME
------------------------------------------------------------
STATE
----------------------
DG_SKATE1
MOUNTED
DG2
MOUNTED
SQL> alter diskgroup dg_skate1 dismount;
磁盘组已变更。
SQL> select name,state from v$asm_diskgroup;
NAME
------------------------------------------------------------
STATE
----------------------
DG_SKATE1
DISMOUNTED
DG2
MOUNTED
SQL> alter diskgroup all mount;
alter diskgroup all mount
*
第 1 行出现错误:
ORA-15032: ?????????
ORA-15017: ??????? "DG2"
ORA-15030: ??????????????? "DG2"
SQL> alter diskgroup all dismount;
磁盘组已变更。
SQL> select name,state from v$asm_diskgroup;
NAME
------------------------------------------------------------
STATE
----------------------
DG_SKATE1
DISMOUNTED
DG2
DISMOUNTED
SQL> alter diskgroup all mount;
磁盘组已变更。
SQL> select name,state from v$asm_diskgroup;
NAME
------------------------------------------------------------
STATE
----------------------
DG_SKATE1
DISMOUNTED
DG2
MOUNTED
SQL> alter diskgroup dg_skate1 mount;
磁盘组已变更。
SQL> select name,state from v$asm_diskgroup;
NAME
------------------------------------------------------------
STATE
----------------------
DG_SKATE1
MOUNTED
DG2
MOUNTED
SQL>
6.创建目录
SQL> alter diskgroup dg2 add directory '+dg2/test/';
磁盘组已变更。
SQL> alter diskgroup dg2 add directory '+dg2/test/datafile';
磁盘组已变更。
SQL>
在数据库实例中使用asm磁盘组创建表空间和数据文件
SQL> create tablespace tbs1 datafile
2 '+dg2/test/datafile/tbs01.dbf' size 1m
3 autoextend on next 1m maxsize 2m;
表空间已创建。
SQL>
asm相关视图:
v$asm_disk
v$asm_diskgroup
v$asm_client
v$asm_template
维护asm磁盘组除了用sqlplus维护之外,还可以用asmcmd,他很类似linux的命令
C:/Documents and Settings/Administrator>asmcmd -p
ASMCMD [+] > ls
DG2/
DG_SKATE1/
ASMCMD [+] > help
asmcmd [-p] [command]
The environment variables ORACLE_HOME and ORACLE_SID determine the
instance to which the program connects, and ASMCMD establishes a
bequeath connection to it, in the same manner as a SQLPLUS / AS
SYSDBA. The user must be a member of the SYSDBA group.
Specifying the -p option allows the current directory to be displayed
in the command prompt, like so:
ASMCMD [+DATAFILE/ORCL/CONTROLFILE] >
[command] specifies one of the following commands, along with its
parameters.
Type "help [command]" to get help on a specific ASMCMD command.
commands:
--------
cd
du
find
help
ls
lsct
lsdg
mkalias
mkdir
pwd
rm
rmalias
ASMCMD [+] >
ASMCMD [+] > ls
DG2/
DG_SKATE1/
ASMCMD [+] > cd dg2
ASMCMD [+dg2] > ls
ORCL/
test/
ASMCMD [+dg2] > du
Used_MB Mirror_used_MB
2 4
ASMCMD [+dg2] > lsct
DB_Name Status Software_Version Compatible_version Instance_Name
orcl CONNECTED 10.2.0.1.0 10.2.0.1.0 orcl
ASMCMD [+dg2] > lsdg
State Type Rebal Unbal Sector Block AU Total_MB Free_MB Req_mi
r_free_MB Usable_file_MB Offline_disks Name
MOUNTED NORMAL N N 512 4096 1048576 1004 896
0 448 0 DG2/
MOUNTED EXTERN N N 512 4096 1048576 1019 969
0 969 0 DG_SKATE1/
ASMCMD [+dg2] > ls
ORCL/
test/
ASMCMD [+dg2] > mkdir test1
ASMCMD [+dg2] > ls
ORCL/
test/
test1/
ASMCMD [+dg2] > rm test1
ASMCMD [+dg2] > ls
ORCL/
test/
ASMCMD [+dg2] > pwd
+dg2
ASMCMD [+dg2] > mkalias test1
usage: mkalias <filename> <alias>
ASMCMD [+dg2] > mkalias test test_alias
ORA-15032: ?????????
ORA-15046: ASM ??? '+dg2/test' ??????????? (DBD ERROR: OCIStmtExecute)
ASMCMD [+dg2] > help mkalias
mkalias <filename> <alias>
Create the specified <alias> for the <filename>. A user-defined
alias must reside in the same diskgroup as the system-created filename,
and only one user-defined alias is permitted per file. The SQL
equivalent is ALTER DISKGROUP <dg_name> ADD ALIAS <alias> FOR
<filename>.
ASMCMD [+dg2] > ls
ORCL/
test/
ASMCMD [+dg2] > ls test
datafile/
ASMCMD [+dg2] > ls test/datafile
tbs01.dbf
ASMCMD [+dg2] > mkalias +dg2/test/datafile/tbs01.dbf tbs_alias.dbf
ORA-15032: ?????????
ORA-15046: ASM ??? '+dg2/test/datafile/tbs01.dbf' ??????????? (DBD ERROR: OCIStm
tExecute)
ASMCMD [+dg2] > ls
ORCL/
test/
ASMCMD [+dg2] > ls orcl
DATAFILE/
ASMCMD [+dg2] > ls orcl/datafile
TBS1.256.704247841
TBS2.257.704248559
ASMCMD [+dg2/orcl/datafile] > mkalias tbs1.256.704247841 tbsa_alias
ORA-15032: ?????????
ORA-15176: ?? '+dg2/orcl/datafile/tbs1.256.704247841' ????????? (DBD ERROR: OCIS
tmtExecute)
ASMCMD [+dg2/orcl/datafile] > mkalias tbs2.257.704248559 tbsa_alias
ASMCMD [+dg2/orcl/datafile] > ls
TBS1.256.704247841
TBS2.257.704248559
tbsa_alias
ASMCMD [+dg2/orcl/datafile] >
ASMCMD [+dg2/orcl/datafile] > rmalias tbsa_alias
ASMCMD [+dg2/orcl/datafile] > ls
TBS1.256.704247841
TBS2.257.704248559
ASMCMD [+dg2/orcl/datafile] >
-----end---