大家好,我是JiekeXu,江湖人称“强哥”,青学会MOP技术社区主席,荣获Oracle ACE Pro称号,金仓最具价值倡导者KVA,崖山最具价值专家YVP,IvorySQL开源社区专家顾问委员会成员,墨天轮MVP,墨天轮年度“墨力之星”,拥有 Oracle OCP/OCM 认证,MySQL 5.7/8.0 OCP 认证以及金仓KCA、KCP、KCM、KCSM证书,PCA、PCTA、OBCA、OGCA等众多国产数据库认证证书,欢迎关注我的微信公众号“JiekeXu DBA之路”,然后点击右上方三个点“设为星标”置顶,更多干货文章才能第一时间推送,谢谢!

前 言
因生产环境 ASM 磁盘 DATA 磁盘组现有三块磁盘大小不一,分别为 400G、800G、1024G 大小,当后期数据增长,将其中最小的一块盘剩余量 169G 用完后,新加磁盘组将无法进行 rebalance 再平衡,这将导致新加磁盘不可用,以及无法添加数据文件扩展表空间等造成的业务数据无法写入,业务不可用等严重后果。

故在合适的停机窗口下新申请两块 1024G 的共享存储,添加进入 ASM 实例,再将其 400G 和 800G 的磁盘剔出 ASM,后面在将其剔出操作系统回收存储。

磁盘优化方案
以下为变更步骤:
首先存储工程师需要新加两块 1T 存储,配置好存储和多路径(由存储工程师完成)。通过查看磁盘多路径 multipath -ll 或者 powermt display dev=all 或者华为的 upadmin show vlun。
这里以新加的磁盘名为 emcpowerm 和 emcpowern 为例。
查看新添加的设备名
确保扫盘成功,新加磁盘已经存在于两台 RAC 所在主机系统。
[oracle@ora-rac1 dev]$ ls -l emc* [oracle@ora-rac1 dev]$ ls -l asm*
查看现有环境 ASM 磁盘大小和使用情况
su - grid
sqlplus / as sysasm
set lin 1000 pagesize 999
col NAME for a25
col FAILGROUP for a15
col path for a55
select GROUP_NUMBER,DISK_NUMBER,OS_MB/1024,TOTAL_MB/1024,FREE_MB/1024,NAME,FAILGROUP,PATH,FAILGROUP_TYPE,header_status,state from v$asm_disk order by 1;
select GROUP_NUMBER,NAME,STATE,TYPE,TOTAL_MB/1024,FREE_MB/1024,USABLE_FILE_MB/1024,HOT_USED_MB,COLD_USED_MB/1024 from v$asm_diskgroup;

