1、AFD特性
* asM FILTER DRIVER 可以最大限度的限制磁盘的用户权限,即便是root用户,也无法删除AFD磁盘
* 在asM 12.1之后支持,在12.2中,asMFD在系统已经安装了asMLIB的情况下无法使用安装AFD,也不支持扩展分区表;18c以后的版本,AFD开始支持扩展分区表
* 这就是asMFD相比asMLIB和udev的新特性,消除了在系统每次被重启后Oracle asM需要重新绑定磁盘,简化了对磁盘设备的配置与管理
* AFD的功能强大,可以省略掉对路径绑定,规则文件授权配置,直接使用afd完成磁盘的绑定和设置
* 在安装完成后,管理磁盘,磁盘识别,绑定与添加也比较方便
* 没有使用multipath、udev等方法做磁盘绑定的情况下,也可以直接使用AFD绑定磁盘
2、AFD 配置
-- 为使用Oracle asM Filter Driver来配置共享磁盘,以root用户来设置环境变量$ORACLE_HOME为Grid Home目录,设置环境变量$ORACLE_BasE为临时目录
# export ORACLE_HOME=/u01/app/18/grid
# export ORACLE_BasE=/tmp
# asmcmd afd_label DATA_1 /dev/sdd --init
# asmcmd afd_lslbl /dev/sdd
# . .bash_profile -- 清除环境,开始安装grid并启用AFD配置
$ asmcmd afd_lsdsk
-- 已安装的GRID软件重新配置AFD
# $ORACLE_HOME/bin/asmcmd dsget
parameter:/dev/asm*
profile:/dev/asm*
# asmcmd dsset '/dev/asm*','AFD:*'
# $ORACLE_HOME/bin/asmcmd dsget
parameter:/dev/asm*, AFD:*
profile:/dev/asm*,AFD:*
# olsnodes -a
# crsctl stop crs
-- 每个节点安装AFD
# asmcmd afd_configure
# asmcmd afd_state
-- AFD常用操作
-- 是否支持扩展分区表的测试,查看当前系统内核版本确实是否支持
# afdroot install
# acfsdriverstate -orahome $ORACLE_HOME supported
# uname -a
# cat /etc/redhat-release
-- 不支持需要升级kmod版本
# rpm -qa|grep kmod
# yum install kmod
# rpm -qa|grep kmod
-- 升级后查看afd驱动是否支持
# acfsdriverstate -orahome $ORACLE_HOME supported
# crsctl start crs
3、添加磁盘 (这里采用多路径)
--查询磁盘 wwid
# /usr/lib/udev/scsi_id -g -u -d /dev/sde
-- 添加新磁盘的 wwid\别名
# vi /etc/multipath.conf
multipath {
wwid 47355521712ffff2a076d28ee91234520
alias DATA_3
}
# systemctl reload multipathd.service
# multipath -ll
-- 修改磁盘权限
# vi /etc/rc.local
chown grid:asmadmin /dev/mapper/asmssd*
chmod 660 /dev/mapper/data*
-- 在RHEL7/OEL7上默认不会生效,需要添加执行权
# chmod +x /etc/rc.d/rc.local
-- 查看已有的afd标签
# su - grid
$ asmcmd afd_lsdsk
$ sqlplus / as sysasm
set lines 200 pages 20
col name for a25
col path for a35
col label for a15
col failgroup for a15
select GROUP_NUMBER,GROUP_NUMBER,name,path,label,os_mb,failgroup
from v$asm_disk order by 1,7;
-- 给需要添加的磁盘打标签,单个节点打标签就可以
# export ORACLE_HOME=/u01/app/18/grid
# export ORACLE_BasE=/tmp
# asmcmd afd_label ASM_ARCH /dev/mapper/ASM_arch_1
# asmcmd afd_label ASM_OCR /dev/mapper/ASM_ocr_1
# asmcmd afd_label ASM_FRA /dev/mapper/ASM_fra_1
# asmcmd afd_label ASM_DATA_3 /dev/mapper/ASM_data_3
-- 其他节点刷新afd磁盘标签信息即可
$ asmcmd afd_refresh
$ asmcmd afd_lsdsk
--查看当前磁盘组信息
$ asmcmd lsdg
-- asm实例中添加新磁盘
alter diskgroup DATA add disk 'AFD:DATA_3','AFD:DATA_4','AFD:DATA_5','AFD:DATA_6' rebalance power 8;
-- 创建新磁盘组 external模式
create diskgroup DATA_2 EXTERNAL REDUNDANCY DISK 'AFD:DATA_5','AFD:DATA_6';
4、删除磁盘、磁盘组
-- 检查磁盘组占用情况
select * from dba_data_files;
select * from dba_temp_files;
select * from v$logfile;
-- 18C 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;
-- 解除磁盘的占用后才能删除磁盘组
sqlplus / as sysasm
alter diskgroup DATA dismount;
-- 查看磁盘组状态
select GROUP_NUMBER,NAME,BLOCK_SIZE,STATE,TYPE,VOTING_FILES from v$asm_diskgroup;
-- 删除DATA磁盘组
drop diskgroup DATA force including contents;
-- 检查当前磁盘组
select GROUP_NUMBER,NAME,BLOCK_SIZE,STATE,TYPE,VOTING_FILES from v$asm_diskgroup;
-- 取消afd标签(若使用的是UDEV或multipath方式,也需将对应资源释放,修改器相应的配置文件,删除相关磁盘的配置等)
-- 查看当前的标签:
$ asmcmd afd_lsdsk
-- 清除标签:
$ asmcmd afd_unlabel DATA_1
-- 删除磁盘
alter diskgroup DATA drop disk 'DATA_1' rebalance power 10;
-- normal模式下 failgroup 写的是 asmcmd lsdsk -k 中failgroup的类
alter diskgroup OCR add failgroup OCR_0000 disk 'AFD:OCR' rebalance power 10;
alter diskgroup OCR drop disk 'OCR_0000' rebalance power 10;
-- OCR磁盘的变更需特别谨慎
$ crsctl query css votedisk
-- 查看rebalance过程是否完成
select * from V$asM_OPERATION;
select name,path,total_mb,free_mb from v$asm_disk;
-- 删除asmfd标签,只需在一个节点删除,其他节点刷新即可
asmcmd afd_unlabel DATA_1
asmcmd afd_refresh
5、AFD是否支持扩展分区表的测试
-- 官方文档12.2中的AFD不支持扩展分区表,也就是说,当我使用AFD做共享存储的磁盘管理时,如果使用了分区表,用户无法对分区表进行添加分区操作
-- 对于18的AFD是否也有相同的问题做以下测试:
-- 创建分区表,并创建相关约束与索引
-- 创建一个以时间为分区标准的分区表,该分区表之创建了一个到2020年1月1日之前的分区,没有开启启动扩展
-- 也就是说,当用户插入一个创建时间大于2020-01-01的日期后,那么,则应该报错,此时需要扩展一个新的分区来满足插入操作
create table as_part_tb
(
ID NUMBER(20) not null,
NAME VARCHAR2(1000),
create_time DATE
)
PARTITION BY RANGE (CREATE_TIME)
(partition P_1 values less than(to_date('2020-01-01', 'yyyy-mm-dd')));
alter table as_part_tb add constraint as_part_tb_pk primary key (ID) using INDEX;
create index as_part_tb_create_time on as_part_tb (create_time);
--检查创建结果
select table_name,partition_name from user_tab_partitions where table_name = upper('as_part_tb');
TABLE_NAME PARTITION_NAME
--------------- ------------------------------------------------------------------
as_part_tb P_1
-- 插入一条符合分区条件的数据
insert into as_part_tb values (1,'AH',to_date('2019-01-08','yyyy-mm-dd'));
select * from as_part_tb;
ID NAME CREATE_TIME
---------- -------------------- ------------------
1 AH 08-JAN-19
commit;
-- 插入一条不符合分区条件的数据插入失败
insert into as_part_tb values (2,'AH',to_date('2020-01-08','yyyy-mm-dd'));
ORA—14400: inserted partition key does not map to any partition
-- 扩展分区
alter table as_part_tb add partition P_2 values less than(to_date('2021-01-01', 'yyyy-mm-dd'));
-- 查看表分区信息
select table_name,partition_name from user_tab_partitions where table_name = upper('as_part_tb');
TABLE_NAME PARTITION_NAME
--------------- --------------------------------------------------
as_part_tb P_1
as_part_tb P_2
-- 重新插入2020-01-08的数据
insert into as_part_tb values (2,'AH',to_date('2020-01-03','yyyy-mm-dd'));
select * from as_part_tb;
ID NAME CREATE_TIME
---------- -------------------------------- ------------------
1 AH 08-JAN-19
2 AH 08-JAN-20
-- 查看新分区中的数据
select * from as_part_tb partition(P_2);
ID NAME CREATE_TIME
---------- -------------------------------- ------------------