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.