1. ASM介绍
1.1
自动存储管理(ASM)提供一个数据镜像与条带化的管理平台。ASM 将文件分成1MB 大小的区(extent),并将所有文件的区平均分布到磁盘组的所有磁盘中。文件的镜像是通过区来体现的。ASM 在所有可用的资源中分布I/O 负载,在免除手动I/O 调节需要(通过分散数据库文件来避免热点)的同时优化性能
1.2
SYSTEM 和 UNDO 表空间因为经常用到,放到RAID1 上
联机重做日志因为有多路复用进行保护,更注重性能,放到 RADI0 卷上
ASM镜像模式有三种:
HIGH(三向镜像,即3副本)
NORMAL(双向镜像,即双副本)
EXTERNAL(无副本)
1.3
另外当建立ASM磁盘组时,可以指定故障组,默认情况下,ASM将文件的一个主分配区分配到磁盘组中的一个磁盘时,会将该分配区的副本分配至该磁盘组的另一个磁盘中。如果指定了故障组,那么也确定了其镜像位置的范围。至于是默认还是制定故障组,看具体需要,有些磁盘是在硬件级别连接的,他们有共同的控制器,如果控制器损坏,整组磁盘将损坏,在这时不希望在同一控制器的磁盘组内部存放镜像,而采用另一控制器的磁盘组存放镜像。
以下是建立一个指定故障组的 ASM磁盘组 dgroup1 的例子
SQL> create diskgroup dgroup1 normal redundancy
那么组controller1的镜像只能会存在于组controller2 的磁盘中,而不会在自己组内
2. 搭建ASM平台
2.1
在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)
C:\> oradim -new -asmsid +ASM -startmode manual
这样在系统服务里就存在 OracleASMService+ASM,之后可以设置让其自动启动
(3)
内容为:
instance_name='+ASM'
instance_type='asm'
asm_diskstring='c:\asmdisks\*' #asm磁盘的路径,如果不指定,asm实例将无法发现磁盘
_asm_allow_only_raw_disks=false
ASM_DISKGROUPS='DGROUP1', 'DGROUP2'
2.2
(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) 创建磁盘组
Sql>select path,mount_status from v$asm_disk;
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
先关闭实例:
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
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
SQL> shutdown immediate;
SQL> startup nomount;
SQL> quit;
ALTER SYSTEM RESET命令用来在SPFILE中删除(unset)参数,此处用来删除control_file参数,因为移到ASM上后需要重建control file
3.2
注意,这里如果直接 rman target / 会报错:
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
--------------------------------------------------------------
+DGROUP1/orcltest/controlfile/backup.266.759515047
+DGROUP2/orcltest/controlfile/backup.262.759515049
#检查数据文件
SQL> select
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命令列表
命令 | 说明 |
du | 显示指定的ASM目录下ASM文件占用的所有磁盘空间 |
ls | 列出ASM目录下的内容及其属性 |
lsct | 列出当前ASM客户端的信息 |
lsdg | 列出所有磁盘组及其属性 |
mkalias | 为系统生成的文件名创建别名 |
rm | 删除文件 |
cp | 复制文件(oracle11g才有) |
lsdsk | 列出发现的磁盘(oracle11g才有) |
5.