Oracle ASM - Adicionando discos a um Diskgroup com AFD

Nesse post vamos adicionar alguns discos em um ambiente Oracle Database 21.03.0.0 com AFD.

Dessa forma antes, vamos contextualizar o AFD em relação ao ASMLIB.

Oque é o Driver de Filtro Oracle ASM (ASMFD)?

O Driver de Filtro Oracle ASM (ASMFD) é um módulo do kernel introduzido para simplificar a configuração e o gerenciamento de dispositivos de disco no Oracle Automatic Storage Management (ASM). Elimina a necessidade de redistribuir dispositivos de disco após a reinicialização do sistema e garante a integridade dos dados filtrando requisições de I/O inválidas para discos ASM.

Principais Características do ASMFD:

  • Gerenciamento de Disco Simplificado: O ASMFD elimina a necessidade de rebinding manual dos dispositivos de disco, simplificando a configuração do disco.
  • Proteção de Dados: Rejeita solicitações de E/S que não sejam da Oracle, prevenindo escritas acidentais e corrupção de discos ASM.
  • Integração com a Oracle Grid Infrastructure: O ASMFD pode ser configurado durante ou após a instalação da Oracle Grid Infrastructure.

Considerações Importantes:
  • Se o ASMLIB estiver instalado, ele deve ser desinstalado antes de configurar o ASMFD. Discos anteriormente gerenciados pelo ASMLIB podem ser migrados para o ASMFD usando a opção --migrate:
  • O ASMFD está disponível a partir do Oracle Database 12c Release 1 (12.1.0.2) para Linux e Solaris.
  • Tabelas de partição estendidas não são suportadas pelo ASMFD.
  • Certifique-se de que as strings de descoberta de disco do Oracle ASM sejam atualizadas para incluir discos gerenciados pelo ASMFD.
  • O ASMFD aprimora a confiabilidade e facilidade de gerenciamento de ambientes Oracle ASM, tornando-se uma escolha preferida para gerenciamento de disco em configurações de Oracle Grid Infrastructure.
  • ASMFD e o sucessor do ASMLIB.

Dessa forma, agora que esclarecemos todas as características do AFD, vamos seguir com o procedimento.


1- Nosso ambiente:

[oracle@ol8-vm1 ~]$ sqlplus / as sysdba

SQL*Plus: Release 21.0.0.0.0 - Production on Wed Mar 25 15:28:46 2026
Version 21.3.0.0.0

Copyright (c) 1982, 2021, Oracle.  All rights reserved.

Connected to an idle instance.

SQL> startup;
ORACLE instance started.

Total System Global Area 1543503024 bytes
Fixed Size                  9686192 bytes
Variable Size            1073741824 bytes
Database Buffers          452984832 bytes
Redo Buffers                7090176 bytes
Database mounted.
Database opened.
SQL>
SQL>
SQL>
SQL> show pdbs

    CON_ID CON_NAME                       OPEN MODE  RESTRICTED
---------- ------------------------------ ---------- ----------
         2 PDB$SEED                       READ ONLY  NO
         3 ORCLPDB                        READ WRITE NO
SQL>
SQL>
SQL> alter session set container = ORCLPDB; Session altered. SQL>
SQL> set lines 9999 set pages 9999 SET SQLFORMAT COL NAME HEADING "Disksgroup" COL TYPE HEADING "Redundancy" COL TOTAL_GB HEADING "Total GB" FORMAT 999,999,999,999 COL FREE_GB HEADING "Free GB" FORMAT 999,999,999,999 COL PERCFREE HEADING "Free %" FORMAT 999.99 SELECT NAME, TYPE, TOTAL_GB, FREE_GB, ROUND(FREE_GB/TOTAL_GB*100,2) AS PERCFREE FROM ( SELECT NAME, TYPE, ( TOTAL_MB / DECODE(TYPE,'HIGH',3,'NORMAL',2,1) ) / 1024 AS TOTAL_GB, USABLE_FILE_MB/1024 AS FREE_GB FROM V$ASM_DISKGROUP ); SQL> SQL> SP2-0158: unknown SET option "SQLFORMAT" SQL> SQL> SQL> SQL> SQL> SQL> SQL> 2 3 4 5 6 7 8
Disksgroup Redundancy Total GB Free GB Free % ------------------------------ ---------- ---------------- ---------------- ------- DG_ARCH EXTERN 200 120 59.80 DG_DATA EXTERN 500 41 8.16


