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