Início / Trilha 5 / Conteúdo / Tópico 2
2

ASM - Automatic Storage Management

Disk groups, redundância, rebalanceamento e administração ASM

📖

Definição

O que é ASM?

Automatic Storage Management (ASM) é um gerenciador integrado de volumes e sistema de arquivos projetado especificamente para bancos de dados Oracle. Ele simplifica o gerenciamento de storage, eliminando a necessidade de ferramentas externas como LVM ou filesystem tradicionais.

ASM distribui dados automaticamente através de discos (striping), fornece redundância integrada e realiza rebalanceamento automático quando discos são adicionados ou removidos, tudo sem downtime do banco de dados.

Conceitos Fundamentais:

  • ASM Instance: Instância especial (+ASM) que gerencia disk groups
  • Disk Group: Pool lógico de discos físicos que armazena dados
  • ASM Disk: Dispositivo de storage individual gerenciado pelo ASM
  • Failure Group: Conjunto de discos que compartilham ponto único de falha
  • Allocation Unit (AU): Unidade básica de alocação (1MB, 2MB, 4MB, 8MB, 16MB, 32MB ou 64MB)
  • Extent: Uma ou mais AUs contíguas alocadas para um arquivo

Níveis de Redundância ASM

EXTERNAL Redundancy

Sem redundância gerenciada pelo ASM. Use quando o storage já possui proteção (RAID de hardware, SAN com replicação).

  • Apenas 1 cópia dos dados mantida
  • Máxima capacidade utilizável (100% do espaço)
  • Melhor performance (sem overhead de espelhamento)
  • Proteção dependente do storage externo

NORMAL Redundancy (Espelhamento 2-way)

ASM mantém 2 cópias de cada bloco de dados em failure groups diferentes. Padrão recomendado.

  • Tolera falha de 1 failure group
  • 50% de capacidade utilizável
  • Balanceamento ideal entre proteção e espaço
  • Requer mínimo 2 failure groups

HIGH Redundancy (Espelhamento 3-way)

ASM mantém 3 cópias de cada bloco. Máxima proteção para ambientes críticos.

  • Tolera falha de 2 failure groups simultaneamente
  • 33% de capacidade utilizável
  • Proteção máxima contra perda de dados
  • Requer mínimo 3 failure groups

Arquitetura ASM

┌─────────────────────────────────────────────────────┐
│              Oracle Database Instance               │
│   Processos conectam-se ao ASM via ASMB process    │
└────────────────────┬────────────────────────────────┘
                     │
┌────────────────────┴────────────────────────────────┐
│              +ASM Instance                          │
│  Processos: RBAL, ARBn, GMON, ASMB                 │
│  Metadados armazenados em: ASM metadata files      │
└────────────────────┬────────────────────────────────┘
                     │
        ┌────────────┴────────────┬──────────────┐
        │                         │              │
   ┌────┴─────┐            ┌─────┴───┐    ┌─────┴───┐
   │ DG_DATA  │            │ DG_FRA  │    │ DG_REDO │
   │ NORMAL   │            │ NORMAL  │    │ EXTERNAL│
   │          │            │         │    │         │
   │ Disk1    │            │ Disk5   │    │ Disk7   │
   │ Disk2    │            │ Disk6   │    │ Disk8   │
   │ Disk3    │            │         │    └─────────┘
   │ Disk4    │            └─────────┘
   └──────────┘
          

Processos Background ASM

  • RBAL: Coordena rebalanceamento
  • ARBn: Executa rebalanceamento
  • GMON: Monitora saúde dos disks
  • ASMB: Comunica com DB instance

Tipos de Disk Groups

  • DATA: Datafiles, control files
  • FRA: Fast Recovery Area (backups)
  • REDO: Redo logs (opcional)
  • GRID: OCR e Voting Disks (RAC)
🛠️

Aplicação Prática

Criando Disk Groups

-- Descobrir discos disponíveis para ASM
SELECT path, total_mb, name, header_status
FROM v$asm_disk
ORDER BY path;