检查各个节点多路径配置文件及 udev 配置文件
multipath 配置
# 设置开机自启动
systemctl enable multipathd.service
# 检查开机自启动
systemctl list-unit-files|grep multipath
# 创建多路径参数配置文件,该语句会创建multipath的参数配置文件:/etc/multipath.conf
/sbin/mpathconf --enable
# 启动多路径软件 multipathd
systemctl start multipathd.service
# 重新加载配置
systemctl reload multipathd
# multipath -F #删除现有路径
# multipath -v2 #格式化路径
# multipath -ll #查看多路径
## 使用以下命令查看 WWID:
udevadm info --query=all --name=/dev/sdb | grep DM_SERIAL
# multipath.conf 主要包括 blacklist、multipaths、devices三部份的配置
blacklist配置
blacklist {
devnode "^sda"
}
Multipaths部分配置multipaths和devices两部份的配置。
multipaths {
multipath {
wwid 36000144000000010e0177a93f3962e72 #此值 multipath -v3 也可以查看
alias dm5 #映射后的别名,可以随便取
path_grouping_policy multibus #路径组策略
path_checker tur #决定路径状态的方法
path_selector "round-robin 0" #选择那条路径进行下一个IO操作的方法
}
}
Devices部分配置
devices {
device {
vendor "iSCSI-Enterprise" #厂商名称
product "Virtual disk" #产品型号
path_grouping_policy multibus #默认的路径组策略
getuid_callout "/sbin/scsi_id -g -u -s /block/%n" #获得唯一设备号使用的默认程序
prio_callout "/sbin/acs_prio_alua %d" #获取有限级数值使用的默认程序
path_checker readsector0 #决定路径状态的方法
path_selector "round-robin 0" #选择那条路径进行下一个IO操作的方法
failback immediate #故障恢复的模式
no_path_retry queue #在disable queue之前系统尝试使用失效路径的次数的数值
rr_min_io 100 #在当前的用户组中,在切换到另外一条路径之前的IO请求的数目
}
}
[oracle@ora-rac1 rules.d]$ more /etc/multipath.conf
#blacklist {
# wwid 26353900f02796769
# devnode "^(ram|raw|loop|fd|md|dm-|sr|scd|st)[0-9]*"
# devnode "^hd[a-z]"
#}
multipaths {
# multipath {
# wwid 3600508b4000156d700012000000b0000
# alias yellow
# path_grouping_policy multibus
# path_checker readsector0
# path_selector "round-robin 0"
# failback manual
# rr_weight priorities
# no_path_retry 5
# }
multipath {
wwid 36a0406f100c8ae7b002bb7a000000019
alias otwrac-arch01
}
multipath {
wwid 36a0406f100c8ae7b002aba4a0000000f
alias otwrac-data01
}
multipath {
wwid 36a0406f100c8ae7b002bfef00000001e
alias otwrac-ocr03
}
multipath {
wwid 36a0406f100c8ae7b002bfef00000001d
alias otwrac-ocr02
}
multipath {
wwid 36a0406f100c8ae7b002bfef00000001c
alias otwrac-ocr01
}
}
devices {
device {
vendor "HUAWEI"
product "XSG1"
path_grouping_policy multibus
path_checker tur
prio const
path_selector "round-robin 0"
failback immediate
dev_loss_tmo 30
fast_io_fail_tmo 5
no_path_retry 6
}
# device {
# vendor "COMPAQ "
# product "MSA1000 "
# path_grouping_policy multibus
# }
}
UDEV 配置文件
[root@ora-rac1 ~]# cd /etc/udev/rules.d [root@ora-rac1 rules.d]# ll total 4 -rw-r--r-- 1 root root 2486 Sep 15 17:16 99-oracle-asmdisks.rules [root@ora-rac1 rules.d]# more /etc/udev/rules.d/99-oracle-asmdisks.rules ##文件名不一定是这个 [root@otwrac-11 ~]# more /etc/udev/rules.d/109-oracle-asmdisks.rules KERNEL=="dm-*",SUBSYSTEM=="block", PROGRAM=="/usr/lib/udev/scsi_id -g -u -d $devnode",RESULT=="36a0406f100c8ae7b002bfef00000001e",SYMLINK+="asmdisks/otwrac-ocr03",OWNER="grid", GROUP="asmadmin", MODE="0660" KERNEL=="dm-*",SUBSYSTEM=="block", PROGRAM=="/usr/lib/udev/scsi_id -g -u -d $devnode",RESULT=="36a0406f100c8ae7b002bfef00000001d",SYMLINK+="asmdisks/otwrac-ocr02",OWNER="grid", GROUP="asmadmin", MODE="0660" KERNEL=="dm-*",SUBSYSTEM=="block", PROGRAM=="/usr/lib/udev/scsi_id -g -u -d $devnode",RESULT=="36a0406f100c8ae7b002bfef00000001c",SYMLINK+="asmdisks/otwrac-ocr01",OWNER="grid", GROUP="asmadmin", MODE="0660" KERNEL=="dm-*",SUBSYSTEM=="block", PROGRAM=="/usr/lib/udev/scsi_id -g -u -d $devnode",RESULT=="36a0406f100c8ae7b002aba4a00000018",SYMLINK+="asmdisks/otwrac-data10",OWNER="grid", GROUP="asmadmin", MODE="0660" KERNEL=="dm-*",SUBSYSTEM=="block", PROGRAM=="/usr/lib/udev/scsi_id -g -u -d $devnode",RESULT=="36a0406f100c8ae7b002aba4a00000017",SYMLINK+="asmdisks/otwrac-data09",OWNER="grid", GROUP="asmadmin", MODE="0660" ...
获取磁盘 scsi_id 并写入配置文件
--物理机获取新加磁盘的 scsi_id /lib/udev/scsi_id --whitelisted --device=/dev/emcpowerm /lib/udev/scsi_id --whitelisted --device=/dev/emcpowern --虚拟机获取新加磁盘的 scsi_id /usr/lib/udev/scsi_id -g -u /dev/sdk 36000c29ab70ff45ff0c378d8695c70eb /usr/lib/udev/scsi_id -g -u /dev/sdl 36000c29c8bfd389fbad7282470eafc5f
然后将新加磁盘配置信息写入各个节点的 udev 配置文件
物理机 EMC 存储: vi /etc/udev/rules.d/99-oracle-asmdevices.rules 虚拟机共享存: vim /etc/udev/rules.d/99-oracle-asmdisks.rules
这里有个小问题,通过多路径配置后,磁盘就会出现多个,比如下面 multipath -ll 后出现 sdc、sdo、sdaa、sdam 四块磁盘,那么到底在 UDEV 配置文件中该怎么写呢?是写这四块盘,还是写上面一行的 dm-5 或者 JIEKEDB-ARCH01 呢?
答案是要写 dm-5 这个别名,在之前 19c RAC on RHEL9.6 安装《Oracle 19c RAC ADG on RHEL9.6 遇到的几个坑 续集》那篇说过了,感兴趣的可以去看看。
[root@t-19crac-r1 backup]# multipath -ll JIEKEDB-ARCH01 (36000144000000010e0177a93f3962e72) dm-5 EMC,Invista size=2.0T features='1 queue_if_no_path' hwhandler='0' wp=rw `-+- policy='service-time 0' prio=1 status=active |- 13:0:0:0 sdc 8:32 active ready running |- 13:0:1:0 sdo 8:224 active ready running |- 15:0:0:0 sdaa 65:160 active ready running `- 15:0:1:0 sdam 66:96 active ready running
这里是添加删除磁盘,将较小的磁盘 emcpowerk* 和 emcpowera* 对应的 asm-data-01 和 asm-data-00 行删除,新加两行 1T 大小的磁盘信息。
--删除以下两行
KERNEL=="emcpowerk*", SUBSYSTEM=="block", PROGRAM=="/sbin/scsi_id --whitelisted --replace-whitespace --device=/dev/$name", RESULT=="36000144000000010f0172f82535a87b0", NAME="asm-data-01", OWNER="grid", GROUP="asmadmin", MODE="0660"
KERNEL=="emcpowera*", SUBSYSTEM=="block", PROGRAM=="/sbin/scsi_id --whitelisted --replace-whitespace --device=/dev/$name", RESULT=="36000144000000010f0172f82535a85dc", NAME="asm-data-00", OWNER="grid", GROUP="asmadmin", MODE="0660"
--生产物理机新加信息
KERNEL=="emcpowerm*", SUBSYSTEM=="block", PROGRAM=="/sbin/scsi_id --whitelisted --replace-whitespace --device=/dev/$name", RESULT=="36000144000000010f0172f82535a87b0", NAME="asm-data-03", OWNER="grid", GROUP="asmadmin", MODE="0660"
KERNEL=="emcpowerm*", SUBSYSTEM=="block", PROGRAM=="/sbin/scsi_id --whitelisted --replace-whitespace --device=/dev/$name", RESULT=="36000144000000010f0172f82535a85dc", NAME="asm-data-04", OWNER="grid", GROUP="asmadmin", MODE="0660"
--虚拟机新加信息
KERNEL=="sd*", ACTION=="add|change", SUBSYSTEM=="block", PROGRAM=="/lib/udev/scsi_id -g -u -d /dev/$name", RESULT=="36000c29c8bfd389fbad7282470eafc5f", SYMLINK+="asmdisks/asm-data02", OWNER="grid", GROUP="asmadmin", MODE="0660"
KERNEL=="sd*", ACTION=="add|change", SUBSYSTEM=="block", PROGRAM=="/lib/udev/scsi_id -g -u -d /dev/$name", RESULT=="36000c29ab70ff45ff0c378d8695c70eb", SYMLINK+="asmdisks/asm-fra01", OWNER="grid", GROUP="asmadmin", MODE="0660"
然后依次修改其他节点 udev 配置文件。或者将此文件 scp 传至其他节点。
为了保险起见,如果有停机窗口需要关闭数据库集群重载规则后再启动(非必须,业务低峰期操作)
/u01/app/19.0.0/grid/bin/crsctl stop crs --或者关闭各个节点监听,禁止对外提供服务,然后重载规则。 lsnrctl stop
各个节点重载 udev 规则并触发udev生效
udevadm control --reload-rules
udevadm trigger
--或者使用如下命令
# /sbin/udevadm trigger --type=devices --action=change
查看新生成的磁盘
正常情况下会生成对应的磁盘,属组为 grid:asmadmin,权限 660 或者是属主为 root:root,权限 777 的软链接。
# ls -lrth /dev/sd*
# ls -l /dev/asmdisks/asm*
[root@ora-rac1 asmdisks]# ls -l /dev/asmdisks/asmdiskc
lrwxrwxrwx 1 root root 6 Nov 5 10:23 /dev/asmdisks/asmdiskc -> ../sde
[root@ora-rac1 asmdisks]# ls -l /dev/sde
brw-rw---- 1 grid asmadmin 8, 64 Nov 5 10:24 /dev/sde
--正常情况下会生成 asm-data-03 和 asm-data-04,属组为grid:asmadmin,权限 660
brw-rw---- 1 grid asmadmin 120, 160 Jun 10 15:54 asm-data-03
brw-rw---- 1 grid asmadmin 120, 176 Jun 10 15:54 asm-data-04
--虚拟机查看
ls -lrth /dev/asmdisks/asm-data*
--正常情况下会生成 asm-data02
然后各个节点查看是否都已经生成并检查权限和属组。磁盘权限均正常后启动 CRS 集群。

