浏览指引:
1. ASM介绍
1.1
主要功能
自动存储管理(ASM)提供一个数据镜像与条带化的管理平台。ASM 将文件分成1MB 大小的区(extent),并将所有文件的区平均分布到磁盘组的所有磁盘中。文件的镜像是通过区来体现的。ASM 在所有可用的资源中分布I/O 负载,在免除手动I/O 调节需要(通过分散数据库文件来避免热点)的同时优化性能
图源:《Oracle
Database 10g:数据库管理 - 课堂练习 II 学生指南第 1 册》
1.2
RAID级别与ASM镜像模式
题外:选择RAID的级别
SYSTEM 和 UNDO 表空间因为经常用到,放到RAID1 上
联机重做日志因为有多路复用进行保护,更注重性能,放到 RADI0 卷上
而数据文件 可放到 RAID5 卷上
ASM镜像模式有三种:
HIGH(三向镜像,即3副本)
NORMAL(双向镜像,即双副本)
EXTERNAL(无副本)
1.3
故障组
另外当建立ASM磁盘组时,可以指定故障组,默认情况下,ASM将文件的一个主分配区分配到磁盘组中的一个磁盘时,会将该分配区的副本分配至该磁盘组的另一个磁盘中。如果指定了故障组,那么也确定了其镜像位置的范围。至于是默认还是制定故障组,看具体需要,有些磁盘是在硬件级别连接的,他们有共同的控制器,如果控制器损坏,整组磁盘将损坏,在这时不希望在同一控制器的磁盘组内部存放镜像,而采用另一控制器的磁盘组存放镜像。
图源:《Oracle
Database 10g:数据库管理 - 课堂练习 II 学生指南第 1 册》
以下是建立一个指定故障组的 ASM磁盘组
dgroup1 的例子
SQL> create diskgroup
dgroup1 normal redundancy
failgroup controller1 disk
‘/dev/rdsk/c2*’
failgroup controller2 disk
‘/dev/rdsk/c3*’
那么组controller1的镜像只能会存在于组controller2 的磁盘中,而不会在自己组内
2. 搭建ASM平台
2.1
创建ASM实例
(1) 配置CSS(Cluster Synchronization
Services)
在oracle_home/bin 目录下执行,添加css服务
C:\oracle\product\10.2.0\db_1\BIN>
localconfig add
检查css是否ok:
C:\>crsctl check
cssd
结果:
CSS appears healthy
(2) 运行oradim 创建一个ASM实例的服务
C:\> oradim -new
-asmsid +ASM -startmode manual
这样在系统服务里就存在 OracleASMService+ASM,之后可以设置让其自动启动
(3) 在oracle_home/database
目录下,创建INIT+ASM.ORA
内容为:
instance_name='+ASM'
instance_type='asm'
asm_diskstring='c:\asmdisks\*'
#asm磁盘的路径,如果不指定,asm实例将无法发现磁盘
_asm_allow_only_raw_disks=false
ASM_DISKGROUPS='DGROUP1',
'DGROUP2'#注意:此处为将要建立的两个磁盘组,若是重启计算机后启动asm实例有问题:ORA-00205 error in identifying
control file(发现是磁盘组没有加载),可能是这里没有添加的缘故
2.2
创建ASM磁盘组
(1)调用asmtool在c:\asmdisks目录下建立虚拟磁盘:
C:\ >asmtool
–create c:\asmdisks\disk1
1000;
C:\>asmtool
–create c:\asmdisks\disk2
1000;
C:\>asmtool
–create c:\asmdisks\disk3
1000;
C:\>asmtool
–create c:\asmdisks\disk4
1000;
C:\>asmtool
–create c:\asmdisks\disk5
1000;
C:\>asmtool
–create c:\asmdisks\disk6
1000;
(2)
创建磁盘组
1. 设置环境变量 ORACLE_HOME , ORACLE_SID
C:\> set
ORACLE_HOME=C:\oracle\product\10.2.0\db_1;
C:\> set
ORACLE_SID=+ASM;
2. 以sysdba登录,然后创建磁盘组
DGROUP1
C:\>sqlpuls
/nolog
Sql>conn as
sysdba
检查磁盘情况
Sql>select
path,mount_status from v$asm_disk;
先建立GROUP1,普通冗余(双镜像)
sql>create diskgroup
DGROUP1 normal redundancy disk
'c:\asmdisks\disk1','c:\asmdisks\disk2','c:\asmdisks\disk3','c:\asmdisks\disk4';
再建立GROUP2,外部冗余(无镜像)
sql>create diskgroup
DGROUP2 external redundancy
disk
'c:\asmdisks\disk5','c:\asmdisks\disk6';
2.3
利用INIT+ASM.ORA 重新生成spfile,启动ASM实例
先关闭实例:
Sql>shutdown
immediate;
重新生成spfile
Sql>create spfile from
pfile=’
C:\oracle\product\10.2.0\db_1\database\INIT+ASM.ORA’;
启动ASM实例
Sql>startup;
3. 数据库迁移(模拟数据库ORCLTEST迁移到ASM)
3.1
登录进ORCLTEST ,修改基础参数,然后关闭,将数据库置于 nomount 状态
C:\>set
ORACLE_SID=orcltest;
C:\>sqlplus
/nolog
SQL> conn
sys/oracle@orcltest as sysdba;
SQL> alter system set
db_create_file_dest='+DGROUP1' scope=spfile;
SQL> alter system set
db_recovery_file_dest='+DGROUP2' scope=spfile;
SQL> alter system set
db_recovery_file_dest_size=2000m scope=spfile;
SQL> alter system
reset control_files scope=spfile sid='*';
SQL> shutdown
immediate;
SQL> startup
nomount;
SQL> quit;
ALTER SYSTEM RESET命令用来在SPFILE中删除(unset)参数,此处用来删除control_file参数,因为移到ASM上后需要重建control file
3.2
启动RMAN,迁移数据库文件
C:\>rman target
sys/oracle@orcltest
注意,这里如果直接 rman target / 会报错:
RMAN-00554: 内部恢复管理器程序包初始化失败
RMAN-04005: 目标数据库中存在错误:
ORA-01017: 用户名/口令无效; 登录被拒绝
RMAN>restore
controlfile from
'c:\oracle\product\10.2.0\oradata\orcltest\CONTROL01.CTL';
RMAN> alter database
mount;
#迁移数据文件
RMAN> backup as copy
database format '+DGROUP1';
RMAN> switch database
to copy;
RMAN> alter database
open;
登录ORCLTEST实例,检查控制文件,数据文件,日志文件,临时文件
C:\ >sqlplus
/nolog
SQL> conn
sys/oracle@orcltest as sysdba;
#检查控制文件
SQL> select
name from v$controlfile;
NAME
--------------------------------------------------------------
+DGROUP1/orcltest/controlfile/backup.266.759515047
+DGROUP2/orcltest/controlfile/backup.262.759515049
#检查数据文件
SQL>
select name from v$datafile;
NAME
--------------------------------------------------------------+DGROUP1/orcltest/datafile/system.267.759515291
+DGROUP1/orcltest/datafile/undotbs1.269.759515351
+DGROUP1/orcltest/datafile/sysaux.268.759515327
+DGROUP1/orcltest/datafile/users.270.759515355
#检查日志文件
SQL> select member
from v$logfile;
MEMBER
C:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCLTEST\REDO03.LOG
C:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCLTEST\REDO02.LOG
C:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCLTEST\REDO01.LOG
#检查临时文件
SQL> select name from
v$tempfile;
NAME
C:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCLTEST\TEMP01.DBF
注意:
检查完各文件后,发现除了 日志文件,临时文件 没有迁移,其他文件都已经迁移进ASM磁盘组中
#要迁移临时文件,技巧是在磁盘组中创建新的文件,然后删除旧的临时文件
SQL> alter temporary
tablespace temp add tempfile '+DGROUP2';
SQL> alter database
default temporary tablespace temp;
SQL> drop tablespace
temp including contents and datafiles;
SQL> select name from
v$tempfile;
NAME
+DGROUP1/orcltest/tempfile/temp.273.759517129
#迁移日志文件,在磁盘组中创建新成员,并删除旧成员(只有当日志文件状态为INACTIVE 时才能删除,所以在删除第1 个日志时,先切换日志,然后关闭数据库,重启后再删除
#新增日志成员
SQL> alter database
add logfile size 50m;
SQL> alter database
add logfile size 50m;
SQL> alter database
add logfile size 50m;
#删除旧日志
SQL> select
group#,status form v$log order by group#;
SQL> alter database
drop logfile group 2;
SQL> alter database
drop logfile group 3;
SQL> alter system
switch logfile;
SQL> shutdown
immediate;
SQL>
startup;
SQL> select
group#,status form v$log order by group#;
SQL> alter database
drop logfile group 1;
SQL> select
group#,status form v$log order by group#;
4. ASMCMD实用程序
要运行ASMCMD程序,要先设置
ORACLE_HOME,ORACLE_SID
C:\>
set ORACLE_HOME=C:\ORACLE\PRODUCT\10.2.0\DB_1
C:\> set
ORACLE_SID=+ASM
C:\> asmcmd
查看ASM磁盘组内的文件
ASMCMD> ls
部分常用的ASMCMD命令列表
命令
说明
du
显示指定的ASM目录下ASM文件占用的所有磁盘空间
ls
列出ASM目录下的内容及其属性
lsct
列出当前ASM客户端的信息
lsdg
列出所有磁盘组及其属性
mkalias
为系统生成的文件名创建别名
rm
删除文件
cp
复制文件(oracle11g才有)
lsdsk
列出发现的磁盘(oracle11g才有)
5. 其他重要补充
ASM支持 数据文件、控制文件、归档日志文件、spfile、RMAN备份文件、Change
Tracking文件、数据泵Dump文件以及OCR文件。
注意,ASM不存储 二进制文件,预警日志,跟踪文件及口令文件
在 数据库实例 连接到ASM实例的情况下,是不允许关闭ASM实例的,若对该实例执行 shutdown
abort 命令,那么 数据库实例 也同时将关闭,并且报错。单单关闭 数据库实例 对
ASM实例不影响。