Oracle ASM管理竟然如此登峰造极

bash 复制代码
作者:IT邦德
中国DBA联盟(ACDU)成员,10余年DBA工作经验
擅长主流数据Oracle、MySQL、PG、openGauss运维
备份恢复,安装迁移,性能优化、故障应急处理等

可提供技术业务:
1.DB故障处理/疑难杂症远程支援
2.Mysql/PG/Oracle/openGauss
数据库部署及数仓搭建

公众号:IT邦德
•••

@TOC

前言

ASM(Auto Storage Management)简称自动存储管理,是一种用于管理磁盘的工具,是 oracle 推荐的一种智能化数据库文件存储管理。


1.概述

ASM它采用 Oracle Managed Files(OMF)文件格式来创建目录文件,能够在多个物理设备之间实现条带化、镜像数据文件、恢复文件等。ASM 是 Oracle 数据库的存储解决方案。ASM 通过自动管理磁盘组来平衡 I/O,通过镜像技术来实现数据文件的高可用性。

文件按分配单元AU(allocation units)平衡分布在磁盘组的所有磁盘中,ASM 使用索引技术来跟踪每个 AU 的位置,ASM 支持联机磁盘的动态增加和减少,当磁盘发生变化后,AU 会自动重新实现动态分布,支持单实例 Oracle 数据库和Oracle RAC 集群环境。

2.ASM 的优点

使用 ASM 自动存储管理减少了 DBA 维护数据库文件的工作量,提高了数据文件的可靠性和高性能的磁盘 I/O,避免磁盘热点等,ASM 磁盘管理主要有以下几个优势:
1、自动磁盘管理:增加和删除磁盘的指令十分简单,而磁盘文件的重部署由 ASM 自动完成,不需要 DBA 的干预。无需停机,并且文件区域自动重新分配。
2、文件级镜像:通过在创建磁盘组时提供故障组,实现了文件级的冗余备份。提高了数据文件的可用性。
3、避免磁盘热点:ASM 自动将一个文件的存储均衡在组中的磁盘上分布,提供条带化技术实现这种文件的均衡分布。
4、方便管理数据库文件:添加和删除文件只需要告诉磁盘组这种操作即可,具体对文件的操作、空间分配等都由 ASM 去管理。
5、ASM 使用方便:其指令是 SQL 语句,对磁盘的操作都可以通过熟悉的 SQL来实现。
6、ASM 部署简单:相比第三方存储管理软件而言其免费提供,为中小型企业节约成本。
7、I/O 分配:I/O 自动分布在所有可用的磁盘上,无需人工干预,减少热点出现的可能性。
8、缓冲:ASM 文件系统不进行缓冲,直接进行输入/输出。

2.ASM架构

ASM 体系结构,主要由 ASM 实例及 ASM 磁盘组组成。
需要创建一个 ASM 实例,用于管理 ASM 磁盘组,
ASM 磁盘组由 ASM 磁盘组成,可以包含一个或多个 ASM
磁盘,ASM 磁盘可以是实际的磁盘,也可以是磁盘的某
个分区,或 LVM 管理的逻辑卷,但必须是未格式化的原始设备,
ASM 磁盘组的大小为该组内 ASM 磁盘大小的总和,
可使用的容量则根据容错级别而有不同的可用大小。

2.1 ASM 实例

bash 复制代码
1. ASM实例有自己的初始化参数
-- $ORACLE_HOME/dbs/spfile+ASM.ora
2. ASM不需要控制文件
3. ASM实例的正常状态为started

ASM 实例类似于普通的数据库实例(RDBMS), 同样由 SGA 和一堆后台进程组成。 
普通的 RDBMS 实例会定位数据文件并打开其数据文件, 而在使用 ASM 存储的
数据库中, 该工作由 ASM 实例接管, 即 ASM 实例用于定位和管理 ASM 磁盘, 
磁盘组不能加载或打开数
据库, 因此也无法读取数据字典信息。
ASM 实例拥有类似于普通 RDBMS 实例的后台进程, 
如 SMON, PMON, LGWR, DBWR,CKPT 等, 
还增添了两个新进程,RBAL、 ARBn。 
RBAL 用于协调和管理磁盘组之间的动态平衡, ARBn 用于完成 AU 的移动。
ASM只能使用口令文件或操作系统身份验证作为 sysasm 或 sysoper 来启动或关闭该实例。 
一个 ASM 实例可以为多个 RDBMS提供服务, 
通常一台主机上使用一个 ASM 实例, 
ASM 实例启动之后进行创建与配置 ASM 磁盘组。
ASM 实例并不能代替 RDBMS 实例来读取或写入数据文件, 
数据是直接在 ASM磁盘和 RDBMS 实例传递, 
ASM实例仅用于定位数据文件。