[root@orarac-86 dev]# ll /dev/sdk
brw-rw---- 1 grid asmadmin 8, 160 May 15 17:04 /dev/sdk
[root@orarac-86 dev]# ll /dev/sdl
brw-rw---- 1 grid asmadmin 8, 176 May 15 17:04 /dev/sdl
[root@orarac-86 dev]#
# /u01/app/19.0.0/grid/bin/crsctl start crs
# /u01/app/19.0.0/grid/bin/crsctl status res -t -init
# /u01/app/19.0.0/grid/bin/crsctl status res -t
grid 用户添加磁盘
先查看磁盘
接下来进入 grid 数据库添加删除磁盘,添加前先查看有哪些可使用的磁盘。
su - grid
sqlplus / as sysasm
set lin 1000 pagesize 999
col NAME for a15
col FAILGROUP for a15
col path for a18
select GROUP_NUMBER,DISK_NUMBER,OS_MB/1024,TOTAL_MB/1024,FREE_MB/1024,NAME,FAILGROUP,PATH,FAILGROUP_TYPE,header_status,state from v$asm_disk order by 1;
--select GROUP_NUMBER,NAME,STATE,TYPE,TOTAL_MB/1024,FREE_MB/1024,USABLE_FILE_MB/1024,HOT_USED_MB,COLD_USED_MB/1024 from v$asm_diskgroup;
GROUP_NUMBER DISK_NUMBER OS_MB/1024 TOTAL_MB/1024 FREE_MB/1024 NAME FAILGROUP PATH FAILGRO HEADER_STATU STATE
------------ ----------- ---------- ------------- ------------ --------------- --------------- ------------------------------ ------- ------------ --------
0 1 300 0 0 /dev/sdl REGULAR CANDIDATE NORMAL
0 0 300 0 0 /dev/sdm REGULAR CANDIDATE NORMAL
1 0 300 300 267.585938 ARCH_0000 ARCH_0000 /dev/sdk REGULAR MEMBER NORMAL
2 3 300 300 74.2460938 DATA_0003 DATA_0003 /dev/sdi REGULAR MEMBER NORMAL
2 4 300 300 74.2734375 DATA_0004 DATA_0004 /dev/sdj REGULAR MEMBER NORMAL
2 1 300 300 74.2460938 DATA_0001 DATA_0001 /dev/sdg REGULAR MEMBER NORMAL
2 2 300 300 74.296875 DATA_0002 DATA_0002 /dev/sdh REGULAR MEMBER NORMAL
2 0 300 300 74.234375 DATA_0000 DATA_0000 /dev/sdf REGULAR MEMBER NORMAL
3 1 3 3 2.6484375 OCR_0001 OCR_0001 /dev/sdd REGULAR MEMBER NORMAL
3 2 3 3 2.66015625 OCR_0002 OCR_0002 /dev/sde REGULAR MEMBER NORMAL
3 0 3 3 2.65234375 OCR_0000 OCR_0000 /dev/sdc REGULAR MEMBER NORMAL