-- Criar Disk Group com redundância NORMAL
CREATE DISKGROUP dg_data NORMAL REDUNDANCY
  FAILGROUP fg1 DISK '/dev/oracleasm/disk1', '/dev/oracleasm/disk2'
  FAILGROUP fg2 DISK '/dev/oracleasm/disk3', '/dev/oracleasm/disk4'
  ATTRIBUTE 'compatible.asm' = '19.0',
            'compatible.rdbms' = '19.0',
            'au_size' = '4M';

-- Criar Disk Group com redundância EXTERNAL
CREATE DISKGROUP dg_redo EXTERNAL REDUNDANCY
  DISK '/dev/oracleasm/disk5', '/dev/oracleasm/disk6'
  ATTRIBUTE 'compatible.asm' = '19.0',
            'compatible.rdbms' = '19.0',
            'au_size' = '1M';

-- Verificar disk groups criados
SELECT name, state, type, total_mb, free_mb,
       ROUND((1 - free_mb/total_mb)*100, 2) pct_used
FROM v$asm_diskgroup;

-- Adicionar disco a disk group existente
ALTER DISKGROUP dg_data ADD DISK '/dev/oracleasm/disk7';

-- Adicionar disco em failure group específico
ALTER DISKGROUP dg_data ADD FAILGROUP fg1
  DISK '/dev/oracleasm/disk8';

Administrando ASM com ASMCMD

-- Conectar ao ASMCMD
$ asmcmd
ASMCMD>

-- Listar disk groups
ASMCMD> lsdg
State    Type    Rebal  Sector  Block       AU  Total_MB  Free_MB  Req_mir_free_MB
MOUNTED  NORMAL  N         512   4096  4194304    204800   184320            20480

-- Navegar na estrutura ASM (similar ao filesystem)
ASMCMD> ls
DATA/
FRA/
REDO/

ASMCMD> cd DATA/PRODDB
ASMCMD> ls -l
Type  Redund  Striped  Time             Sys  Name
DATAFILE  UNPROT  COARSE   JAN 15 10:00:00  Y    SYSTEM.256.1234567890
DATAFILE  UNPROT  COARSE   JAN 15 10:00:00  Y    SYSAUX.257.1234567891
DATAFILE  UNPROT  COARSE   JAN 15 10:05:00  N    USERS.258.1234567892

-- Ver espaço usado por database
ASMCMD> du DATA/PRODDB
Used_MB      Mirror_used_MB
  51200             102400

-- Copiar arquivo do ASM para filesystem
ASMCMD> cp DATA/PRODDB/DATAFILE/users.258.1234567892 /backup/users.dbf

-- Remover arquivo ASM
ASMCMD> rm DATA/PRODDB/TEMPFILE/temp01.dbf

-- Criar alias para arquivo
ASMCMD> mkalias DATA/PRODDB/DATAFILE/users.258.1234567892 DATA/PRODDB/USERS_DATA

-- Verificar templates de disk group
ASMCMD> lstmpl -G DATA
Group_Name  Name          Stripe  Sys  Redund
DATA        ARCHIVELOG    COARSE  N    MIRROR
DATA        AUTOBACKUP    COARSE  N    MIRROR
DATA        DATAFILE      COARSE  Y    MIRROR
DATA        CONTROLFILE   FINE    Y    HIGH
DATA        ONLINELOG     FINE    Y    MIRROR
DATA        TEMPFILE      COARSE  Y    MIRROR

Rebalanceamento e Gerenciamento de Discos

-- Remover disco (triggering rebalance)
ALTER DISKGROUP dg_data DROP DISK disk3;

-- Remover disco com rebalance controlado (power 2 = mais lento, menos impacto)
ALTER DISKGROUP dg_data DROP DISK disk3 REBALANCE POWER 2;

-- Monitorar progresso do rebalance
SELECT group_number, operation, state, power,
       actual, sofar, est_work, est_rate, est_minutes
FROM v$asm_operation;