2.2 ASM 磁盘

sql 复制代码
ASM DiskASM 磁盘是组成Disk Group 的存储设备, 包括:
1.存储阵列的单个磁盘或分区
2.整个物理磁盘或磁盘上的分区
3.逻辑卷
4.网络存储文件(NFS)
当增加一个磁盘到Disk Group 时, 
可以手工设定ASM 磁盘名或由ASM 自动指派ASM 磁盘名。 
ASM 的磁盘名不同于操作系统的路径名。

3.ASM 磁盘组

css 复制代码
ASM 磁盘组是一组磁盘或磁盘分区的逻辑组合,
对用户而言看到的就是一个磁盘组,将文件存储入磁盘组,
其他的管理工作由 ASM 去完成。如平衡文件的磁盘分布等,
用户可以方便地向 ASM 中添加磁盘组,以及向磁盘
组添加或删除磁盘文件,以增大磁盘的可用空间或删除不必要的磁盘。
当向diskgroup1存储数据库文件时,此时在三个故障组中分别存储该文件的完全备份,
实现了数据文件存储的冗余,这样就提高了数据文件的高可靠性,
而在每个故障组中,ASM实现了条带化存储,这样就实现了平衡磁盘
I/O。镜像的含义就是对数据文件的冗余备份,ASM提供三类镜像类型,
分别是外部冗余、常规冗余、高冗余。
ASM有三种镜像类型:

3.1 外部冗余

外部冗余(external redundancy)没有镜像的一种冗余,即在磁盘组中没有故障组

3.2 常规冗余

常规冗余(normal redundancy)要求磁盘组具有二个故障组,每个故障组一个磁盘控 制器。

3.3 高冗余

高冗余(high redundancy)要求磁盘组具有三个故障组,每个故障组一个磁盘控制 器

3.ASM的运维及管理

3.1 ASM启动及关闭

ini 复制代码
ASM启动
1. 以 SYSASM 权限连接;
2. 初始化参数文件必须包含以下条目:
INSTANCE_TYPE = ASM 此参数指示正在启动 Oracle ASM 实例, 而不是数据库实例。
3. 运行该 STARTUP 命令时, 此命令将尝试装入 Oracle ASM 磁盘组, 而不是尝试装入和打开数据库。
4. 启动关联的 Oracle ASM 实例时, 不必运行关联的 Oracle 数据库实例。
5. Startup 命令就是 mount 磁盘组;
6. Startup force 会 abort ASM 实例然后重启 ASM;
7. Startup RESTRICT 启动限制访问模式, 不允许其他实例 mount 该 ASM 下的磁盘组;

ASM关闭
以 SYSASM 权限连接; 需要先关闭数据库;

3.2 创建 Disk Groups

makefile 复制代码
创建磁盘组的方法:
1)通过 ASMCA 工具来配置 ASM 增加磁盘组
2)通过命令行方式手工创建磁盘组。
sql 复制代码
##创建外部冗余
create diskgroup dg_ext external redundancy disk '/dev/sdc' name dg_ext1;
bash 复制代码
#创建标准冗余, 每个故障组有一个成员
create diskgroup dg_nor1 normal redundancy
failgroup FG1 disk '/dev/sde' name VOL1
failgroup FG2 disk '/dev/sdf' name VOL2;
lua 复制代码
创建高冗余, 每个故障组有一个成员
create diskgroup dg_high1 high redundancy
failgroup FG1 disk '/dev/sde' name VOL1
failgroup FG2 disk '/dev/sdf' name VOL2
failgroup FG3 disk '/dev/sdg' name VOL3;

3.3 平衡磁盘组

sql 复制代码
在 ASM 实例中有一个参数 ASM_POWER_LIMIT,
该参数的作用是控制对磁盘的平衡速度, 参数越大说明磁盘平衡操作速度越快,
可以根据性能要求调整该参数来影响对某个磁盘组的平衡速度。
SQL> show parameter asm_power_limit
NAME TYPE VALUE
--------------- ----------- ---------------------
asm_power_limit integer 9
修改该参数值
SQL> alter system set asm_power_limit=14;
手动平衡磁盘组
SQL> alter diskgroup DATA rebalance power 12;

3.4 drop磁盘组

sql 复制代码
磁盘组和卸载
alter diskgroup DG_NOR1 dismount;
--此操作删除数据
drop diskgroup DG_NOR1 force including contents;