注意看比之前多出两行的信息,
HEADER_STATU列为FORMER表示ASM可使用此磁盘。
添加磁盘
查看均衡参数及检查磁盘平衡的剩余时间
SQL> show parameter limit
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
asm_power_limit integer 1
SQL> select * from v$asm_operation;
no rows selected
select operation,state,actual,round(est_minutes/60,1) est_hours,est_minutes,error_code from v$asm_operation;
添加磁盘的同时删除磁盘
alter diskgroup DATA add disk '/dev/asm-data-03','/dev/asm-data-04' drop disk 'DATA_0000','DATA_0001';
添加多块磁盘(虚拟机示例),注意:添加的时候是上面 v$asm_disk 视图查出来的 Path 路径 header_status 状态为 CANDIDATE 或 FORMER 状态的磁盘路径。
--添加多块磁盘
alter diskgroup DATA add disk '/dev/sdl','/dev/sdm';
仅添加一块磁盘
alter diskgroup DATA add disk '/dev/asmdisks/asm-data02';
alter diskgroup FRA add disk '/dev/asmdisks/asm-fra01';
-- 下面报错就是在上一篇文章中提到的集群补丁不一致的问题
ORA-15032: not all alterations performed
ORA-15137: The ASM cluster is in rolling patch state.
在业务空闲时调整磁盘平衡参数
ALTER DISKGROUP DATA REBALANCE POWER 10;
ASM_POWER_LIMIT 取值范围是 0 ~ 1024,缺省值为 1。值为 0 时禁用再平衡,更高的数值使重新平衡操作能够更快地完成,但可能会导致更高的 I/O 开销和更多的重新平衡进程。磁盘组 ASM 兼容性设置为 11.2.0.2 或更高(例如COMPATIBLE.ASM = 11.2.0.2),再平衡功率的操作范围为 0 到 1024。
对于磁盘组 ASM 兼容性设置为小于 11.2.0.2 的磁盘组,取值范围为 0 ~ 11(含11)。 如果 ASM_POWER_LIMIT 的值大于 11,则对这些磁盘组使用 11。
SQL> select GROUP_NUMBER,NAME,SECTOR_SIZE,BLOCK_SIZE,STATE,TOTAL_MB/1024 Total_GB,FREE_MB/1024,COLD_USED_MB/1024,COMPATIBILITY,DATABASE_COMPATIBILITY from v$asm_diskgroup;
GROUP_NUMBER NAME SECTOR_SIZE BLOCK_SIZE STATE TOTAL_GB FREE_MB/1024 COLD_USED_MB/1024 COMPATIBILITY DATABASE_COMPATIBILITY
------------ --------------- ----------- ---------- ----------- ---------- ------------ ----------------- ----------------------------------- -------------------------
1 OCR 512 4096 MOUNTED 9 7.98046875 1.01953125 19.0.0.0.0 10.1.0.0.0
2 DATA 512 4096 CONNECTED 2100 220.289063 1879.71094 19.0.0.0.0 10.1.0.0.0
3 ARCH 512 4096 CONNECTED 300 247.523438 52.4765625 19.0.0.0.0 10.1.0.0.0
--设置磁盘组 compatible 参数值示例,需谨慎,参数不可逆
ALTER DISKGROUP data SET ATTRIBUTE 'compatible.asm' = '19.0';
ALTER DISKGROUP data SET ATTRIBUTE 'compatible.rdbms' = '19.0.0.0.0';
查看均衡时间
均衡时间是 Oracle 预估算的时间,并不是真实的时间。
SQL> select operation,state,actual,round(est_minutes/60,1) est_hours,est_minutes from v$asm_operation;
OPERA STAT ACTUAL EST_HOURS EST_MINUTES
----- ---- ---------- ---------- -----------
REBAL RUN 10 .2 12
-- ERROR_CODE 没有错误码就是正常操作
SQL> select * from v$asm_operation;
GROUP_NUMBER OPERA STAT POWER ACTUAL SOFAR EST_WORK EST_RATE EST_MINUTES ERROR_CODE
------------ ----- ---- ---------- ---------- ---------- ---------- ---------- ----------- --------------------------------------------
2 REBAL RUN 10 10 2040 56442 4258 12
重平衡会经历三个阶段:
Planning ----> File extents relocation ----> Disk compacting
Planning --规划
File extents relocation --文件盘区重定位
Disk compacting --磁盘压缩

