目录
2.3.1 此步骤可能会产生报错:ASMCMD-9520: AFD is not 'supported'
一、AFD简介
在ASM 12.1之后有效,在12.2中,ASMFD在系统已经安装了ASMLIB的情况下无法安装,也不支持扩展分区表。自18c起,AFD支持扩展分区表。
ASM FILTER DRIVER 可以最大限度的限制磁盘的用户权限,即便是root用户,也无法删除AFD磁盘。这就是ASMFD比ASMLIB和udev相比的新特性,I/O Filter筛选。
消除了在系统每次被重启后Oracle ASM需要重新绑定磁盘设备来简化对磁盘设备的配置与管理。
操作系统支持说明,可以参考一下文章:
ASMFD (ASM Filter Driver) Support on OS Platforms (Certification Matrix). (Doc ID 2034681.1)
二、AFD的配置
从官方文档可知,AFD的功能,很强大,可以省略掉对路径绑定,规则文件授权配置,直接使用afd完成次磁盘的绑定和设置,同时,可以在安装完成后,管理磁盘,磁盘的识别,绑定与添加有的极大的简化。
2.1 在安装之前配置AFD
在没有使用multipath、udev等方法做磁盘绑定的情况下,可以直接使用AFD做磁盘绑定,此时的配置步骤如下:
A.为了使用Oracle ASM Filter Driver来配置共享磁盘,以root用户来设置环境变量$ORACLE_HOME为Grid Home目录,设置环境变量$ORACLE_BASE为临时目录
# export ORACLE_HOME=/u01/app/oracle/12.2.0/grid
# export ORACLE_BASE=/tmp
ORACLE_BASE变量被设置为临时目录可以避免在安装Oracle Grid Infrastructure之前在Grid Home目录中创建诊断或跟踪文件。在执行下面的操作之前,确保是在$ORACLE_HOME/bin目录中执行命令。
B.使用ASMCMD afd_label命令来为Oracle ASM Filter Driver来准备磁盘。绑定成功后会在/dev 路径下,产生一个oracleafd/disk的路径,路径下的磁盘名都是AFD的标签名
# asmcmd afd_label DATA1 /dev/sda --init
C.使用ASMCMD afd_lslbl命令来验证磁盘是否已经被标记可以为Oracle ASMFD所使用
# asmcmd afd_lslbl /dev/sda
D.当为Oracle ASMFD准备完磁盘后清除变量ORACLE_BASE
$ . .bash_profile
E.运行grid安装脚本,并启用AFD配置
2.2 若使用MULTIPATH并使用AFD
在安装之前,启用了MULTIPATH做多路径绑定,此时在使用上述方法,给多路径绑定的别名做AFD绑定就会提示没有AFD的配置文件,此时使用AFD的方法与上述不尽相同。需要满足两大条件:
1. multipath启用成功且配置了别名
# multipath -l
ocr3 (36000c2923e1d04531b3277dad6fd15ed) dm-3 VMware ,Virtual disk
size=1.0G features='0' hwhandler='0' wp=rw
`-+- policy='service-time 0' prio=0 status=active
`- 3:0:2:0 sdd 8:48 active undef running
ocr2 (36000c291406e5686333b962d52dc7af4) dm-4 VMware ,Virtual disk
size=1.0G features='0' hwhandler='0' wp=rw
`-+- policy='service-time 0' prio=0 status=active
`- 3:0:1:0 sdc 8:32 active undef running
ocr1 (36000c29c26d7a40c7593945fbe607a3a) dm-2 VMware ,Virtual disk
size=1.0G features='0' hwhandler='0' wp=rw
`-+- policy='service-time 0' prio=0 status=active
`- 3:0:0:0 sdb 8:16 active undef running
2. multipath路径先赋权(chmod,chown修改;修改rc.local),然后直接执行安装,在安装过程中,选择AFD启用
$ asmcmd afd_lsdsk
--------------------------------------------------------------------------------
Label Filtering Path
================================================================================
OCR1 ENABLED /dev/mapper/ocr1
OCR2 ENABLED /dev/mapper/ocr2
OCR3 ENABLED /dev/mapper/ocr3
可以看出,AFD若与多路径绑定搭配使用的方法不需要提前使用root用户给磁盘打标签。但是对磁盘的初始化赋权需要通过chmod和chown的方式手动完成,并且,为了保证重启后,权限仍然正确,需要启用rc.local或其他开机自配置的脚本或工具,辅助完成。
2.3 对于已安装的GRID软件重新配置AFD
A.获取当前asm磁盘组的发现路径
[root@rac1 ~]# $ORACLE_HOME/bin/asmcmd dsget
parameter:/dev/asm*
profile:/dev/asm*
B.添加AFD发现路径
[root@rac1 ~]# asmcmd dsset '/dev/asm*','AFD:*'
[root@rac1 ~]# $ORACLE_HOME/bin/asmcmd dsget
parameter:/dev/asm*, AFD:*
profile:/dev/asm*,AFD:*
C.查看节点信息
[root@rac1 ~]# olsnodes -a
rac1 Hub
rac2 Hub
D.关闭所有的节点,停止CRS
[root@rac1 ~]# crsctl stop crs
E.安装AFD(每个节点)
[root@rac1 yum.repos.d]# asmcmd afd_configure
[root@rac1 yum.repos.d]# asmcmd afd_state
ASMCMD-9526: The AFD state is 'LOADED' and filtering is 'ENABLED' on host 'rac1'
2.3.1 此步骤可能会产生报错:ASMCMD-9520: AFD is not 'supported'
进一步判断原因:
目录
2.3.1 此步骤可能会产生报错:ASMCMD-9520: AFD is not 'supported'
[root@rac1 ~]# afdroot install AFD-620: AFD is not supported on this operating system version: '3.10.0-693.el7.x86_64' [root@rac1 ~]# acfsdriverstate -orahome $ORACLE_HOME supported ACFS-9459: ADVM/ACFS is not supported on this OS version: '3.10.0-693.el7.x86_64' ACFS-9201: Not Supported [root@rac1 ~]# uname -a Linux rac1 3.10.0-693.el7.x86_64 #1 SMP Thu Jul 6 19:56:57 EDT 2017 x86_64 x86_64 x86_64 GNU/Linux ----查看当前系统内核版本确实不被支持 [root@rac1 ~]# cat /etc/redhat-release Red Hat Enterprise Linux Server release 7.4 (Maipo)
解决:
REHL 7.4 + 需要升级kmod版本
ACFS and AFD report “Not Supported” after installing appropriate Oracle Grid Infrastructure Patches on RedHat (文档 ID 2303388.1)查看kmod版本: [root@rac2 ~]# rpm -qa|grep kmod kmod-libs-20-15.el7.x86_64 kmod-20-15.el7.x86_64 ----20-15版本 [root@rac1 yum.repos.d]# yum install kmod 检查安装效果: [grid@rac1:/home/grid]$rpm -qa|grep kmod kmod-libs-20-15.el7.x86_64 kmod-20-21.el7.x86_64 --->已升级到20-21版本 查看afd驱动版本: [root@rac1 yum.repos.d]# acfsdriverstate -orahome $ORACLE_HOME supported ACFS-9200: Supported ---升级kmod之后afd驱动已支持
F.启动crs
[root@rac1 yum.repos.d]# crsctl start crs
CRS-4123: Oracle High Availability Services has been started.
三、AFD常用操作说明
3.1 添加磁盘
步骤如下:
A.确定要添加的磁盘,本例中为使用multipath多路径绑定,并确定磁盘权限
--查看目标磁盘的多路径文件配置情况
# /usr/lib/udev/scsi_id -g -u -d /dev/sdb --查询磁盘的wwid
# vi /etc/multipath.conf --添加新磁盘的wwid 和别名
multipath {
wwid 36244427100fbe2a072d28ee900000029
alias data13
}
# systemctl reload multipathd.service
# multipath -ll
--修改磁盘权限
# vi /etc/rc.local
chown grid:asmadmin /dev/mapper/asmssd*
chmod 660 /dev/mapper/data*
--默认在RHEL/OEL7上不会生效,需要添加执行位。
# chmod +x /etc/rc.d/rc.local
B.查看当前已有的afd标签
# su - grid
$ asmcmd afd_lsdsk
$ sqlplus / as sysasm
set lines 222 pages 222
col name for a22
col path for a33
col label for a11
col failgroup for a11
select GROUP_NUMBER,GROUP_NUMBER,name,path,label,os_mb,failgroup
from v$asm_disk order by 1,7;
C.AFD给需要添加的磁盘打标签
--单个节点打标签
# export ORACLE_HOME=/u01/app/grid_home
# asmcmd afd_label A700_RECO /dev/mapper/asma700-reco1p1
# asmcmd afd_label A700_OCR /dev/mapper/asma700-ocr1p1
# asmcmd afd_label A700_FRA /dev/mapper/asma700-fra1p1
# asmcmd afd_label A700_DATA1 /dev/mapper/asma700-data0p1
--其他节点刷新afd磁盘标签信息
$ asmcmd afd_refresh
$ asmcmd afd_lsdsk
--查看当前磁盘组信息
$ asmcmd lsdg
State Type ... Logical_Sector Block AU Total_MB ... Voting_files Name
MOUNTED EXTERN ... 512 4096 4194304 40960 ... N DATA/
MOUNTED NORMAL ... 512 4096 4194304 3072 ... Y OCR/
OR
MOUNTED EXTERN ... 512 4096 4194304 3072 ... Y OCR/
D.asm实例中添加新磁盘
alter diskgroup DATA
add disk 'AFD:DATA5','AFD:DATA6','AFD:DATA7','AFD:DATA8'
rebalance power 8;
--创建新的磁盘组(需要创建新的external模式的磁盘组)
create diskgroup TEST EXTERNAL REDUNDANCY DISK 'AFD:DATA5','AFD:DATA6';
3.2 AFD删除磁盘组/磁盘
A.检查磁盘组占用情况(MGMTDB相关操作可参考——MGMTDB实例与资源详解)
select * from dba_data_files;
select * from dba_temp_files;
select * from v$logfile;
--12C RAC环境中,还有一个MGMTDB的实例,可能会占用磁盘,需要迁移相关文件或删除实例
select dg.name group_name,cli.instance_name,cli.db_name,cli.status
from v$asm_client cli
left join v$asm_diskgroup dg
on cli.group_number=dg.group_number;
GROUP_NAME INSTANCE_NAME DB_NAME STATUS
------------------------------ ---------------------------------------------------------------- -------- ------------
+APX1 +APX CONNECTED
DATA +ASM1 +ASM CONNECTED
DATA o18000r11 o18000r CONNECTED
OCR +ASM1 +ASM CONNECTED
OCR o18000r1.ntos.com _OCR CONNECTED
B.解除磁盘的占用后,删除磁盘组
step A: dismount DATA磁盘组:(grid用户下各节点单独操作)
sqlplus / as sysasm
alter diskgroup DATA dismount;
--查看磁盘组状态
select GROUP_NUMBER,NAME,BLOCK_SIZE,STATE,TYPE,VOTING_FILES from v$asm_diskgroup;
GROUP_NUMBER NAME BLOCK_SIZE STATE TYPE V
------------ ------------------------------ ---------- ----------- ------ -
0 DATA 0 MOUNTED EXTERN N
2 OCR 4096 MOUNTED NORMAL Y
step B: 删除DATA磁盘组:(任一节点执行即可)
drop diskgroup DATA force including contents;
--检查当前磁盘组
select GROUP_NUMBER,NAME,BLOCK_SIZE,STATE,TYPE,VOTING_FILES from v$asm_diskgroup;
GROUP_NUMBER NAME BLOCK_SIZE STATE TYPE V
------------ ------------------------------ ---------- ----------- ------ -
2 OCR 4096 MOUNTED NORMAL Y
step C: 取消afd标签(若使用的是UDEV或multipath等方式,也需将对应资源释放,修改器相应的配置文件,删除相关磁盘的条目)
--查看当前的标签:
$ asmcmd afd_lsdsk
--清除标签:
$ asmcmd afd_unlabel DATA1
C.删除磁盘
alter diskgroup DATA drop disk 'DATA1' rebalance power 10;
--normal模式下删除
alter diskgroup OCR add failgroup OCR_0000 disk 'AFD:OCR' rebalance power 10;
--failgroup 写的是asmcmd lsdsk -k中failgroup的类
alter diskgroup OCR drop disk 'OCR_0000' rebalance power 10;
--OCR磁盘的变更需特别谨慎(votedisk)
$ crsctl query css votedisk --确认votedisk是否切换
--观察rebalance过程,替换一个观察一个
select * from V$ASM_OPERATION;
--确认当前的磁盘组是否替换完成
select name,path,total_mb,free_mb from v$asm_disk;
--删除asmfd标签,只需在一个节点删除,其他节点刷新即可(multipath/udev相关条目也需要调整)
asmcmd afd_unlabel DATA1
asmcmd afd_refresh
四、关于18c版本的AFD是否支持扩展分区表的测试
官方文档已经明确说明,12.2中的AFD不支持扩展分区表,也就是说,当我使用AFD做共享存储的磁盘管理时,如果使用了分区表,用户无法对分区表进行添加分区操作,那么,18的AFD是否也有相同的问题呢?官方文档没有明确指出,因此进行了以下测试:
A.创建模拟分区表,并创建相关约束与索引
创建一个,以创建时间为分区标准的分区表,该分区表之创建了一个到2019年1月1日之前的分区,其没有开启启动扩展,也就是说,当用户插入一个create_time大于2019-01-01的日期后,那么,则应该报错,此时需要扩展一个新的分区来满足插入操作
create table test_part
(
ID NUMBER(20) not null,
REMARK VARCHAR2(1000),
create_time DATE
)
PARTITION BY RANGE (CREATE_TIME)
(partition part_t01 values less than(to_date('2019-01-01', 'yyyy-mm-dd')));
alter table test_part add constraint test_part_pk primary key (ID) using INDEX;
create index test_part_create_time on TEST_PART (create_time);
--检查创建结果
select table_name,partition_name
from user_tab_partitions
where table_name = upper('test_part');
TABLE_NAME PARTITION_NAME
--------------- ------------------------------------------------------------------
TEST_PART PART_T01
B.插入模拟数据:
--插入一条符合分区条件的数据
insert into test_part values (1,'as',to_date('2018-01-03','yyyy-mm-dd'));
select * from test_part;
ID REMARK CREATE_TIME
---------- -------------------- ------------------
1 as 03-JAN-18
--提交数据
commit;
--模拟插入一条不符合分区条件的数据
insert into test_part values (2,'as',to_date('2019-01-03','yyyy-mm-dd'));
--产生如下报错
ORA—14400: inserted partition key does not map to any partition
--此时查看分区表数据,没有插入任何新数据,无效数据插入失败
C.扩展分区
alter table TEST_PART add partition part_t02 values less than(to_date('2020-01-01', 'yyyy-mm-dd'));
查看表分区信息
select table_name,partition_name
from user_tab_partitions
where table_name = upper('test_part');
TABLE_NAME PARTITION_NAME
--------------- --------------------------------------------------
TEST_PART PART_T01
TEST_PART PART_T02
D.重新插入2019-01-03的未匹配数据
insert into test_part values (2,'as',to_date('2019-01-03','yyyy-mm-dd'));
select * from test_part;
ID REMARK CREATE_TIME
---------- -------------------------------- ------------------
1 as 03-JAN-18
2 as 03-JAN-19
--查看新增分区中的数据
select * from test_part partition(PART_T02);
ID REMARK CREATE_TIME
---------- -------------------------------- ------------------
2 as 03-JAN-19
实验说明,18c的GI中AFD支持扩展分区表