3.5 添加删除磁盘组

sql 复制代码
alter diskgroup dg_ext drop disk dg_ext1;
alter diskgroup dg_ext add disk '/dev/sdc' name dg_ext1;

4.ASMCDM

sql 复制代码
--查询 Oracle ASM 实例及其客户端使用的 diskstring 发现值
ASMCMD> dsget
parameter:/dev/sd*
profile:/dev/sd*

--设置 Oracle ASM 实例及其客户端使用的磁盘发现 diskstring 值
ASMCMD> dsset /dev/sd*

--列出 Oracle ASM 客户端的信息
ASMCMD> lsct
DB_Name Status Software_Version Compatible_version Instance_Name Disk_Group
+ASM CONNECTED 19.0.0.0.0 19.0.0.0.0 +ASM DATA
prod CONNECTED 19.0.0.0.0 19.0.0.0.0 prod DATA

--列出 Oracle ASM 密码文件中的用户
ASMCMD> lspwusr
Username sysdba sysoper sysasm
SYS TRUE TRUE TRUE
ASMSNMP TRUE FALSE FALSE

--添加、 删除或更改 Oracle ASM 密码用户
ASMCMD> orapwusr --add hruser
ASMCMD> orapwusr --grant sysasm hruser
ASMCMD> lspwusr
ASMCMD> orapwusr --revoke sysasm hruser
ASMCMD> lspwusr
ASMCMD> orapwusr --delete hruser

--将密码文件复制到指定位置
ASMCMD> pwcopy --asm -f +DATA/orapwasm +FRA/orapwasm_new

--在指定位置创建密码文件
ASMCMD> pwcreate --dbuniquename cdb1 '+data/orapwcdb1'

--删除指定位置的密码文件
ASMCMD> pwdelete --dbuniquename cdb1

--查找密码文件的位置
ASMCMD> pwget --asm

--列出 GI 的修补程序
ASMCMD> showpatches
---------------
List of Patches
===============
29401763
29517242
29517247
29585399

--关闭实例
ASMCMD> shutdown

5.数据字典

vbnet 复制代码
select group_number,disk_number,path,name,failgroup,total_mb,free_mb from v$asm_disk;
SQL> select name,state,type from v$asm_diskgroup;
NAME STATE TYPE
------------------------------ ----------- ------
ARCH MOUNTED NORMAL
DATA MOUNTED EXTERN
FRA MOUNTED HIGH

--Viewing disks in disk groups with V$ASM_DISK

SELECT SUBSTR(d.name,1,16) AS asmdisk, d.mount_status, d.state,
dg.name AS diskgroup FROM V$ASM_DISKGROUP dg, V$ASM_DISK d WHERE
dg.group_number = d.group_number;

--Viewing disk group clients with V$ASM_CLIENT

SELECT dg.name AS diskgroup, SUBSTR(c.instance_name,1,12) AS
instance,SUBSTR(c.db_name,1,12) AS dbname,
SUBSTR(c.SOFTWARE_VERSION,1,12) AS software,
SUBSTR(c.COMPATIBLE_VERSION,1,12) AS compatible FROM V$ASM_DISKGROUP
dg, V$ASM_CLIENT c WHERE dg.group_number = c.group_number;
相关推荐
中杯可乐多加冰2 个月前
【AI落地应用实战】DAMODEL深度学习平台部署+本地调用ChatGLM-6B解决方案
人工智能·掘金·金石计划
中杯可乐多加冰2 个月前
Amazon Bedrock +Amazon Step Functions实现链式提示(Prompt Chaining)
人工智能·掘金·金石计划
阿李贝斯2 个月前
el-select海量数据渲染-分页解决方案
前端·javascript·掘金·金石计划
宇宙之一粟3 个月前
Error Flows in Go
后端·go·掘金·金石计划
雨绸缪3 个月前
如何在 Eclipse 中调试ABAP程序
后端·掘金·金石计划
中杯可乐多加冰3 个月前
解决方案:昇腾aarch64服务器安装CUDA+GCC+CMake,编译安装Pytorch,华为昇腾HPC服务器深度学习环境安装全流程
人工智能·掘金·金石计划
雨绸缪4 个月前
第 1章 BW 建模工具概念介绍
后端·数据挖掘·掘金·金石计划
宇宙之一粟4 个月前
Python Asyncio 如何工作?从零开始重新创建
后端·python·掘金·金石计划
中杯可乐多加冰4 个月前
与Apollo共创生态:Apollo7周年大会的心得体会
自动驾驶·掘金·金石计划