oracle之二ASM 管理
Oracle ASM 管理(PPT-II:602-636)
16.1 什么是ASM
自动存储管理即ASM(Automatic Storage Management),是Oracle提供的一项管理磁盘的功能,它是一种以纯软件方式实现的逻辑卷管理器,功能上提供了基于Oracle数据文件的条带化和可选的镜像。ASM的知识同时涉及了数据库管理和系统管理两大领域。
16.2 系统级的磁盘管理
物理卷:指的是独立磁盘,或磁盘分区或磁盘RAID结构。
逻辑卷:LVM(Logical Volume Manager),以软件方式将虚拟磁盘呈现给用户,LVM是操作系统级别的。提供了磁盘管理的灵活性,可靠性,具有条带,镜像和快照等功能。
磁盘阵列上的RAID技术:希望通过多个物理卷增强性能和容错性,常用的有4个级别,RAID0,RAID1,RAID5,RAID0+1。
16.3 ASM和LVM的比较
1)ASM了解Oracle特性,ASM可以对ASM数据文件制定不同的条带(两种)和镜像(三种)策略,这对提高数据库性能来说是一个优势。
2)ASM增加/删除磁盘后会使磁盘组上的ASM文件重新均衡分布,这个过程是自动完成的。
3)ASM是Oracle绑定的,不同的平台上可移植性好。
16.4 ASM体系结构(以下概念全是考点)
16.4.1 ASM实例
1)ASM数据库需要启动ASM实例,它和RDBMS实例分工协作,ASM实例负责管理ASM磁盘组和ASM磁盘以及定位ASM文件,注意仅仅是定位,ASM文件的IO读写操作还是由RDBMS实例完成的。
2)ASM实例合法参数很少,如ASM_DISKTRING和ASM_DISKGROUP,这些参数在RDBMS实例中是没有的。
16.4.2 ASM文件
ASM可以管理的文件有数据文件,临时文件,控制文件,联机日志和归档日志文件,spfile,及RMAN备份集和映像副本等。ASM不支持口令文件、跟踪文件、告警文件和Oracle二进制文件[bin目录下的sqlplus等](考点)。
16.4.3 ASM磁盘和磁盘组概念
1)ASM disk可以是实际的磁盘,也可以是磁盘的某个分区,或LVM管理的逻辑卷,实际工作中ASM disk一般不使用文件系统格式化的磁盘。
2)ASM diskgroup由ASM disk组成,可以包含一个或多个ASM disk。
3)建立ASM diskgroup时会将所有ASM disk划分成单元(AU)。AU大小缺省1M。也可指定其属性为2,4,8,16,32或64M。(考点)
4)建立ASM file会依据文件的动态增长分配ASM extent,ASM extent是(可变长)基于一个或多个ASM AU ,一个ASM file会分布到一个ASM diskgroup的所有ASM disk上。
5)只能使用RMAN备份ASM file,操作系统命令对ASM file是不可知的。
6)可以通过ALTER DISKGROUP MOUNT手动加载ASM disk,也可以通过指定参数ASM_DISKGROUP自动加载。
7)当ASM diskgroup组中的ASM disk发生增减后,ASM diskgroup会自动再平衡[RBA],目的是使IO均衡在ASM diskgroup的所有ASM disk上。
16.4.4 利用磁盘组增加性能和冗余
1)ASM striping (条带)
为了提高IO读写性能,ASM需要进行条带化处理,注意striping(条带)是基于AU的。
2)ASM不能禁用striping。有两种类型的条带化方式:粗粒度条带(coarse)和细粒度条带(fine)。粗粒度条带大小=AU大小,一般来说相对1M的AU,粗粒度条带也是1M, 而细粒度条带总是128K, 条带策略已由Oracle模板缺省定义了(见下图)。若有特殊需求,你可自定义模板,然后在建立表空间时使用模板子句引用你自定义的文件模板。
ASM文件模板的默认值
Oracle文件类型 默认系统模板名称 条带化
------------------------------------------------------------------------------
控制文件 CONTROLFILE 细密
数据文件 DATAFILE 粗糙
日志文件 ONLINELOG 细密
归档日志文件 ARCHIVELOG 粗糙
临时文件 TEMPFILE 粗糙
RMAN备份文件 BACKUPSET 粗糙
动态参数文件 PARAMETERFILE 粗糙
......
16.4.5 ASM文件(file)、ASM区(extent)、ASM单元(unit)、ASM镜像(mirror)、ASM条带(stripe)之间的关系:
ASM file ----->spread across all of the disks in a disk group
/|\
ASM extent(3种规格) ----->mirror(3种规格)
/|\
ASM au (7种规格) ----->stripe(2种规格)[粗力度、细粒度]
AU规格:1、2、4、8、16、32、64
16.5 ASM 的一些重要特性
16.5.1 动态可变分配ASMextent的大小
ASM file (0--19999) extents extent=AU
ASM file (20000--39999) extents extent=8AU
ASM file (40000+) extents extent=64AU
16.5.2 ASM镜像及故障组
1)ASM镜像提供了数据的冗余支持,镜像有三种模式:是在extent级别上实现,保证两个相同的extent不在一块硬盘上
NORMAL REDUNDANCY(两路 RAID1),
HIGH REDUNDANCY(三路 RAID5 ),
EXTERNAL REDUNDANCY(无镜像,使用RAID0)
2)ASM的镜像与操作系统提供的镜像有所不同。操作系统镜像是基于整个盘(分区)的镜像。而ASM是对ASM文件的extent做镜像,当ASM在某个磁盘上分配了一个primary extent时,必定在另一个磁盘上分配一个与之对应的secondary extent(镜像)。
3)对于双路磁盘控制器,为防止单路控制器同时损毁主副extent,ASM又引入故障组容错概念,使主副extent分布在不同的故障组下,即主extent和副extent分别属于不同的故障组。所以,如果不设故障组,则每个磁盘就是一个独立的故障组。
4)一个磁盘组可有两个或多个故障组(failgroup),一个故障组由一个或多个ASM磁盘组成,故障组只能在两路或三路镜像模式下进行。
故障组是在标准冗余的基础上指定镜像策略,它是一种镜像功能的补充。假定有磁盘组DG1,且创建了两个故障组controller1,controller2,每个故障组由2个ASM磁盘组成,则对标准冗余而言,指定两个故障组互为镜像
controller1 --> asmdiskA , asmdiskB
controller2 --> asmdiskC , asmdiskD
就是说:asmdiskA 的extent镜像一定会建立在另一个故障组的asmdiskC或asmdiskD磁盘上,而不会在本故障组conntroller1内。
16.5.3 重新平衡磁盘组
ASM重新平衡磁盘组的操作是自发的,动态的。无论是向磁盘组加盘还是减盘,只要改变了磁盘组中磁盘的数量,ASM就会重新分布磁盘上的数据。如果是增加磁盘还会为其划分au, 进而划分条带,这样,文件会立即分布到新加的ASM disk上。
自动重新平衡会消耗系统资源,有条件的话应该选择系统比较空闲的时段加减磁盘。
ASM_POWER_LIMIT这个参数值取1-11(在11gR2后可以选的范围是1-1024),此值越高平衡时消耗服务器资源越多(考点)。
如果需要也可以使用手动方式对磁盘组进行重新平衡。可以为power子句分配1-11的值。
SQL> ALTER DISKGROUP dgroup1 REBALANCE POWER 5; \\临时修改ASM_POWER_LIMIT的个数,优先级高
16.5.4 快速镜像再同步特性(PPT-II-635)
一般情况下,如果由于一个磁盘损坏使之不可用,系统会自动将冗余extent的复制到另一个磁盘上,即重新创建该盘的extent副本,然后删除有故障的磁盘,这样做的缺点是迁移总会消耗一定的系统资源。但是,如果仅仅是电缆或控制器接口或电源等故障(干脆说不是介质损坏)而导致ASM磁盘不可用,这样的问题可以快速修复,为此Oracle引入ASM快速镜像再同步特性。
这个特性的要点是:
1)在给定修复期内,仅使磁盘offline,不会从磁盘组drop磁盘。(考点)。
2)将修复的磁盘online后,ASM仅重写offline之后发生变更的数据(增量数据),而不必执行冗长的再平衡。
可以通过设置属性参数disk_repair_time指定修复期。
如:alter diskgroup dg1 set attribute 'disk_repair_time'=4h;
可以临时更改修复期
alter diskgroup dg1 offline disks in failuregroup controller1 drop after 2h;
这将意味着忽略了disk_repair_time属性,指定2小时为修复时间。
修复后重新进行联机即可
alter diskgroup dg1 ONLINE;
超过修复期,将转为常规方式处理,即自动drop掉这些磁盘,然后开始复制整个副本并做REBALANCE。
也可以在修复期内提前使用FORCE选项删除这些磁盘:
alter diskgroup dg1 drop disks in failure group controller1 FORCE;
16.5.5 ASM首选镜像读
正常冗余需要两个故障组,高冗余需要三个故障组,ASM分配新的extent时总是定义一个主本和一个副本。ASM总是自动的读取镜像extent的主本。但对于一个远程系统(集群延伸),读取它本地的副本更可以减少网络流量。于是有了首选镜像读特性。
通过设置ASM_PREFERRED_READ_FAILURE_GROUPS初始化参数,指定一列首选镜像读故障组的名字。
通过查询V$ASM_DISK视图可以确定首选故障组中有哪些磁盘:
例
SQL> alter system set asm_prefeeed_read_failure_groups=diskgroup_name.failure_group_name,diskgroup_name1.failure_group_name1...;
SQL> select preferred_read from v$asm_disk;
16.5.6 ASM兼容性参数(PPT-II-631)
为使用一些ASM的新功能,你可以对不同的磁盘组设置不同的兼容性属性,
COMPATIBLE.RDBMS 指定能mount这个diskgroup的RDBMS实例的最小兼容版本
COMPATIBLE.ASM 定义了这个dsikgroup的ASM metadata格式[OMF]
COMPATIBLE.ADVM 指定该diskgroup是否可以包含ASM volume
请记住:RDBMS兼容性级别必须小于或等于磁盘组的ASM兼容性级别。
即:COMPATIBLE.RDBMS<=COMPATIBLE.ASM。
16.5.7 ASM的同步集群服务
CSS是为claster服务一组软件,即使不是RAC配置,配置一个单实例的ASM也要使用CSS部分功能,另外还需要了解ASM也有后台进程,特别是有两个进程,一个是RBAL,一个是ARBn
ASM实例上的两个重要进程
RBAL:用于协调和管理磁盘组之间的动态平衡
ARBn:用于完成AU的移动
===============
===============
RDBMS实例上两个与ASM有关的后台进程:
RBAL:完成ASM磁盘打开的任务,其中的磁盘是ASM磁盘组的一部分
ASMB:作为一个重要的进程将RDBMS实例与ASM实例相连起来,对于RDBMS实例来说,它是一个foreground process(考题)
特别注意 RBAL在ASM实例和RDBMS实例中各有一个,但功能不同,前者是负责协调ASM再平衡活动,后者负责打开和关闭ASM磁盘。
[oracle@timran timran11g]$ ps -ef |grep rbal
oracle 4790 1 0 14:10 ? 00:00:00 asm_rbal_+ASM
oracle 5021 1 0 14:13 ? 00:00:00 ora_rbal_timran11g
oracle 5133 4112 0 14:22 pts/2 00:00:00 grep rbal
16.5.8 关于ASM实例和RDBMS实例的启动和关闭
1)只能在nomount 下启动ASM实例,它永远不能mount控制文件,也不能打开datafile
2)启动:ASM实例先启动,RDBMS实例后启动。退出:RDBMS实例先shutdwon immediate,ASM实例后退出.
3)ASM实例做shutdown immediate,而此时RDBMS还有用户连接,ASM shutdown不能成功。会报错!
4)如果RDBMS shutdown abort, ASM实例什么也不做。
16.5.9 ASMCMD命令行工具
$asmcmd
ASMCMD>help
可以使用命令行工具更灵活的管理ASM。关注11g下在ASMCMD中新加入的两个命令,ASM元数据的备份与还原:即md_backup和 md_resotre
md_backup 进行磁盘组的备份
ASMCMD> md_backup -b /tmp/asmbkp1 -g g1
-g 选项指定要备份的单个磁盘组,-b 选项指定文件asmbkp1作为备份的文本文件。
ASMCMD> md_recover -b /tmp/asmbkp1 -t full -g g1
考点:md_recover 不能恢复存储在ASM磁盘中的实际数据,但是能恢复磁盘组,修改模板,创建目录。当md_recover恢复了ASM元数据后,才可以使用RMAN备份在重建的磁盘组中恢复数据。
16.6 在Linux上创建ASM实例的范例
1) 在linux里增加两个虚盘
ASMDISK1, /dev/sdb,4G, 分4个区,每个区1000M,分别对应sdb1,sdb2,sdb3,sdb4。
ASMDISK2, /dev/sdc, 2G 分1个区,对应sdc1。
[root@timran dev]# fdisk -l
Disk /dev/sda: 21.4 GB, 21474836480 bytes
255 heads, 63 sectors/track, 2610 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Device Boot Start End Blocks Id System
/dev/sda1 * 1 2349 18868311 83 Linux
/dev/sda2 2350 2610 2096482+ 82 Linux swap / Solaris
Disk /dev/sdb: 4294 MB, 4294967296 bytes
255 heads, 63 sectors/track, 522 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Device Boot Start End Blocks Id System
/dev/sdb1 1 123 987966 83 Linux
/dev/sdb2 124 246 987997+ 83 Linux
/dev/sdb3 247 369 987997+ 83 Linux
/dev/sdb4 370 492 987997+ 83 Linux
Disk /dev/sdc: 2147 MB, 2147483648 bytes
255 heads, 63 sectors/track, 261 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Device Boot Start End Blocks Id System
/dev/sdc1 1 261 2096451 83 Linux
[root@timran dev]#
vi /etc/udev/rules.d/90-raw.rules
kernel=="sdd*",action=="add",owner="oracle",group="oinstall",mode="660"
kernel=="sde*",action=="add",owner="oracle",group="oinstall",mode="660"
2) Oracle ASMlib 安装
ASMlib是Oracle针对linux 操作系统的ASM管理套件,ASMlib 简化磁盘管理,取代原来我们在linux 上常用rawdevices 服务。
根据linux不同的内核版本,对应有不同的ASMlib包,下载地址:http://www.oracle.com/technetwork/server-storage/linux/asmlib/index-101839.html
比如,我的linux内核版本是:
[root@timran ~]# uname -a
Linux timran.localdomain 2.6.18-348.el5 #1 SMP Wed Nov 28 21:25:39 EST 2012 i686 athlon i386 GNU/Linux
根据这个kernel版本,我找到的三个对应的ASMlib包应该是:
[root@timran timran11g]# ll -al *.rpm
-rw-rw-r-- 1 oracle oracle 22751 07-01 13:12 oracleasm-2.6.18-348.el5-2.0.5-1.el5.i686.rpm
-rw-rw-r-- 1 oracle oracle 13929 07-01 13:12 oracleasmlib-2.0.4-1.el5.i386.rpm
-rw-rw-r-- 1 oracle oracle 85303 07-01 13:12 oracleasm-support-2.1.8-1.el5.i386.rpm
[root@timran timran11g]# rpm -qa |grep asm
[root@timran timran11g]#
将这三个包加载到linux kernel中
[root@timran timran11g]# rpm -ivh *.rpm
warning: oracleasm-2.6.18-348.el5-2.0.5-1.el5.i686.rpm: Header V3 DSA signature: NOKEY, key ID 1e5e0159
Preparing... ########################################### [100%]
1:oracleasm-support ########################################### [ 33%]
2:oracleasm-2.6.18-348.el ########################################### [ 67%]
3:oracleasmlib ########################################### [100%]
显示一下已经加载成功
[root@timran timran11g]# rpm -qa |grep asm
oracleasmlib-2.0.4-1.el5
oracleasm-support-2.1.8-1.el5
oracleasm-2.6.18-348.el5-2.0.5-1.el5
[root@timran timran11g]#
[root@timran oracle]# reboot //重启一下,看看主控台显示ASM驱动能否正常加载.
ASMlib包装好后会在/etc/init.d/下出现oracleasm这个service,它可以支持很多linux上的ASM操作。
3)配置ASMlib驱动
[root@timran init.d]# /etc/init.d/oracleasm configure
Configuring the Oracle ASM library driver.
This will configure the on-boot properties of the Oracle ASM library
driver. The following questions will determine whether the driver is
loaded on boot and what permissions it will have. The current values
will be shown in brackets ('[]'). Hitting <ENTER> without typing an
answer will keep that current value. Ctrl-C will abort.
Default user to own the driver interface []: grid
Default group to own the driver interface []: asmadmin
Start Oracle ASM library driver on boot (y/n) [n]: y
Scan for Oracle ASM disks on boot (y/n) [y]:
Writing Oracle ASM library driver configuration: done
Initializing the Oracle ASMLib driver: [ OK ]
Scanning the system for Oracle ASMLib disks: [ OK ]
[root@timran ~]#
4)创建ASM磁盘
[root@timran init.d]# /etc/init.d/oracleasm createdisk VOL1 /dev/sdb1
Marking disk "VOL1" as an ASM disk: [ OK ]
[root@timran init.d]# /etc/init.d/oracleasm createdisk VOL2 /dev/sdb2
Marking disk "VOL2" as an ASM disk: [ OK ]
[root@timran init.d]# /etc/init.d/oracleasm createdisk VOL3 /dev/sdb3
Marking disk "VOL3" as an ASM disk: [ OK ]
[root@timran init.d]# /etc/init.d/oracleasm createdisk VOL4 /dev/sdb4
Marking disk "VOL4" as an ASM disk: [ OK ]
[root@timran init.d]# /etc/init.d/oracleasm createdisk VOL5 /dev/sdc1
Marking disk "VOL5" as an ASM disk: [ OK ]
[root@timran init.d]#
[root@timran init.d]# ls /dev/oracleasm/disks
VOL1 VOL2 VOL3 VOL4 VOL5 //可以看到生成了5个ASM磁盘。
#/etc/init.d/oracleasm querydisk -d VOL1 //试一下,查询ASM磁盘对应的物理磁盘号
Disk "VOL1" is a valid ASM disk on device /dev/sdb1[8,17]
5)创建ASM实例
5.1)启用css服务(Cluster Synchronization Services ),
单实例的ASM也要用到RAC套件中的一些驱动,它们负责多实例间的通信。这里用于同步ASM实例与RDBMS实例
使用root帐户进行配置,配置程序位于$ORACLE_HOME/bin
[root@timran ~]# /u01/oracle/bin/localconfig add
Successfully accumulated necessary OCR keys.
Creating OCR keys for user 'root', privgrp 'root'..
Operation successful.
Configuration for local CSS has been initialized
Cleaning up Network socket directories
Setting up Network socket directories
Adding to inittab
Startup will be queued to init within 30 seconds.
Checking the status of new Oracle init process...
Expecting the CRS daemons to be up within 600 seconds.
Cluster Synchronization Services is active on these nodes.
timran
Cluster Synchronization Services is active on all the nodes.
Oracle CSS service is installed and running under init(1M)
[root@timran ~]#
[root@timran ~]# ps -ef |grep css
oracle 3316 1 1 12:01 ? 00:00:00 /u01/oracle/bin/ocssd.bin
root 3594 2537 0 12:01 pts/0 00:00:00 grep css
5.2)创建ASM参数文件(使用VI或VIM)
[root@timran dbs]# vi /u01/oracle/dbs/init+ASM.ora
#*.asm_diskgroups='DG1'
*.asm_diskstring='/dev/oracleasm/disks'
*.diagnostic_dest='/u01'
*.instance_type='ASM'
*.instance_name='+ASM'
*.large_pool_size=12M
*.remote_login_passwordfile='SHARED'
*.asm_power_limit=1
说明一下:
asm_diskgroups='DG1' 这行先注释掉,等到建完磁盘组后再去掉#号。
asm_diskstring='/dev/oracleasm/disks' 描述ASM磁盘所在的路径。
instance_type='ASM' 这个参数对应ASM实例是强制性的,其他都不是。
存盘后改一下属主:
[root@timran dbs]# chown oracle:oinstall /u01/oracle/dbs/init+ASM.ora
5.3) 创建ASM的口令文件
[oracle@timran ~]$orapwd file=$ORACLE_HOME/dbs/orapw+ASM password=system entries=5
5.3) 启动ASM实例
[oracle@timran ~]$export ORACLE_SID=+ASM
[oracle@timran ~]$sqlplus / as sysdba
Connected to an idle instance.
SQL> startup
ASM instance started
Total System Global Area 284565504 bytes
Fixed Size 1299428 bytes
Variable Size 258100252 bytes
ASM Cache 25165824 bytes
ORA-15110: no diskgroups mounted //因为ASM磁盘组还没有建立
实例启动了,可以在linux下看一下+ASM进程
[root@timran dbs]# ps -ef |grep +ASM
oracle 3993 1 0 14:31 ? 00:00:00 asm_pmon_+ASM
oracle 3995 1 0 14:31 ? 00:00:00 asm_vktm_+ASM
oracle 3999 1 0 14:31 ? 00:00:00 asm_diag_+ASM
oracle 4001 1 0 14:31 ? 00:00:00 asm_psp0_+ASM
oracle 4005 1 0 14:31 ? 00:00:00 asm_dia0_+ASM
oracle 4007 1 0 14:31 ? 00:00:00 asm_mman_+ASM
oracle 4009 1 0 14:31 ? 00:00:00 asm_dbw0_+ASM
oracle 4011 1 0 14:31 ? 00:00:00 asm_lgwr_+ASM
oracle 4013 1 0 14:31 ? 00:00:00 asm_ckpt_+ASM
oracle 4015 1 0 14:31 ? 00:00:00 asm_smon_+ASM
oracle 4017 1 0 14:31 ? 00:00:00 asm_rbal_+ASM
oracle 4019 1 0 14:31 ? 00:00:00 asm_gmon_+ASM
oracle 4021 3988 0 14:31 ? 00:00:00 oracle+ASM (DESCRIPTION=(LOCAL=YES)(ADDRESS=(PROTOCOL=beq)))
root 4032 3235 0 14:37 pts/2 00:00:00 grep +ASM
6)创建ASM磁盘组
建立磁盘组有三个办法,一个是使用ASMCA工具,另一个是使用sqlplus命令,还有一种是使用EM。
使用sqlplus命令:
注意:创建磁盘组要在ASM实例下去做,不可以在RDBMS实例下完成
SQL>
create diskgroup DG1 normal redundancy
failgroup controller1 disk '/dev/oracleasm/disks/VOL1','/dev/oracleasm/disks/VOL2'
failgroup controller2 disk '/dev/oracleasm/disks/VOL3','/dev/oracleasm/disks/VOL4';
不使用asmlib
create diskgroup DG1 normal redundancy
failgroup f1 disk '/dev/sdb1','/dev/sdb3'
failgroup f2 disk '/dev/sdb2','/dev/sdb4';
col name for a15;
col failgroup for a20;
SQL> select NAME,STATE,FREE_MB,REQUIRED_MIRROR_FREE_MB,USABLE_FILE_MB from v$asm_diskgroup;
NAME STATE FREE_MB REQUIRED_MIRROR_FREE_MB USABLE_FILE_MB
---------------------------------------------------------------------------------------------------------------
DG1 MOUNTED 3750 964 1393
SQL> select GROUP_NUMBER,DISK_NUMBER,NAME,FAILGROUP,STATE,TOTAL_MB from v$asm_disk;
GROUP_NUMBER DISK_NUMBER NAME FAILGROUP STATE TOTAL_MB
---------------------------------------------------------------------------------------------------------------
0 5 NORMAL 0
1 3 DG1_0003 CONTROLLER2 NORMAL 964
1 2 DG1_0002 CONTROLLER2 NORMAL 964
1 1 DG1_0001 CONTROLLER1 NORMAL 964
1 0 DG1_0000 CONTROLLER1 NORMAL 964
看一下ASM磁盘的情况:
SQL> col path for a40;
SQL> select path,os_mb from v$asm_disk order by path;
PATH OS_MB
---------------------------------------- ----------
/dev/oracleasm/disks/VOL1 964
/dev/oracleasm/disks/VOL2 964
/dev/oracleasm/disks/VOL3 964
/dev/oracleasm/disks/VOL4 964
/dev/oracleasm/disks/VOL5 2047
重新启动前将参数文件的第一行#去掉
[root@timran dbs]#vi /u01/oracle/dbs/init+ASM.ora
*.asm_diskgroups='DG1'
到此,创建ASM的基本内容已经完成了。重启系统(reboot),检查一下看看磁盘组是否能够自动mounted了。
测试ASM是否可以工作
启动了+ASM实例正常后,再启动RDBMS实例,然后建立一个+ASM上的表空间testasm做测试。
SQL> exit
[oracle@timran ~]$ export ORACLE_SID=timran11g
[oracle@timran ~]$ sqlplus / as sysdba
Connected to an idle instance.
SQL> startup
SQL> create tablespace testasm
datafile '+data/orcl/datafile/testasm01.dbf' size 10m;
Tablespace created.
//这时,你可以使用ps -ef看看,ASM实例和RDBMS实例中都有了RABL后台进程。
SQL> select * from v$tablespace;
TS# NAME INC BIG FLA ENC
---------- ------------------------------ --- --- --- ---
0 SYSTEM YES NO YES
1 SYSAUX YES NO YES
2 UNDOTBS1 YES NO YES
4 USERS YES NO YES
3 TEMP NO NO YES
6 EXAMPLE YES NO YES
7 TESTASM YES NO YES
SQL>select file#,name from v$datafile;
FILE# NAME
---------- --------------------------------------------------
1 /u01/oradata/timran11g/system01.dbf
2 /u01/oradata/timran11g/sysaux01.dbf
3 /u01/oradata/timran11g/undotbs01.dbf
4 /u01/oradata/timran11g/users01.dbf
5 /u01/oradata/timran11g/example01.dbf
6 +DG1/timran11g/datafile/testasm.256.803235039
create table scott.test(id int) tablespace testasm;
insert into scott.test values(1);
commit;
select * from scott.test;
ID
----------
1
OK! 我们进入EM,看看是否也可以看到ASM磁盘组了,当ASM实例和RDBMS实例都启动之后,在EM里应该出现管理ASM磁盘组的栏目,
EM-->Server-->Storage-->Disk Group
第一次加载ASM有可能看不到Disk Group项,可以尝试查询testasm表空间-->datafile-->DG1使其出现。如果还不能出现,说明EM的资料库里缺少我们加载的ASM信息。重新配置一下EM,这需要花点时间了。
[oracle@timran ~]$ emca -config dbcontrol db
过程较长,简单说一下:
a)不需要shutdown数据库,也不需要关闭EM,配置过程会自动关闭启动EM
b)数据库SID:timran11g
监听端口号:1521
有关ASM信息使用缺省值即可
所有管理用户口令:system
c)继续,等待最终结果:“已成功完成Enterprise Manager的配置” ok
e) 重新登录EM,按前面所述再试,使之出现Disk Group项
[oracle@timran ~]$
8)动态增加/删除ASM磁盘,观察动态再平衡,你将看到动态再平衡的特点:ASM文件以failgroup为“池”均衡分布在所有ASM磁盘上。
8-1)将VOL5加入dg1组并指定一个故障组
SQL> alter diskgroup dg1 ADD FAILGROUP CONTROLLER3 DISK 'ORCL:VOL5';
SQL> select GROUP_NUMBER,DISK_NUMBER,NAME,FAILGROUP,STATE,TOTAL_MB from v$asm_disk;
GROUP_NUMBER DISK_NUMBER NAME FAILGROUP STATE TOTAL_MB
------------ ----------- ---------- -------------------- -------- ----------
1 0 DG1_0000 CONTROLLER1 NORMAL 964
1 1 DG1_0001 CONTROLLER1 NORMAL 964
1 2 DG1_0002 CONTROLLER2 NORMAL 964
1 3 DG1_0003 CONTROLLER2 NORMAL 964
1 4 VOL5 CONTROLLER3 NORMAL 2047
8-2)增扩表空间
SQL> alter tablespace testasm add datafile '+DG1' size 5m;
注意:
1)动态再平衡的范围是以该ASM磁盘所在的故障组中进行的,其他故障组不会做IO平衡。
2)如果由于ASM文件的增长使空间不够时,可以扩容表空间,而这会扩展所有ASM磁盘的使用空间。
9)彻底删除ASMlib
9.1) 删除表空间
SQL> drop tablespace testasm including contents and datafiles;
9.2)删除ASM组
[root@timran ~]# su - oracle
[oracle@timran ~]$ export ORACLE_SID=+ASM
[oracle@timran ~]$ sqlplus / as sysdb
SQL> drop diskgroup dg1 including contents; //删除ASM组要在实例启动时做。
SQL> drop diskgroup dg1 force including contents; //如果删除失败,再试试这句。
9.3)删除ASM磁盘
SQL>shutdown abort //关闭ASM实例
#/etc/init.d/oracleasm listdisks
VOL1
VOL2
VOL3
VOL4
VOL5
#/etc/init.d/oracleasm deletedisk vol1
#/etc/init.d/oracleasm deletedisk vol2
#/etc/init.d/oracleasm deletedisk vol3
#/etc/init.d/oracleasm deletedisk vol4
#/etc/init.d/oracleasm deletedisk vol5
9.4)删除CSS服务
#/u01/oracle/bin/localconfig delete //删除css信息
9.5)删除ASM参数文件和口令文件
#rm /u01/oracle/dbs/*ASM*
9.6) 删除ASMlib的RPM包
[root@timran init.d]# rpm -qa |grep asm //查询asm有关的rpm包,
oracleasm-2.6.18-53.el5-2.0.4-1.el5
oracleasm-support-2.1.7-1.el5
oracleasmlib-2.0.4-1.el5
[root@timran init.d]# rpm -e oracleasmlib-2.0.4-1.el5 //删除这三个rpm包有顺序
[root@timran init.d]# rpm -e oracleasm-2.6.18-53.el5-2.0.4-1.el5
[root@timran init.d]# rpm -e oracleasm-support-2.1.8-1.el5
[root@timran init.d]#
[root@timran init.d]# ll /etc/init.d/oracleasm //确信oracleasm文件删掉了
9.7)物理删除Vbox上的ASM虚盘
vbox->存储->controller stat->vdi //vobx里删除ASMDISK1,ASMDISK2。
重启linux,看到sdb,sbc都没有了,再启动RDBMS,可以正常打开访问。
[root@timran dev]# ll /dev/sd*
brw-r----- 1 root disk 8, 0 Dec 28 17:35 sda
brw-r----- 1 root disk 8, 1 Dec 28 17:35 sda1
brw-r----- 1 root disk 8, 2 Dec 28 17:35 sda2
[root@timran dev]#
9.8 本机安装测试完成后碰到的一个问题:当启动ASM实例后再启动RDBMS实例时报错:
ORA-00845: MEMORY_TARGET not supported on this system
这个问题是由于设置SGA的大小超过了操作系统/dev/shm的大小:
查看并更改/etc/fstab文件后,问题解决。
[root@timran ~]# df -h /dev/shm
Filesystem Size Used Avail Use% Mounted on
tmpfs 506M 158M 348M 32% /dev/shm
[root@timran ~]#
[root@timran ~]# vi /etc/fstab
LABEL=/ / ext3 defaults 1 1
tmpfs /dev/shm tmpfs defaults,size=800m 0 0
devpts /dev/pts devpts gid=5,mode=620 0 0
sysfs /sys sysfs defaults 0 0
proc /proc proc defaults 0 0
LABEL=SWAP-sda2 swap swap defaults 0 0