Informações dos discos a serem adicionados - 100G cada disco.

/dev/sdl
/dev/sdm
/dev/sdn
/dev/sdo

1- Particionando os discos:

Com usuário ROOT vamos validar se os discos foram apresentados corretamente ao ambiente com o comando "lsblk -f":

[root@ol8-vm1 ~]# lsblk -f
NAME   FSTYPE  LABEL          UUID                                 MOUNTPOINT
sda
├─sda1 xfs                    cfd5935a-101c-4ca1-9478-018eaaa566bd /boot
├─sda2 xfs                    8b84d2ce-314c-4ec4-865a-c5f161e89aaa /u01
├─sda3 xfs                    bd226c71-2c8c-49d7-83db-7ebe3264af47 /
├─sda4
├─sda5 swap                   35afe57c-0d80-47bc-99ad-b6e090861bf2 [SWAP]
├─sda6 xfs                    1a689c9b-a139-4bd3-bfb1-c95bd04e8ae8 /home
└─sda7 xfs                    aea20e8a-ecda-4db4-ae54-202b7b6a40f7 /u02
sdd └─sdd1 oracleasm DATA01 <-- particionado sde └─sde1 oracleasm DATA02 <-- particionado sdf └─sdf1 oracleasm DATA03 <-- particionado sdg └─sdg1 oracleasm DATA04 <-- particionado sdh └─sdh1 oracleasm DATA05 <-- particionado sdi └─sdi1 oracleasm ARCH01 <-- particionado sdj └─sdj1 sdk └─sdk1 oracleasm ARCH02 <-- particionado
sdl -------- DISCO DISPONÍVEL sdm -------- DISCO DISPONÍVEL sdn -------- DISCO DISPONÍVEL sdo -------- DISCO DISPONÍVEL
Podemos ver acima que os nossos discos estão disponíveis para adição e são particionados.

OBS: Caso no seu ambiente os discos não sejam particionados, pule a etapa de particionamento e siga para o passo 3.


Outro comando útil para ver o label dos discos, apenas dos discos já configurados "asmcmd afd_lslbl":
Pode ser necessário configurar as variáveis do ASM para executar o comando:

. oraenv --> +ASM

[root@ol8-vm1 ~]# asmcmd afd_lslbl
-------------------------------------------------------------------------------- Label Duplicate Path ================================================================================ ARCH01 /dev/sdi1 ARCH02 /dev/sdk1 DATA01 /dev/sdd1 DATA02 /dev/sde1 DATA03 /dev/sdf1 DATA04 /dev/sdg1 DATA05 /dev/sdh1

Nesse ponto para iniciar adição, devemos particionar o disco para seguir o padrão dos discos já adicionados ao ambiente. Vamos usar o "fdisk" para realizar a atividade, abaixo vou mostrar o output de particionamento de apenas 1 disco, os demais seguiram o mesmo procedimento:

