--========================
-- 创建 ASM 实例及ASM数据库
--========================
一、 ASM 相关概念
1. 什么是 ASM(Auto Storage Management)
简称自动存储管理,是一种用于管理磁盘的工具
能够在多个物理设备之间实现条带化、镜像数据文件、恢复文件等
文件按分配单元 AUs ( allocation units ) 平衡分布在磁盘组的所有磁盘中, ASM 使用索引技术来跟踪每个 AUs 的位置
支持联机磁盘的动态增加和减少,当磁盘发生变化后, AUs 会自动重新实现动态分布
支持 RAC 集群技术,每一节点上运行一个 ASM 实例,各 ASM 实例间能实现点对点通讯
是一个纯软件级别的实现方式,第三方 RAID 工作在卷层次上,使用统一条带大小, ASM 可以工作在文件层次级别,不同文件可以使用
不同的条带大小
2.ASM 的优点
磁盘增加:增加磁盘变得非常容易。无需停机时间,并且文件区域自动重新分配。
I / O 分配: I / O 自动分布在所有可用的磁盘上,无需人工干预,从而减少了热点出现的可能性。
带区宽度:在重做日志文件中分段可以细分( K ,以获得更快的传输速率),对于数据文件,带区则略大一些( MB ,以一次性
传输大量的数据块)。
缓冲: ASM 文件系统不进行缓冲,直接进行输入 / 输出。
镜像:如果硬件镜像不可用,则可以容易地建立软件镜像。
核心化的异步 I / O :实现核心化的异步 I / O 无需特殊的设置,并且无需使用原始或第三方的文件系统(如 Veritas Quick I / O )
3.Oracle 常用数据文件的 RAID 级别
SYSTEM 、 UNDO 表空间通常置于 RAID 1 卷上
联机重做日志通常置于 RAID 0 卷上
控制文件通常置于 RAID 0 + 1 卷上
数据文件通常置于 RAID 5 卷上
4.ASM 体系结构 ( 主要由 ASM 实例及 ASM 磁盘组组成 )
ASM 的使用需要创建一个 ASM 实例,用于管理 ASM 磁盘组
ASM 磁盘组由 ASM 磁盘组成,可以包含一个或多个 ASM 磁盘
ASM 磁盘可以是实际的磁盘,也可以是磁盘的某个分区,或 LVM 管理的逻辑卷,但必须是未格式化的原始设备
ASM 磁盘组的大小为该组内 ASM 磁盘大小的总和,可使用的容量则根据容错级别而有不同的可用大小
5.ASM 实例及 RDBMS 实例
ASM 实例类似于普通的数据库实例 ( RDBMS ) ,同样由 SGA 和一堆后台进程组成 , 对大多数系统而言, SGA 只需 64 MB 即可
ASM 实例中的 LargePool 用于存放 Extent Map , 可以根据数据库的大小来计算 LargePool 的大小 , 通常 100GB 大小需要 1MB 存放 Extent Map
普通的 RDBMS 实例会定位数据文件并打开其数据文件,而在使用 ASM 存储的数据库中,该工作由 ASM 实例接管,即 ASM 实例用于定位和
管理 ASM 磁盘,磁盘组。
ASM 实例拥有类似于普通 RDBMS 实例的后台进程,如 SMON , PMON , LGWR , DBWR , CKPT 等,还增添了两个新进程 , 一类是 RBAL , 一类是 ARBn
RBAL : 用于协调和管理磁盘组之间的动态平衡
ARBn : 可以为多个,用于完成 AU 的移动
ASM 实例仅仅是定位管理 ASM 磁盘,不能加载或打开数据库,因此也无法读取数据字典信息
ASM 实例通常有个参数,只能使用口令文件或操作系统身份验证作为 sysdba 或 sysoper 来启动或关闭该实例。
关于 sysdba 或 sysoper 区别请参考: system sys ,sysoper sysdba 的 区 别
一个 ASM 实例可以为多个 RDBMS 提供服务,可以在一台主机上创建多个 ASM 实例,但通常一台主机上使用一个 ASM 实例
如果一个实例服务于多个 RDBMS ,建议将 ASM 的 ASM_HOME 与 DB 的 ORACLE_HOME 分开,便于日后的升级与维护
ASM 磁盘组的创建与配置在 ASM 实例启动之后
使用 ASM 磁盘的 RDBMS 实例与普通的 RDBMS 实例相同,但多出了两个后台进程, RBAL , ASMB 。
ASMB 借助某个服务器进程如 oracle + ASM1 建立普通 RDBMS 实例到 ASM 实例的会话,并传递磁盘文件的相关信息
RBAL 打开通过 ASM 实例定位的 ASM 磁盘
注意: ASM 实例并不代替 RDBMS 实例来读取或写入数据文件,数据是直接在 ASM 磁盘和 RDBMS 实例传递, ASM 实例仅用于定位数据文件
所在的 asm 磁盘,盘区以及所需的相关信息。假定新增加数据文件,则 RDBMS 告知 ASM 实例要创建数据文件, ASM 实例则分配盘区
( extent ) ,并创建盘区映射地址返回给 RDBMS 实例, RDBMS 则将数据直接写入到磁盘组。
6.ASM 实例中存储的文件类型
控制文件 参数文件 联机日志文件 归档日志文件 数据文件 临时文件
RMAN 备份集、映像副本 控制文件备份集 datapump 转储文件、 Change Tracing file
二、创建 ASM 实例 ( 下面基于 VMware + RHEL 5.4 + Oracle 10g R2 演示 )
1. 安装 ASM 包
使用 ASM 实例,需要到 Oracle 官方网站下载所需的 ASM 包。下载路径: ASMLib 下 载
注意下载支持该内核的包,分为两部分,一是 Library and Tools ,二是 Drivers for kernel
如本人的 Linux 的内核为:
[root@oradb ~]# uname - rm
2.6.18 - 164.el5 i686
则下载对应的包为:
Library and Tools
oracleasmlib - 2.0.4 - 1.el5 . x86_64 . rpm
oracleasm - support - 2.1.3 - 1.el5 . i386 . rpm
Drivers for kernel 2.6.18 - 164.el5
oracleasm - 2.6.18 - 164.el5xen - 2.0.5 - 1.el5 . i686 . rpm
oracleasm - 2.6.18 - 164.el5debug - 2.0.5 - 1.el5 . i686 . rpm
oracleasm - 2.6.18 - 164.el5PAE - 2.0.5 - 1.el5 . i686 . rpm
oracleasm - 2.6.18 - 164.el5 - debuginfo - 2.0.5 - 1.el5 . i686 . rpm
oracleasm - 2.6.18 - 164.el5 - 2.0.5 - 1.el5 . i686 . rpm
使用下面类似的方式来安装这些包,关于 RPM 的使用请参考: RPM 使用简介
[root@oradb asm]# rpm - Uvh oracleasm - support - 2.1.3 - 1.el5 . i386 . rpm
验证安装的包
[root@oradb asm]# rpm - qa | grep asm
oracleasm - support - 2.1.3 - 1.el5
oracleasm - 2.6.18 - 164.el5 - debuginfo - 2.0.5 - 1.el5
oracleasm - 2.6.18 - 164.el5 - 2.0.5 - 1.el5
2. 启用 css 服务 ( Cluster Synchronization Services )
用于同步 ASM 实例与 RDBMS 实例
使用 root 帐户进行配置 , 配置程序位于 $ORACLE_HOME/bin
[root@oradb ~]# / u01 / oracle / 10g / bin / localconfig add
/ etc / oracle does not exist . Creating it now .
Successfully accumulated necessary OCR keys .
Creating OCR keys for user 'root' , privgrp 'root' ..
Operation successful .
Configuration for local CSS has been initialized
Adding to inittab
Startup will be queued to init within 90 seconds .
Checking the status of new Oracle init process ...
Expecting the CRS daemons to be up within 600 seconds .
CSS is active on these nodes .
oradb
CSS is active on all nodes .
Oracle CSS service is installed and running under init ( 1M )
3. 创建 ASM 参数文件 ( 使用 VI 或 VIM )
[oracle@oradb dbs]$ cat / u01 / oracle / 10g / dbs / init + ASM . ora
*. asm_diskstring = '' # 为空表示可以搜索任意的 ASM 磁盘
*. background_dump_dest = '/u01/oracle/admin/+ASM/bdump' # 后台进程存放位置
*. core_dump_dest = '/u01/oracle/admin/+ASM/cdump' # 核心进程存放位置
*. user_dump_dest = '/u01/oracle/admin/+ASM/udump' # 用户进程存放位置
*. instance_type = 'ASM' # 实例类型,普通实例默认则为 RDBMS
*. instance_name = '+ASM' # 实例名字
*. large_pool_size = 12M # 为实例分配 large_pool 的大小
*. remote_login_passwordfile = 'SHARED' # 登陆认证方式
*. asm_power_limit = 1 # 控制均衡操作的资源,缺省为
4. 创建 ASM 后台进程目录,参照参数文件中的配置来创建
[oracle@oradb ~]$ echo $ORACLE_BASE
/ u01 / oracle / 10g
[oracle@oradb ~]$ mkdir - p $ORACLE_BASE / admin /+ ASM / bdump
[oracle@oradb ~]$ mkdir - p $ORACLE_BASE / admin /+ ASM / udump
[oracle@oradb ~]$ mkdir - p $ORACLE_BASE / admin /+ ASM / cdump
5. 创建密码文件及 spfile 参数文件
[oracle@oradb ~]$ orapwd file = $ORACLE_HOME / dbs / orapw + ASM password = redhat entries = 8
[oracle@oradb ~]$ export ORACLE_SID =+ ASM
SQL > conn / as sysdba
Connected to an idle instance .
SQL > startup
ASM instance started
ORA - 15110 : no diskgroups mounted
SQL > create spfile from pfile ;
SQL > select * from v$asm_diskgroup ;
no rows selected
7. 创建 ASM 磁盘及配置 ASMlib 驱动
在 Vmware 分配几个空闲的磁盘用于创建 ASM 磁盘,建议使用不同的磁盘控制器
下面使用个磁盘来组建 ASM 磁盘组 , 分别为 sdd , sde , sdf , sdg
分别对个磁盘进行分区 , 列出 sdd 的分区样例,其余如法炮制
[root@oradb ~]# fdisk /dev/sdd
Command (m for help): n
Command action
e extended
p primary partition (1-4)
p
Partition number (1-4): 1
First cylinder (1-261, default 1):
Using default value 1
Last cylinder or +size or +sizeM or +sizeK (1-261, default 261):
Using default value 261
Command (m for help): w
The partition table has been altered!
Calling ioctl() to re-read partition table.
Syncing disks.
创建 ASM 磁盘 ( 三种方法 )
a. 配置裸设备映射,修改 /etc/udev/rules.d/60-raw.rules 文件
使用 root 帐户修改 /etc/udev/rules.d/60-raw.rules 按如下方式添加磁盘
[root@oradb ~]# cat / etc / udev / rules . d / 60 - raw . rules -- 查看添加的内容
ACTION == "add" , KERNEL == "sdd1" , RUN += "/bin/raw /dev/raw/raw1 %N"
ACTION == "add" , ENV{MAJOR} == "8" , ENV{MINOR} == "1" , RUN += "/bin/raw /dev/raw/raw1 %M %m"
ACTION == "add" , KERNEL == "sde1" , RUN += "/bin/raw /dev/raw/raw2 %N"
ACTION == "add" , ENV{MAJOR} == "8" , ENV{MINOR} == "17" , RUN += "/bin/raw /dev/raw/raw2 %M %m"
[root@oradb ~]# start_udev # 重启 udev 服务
Starting udev : [ OK ]
[root@oradb ~]# ll / dev / raw
total 0
crw ------- 1 root root 162, 1 Nov 10 18:50 raw1
crw ------- 1 root root 162, 2 Nov 10 18:50 raw2
[root@oradb ~]# chown oracle : dba / dev / raw / raw [1-2] -- 修改属主,否则创建磁盘组时提示权限不够
b . 也可以采用下面的方式来增加磁盘,即直接修改 / etc / sysconfig / rawdevices ( root 帐户 )
[root@oradb ~]# vim / etc / sysconfig / rawdevices
[root@oradb ~]# cat / etc / sysconfig / rawdevices -- 查看增加的内容为 raw3,raw4
/ dev / raw / raw3 / dev / sdf1
/ dev / raw / raw4 / dev / sdg1
[root@oradb ~]# chown oracle : dba / dev / raw / raw [3-4] -- 修改属主,否则创建磁盘组时提示权限不够
[root@oradb ~]# ll / dev / raw /
total 0
crw ------- 1 oracle dba 162, 1 Nov 10 20:12 raw1
crw ------- 1 oracle dba 162, 2 Nov 10 20:12 raw2
crw ------- 1 oracle dba 162, 3 Nov 10 20:12 raw3
crw ------- 1 oracle dba 162, 4 Nov 10 20:12 raw4
重启裸设备服务
[root@oradb ~]# / sbin / service rawdevices restart
Assigning devices :
/ dev / raw / raw3 --> /dev/sdf1
/ dev / raw / raw3 : bound to major 8 , minor 81
/ dev / raw / raw4 --> /dev/sdg1
/ dev / raw / raw4 : bound to major 8 , minor 97
done
SQL > select instance_name , status from v$instance ;
INSTANCE_NAME STATUS
---------------- ------------
+ ASM STARTED
SQL > create diskgroup DG1 normal redundancy disk '/dev/raw/raw1' , '/dev/raw/raw2' ; -- 创建磁盘组 DG1
SQL > select * from v$fixed_table where name like '%ASM%' ; -- 查看和 asm 相关的视图
SQL > select name , allocation_unit_size , state , type ,
2 free_mb , required_mirror_free_mb req_mi_fr_mb , usable_file_mb
3 from v$asm_diskgroup ;
NAME ALLOCATION_UNIT_SIZE STATE TYPE FREE_MB REQ_MI_FR_MB USABLE_FILE_MB
--------------- -------------------- ----------- ------ ---------- ------------ --------------
DG1 1048576 MOUNTED NORMAL 296 0 148
SQL > create diskgroup DG2 normal redundancy disk '/dev/raw/raw3' , '/dev/raw/raw4' ; -- 创建磁盘组 DG2
SQL > select name , state , free_mb , required_mirror_free_mb , usable_file_mb -- 查看磁盘组的状态及信息
2 from v$asm_diskgroup ;
NAME STATE FREE_MB REQUIRED_MIRROR_FREE_MB USABLE_FILE_MB
--------------- ----------- ---------- ----------------------- --------------
DG1 MOUNTED 296 0 148
DG2 MOUNTED 296 0 148
SQL > select disk_number , total_mb , free_mb from v$asm_disk ;
DISK_NUMBER TOTAL_MB FREE_MB
----------- ---------- ----------
1 199 148
0 199 148
1 199 148
0 199 148
重新启动 Linux 主机后
SQL > startup -- 重新启动 ASM 实例,收到了磁盘组 insufficient 信息
ASM instance started
ORA - 15032 : not all alterations performed
ORA - 15063 : ASM discovered an insufficient number of disks for diskgroup "DG2"
ORA - 15063 : ASM discovered an insufficient number of disks for diskgroup "DG1"
SQL > ho ls - hlt / dev / raw # LINUX 主机重新启动之后属主性质已发生变化
total 0
crw ------- 1 root root 162, 4 Nov 10 20:28 raw4
crw ------- 1 root root 162, 3 Nov 10 20:28 raw3
crw ------- 1 root root 162, 2 Nov 10 20:28 raw2
crw ------- 1 root root 162, 1 Nov 10 20:28 raw1
原因:原始设备在引导时会重新映射。默认情况下,在引导时原始设备的拥有者将更改为 root 用户
将下面的内容增加到 / etc / rc . local 文件 ( root 帐户 ) ,重新启动主机,使得属主变为 oracle ,则不再出现类似的提示
chown oracle : dba / dev / raw / raw1
chown oracle : dba / dev / raw / raw2
chown oracle : dba / dev / raw / raw3
chown oracle : dba / dev / raw / raw4
chmod 660 / dev / raw / raw1
chmod 660 / dev / raw / raw2
chmod 660 / dev / raw / raw3
chmod 660 / dev / raw / raw4
SQL > drop diskgroup dg1 ; -- 将刚才创建的两个磁盘组删除
SQL > drop diskgroup dg2 ;
使用 root 帐户清除 /etc/udev/rules.d/60-raw.rules /etc/sysconfig/rawdevices 以及 /etc/rc.local 刚刚增加的记录
便于下面使用 asmlib 来创建 asm 磁盘
c . 使用 root 帐户配置 ASMLib 驱动及创建 ASM 磁盘, Oracle 建议使用 ASMLIB 驱动来配置 ASM 磁盘
[root@oradb ~]# / 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 [] : oracle
Default group to own the driver interface [] : dba
Start Oracle ASM library driver on boot ( y / n ) [n] : y
Scan for Oracle ASM disks on boot ( y / n ) [y] : y
Writing Oracle ASM library driver configuration : done
Initializing the Oracle ASMLib driver : [ OK ]
Scanning the system for Oracle ASMLib disks : [ OK ]
-- 注意下面创建磁盘前本人重新对磁盘分过区
[root@oradb ~]# ls / dev / oracleasm / disks
[root@oradb ~]# / etc / init . d / oracleasm createdisk VOL1 / dev / sdd1
Marking disk "VOL1" as an ASM disk : [ OK ]
[root@oradb ~]# / etc / init . d / oracleasm createdisk VOL2 / dev / sdd2
Marking disk "VOL2" as an ASM disk : [ OK ]
[root@oradb ~]# / etc / init . d / oracleasm createdisk VOL3 / dev / sde1
Marking disk "VOL3" as an ASM disk : [ OK ]
[root@oradb ~]# / etc / init . d / oracleasm createdisk VOL4 / dev / sde2
Marking disk "VOL4" as an ASM disk : [ OK ]
[root@oradb ~]# / etc / init . d / oracleasm listdisks
VOL1
VOL2
VOL3
VOL4
[root@oradb ~]# su - oracle
[oracle@oradb ~]$ export ORACLE_SID =+ ASM
[oracle@oradb ~]$ sqlplus / nolog
SQL > conn / as sysdba
SQL > startup
ASM instance started
ORA - 15110 : no diskgroups mounted
SQL > create diskgroup DG1 normal redundancy
2 failgroup FG1 disk '/dev/oracleasm/disks/VOL1' name VOL1
3 failgroup FG2 disk '/dev/oracleasm/disks/VOL2' name VOL2 ;
create diskgroup DG1 normal redundancy
*
ERROR at line 1 :
ORA - 15018 : diskgroup cannot be created -- 下面提示磁盘路径未在 discovery set 中设置
ORA - 15031 : disk specification '/dev/oracleasm/disks/VOL2' matches no disks
ORA - 15014 : location '/dev/oracleasm/disks/VOL2' is not in the discovery set
ORA - 15031 : disk specification '/dev/oracleasm/disks/VOL1' matches no disks
ORA - 15014 : location '/dev/oracleasm/disks/VOL1' is not in the discovery set
SQL > show parameter asm_diskstring
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
asm_diskstring string
SQL > alter system set asm_diskstring = '/dev/oracleasm/disks/VOL*' ;
SQL > create diskgroup DG1 normal redundancy -- 设置 asm_diskstring 后重新创建磁盘 DG1 成功
2 failgroup FG1 disk '/dev/oracleasm/disks/VOL1' name VOL1
3 failgroup FG2 disk '/dev/oracleasm/disks/VOL2' name VOL2 ;
SQL > select name , state , free_mb , required_mirror_free_mb , usable_file_mb
2 from v$asm_diskgroup ;
NAME STATE FREE_MB REQUIRED_MIRROR_FREE_MB USABLE_FILE_MB
--------------- ----------- ---------- ----------------------- --------------
DG1 MOUNTED 2964 0 1482
8. 创建 ASM 数据库
使用 dbca 工具根据提示来创建使用 ASM 存储的数据库
创建使用 ASM 存储的数据库完毕之后,对于 ASM 数据库启动应首先保证 ASM 实例先被启动,因为 RDBMS 是 ASM 实例服务的一个客户端
接下来再来启动 RDBMS
-- 首先启动 asm 实例
export ORACLE_SID =+ ASM
sqlplus / as sysdba
startup
exit
-- 接下来启动 rdbms 数据库
export ORACLE_SID = orcl
sqlplus / as sysdba
startup
三、创建 ASM 实例时的常见故障
1. 创建磁盘时出现错误可以查看 asm 日志
tail -f /var/log/oracleasm
2. 启动 asm 实例时出现 ORA-29701 错误
ORA-29701: unable to connect to Cluster Manager
首次需要启用 css 服务,使用 root 帐户 , 运行 $ORACLE_HOME/bin/localconfig add
如果下次启动实例的时候仍然碰到如下报错:
ORA-29701: unable to connect to Cluster Manager
那么检查 /etc/inittab 文件,看看是否有下面这行
h1:35:respawn:/etc/init.d/init.cssd run >/dev/null 2>&1 </dev/null
如果没有请添加,如果被注释了请取消注释 (root 帐户 ) 。
也可以使用 root 帐户执行 /u01/oracle/10g/bin/localconfig reset 来解决
3. 磁盘搜索路径问题
SQL > create diskgroup DG1 normal redundancy disk 'ORCL:VOL1' , 'ORCL:VOL2' ;
create diskgroup DG1 normal redundancy disk 'ORCL:VOL1' , 'ORCL:VOL2'
*
ERROR at line 1 :
ORA - 15018 : diskgroup cannot be created
ORA - 15031 : disk specification 'ORCL:VOL2' matches no disks
ORA - 15031 : disk specification 'ORCL:VOL1' matches no disks
使用 oraclasm 创建磁盘后,缺省会在 / dev / oracleasm / disks 目录下添加刚刚创建的磁盘映射
修改 asm_diskstring 修改路径之后再次创建即可
alter system set asm_diskstring = '/dev/oracleasm/disks/VOL*'