监控资源使用情况 top/iostat/iotop

查看数据库 alert 日志,等待均衡完成,收工,下班~
--查看 alert 日志,等待均衡完成。
Sat Jun 19 10:33:53 2021
SUCCESS: disk DATA_0003 (3.2746602556) added to diskgroup DATA
SUCCESS: disk DATA_0004 (4.2746602555) added to diskgroup DATA
Sat Jun 19 10:39:55 2021
Starting background process SMCO
Sat Jun 19 10:39:55 2021
SMCO started with pid=68, OS id=50605
Sat Jun 19 11:04:04 2021
NOTE: disk 0 (DATA_0000) in group 2 (DATA) is offline for reads
NOTE: disk 1 (DATA_0001) in group 2 (DATA) is offline for reads
NOTE: disk 0 (DATA_0000) in group 2 (DATA) is offline for writes
NOTE: disk 1 (DATA_0001) in group 2 (DATA) is offline for writes
SUCCESS: disk DATA_0000 (0.2746602545) dropped from diskgroup DATA
SUCCESS: disk DATA_0001 (1.2746602544) dropped from diskgroup DATA
SQL> select * from v$asm_operation;
no rows selected

全文完,希望可以帮到正在阅读的你,如果觉得有帮助,可以分享给你身边的朋友,同事,你关心谁就分享给谁,一起学习共同进步~~~
欢迎关注我的公众号【JiekeXu DBA之路】,一起学习新知识!
——————————————————————————
公众号:JiekeXu DBA之路
墨天轮:https://www.modb.pro/u/4347
CSDN :https://blog.csdn.net/JiekeXu
ITPUB:https://blog.itpub.net/69968215
腾讯云:https://cloud.tencent.com/developer/user/5645107
——————————————————————————