[root@ol8-vm1 ~]# fdisk /dev/sdl
Welcome to fdisk (util-linux 2.32.1). Changes will remain in memory only, until you decide to write them. Be careful before using the write command. Device does not contain a recognized partition table. Created a new DOS disklabel with disk identifier 0x0285f398. Command (m for help): n Partition type p primary (0 primary, 0 extended, 4 free) e extended (container for logical partitions) Select (default p): p Partition number (1-4, default 1): << ENTER >> First sector (2048-209715199, default 2048): << ENTER >> Last sector, +sectors or +size{K,M,G,T,P} (2048-209715199, default 209715199): << ENTER >>
Created a new partition 1 of type 'Linux' and of size 100 GiB. Command (m for help): p Disk /dev/sdl: 100 GiB, 107374182400 bytes, 209715200 sectors Units: sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disklabel type: dos Disk identifier: 0x0285f398 Device Boot Start End Sectors Size Id Type /dev/sdl1 2048 209715199 209713152 100G 83 Linux Command (m for help): w The partition table has been altered. Calling ioctl() to re-read partition table. Syncing disks. [root@ol8-vm1 ~]# partprobe

Descrição dos comandos:

1- n : Para iniciar o particionamento
2- p : Para criar uma partição primária
3- ENTER : Para manter a configuração padrão - vai particionar o disco em uma única partição 
4- ENTER : Para manter a configuração padrão - Vai criar a partição com o tamanho total do disco
5- ENTER : Para manter a configuração padrão - Vai criar a partição com o tamanho total do disco
6- p : Para listar a partição criada
7- w : Para escrever e salvar a alteração 
8- partprobe: Para fixar a nova partição no kernel sem necessidade de reboot do sistema

Se tudo deu certo, agora devemos ter os 4 discos particionados, usaremos novamente o comando "asmcmd afd_lslbl" para validar:

[root@ol8-vm1 ~]# lsblk -f
NAME   FSTYPE  LABEL          UUID                                 MOUNTPOINT
sda
├─sda1 xfs                    cfd5935a-101c-4ca1-9478-018eaaa566bd /boot
├─sda2 xfs                    8b84d2ce-314c-4ec4-865a-c5f161e89aaa /u01
├─sda3 xfs                    bd226c71-2c8c-49d7-83db-7ebe3264af47 /
├─sda4
├─sda5 swap                   35afe57c-0d80-47bc-99ad-b6e090861bf2 [SWAP]
├─sda6 xfs                    1a689c9b-a139-4bd3-bfb1-c95bd04e8ae8 /home
└─sda7 xfs                    aea20e8a-ecda-4db4-ae54-202b7b6a40f7 /u02
sdd └─sdd1 oracleasm DATA01 <-- particionado sde └─sde1 oracleasm DATA02 <-- particionado sdf └─sdf1 oracleasm DATA03 <-- particionado sdg └─sdg1 oracleasm DATA04 <-- particionado sdh └─sdh1 oracleasm DATA05 <-- particionado sdi └─sdi1 oracleasm ARCH01 <-- particionado sdj └─sdj1 sdk └─sdk1 oracleasm ARCH02 <-- particionado sdl └─sdl1 -- <---------------------------------- PART CRIADA sdm └─sdm1 -- <---------------------------------- PART CRIADA sdn └─sdn1 -- <---------------------------------- PART CRIADA sdo └─sdo1 -- <---------------------------------- PART CRIADA

3- Adicionados discos a um Diskgroup:

Agora vamos configurar as variáveis do ASM e criar o label dos discos:

. oraenv --> +ASM

Como já temos discos configurados e o último label usado foi o DATA05, vamos criar a partir do DATA06:

asmcmd afd_label DATA06 /dev/sdl1
asmcmd afd_label DATA07 /dev/sdm1
asmcmd afd_label DATA08 /dev/sdn1
asmcmd afd_label DATA09 /dev/sdo1
Depois de executar os comandos acimas vamos executar o scan e listar os discos novamente:

asmcmd afd_scan
asmcmd afd_lslbl

