天天看點

ORACLE ASMFD 配置删除磁盤

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);