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
-- 更新後檢視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
$ 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;
-- 給需要添加的磁盤打标簽,單個節點打标簽就可以
# 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 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;
-- 檢查目前磁盤組
-- 取消afd标簽(若使用的是udev或multipath方式,也需将對應資源釋放,修改器相應的配置檔案,删除相關磁盤的配置等)
-- 檢視目前的标簽:
-- 清除标簽:
$ 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'));
-- 檢視表分區資訊
--------------- --------------------------------------------------
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);