-------------------------------------------------------------------------------- Label Duplicate Path ================================================================================ ARCH01 /dev/sdi1 ARCH02 /dev/sdk1 DATA01 /dev/sdd1 DATA02 /dev/sde1 DATA03 /dev/sdf1 DATA04 /dev/sdg1 DATA05 /dev/sdh1 DATA06 /dev/sdl1 -- < ------ DISCOS APRESENTADOS DATA07 /dev/sdm1 -- < ------ DISCOS APRESENTADOS DATA08 /dev/sdn1 -- < ------ DISCOS APRESENTADOS DATA09 /dev/sdo1 -- < ------ DISCOS APRESENTADOS

Caso seja necessário desconfigurar o label de um disco ou remover use o comandos abaixo:

asmcmd afd_unlabel DATAXXX

Agora devemos adicionar os discos ao diskgroup DATA:

Faça login no ambiente com as variáveis do ASM configuradas:

sqlplus / as sysasm

Agora vamos executar uma consulta para listar os discos e espaço disponíveis:

SQL> column path format a40
set lines 9999 pages 9999
select path,os_mb,header_Status from v$asm_Disk where header_Status!='MEMBER';
PATH OS_MB HEADER_STATU ---------------------------------------- ---------- ------------ AFD:DATA08 102399 PROVISIONED AFD:DATA07 102399 PROVISIONED AFD:DATA09 102399 PROVISIONED AFD:DATA06 102399 PROVISIONED SQL>

Agora vamos adicionar os discos ao Diskgroup que desejarmos:

OBS: Aqui coloquei o rebalance com o valor de 10, para deixar a adição e a redistribuição dos dados entre os discos mais rápida, mas isso demanda mais consumo de CPU e I/O, esse valor pode ser configurado na instância através do parâmetro ASM_POWER_LIMIT, um valor muito alto pode impactar a performance do banco, dessa forma, use com sabedoria.

SQL> alter diskgroup DG_DATA add disk 'AFD:DATA06','AFD:DATA07','AFD:DATA08','AFD:DATA09' rebalance power 10;

Diskgroup altered.

SQL>


4- Validando operação de rebalance do disco:

Depois de adicionar os discos podemos acompanhar o rebalance:

select INST_ID, OPERATION, STATE, POWER, SOFAR, EST_WORK, EST_RATE, EST_MINUTES from GV$ASM_OPERATION;


   INST_ID OPERA STAT      POWER      SOFAR   EST_WORK   EST_RATE EST_MINUTES
---------- ----- ---- ---------- ---------- ---------- ---------- -----------
         1 REBAL WAIT         10          0          0          0           0
         1 REBAL RUN          10        416      52239       4580          11
         1 REBAL DONE         10          0          0          0           0

SQL>

Aqui podemos ver que ele está estimando o rebalance em 11 minutos, esse valor pode varia de acordo com o tamanho dos discos adicionados e também do espaço já consumido dos discos existentes.

Por ultimo, após o rebalance finalizar, vamos consultar o tamanho do nosso Diskgroup DG_DATA após a adição:

Disksgroup                     Redundancy         Total GB          Free GB  Free %
------------------------------ ---------- ---------------- ---------------- -------
DG_ARCH                        EXTERN                  200              120   59.80
DG_DATA                        EXTERN                  900              441   48.98
Agora temos 900G no nosso diskgroup DG_DATA.


Conclusão:

  • Como formatar discos com FDISK no linux
  • Como criar e gerenciar labels com ASMFD
  • Como adicionar discos a um Diskgroup
  • Como validar o rebalance de um operação de Adição


Agora temos o ambiente redimensionado para as demandas do dia a dia!

Espero que esse material ajude no dia a dia atuando como DBA. Caso tenha alguma dúvida ou sugestão de postagem, deixo aqui meu E-mail - pedrohvido@gmail.com para contato.

Nos vemos no próximo post!






Comentários

Postagens mais visitadas deste blog

Instalando Oracle Database 19c em um Oracle Linux 8.8 no Virtual Box - PARTE 2

Temporary Tablespace : Identificando consultas consumindo uma Tablespace Temporária

SQL - Calculando crescimento do Banco de dados Oracle