-- Cancelar operação de rebalance
ALTER DISKGROUP dg_data REBALANCE POWER 0;

-- Rebalancear manualmente após adicionar discos
ALTER DISKGROUP dg_data REBALANCE POWER 8;

-- Substituir disco defeituoso
-- 1. Marcar disco como offline
ALTER DISKGROUP dg_data OFFLINE DISK disk2 TIMEOUT 3600;

-- 2. Substituir disco fisicamente

-- 3. Descobrir novo disco
ALTER DISKGROUP dg_data CHECK ALL;

-- 4. Adicionar novo disco
ALTER DISKGROUP dg_data ADD DISK '/dev/oracleasm/disk9';

-- 5. Drop disco antigo
ALTER DISKGROUP dg_data DROP DISK disk2;

-- Redimensionar disk group (aumentar/diminuir tamanho de discos)
ALTER DISKGROUP dg_data RESIZE ALL SIZE 500G;

Monitoramento ASM

-- Informações gerais dos disk groups
SELECT name, state, type, total_mb, free_mb,
       usable_file_mb,
       ROUND((total_mb - free_mb)/total_mb * 100, 2) pct_used,
       offline_disks
FROM v$asm_diskgroup;

-- Estatísticas detalhadas por disco
SELECT g.name diskgroup,
       d.path,
       d.mount_status,
       d.mode_status,
       d.state,
       d.total_mb,
       d.free_mb,
       d.reads,
       d.writes,
       d.read_time,
       d.write_time
FROM v$asm_disk d
JOIN v$asm_diskgroup g ON d.group_number = g.group_number
ORDER BY g.name, d.path;

-- Verificar I/O performance por disk
SELECT g.name diskgroup,
       d.name disk,
       d.reads,
       d.writes,
       d.read_errs,
       d.write_errs,
       ROUND(d.read_time / NULLIF(d.reads, 0), 2) avg_read_ms,
       ROUND(d.write_time / NULLIF(d.writes, 0), 2) avg_write_ms
FROM v$asm_disk d
JOIN v$asm_diskgroup g ON d.group_number = g.group_number
WHERE d.mount_status = 'CACHED'
ORDER BY g.name, d.name;

-- Listar todos arquivos ASM e seu tamanho
SELECT concat('+' || gname, sys_connect_by_path(aname, '/')) full_path,
       file_type,
       round(bytes/1024/1024,2) size_mb
FROM (SELECT g.name gname,
             a.parent_index pindex,
             a.name aname,
             a.reference_index rindex,
             a.file_type,
             a.bytes
      FROM v$asm_file a, v$asm_diskgroup g
      WHERE g.group_number = a.group_number)
START WITH pindex = 0
CONNECT BY PRIOR rindex = pindex;

Resultado Esperado

O que você deve dominar após este tópico:

Criar disk groups

Escolher redundância adequada e configurar failure groups

Gerenciar storage

Adicionar/remover discos com rebalanceamento online

Usar ASMCMD

Navegar estrutura ASM e gerenciar arquivos

Monitorar performance

Identificar discos problemáticos e bottlenecks

Resolver falhas

Substituir discos defeituosos sem downtime

Otimizar layout

Planejar disk groups para diferentes workloads

Best Practices ASM

Separação de Disk Groups

Use disk groups separados para DATA (datafiles), FRA (backups) e REDO (redo logs). Isso isola I/O e facilita gerenciamento independente.

Escolha de AU Size

1MB para redo logs (write sequencial), 4MB para datafiles (balanceado), 8MB+ para Data Warehouse (large sequential scans). Não pode ser alterado após criação.

Failure Groups

Configure failure groups baseados em pontos únicos de falha físicos: controladores, chassis, power supplies. Evite colocar discos do mesmo hardware no mesmo failure group.

Monitoramento Proativo

Monitore espaço livre (alerta em 85%), I/O errors, tempo de rebalance e performance de discos. Configure alertas para disk offline events.

Anterior: Oracle RAC Próximo: Data Guard