Translate

Mostrar mensagens com a etiqueta runstats. Mostrar todas as mensagens
Mostrar mensagens com a etiqueta runstats. Mostrar todas as mensagens

domingo, 10 de maio de 2026

🔥☕ DB2 PERFORMANCE TUNING — O “MOTOR INVISÍVEL” DO MAINFRAME IBM Z

 

Bellacosa Mainframe em tuning DB2

🔥☕ DB2 PERFORMANCE TUNING — O “MOTOR INVISÍVEL” DO MAINFRAME IBM Z

Como um SYSprog/DBA Padawan Aprende a Domar SQL, Buffer Pool, RID Pool, SORT e LOCKING no DB2 z/OS 💾🚀

No universo do DB2 for z/OS existe uma verdade brutal:

💣 “O problema quase nunca é o Mainframe.”

O IBM Z aguenta pancada absurda.
Quem normalmente destrói CPU, I/O e tempo de resposta é:

  • SQL mal escrito

  • Buffer pool mal dimensionado

  • RID pool estourando

  • SORT explodindo em WORKFILE

  • Locking gerando contenção

O DB2 é praticamente uma cidade viva dentro do z/OS.
E tuning é aprender onde o trânsito trava. ☕🏛️


🔥 1. SQL TUNING — O VERDADEIRO REI DA PERFORMANCE

💣 Regra número 1:

“O SQL errado derruba até z17.”


☕ O que mais mata performance?

🚨 TABLESPACE SCAN (TBSCAN)

Quando o DB2 lê a tabela inteira.

Exemplo ruim:

SELECT *
FROM CLIENTES
WHERE NOME = 'JOAO'

Sem índice em NOME:

-> scan completo
-> milhões de linhas
-> CPU sobe
-> I/O explode

🔥 Como melhorar?

✅ Use índices corretos

CREATE INDEX IX1
ON CLIENTES (NOME)

🚀 Prefira Stage 1 Predicates

Predicados Stage 1 são processados cedo pelo DB2.

Bom:

WHERE DATA = '2026-05-14'

Ruim:

WHERE YEAR(DATA) = 2026

A função quebra o uso eficiente do índice.


💣 Evite SELECT *

Ruim:

SELECT *

Bom:

SELECT ID, NOME

Menos colunas:

  • menos GETPAGE

  • menos I/O

  • menos CPU


🔥 Verifique o ACCESS PATH

Use:

EXPLAIN PLAN

Olhe:

  • MATCHCOLS

  • INDEX ONLY

  • TBSCAN

  • SORT

  • RID LIST


🚨 Sinais perigosos no EXPLAIN

ProblemaImpacto
TBSCANscan completo
SORTuso pesado de workfile
Hybrid Join ruimCPU explode
List Prefetch excessivoRID pool sofre
Cartesian Joincaos absoluto

☕ Ferramentas clássicas

SPUFI

EXPLAIN YES

PLAN_TABLE

Tabela mágica do DBA.


Visual Explain

No Data Studio ou ferramentas IBM.


🔥 2. BUFFER POOL TUNING — O “CACHE SAGRADO” DO DB2

O Buffer Pool é onde páginas ficam em memória.

Quanto mais HIT:

  • menos I/O

  • menos disco

  • mais velocidade


☕ Conceito simples

Sem buffer pool:

Programa -> Disco

Com buffer pool:

Programa -> Memória

Muito mais rápido.


🔥 Métricas importantes

Buffer Hit Ratio

Ideal:

> 90%

🚨 Sintomas de buffer pool ruim

  • Sync I/O alto

  • Read I/O excessivo

  • CPU esperando disco

  • Response time ruim


☕ Comandos úteis

Ver status

-DISPLAY BUFFERPOOL(BP0) DETAIL

🚀 Alterar tamanho

ALTER BUFFERPOOL BP0 VPSIZE 200000

💣 Mas cuidado…

Buffer pool gigante demais:

  • rouba memória do z/OS

  • aumenta paging

  • piora tudo

Tuning é equilíbrio.


🔥 Estratégia clássica

Separar objetos críticos

Exemplo:

Buffer PoolUso
BP0sistema
BP1OLTP
BP2batch
BP32KLOB/XML

☕ Pagesize correta

TipoPage
OLTP4K
Scan grande32K

🔥 3. RID POOL TUNING — A GUERRA DAS RID LISTS

RID = Record ID.

DB2 usa RID LIST quando:

  • vários índices participam

  • list prefetch ocorre


💣 Quando RID pool estoura…

O DB2 muda estratégia:

RID LIST -> TABLESPACE SCAN

Resultado:
🔥 desastre de performance


☕ Verificar RID pool

-DISPLAY BUFFERPOOL

ou IFCID traces.


🚀 Ajustar tamanho

ZPARM:

MAXRBLK

🔥 Sintomas clássicos

SintomaCausa
RID overflowpool pequeno
fallback para scanRID cheio
CPU altaexcesso de leitura

☕ Soluções

Melhorar índices

Muitas vezes RID pool explode porque:

  • índice ruim

  • predicates ruins

  • cardinalidade ruim


Atualizar RUNSTATS

Sem estatística:
DB2 toma decisões erradas.

RUNSTATS TABLESPACE ...

🔥 4. SORT TUNING — O BURACO NEGRO DO WORKFILE

SORT é caro.

Muito caro.


💣 O que gera SORT?

  • ORDER BY

  • GROUP BY

  • DISTINCT

  • UNION

  • JOIN sem índice


☕ O perigo invisível

SORT -> WORKFILE -> I/O -> CPU -> contenção

🚀 Como reduzir SORT?

Criar índices compatíveis

Exemplo:

SELECT *
FROM VENDAS
ORDER BY DATA

Índice:

CREATE INDEX IXDATA
ON VENDAS(DATA)

O DB2 evita SORT.


🔥 Monitorar WORKFILE

Veja:

  • DSNDB07

  • utilização

  • overflow

  • spill


☕ ZPARMs importantes

ParâmetroFunção
SRTPOOLmemória do sort
MAXSORT_IN_MEMORYsort em memória
DSMAXdatasets

🚨 Sintomas clássicos

  • DSNDB07 lotado

  • I/O absurdo

  • elapsed alto

  • batch lento


🔥 5. LOCKING TUNING — O INFERNO DAS CONTENÇÕES

O DB2 protege dados com locks.

Mas lock demais:
💣 trava o sistema inteiro.


☕ Tipos de lock

TipoNível
Rowlinha
Pagepágina
Tabletabela
Tablespacetudo

🚨 Deadlock

Dois processos esperam um ao outro.

Resultado:

SQLCODE -911
ou
SQLCODE -913

🔥 Timeout

Um processo espera demais.


☕ Estratégias de tuning

✅ Commit frequente

Ruim:

COMMIT a cada 1 milhão

Bom:

COMMIT a cada 1000

🚀 Use LOCKSIZE ROW

LOCKSIZE ROW

Menos contenção.


💣 Evite lock escalation

Quando muitos locks viram lock maior.

Exemplo:

10000 row locks
-> table lock

Caos no OLTP.


☕ CURRENTDATA(NO)

Ajuda em consultas read-only.


🔥 ISOLATION LEVEL

NívelCaracterística
URmais rápido
CScomum
RSconsistente
RRmáximo lock

🚨 RR é perigoso

Repeatable Read

Pode prender milhares de locks.


☕ Comandos úteis

Ver locks

-DISPLAY DATABASE(*) LOCKS

Threads travadas

-DISPLAY THREAD(*)

🔥 O SEGREDO QUE TODO DBA MAINFRAME APRENDE

A maioria dos problemas NÃO é resolvida aumentando hardware.

O fluxo correto é:

1. SQL
2. Índice
3. RUNSTATS
4. Access Path
5. Buffer Pool
6. Sort
7. Locking
8. Só depois pensar em CPU

☕ A FILOSOFIA DO DB2 z/OS

O DB2 é como uma megacidade subterrânea.

Cada:

  • página

  • lock

  • RID

  • sort

  • getpage

é trânsito acontecendo em tempo real.

E o DBA/Sysprog experiente aprende uma coisa:

🔥 “Performance não é força bruta.
É arquitetura inteligente.” 💾🚀

 

sábado, 9 de maio de 2026

🔥☕ “O MAINFRAME NÃO ESTÁ LENTO — SEU SQL É QUE ESTÁ INCENDIANDO A CPU DO IBM Z” 💾🚨

 

Bellacosa Mainframe mergulhando em performance e custo de query db2 no Mainframe

🔥☕ “O MAINFRAME NÃO ESTÁ LENTO — SEU SQL É QUE ESTÁ INCENDIANDO A CPU DO IBM Z” 💾🚨

A Verdade Brutal que Todo Sysprog Júnior Descobre Quando Entra no Mundo Real do DB2 for z/OS

Por Bellacosa Mainframe


Existe um momento na vida de todo sysprog júnior…

aquele instante mágico, traumático e inesquecível…

quando ele percebe que:

💣 O problema não era o CICS.

💣 Não era o z/OS.

💣 Não era o storage.

💣 Nem o “mainframe velho”.

Era um único SQL.

Sim.

Uma linha aparentemente inocente:

SELECT *
FROM CLIENTES
WHERE CPF = '12345678900'

…destruindo CPU, queimando MIPS, elevando MSU, congestionando buffer pool e transformando a LPAR num inferno termonuclear digital.

Bem-vindo ao mundo real do DB2 for z/OS.


☕ O DIA EM QUE O PADAWAN DESCOBRE QUE CPU NO MAINFRAME = DINHEIRO

No universo distribuído moderno, quando falta performance, a resposta costuma ser:

  • sobe mais VM

  • coloca Kubernetes

  • aumenta cluster

  • escala horizontalmente

No mainframe?

HAHAHAHA.

Aqui a conversa é outra.

Aqui:

CPU = LICENSING

CPU = MLC

CPU = 4HRA

CPU = FATURA MILIONÁRIA

Um SQL ruim não deixa apenas o sistema “mais lento”.

Ele:

  • aumenta custo mensal

  • afeta SLA

  • derruba throughput

  • impacta batch

  • congestiona CICS

  • aumenta I/O

  • cria lock contention

  • vira incidente de produção

E o mais assustador?

Muitas vezes tudo começa com um programador dizendo:

“Mas é só um SELECT…”


🏛️ O MAINFRAME NÃO PENSA COMO VOCÊ

O sysprog júnior normalmente imagina que o DB2 executa SQL exatamente como foi escrito.

Não.

O DB2 é muito mais sofisticado.

Quando você envia um SQL, o DB2 chama uma entidade quase mística:

🔥 O OPTIMIZER

Ele analisa:

  • estatísticas

  • cardinalidade

  • índices

  • distribuição de dados

  • filtros

  • joins

  • sort

  • predicates

  • paralelismo

  • buffer access

E então decide:

“Qual será o caminho menos custoso para encontrar esses dados?”

Esse caminho se chama:

☕ ACCESS PATH

E é aqui que nascem:

  • os heróis

  • os vilões

  • os incêndios de CPU

  • e os DBA traumatizados.


💣 O TABLESPACE SCAN — O DEMÔNIO QUE ASSOMBRA PRODUÇÃO

Imagine uma tabela com:

  • 900 milhões de linhas

  • 14 TB

  • milhões de acessos diários

Agora imagine um SQL sem índice adequado:

SELECT *
FROM CLIENTES
WHERE CPF = '12345678900'

Sem índice…

o DB2 pode precisar ler:

  • página por página

  • bloco por bloco

  • segmento por segmento

Isso se chama:

🚨 TABLESPACE SCAN

Ou seja:

o DB2 sai varrendo o oceano inteiro para encontrar um peixinho.

Resultado:

  • GETPAGE explode

  • CPU dispara

  • synchronous I/O aumenta

  • elapsed cresce

  • batch atrasa

  • CICS sofre

E o sysprog júnior começa a ouvir palavras assustadoras no war room:

  • “buffer pool saturation”

  • “RID failure”

  • “class 2 CPU”

  • “dynamic statement cache”

  • “DSNZPARM”

  • “DSNDB07 lotado”


☕ O PODER SOBRENATURAL DE UM ÍNDICE

Agora veja a mesma consulta com índice:

CREATE INDEX IXCPF
ON CLIENTES (CPF)

O cenário muda completamente.

Agora o DB2:

  • acessa diretamente o valor

  • evita scan massivo

  • reduz GETPAGE

  • diminui I/O

  • baixa CPU

O que levava:

  • 40 minutos

passa a levar:

  • 2 segundos

Sem exagero.

No mundo IBM Z isso acontece TODOS OS DIAS.


🔥 O ERRO MAIS COMUM DOS PROGRAMADORES COBOL

Padawan…

grave isso na alma:

“O COBOL não mata CPU sozinho.”

“O SQL dentro dele mata.”

Um clássico infernal:

PERFORM VARYING WS-I FROM 1 BY 1
   EXEC SQL
      SELECT ...
   END-EXEC
END-PERFORM

Parabéns.

Você acabou de criar:

☠️ O APOCALIPSE DO ROW-BY-ROW PROCESSING

Também conhecido como:

  • slow by slow

  • chatty SQL

  • cursor abuse

O programa funciona.

Mas em produção:

  • executa milhões de SQLs

  • congestiona DB2

  • aumenta context switch

  • explode CPU

O júnior acha:

“Funcionou no teste.”

O veterano olha e já sente dor física.


🧠 O MITO DO “SELECT *”

Outra heresia clássica:

SELECT *

Isso é praticamente um ritual proibido em ambientes críticos.

Porque talvez você precise:

  • 2 colunas

Mas o DB2 entrega:

  • 180 colunas

  • LOBs

  • dados inúteis

  • mais I/O

  • mais buffer

  • mais sort

  • mais CPU

O correto:

SELECT NOME, CPF

No mainframe:

eficiência é religião.


☕ RUNSTATS — O ALIMENTO DO OPTIMIZER

O optimizer do DB2 depende de estatísticas.

Sem elas:

ele fica cego.

RUNSTATS informa:

  • quantidade de linhas

  • distribuição

  • cardinalidade

  • clustering

  • seletividade

Sem RUNSTATS atualizada…

o DB2 toma decisões absurdas.

Exemplo real:

Tabela cresceu de:

  • 10 milhões
    para

  • 800 milhões linhas

Mas estatística continua antiga.

O optimizer acredita que a tabela ainda é pequena.

Escolhe nested loop inadequado.

Resultado:

💣 CPU 100x maior


🔥 EXPLAIN — O RAIO-X DA ALMA DO SQL

Veterano de DB2 não confia em “achismo”.

Ele usa:

EXPLAIN PLAN

Porque EXPLAIN revela:

  • índice usado

  • join method

  • scans

  • sorts

  • custo estimado

  • stage 1 / stage 2

  • parallelism

É literalmente:

a anatomia do pensamento do DB2.


☕ STAGE 2 — O CEMITÉRIO DA INDEXABILITY

Veja isso:

WHERE SUBSTR(NOME,1,3) = 'MAR'

Parece elegante.

Mas pode impedir uso eficiente de índice.

Outro clássico:

WHERE YEAR(DATA) = 2025

Muito bonito.

Muito moderno.

Muito destrutivo.

Melhor:

WHERE DATA BETWEEN '2025-01-01'
              AND '2025-12-31'

Porque agora:

  • o índice pode respirar

  • o optimizer consegue navegar melhor


🔥 GETPAGE — A PALAVRA QUE FAZ DBA SUAR FRIO

No DB2 z/OS:

GETPAGE = acesso à página de dados.

Muito GETPAGE:

  • mais CPU

  • mais latch

  • mais memória

  • mais I/O

Veteranos monitoram:

  • GETPAGE

  • sync read

  • class 1

  • class 2

  • lock wait

  • RID list

como cardiologista monitorando ECG.


☕ “RÁPIDO” NÃO SIGNIFICA “BARATO”

Essa é uma das maiores lições do mainframe.

Às vezes:

  • elapsed time está ótimo

MAS:

  • CPU está monstruosa.

O usuário acha:

“Nossa, ficou rápido!”

O financeiro vê:

💸🔥💸🔥💸🔥

Porque no IBM Z:

CPU custa dinheiro real.


🤖 A ERA DA IA NO TUNING DB2

Hoje ferramentas modernas analisam:

  • SQLs problemáticos

  • regressão de access path

  • mudanças após REBIND

  • índices ausentes

  • scans perigosos

  • CPU anomalies

E algumas usam IA para:

  • prever degradação

  • sugerir rewrite

  • detectar padrões tóxicos

  • identificar SQLs assassinos

O futuro do tuning DB2 já começou.


🏛️ O QUE O SYSprog JÚNIOR PRECISA ENTENDER URGENTEMENTE

Mainframe não é:

  • “computador velho”

  • “COBOL antigo”

  • “legado ultrapassado”

Mainframe é:

engenharia extrema de throughput.

E DB2 for z/OS é:

um dos motores transacionais mais eficientes já criados pela humanidade.

Ele processa:

  • bancos

  • cartões

  • bolsa

  • aviação

  • seguros

  • governo

  • PIX

  • ATM

  • clearing financeira

Em escala absurda.


☕ A GRANDE VERDADE FINAL

O mundo moderno fala:

  • cloud

  • containers

  • microservices

  • IA

Mas nos bastidores…

existe um IBM Z executando milhões de transações por segundo…

e um DBA desesperado tentando descobrir:

🔥 “QUAL SQL ESTÁ QUEIMANDO A CPU?” 🔥

Porque no fim…

o COBOL processa o negócio…

o CICS coordena as transações…

mas:

💾 É O ACCESS PATH DO DB2 QUE DECIDE QUANTO CUSTA MANTER O MUNDO FUNCIONANDO. ☕🔥

quinta-feira, 7 de setembro de 2023

☕💣 PADAWAN, SUA QUERY ACABOU DE DERRUBAR O CICS?

Bellacosa Mainframe e o padawan perigoso nas querys db2


☕💣 PADAWAN, SUA QUERY ACABOU DE DERRUBAR O CICS?

Como Escrever SELECTs Performáticos no DB2 for z/OS Sem Virar Inimigo do DBA

Existe um momento na vida de todo profissional Mainframe em que ele descobre uma verdade dolorosa:

A query funciona.

Mas a CPU não gosta dela.

O usuário não gosta dela.

O DBA não gosta dela.

E o gerente de produção definitivamente não gosta dela.

O iniciante normalmente pensa:

"Mas ela trouxe o resultado correto."

O DB2 pensa:

"Sim. Depois de ler 800 milhões de linhas."

É aí que nasce a diferença entre um programador SQL e um especialista em performance DB2.

Hoje vamos aprender como analisar uma consulta SQL antes que ela se transforme em um incidente de produção.

Prepare seu café.

Vamos conversar sobre CPU, índices, Access Path e sobrevivência corporativa.


O PRIMEIRO MANDAMENTO

Nunca confie numa query apenas porque ela funciona

Muitos iniciantes executam:

SELECT *
FROM CLIENTES
WHERE CPF='12345678900';

O resultado aparece instantaneamente no ambiente de testes.

Eles ficam felizes.

Mas esquecem que:

  • Teste possui poucos registros

  • Produção possui bilhões

  • Teste tem poucos usuários

  • Produção tem milhares

Uma query aparentemente inocente pode consumir milhares de segundos de CPU diariamente.


PASSO 1 — APRENDA A LER O EXPLAIN

O EXPLAIN é o raio-x da consulta.

Antes de colocar qualquer SQL importante em produção execute:

EXPLAIN PLAN SET QUERYNO = 1001
FOR
SELECT ...

O DB2 gravará informações em tabelas como:

  • PLAN_TABLE

  • DSN_STATEMNT_TABLE

  • DSN_FUNCTION_TABLE

Ali está a verdade.

Não a opinião do desenvolvedor.


PASSO 2 — DESCUBRA O ACCESS PATH

O Access Path é a rota escolhida pelo otimizador.

Você quer ver algo parecido com:

MATCHCOLS = 3
ACCESS = I
INDEX ONLY = Y

Ou seja:

  • usando índice

  • poucas leituras

  • acesso eficiente

Você NÃO quer encontrar:

ACCESS = R

ou

TABLESPACE SCAN

Isso significa:

"Vou ler tudo."

É como procurar um CPF lendo uma lista telefônica inteira.


PASSO 3 — OLHE O MATCHCOLS

Padawan, grave isso.

MATCHCOLS é uma das colunas mais importantes do EXPLAIN.

Suponha índice:

IX01

CPF
AGENCIA
CONTA

Consulta:

WHERE CPF = ?

MATCHCOLS = 1

Excelente.


Consulta:

WHERE CPF = ?
AND AGENCIA = ?

MATCHCOLS = 2

Melhor ainda.


Consulta:

WHERE AGENCIA = ?

MATCHCOLS = 0

Problema.

O DB2 não consegue aproveitar o início do índice.


PASSO 4 — ANALISE A FILTRAGEM

O índice deve reduzir o universo de dados.

Imagine:

Tabela:

100 milhões de linhas

Cláusula:

WHERE SEXO='M'

Se 50 milhões possuem M.

O filtro é ruim.


Agora:

WHERE CPF='12345678900'

Retorna uma linha.

Excelente seletividade.

Quanto mais seletivo, melhor.


PASSO 5 — CUIDADO COM O LIKE

Boa consulta:

WHERE NOME LIKE 'CARLOS%'

Pode utilizar índice.


Consulta perigosa:

WHERE NOME LIKE '%CARLOS%'

O DB2 normalmente perde o acesso direto.

Resultado:

CPU sobe.

GETPAGE sobe.

Tempo sobe.

O DBA chora.


PASSO 6 — EVITE FUNÇÕES NA COLUNA INDEXADA

Ruim:

WHERE YEAR(DATA_NASCIMENTO)=2025

O índice pode ser ignorado.

Melhor:

WHERE DATA_NASCIMENTO
BETWEEN '2025-01-01'
AND '2025-12-31'

Agora o índice pode ser explorado.


PASSO 7 — NÃO USE SELECT *

Erro clássico:

SELECT *
FROM CLIENTES

O DB2 buscará tudo.

Inclusive colunas que você não precisa.

Melhor:

SELECT
CPF,
NOME,
LIMITE
FROM CLIENTES

Menos I/O.

Menos CPU.

Menos rede.

Menos buffer pool.


PASSO 8 — DESCUBRA SE O ÍNDICE É BOM

Pergunte:

Ele atende o WHERE?

Exemplo:

WHERE CPF=?

Índice:

CPF

Excelente.


Ele atende ORDER BY?

Consulta:

WHERE CPF=?
ORDER BY DATA

Índice:

CPF
DATA

Excelente.

Pode eliminar SORT.


Ele atende JOIN?

Consulta:

CLIENTE.ID
=
PEDIDO.ID_CLIENTE

A coluna do JOIN deveria estar indexada.


PASSO 9 — PROCURE SORTS DESNECESSÁRIOS

O SORT é um consumidor profissional de CPU.

Se aparecer:

SORTN_ORDERBY = Y

investigue.

Talvez um índice resolva.


PASSO 10 — ANALISE O CUSTO ESTIMADO

DB2 12 e DB2 13 fornecem estimativas importantes.

Observe principalmente:

TOTAL_COST
CPU_COST
IO_COST

Ferramentas como:

  • Data Studio

  • Optim Query Workload Tuner

  • IBM Data Server Manager

mostram essas informações de forma amigável.

CPU_COST elevado é sinal de atenção.


PASSO 11 — OLHE OS GETPAGES

DBAs experientes adoram GETPAGE.

Porque ele mostra quantas páginas serão lidas.

Exemplo:

GETPAGE = 100

Ótimo.


GETPAGE = 8.000.000

Hora de revisar a query.


PASSO 12 — VERIFIQUE RUNSTATS

Às vezes a query é boa.

O índice é bom.

Mas as estatísticas são ruins.

Verifique:

RUNSTATS atualizado?

Sem estatísticas confiáveis o otimizador toma decisões erradas.


PASSO 13 — REORG IMPORTA

Um índice pode existir.

Mas estar fragmentado.

Nesse cenário:

  • mais I/O

  • mais CPU

  • mais elapsed time

REORG continua sendo um dos melhores amigos da performance.


PASSO 14 — CUIDADO COM O ONLINE

Batch e Online são mundos diferentes.

No Batch:

5 segundos

Pode ser aceitável.

No Online:

5 segundos

Pode ser uma catástrofe.

Imagine:

1000 usuários simultâneos.

Cada um executando uma query de 5 segundos.

O gargalo nasce rapidamente.


PASSO 15 — A REGRA DE OURO DO PADAWAN

Antes de promover uma query para produção pergunte:

✅ Existe índice?

✅ O índice é utilizado?

✅ O MATCHCOLS é bom?

✅ Existe TABLESPACE SCAN?

✅ Existe SORT desnecessário?

✅ O filtro é seletivo?

✅ Os RUNSTATS estão atualizados?

✅ O GETPAGE está razoável?

✅ O CPU_COST parece aceitável?

✅ O tempo de resposta atende o SLA?

Se alguma resposta for não...

Volte para a oficina.


O SEGREDO DOS MESTRES DB2

Programadores iniciantes escrevem SQL.

Programadores experientes analisam EXPLAIN.

Especialistas DB2 pensam como o otimizador.

Quando você começa a prever qual índice será utilizado, qual access path será escolhido e qual será o impacto em CPU antes mesmo de executar a query, você deixa de ser apenas um desenvolvedor.

Você começa a enxergar o banco pelos olhos do DB2.

E é nesse momento que o Padawan se aproxima do nível Jedi Mainframe.

Porque no universo do DB2, o objetivo não é apenas retornar dados.

O objetivo é retornar dados rapidamente, consumindo o mínimo possível de CPU, evitando filas no CICS, gargalos no DDF, explosões de GETPAGE e telefonemas desesperados da equipe de produção às duas da manhã.

Que a Força do Access Path esteja com você.


sexta-feira, 4 de agosto de 2023

☕ Da Tela Verde ao SQL: A Jornada de um Profissional Mainframe

 

Bellacosa Mainframe evoluindo da tela verde ao SQL no Db2



☕ Da Tela Verde ao SQL: A Jornada de um Profissional Mainframe

Muitos profissionais aprendem JCL, COBOL, SORT e CICS antes de entrar em contato com SQL.

Quando isso acontece, a primeira impressão costuma ser:

"Parece simples demais."

Mas o SQL possui uma característica única:

É simples para começar e complexo para dominar.

Você consegue escrever um SELECT em poucos minutos.

Pode levar anos para compreender completamente:

  • Access Paths

  • Indexes

  • Buffer Pools

  • Locking

  • Concurrency

  • RUNSTATS

  • REORG

  • Performance Tuning

Por isso cada objetivo dessa trilha merece ser explorado profundamente.


🎯 Objetivo 1: Compreender os Conceitos Básicos do SQL

O que realmente significa?

Entender SQL não é decorar comandos.

É compreender o Modelo Relacional.

Antes do SQL, sistemas trabalhavam diretamente com:

  • Arquivos sequenciais

  • VSAM KSDS

  • VSAM ESDS

  • VSAM RRDS

O programador precisava conhecer:

  • Layout físico

  • Chaves

  • Organização dos dados

Com SQL ocorre uma revolução:

Você informa:

SELECT NOME
FROM CLIENTES

O banco decide:

  • Como localizar

  • Qual índice usar

  • Quantas páginas acessar

  • Qual estratégia é mais eficiente

Essa separação entre lógica e armazenamento foi uma das maiores inovações da computação.


Conceitos fundamentais

Tabela

Equivalente moderno de um arquivo lógico.

Linha

Registro.

Coluna

Campo.

Chave Primária

Identifica unicamente cada registro.

Índice

Estrutura que acelera pesquisas.

Relacionamento

Conexão entre tabelas.


🎯 Objetivo 2: Explorar a Sintaxe e Estruturas do SQL

Aqui começa a alfabetização do profissional SQL.

Toda instrução possui uma estrutura lógica.

Exemplo:

SELECT
    NOME,
    CIDADE
FROM CLIENTES
WHERE CIDADE = 'SANTOS'
ORDER BY NOME;

Observe a sequência:

  1. SELECT

  2. FROM

  3. WHERE

  4. ORDER BY

A ordem de escrita é simples.

Mas o DB2 executa internamente de forma diferente.

Ele primeiro localiza os dados.

Depois filtra.

Depois ordena.

Compreender isso ajuda a entender performance.


Boas práticas desde o início

Evite:

SELECT *
FROM CLIENTES;

Prefira:

SELECT
    ID_CLIENTE,
    NOME,
    CIDADE
FROM CLIENTES;

Essa pequena mudança já demonstra maturidade técnica.


🎯 Objetivo 3: Utilizar Comandos Básicos de SQL

Todo profissional precisa dominar quatro comandos fundamentais.


SELECT

Consulta informações.

SELECT *
FROM CLIENTES;

INSERT

Inclui registros.

INSERT INTO CLIENTES
(
 ID,
 NOME
)
VALUES
(
 1,
 'ANA'
);

UPDATE

Altera registros.

UPDATE CLIENTES
SET CIDADE = 'SANTOS'
WHERE ID = 1;

DELETE

Remove registros.

DELETE
FROM CLIENTES
WHERE ID = 1;

O erro que assombra os DBAs

Esquecer o WHERE.

Exemplo perigoso:

UPDATE CLIENTES
SET STATUS = 'ATIVO';

Resultado:

Toda a tabela será atualizada.

É um dos acidentes mais famosos da história dos bancos de dados.


🎯 Objetivo 4: Implementar Consultas Simples em SQL

Agora o aluno começa a transformar dados em informação.


Filtrando registros

SELECT
    NOME
FROM CLIENTES
WHERE CIDADE = 'SANTOS';

Filtrando intervalos

SELECT
    NOME
FROM CLIENTES
WHERE SALARIO
BETWEEN 5000 AND 10000;

Utilizando listas

SELECT *
FROM CLIENTES
WHERE ESTADO IN
(
 'SP',
 'RJ',
 'MG'
);

Pesquisando padrões

SELECT *
FROM CLIENTES
WHERE NOME LIKE 'MAR%';

Retorna:

  • MARIA

  • MARCOS

  • MARCELO


Ordenando resultados

SELECT
 NOME,
 SALARIO
FROM FUNCIONARIOS
ORDER BY SALARIO DESC;

🎯 Objetivo 5: Criar Suas Primeiras Consultas em SQL

Aqui nasce o verdadeiro analista de dados.

Não basta consultar.

É necessário responder perguntas do negócio.


Quantos clientes existem?

SELECT COUNT(*)
FROM CLIENTES;

Qual o maior salário?

SELECT MAX(SALARIO)
FROM FUNCIONARIOS;

Qual a média salarial?

SELECT AVG(SALARIO)
FROM FUNCIONARIOS;

Quantos clientes existem por cidade?

SELECT
    CIDADE,
    COUNT(*)
FROM CLIENTES
GROUP BY CIDADE;

Agora estamos produzindo inteligência.

Não apenas listando registros.


🚀 O Próximo Passo no DB2 13

Após dominar esses cinco objetivos, o profissional estará pronto para estudar temas mais avançados:

JOINs

SELECT
 C.NOME,
 P.NUMERO_PEDIDO
FROM CLIENTES C
INNER JOIN PEDIDOS P
ON C.ID = P.ID_CLIENTE;

Subqueries

SELECT *
FROM FUNCIONARIOS
WHERE SALARIO >
(
 SELECT AVG(SALARIO)
 FROM FUNCIONARIOS
);

Índices

CREATE INDEX IX_CLIENTE_NOME
ON CLIENTES
(
 NOME
);

EXPLAIN

Análise do plano de acesso.

Ferramenta essencial para DBAs e desenvolvedores DB2.


SQL Embedded em COBOL

EXEC SQL
   SELECT NOME
   INTO :WS-NOME
   FROM CLIENTES
   WHERE ID = :WS-ID
END-EXEC.

Aqui começa o verdadeiro universo Mainframe.


☕ Conclusão Bellacosa Mainframe

Os cinco objetivos apresentados na imagem parecem simples à primeira vista.

Mas eles representam a fundação de praticamente todo o ecossistema corporativo moderno.

Cada PIX processado.

Cada compra no cartão.

Cada transferência bancária.

Cada consulta de seguro.

Cada reserva aérea.

Em algum momento passa por um comando SQL.

No DB2 13, aprender SQL significa muito mais do que aprender uma linguagem. Significa compreender como os dados fluem dentro de alguns dos maiores sistemas do planeta.

O primeiro passo é escrever:

SELECT *
FROM CLIENTES;

O passo seguinte é entender por que essa consulta funciona.

O passo que diferencia um especialista é compreender por que ela pode ser lenta, como o DB2 a executa, quais índices utiliza e como transformá-la em uma consulta capaz de processar bilhões de registros com eficiência.

E é exatamente nesse momento que o estudante deixa de apenas aprender SQL e começa a pensar como um verdadeiro profissional de Mainframe. ☕🚀💾



Descubra como profissionais de Mainframe evoluem da programação em JCL, COBOL, SORT e CICS para o domínio do SQL no DB2 13 for z/OS. Entenda modelo relacional, consultas SQL, índices, joins, subqueries, EXPLAIN, access paths e técnicas de otimização utilizadas nos maiores ambientes corporativos do mundo.

terça-feira, 19 de julho de 2022

DB2 Utilities sem Mistérios : O Guia do Programador COBOL Padawan para Entender REBUILD, REORG, COPY, RUNSTATS e o JCL por Trás da Tela Verde

 

Bellacosa Mainframe e o db2 utilies sem misterios

☕ Um Café no Bellacosa Mainframe

DB2 Utilities sem Mistérios 

O Guia do Programador COBOL Padawan para Entender REBUILD, REORG, COPY, RUNSTATS e o JCL por Trás da Tela Verde

Imagine a seguinte cena.

Você está diante de um terminal 3270. A tela preta parece silenciosa, quase imóvel. No alto aparece a inscrição:

DB2 UTILITIES

À direita, surge o nome do subsistema:

SSID: DB9G

No centro da tela, alguns campos aparentemente simples:

FUNCTION  ==> EDITJCL
JOB ID    ==> TEMP
UTILITY   ==> REBUILD
RESTART   ==> NO
LISTDEF   ==> NO
TEMPLATE  ==> NO

Para um programador COBOL Padawan, essa tela pode parecer apenas mais um formulário antigo do ISPF. Talvez algo criado em uma era na qual os monitores eram pesados, os teclados faziam barulho e os programadores carregavam manuais do tamanho de listas telefônicas.

Mas não se deixe enganar pela simplicidade visual.

Essa tela é como o painel de controle de uma enorme estação orbital. Por trás de poucos campos existe um conjunto de programas capazes de copiar, reorganizar, validar, reconstruir, descarregar e recuperar bancos de dados que podem armazenar bilhões de registros.

É aqui que o Db2 deixa de ser apenas o lugar onde seu programa COBOL executa um SELECT ou um UPDATE e revela sua verdadeira natureza: um sistema vivo que precisa de manutenção, estatísticas, cópias de segurança, reorganização e monitoramento constante.

Hoje vamos abrir esse painel, desmontar seus componentes e entender a engenharia escondida por trás de cada opção.


Bellacosa Mainframe e a tela do db2 para comandos de administracao

1. A tela não executa a mágica: ela gera as ordens

O primeiro conceito importante é compreender que o painel do Db2 Utilities não é, por si só, o utilitário.

Ele funciona como uma interface de preparação.

O fluxo normalmente é:

Usuário
   |
   v
Painel ISPF
   |
   v
Parâmetros informados
   |
   v
Geração de JCL
   |
   v
Submissão ao JES2
   |
   v
Execução do utilitário Db2
   |
   v
Mensagens no spool

O painel pergunta:

  • Qual utilitário deseja executar?

  • Qual subsistema Db2 será utilizado?

  • Onde estão os comandos do utilitário?

  • Deseja apenas editar o JCL ou submetê-lo?

  • A execução será nova ou continuará uma execução anterior?

  • Serão utilizadas listas automáticas?

  • Serão utilizados templates para datasets?

Com essas respostas, ele monta o JCL necessário.

Essa filosofia é muito comum no mainframe: a interface não tenta esconder completamente o que está acontecendo. Ela ajuda, orienta e gera o material operacional, mas o profissional ainda consegue examinar o JCL, alterar parâmetros e analisar o resultado.


2. SSID: escolhendo o universo Db2 correto

Na imagem temos:

SSID: DB9G

SSID significa:

Subsystem Identifier

É o identificador do subsistema Db2.

Uma instalação z/OS pode executar vários subsistemas Db2. Cada um representa um ambiente independente, com seu próprio catálogo, logs, buffer pools, planos, packages e objetos.

Exemplos:

DB2D  - Desenvolvimento
DB2T  - Testes
DB2H  - Homologação
DB2P  - Produção
DB9G  - Ambiente de laboratório ou treinamento

O nome não possui uma regra universal. Cada organização define seu padrão.

Essa escolha é crítica.

Executar um REBUILD INDEX em desenvolvimento é uma coisa.

Executar no subsistema de produção, durante o horário de pico, é outra completamente diferente.

Um erro no SSID pode transformar uma atividade rotineira em um incidente.

Easter egg operacional

Muitos profissionais experientes confirmam o SSID várias vezes antes de submeter um utilitário. Não é paranoia. É memória histórica.

Um DBA pode ter duas sessões abertas:

Sessão 1: DB2D
Sessão 2: DB2P

As telas são praticamente idênticas.

Um comando correto no ambiente errado continua sendo um comando errado.


3. FUNCTION: o que fazer com o JCL

Na tela aparece:

FUNCTION ==> EDITJCL

Esse campo define o destino da operação.

As opções normalmente incluem:

SUBMIT
EDITJCL
DISPLAY
TERMINATE

3.1 EDITJCL

A opção EDITJCL gera o JCL e abre o resultado no editor ISPF.

É uma das opções mais seguras, pois permite revisar tudo antes da execução.

Você pode conferir:

  • JOBNAME;

  • CLASS;

  • MSGCLASS;

  • subsistema Db2;

  • datasets;

  • comandos SYSIN;

  • parâmetros de SORT;

  • nomes de tablespaces e índices;

  • opções de paralelismo;

  • espaço temporário;

  • instruções de restart.

Fluxo:

Painel
   |
   v
Geração do JCL
   |
   v
ISPF Edit
   |
   v
Revisão humana
   |
   v
SUBMIT

Para produção, essa revisão é importantíssima.

3.2 SUBMIT

A opção SUBMIT gera o JCL e o envia diretamente ao JES2.

É prática e rápida, mas elimina a oportunidade de revisão manual.

Pode ser adequada em ambientes controlados, especialmente quando:

  • o procedimento já foi testado;

  • o JCL segue um padrão;

  • os datasets são gerados por template;

  • o objeto já foi validado;

  • o usuário conhece o impacto da operação.

Para um Padawan, EDITJCL é a escolha mais educativa.

3.3 DISPLAY

DISPLAY permite consultar utilitários em execução ou pendentes.

Um utilitário Db2 mantém informações sobre seu estado.

Por exemplo:

UTILID = REORGP01
PHASE  = RELOAD
STATUS = ACTIVE

Isso permite saber:

  • qual utilitário está executando;

  • qual objeto está sendo processado;

  • em qual fase está;

  • se está parado;

  • se aguarda algum recurso;

  • se pode ser reiniciado.

3.4 TERMINATE

TERMINATE encerra o estado registrado de uma utility.

Mas cuidado: terminar uma utility não significa simplesmente “cancelar um job”.

Existe uma diferença entre:

CANCEL do job no JES2

e:

TERM UTILITY no Db2

Quando um job é cancelado, o Db2 pode manter informações de restart.

A utility continua registrada como incompleta.

O comando de término informa ao Db2 que aquela execução não será retomada.

Essa operação deve ser feita com conhecimento, porque pode eliminar a possibilidade de restart daquela utility.


4. JOB ID: identificando a missão

Na imagem:

JOB ID ==> TEMP

Esse campo serve como identificador para a geração ou para a execução.

Dependendo do painel e do modelo utilizado, ele pode participar da criação de:

  • JOBNAME;

  • utility ID;

  • nomes temporários;

  • membros;

  • datasets de trabalho.

Exemplos mais descritivos:

REBLIDX
REORGCAD
COPYFIN
RUNSTPRD
LOADCLI

Em produção, nomes claros ajudam muito.

Compare:

TEMP

com:

RBCUST01

O segundo nome já sugere:

RB = Rebuild
CUST = Customer
01 = Execução ou partição

Quando dezenas de jobs aparecem no SDSF, uma boa nomenclatura reduz confusão.


5. UTILITY: escolhendo a ferramenta certa

Na imagem, a opção selecionada é:

UTILITY ==> REBUILD

O painel lista vários utilitários:

CHECK DATA
CHECK INDEX
CHECK LOB
COPY
DIAGNOSE
LOAD
MERGE
MODIFY
QUIESCE
REBUILD
RECOVER
REORG INDEX
REORG LOB
REORG TABLESPACE
REPORT
REPAIR
RUNSTATS
STOSPACE
UNLOAD

Cada um resolve um problema diferente.

Vamos entender os principais.


6. REBUILD INDEX: reconstruindo a árvore

Um índice Db2 normalmente utiliza uma estrutura semelhante a uma árvore B+.

Ele permite localizar rapidamente linhas sem ler toda a tabela.

Imagine uma tabela:

TB_CLIENTE

com as colunas:

ID_CLIENTE
CPF
NOME
CIDADE
SALDO

E um índice:

IX_CLIENTE_CPF

Ao executar:

SELECT NOME
  FROM TB_CLIENTE
 WHERE CPF = '12345678900';

o Db2 pode consultar o índice e localizar diretamente a página correspondente.

Com o tempo, porém, o índice sofre alterações:

  • inserções;

  • exclusões;

  • splits de páginas;

  • movimentação de chaves;

  • páginas parcialmente vazias;

  • perda de organização;

  • inconsistência após determinadas falhas.

O REBUILD INDEX recria a estrutura.

Fluxo conceitual

Leitura dos dados ou das chaves
          |
          v
Ordenação das chaves
          |
          v
Criação de nova estrutura
          |
          v
Gravação das páginas do índice
          |
          v
Validação e disponibilização

Exemplo de comando Db2

REBUILD INDEX
  (DBFIN.IXCLIENT)
  SHRLEVEL REFERENCE
  SORTDEVT SYSDA
  SORTNUM 8
  STATISTICS

Explicando cada linha

REBUILD INDEX

Solicita a reconstrução de um índice.

(DBFIN.IXCLIENT)

Identifica o indexspace ou objeto que será reconstruído. A sintaxe exata pode variar conforme o tipo de objeto e a convenção utilizada.

SHRLEVEL REFERENCE

Permite determinado nível de acesso concorrente, geralmente leitura, enquanto restringe alterações durante partes da execução.

SORTDEVT SYSDA

Indica o tipo genérico de dispositivo a ser utilizado para arquivos temporários de sort.

SORTNUM 8

Solicita uma quantidade de datasets de trabalho para ordenação.

STATISTICS

Pede a coleta de estatísticas durante ou após o processo, quando suportado pela utility e configuração.


7. Exemplo completo de JCL para REBUILD INDEX

//RBIDX01  JOB (ACCT),'REBUILD INDEX',
//             CLASS=A,
//             MSGCLASS=X,
//             NOTIFY=&SYSUID
//*
//STEP01   EXEC PGM=DSNUTILB,
//             REGION=0M,
//             PARM='DB9G,RBIDX01'
//STEPLIB   DD DISP=SHR,DSN=DB2.V13.SDSNLOAD
//SYSPRINT  DD SYSOUT=*
//UTPRINT   DD SYSOUT=*
//SYSUDUMP  DD SYSOUT=*
//SORTDEVT  DD DUMMY
//SYSIN     DD *
  REBUILD INDEX
    (DBFIN.IXCLIENT)
    SHRLEVEL REFERENCE
    SORTDEVT SYSDA
    SORTNUM 8
/*
//

Agora vamos desmontar esse JCL como um engenheiro desmontaria um processador antigo.


7.1 JOB statement

//RBIDX01 JOB (ACCT),'REBUILD INDEX',

O nome do job é:

RBIDX01

Ele será exibido no JES2 e no SDSF.

(ACCT)

Representa informações contábeis ou administrativas. O formato depende da instalação.

'REBUILD INDEX'

É uma descrição humana da execução.


7.2 CLASS

//            CLASS=A,

A classe determina como o JES2 tratará o job.

Pode influenciar:

  • prioridade;

  • initiator;

  • ambiente de execução;

  • limite de recursos;

  • janela operacional.

Cada empresa configura suas classes.


7.3 MSGCLASS

//            MSGCLASS=X,

Define onde as mensagens e listagens do job serão direcionadas.

Normalmente controla a classe de saída no spool.


7.4 NOTIFY

//            NOTIFY=&SYSUID

Pede que o usuário seja notificado quando o job terminar.

&SYSUID é uma variável simbólica que representa o usuário que submeteu o job.


7.5 EXEC PGM=DSNUTILB

//STEP01 EXEC PGM=DSNUTILB,

Aqui está o programa que executa a utility.

DSNUTILB é o batch utility program do Db2 for z/OS.

Ele recebe os comandos, conversa com o subsistema Db2 e coordena a operação.


7.6 REGION=0M

//            REGION=0M,

Solicita que o step utilize a quantidade de memória permitida pelas políticas do sistema, sem um limite artificial pequeno definido no JCL.

Isso não significa memória infinita.

O z/OS, o WLM e as configurações de instalação continuam impondo limites.


7.7 PARM

//            PARM='DB9G,RBIDX01'

O primeiro parâmetro identifica o subsistema Db2:

DB9G

O segundo funciona como utility ID:

RBIDX01

A utility ID precisa ser administrada com cuidado.

Se uma utility falhar e permanecer registrada, uma nova execução com a mesma ID pode encontrar conflito ou tentar continuar uma execução anterior, dependendo dos parâmetros.


7.8 STEPLIB

//STEPLIB DD DISP=SHR,DSN=DB2.V13.SDSNLOAD

Aponta para a biblioteca onde se encontram os módulos executáveis do Db2.

DISP=SHR

Permite compartilhar a biblioteca com outros jobs.

Em algumas instalações, a biblioteca já está no LINKLIST ou definida em um procedimento catalogado. Nesse caso, o STEPLIB pode não ser necessário.


7.9 SYSPRINT

//SYSPRINT DD SYSOUT=*

Recebe as mensagens principais da utility.

É um dos primeiros lugares que você deve consultar no spool.

Ali podem aparecer:

  • parâmetros reconhecidos;

  • objetos processados;

  • fases executadas;

  • mensagens de erro;

  • return code;

  • estatísticas;

  • tempos de execução.


7.10 UTPRINT

//UTPRINT DD SYSOUT=*

Recebe mensagens relacionadas ao processamento da utility.

Dependendo do utilitário e da versão, pode conter informações adicionais importantes.


7.11 SYSUDUMP

//SYSUDUMP DD SYSOUT=*

Solicita um dump caso ocorra uma falha anormal.

Esse dump pode ser enorme, mas é muito útil para diagnóstico técnico.

Em ambientes de produção, dumps podem ser direcionados a datasets específicos ou sistemas de gerenciamento de dumps.


7.12 SYSIN

//SYSIN DD *

Aqui começam os comandos da utility.

O asterisco indica que os dados estão embutidos no próprio JCL.

  REBUILD INDEX
    (DBFIN.IXCLIENT)

O conteúdo termina com:

/*

Também seria possível armazenar os comandos em um membro de PDS:

//SYSIN DD DISP=SHR,
//          DSN=IBMUSER.WORKBOOK.DB2.ERG(ERGREBL)

Esse formato corresponde ao campo mostrado na imagem:

STATEMENT DATA SET
IBMUSER.WORKBOOK.DB2.ERG(ERGREBL)

8. STATEMENT DATA SET: separando o JCL do comando

Na tela aparece um dataset semelhante a:

IBMUSER.WORKBOOK.DB2.ERG(ERGREBL)

Esse é um membro de uma biblioteca particionada.

Podemos dividir o nome assim:

IBMUSER
WORKBOOK
DB2
ERG
ERGREBL

O trecho entre parênteses é o membro:

ERGREBL

Dentro dele provavelmente existe algo semelhante a:

REBUILD INDEX
  (DBFIN.IXCLIENT)
  SHRLEVEL REFERENCE
  SORTDEVT SYSDA
  SORTNUM 8

A vantagem de armazenar o comando separadamente é a reutilização.

O mesmo JCL pode apontar para comandos diferentes:

ERGREBL  - REBUILD
ERGREOG  - REORG
ERGRUNS  - RUNSTATS
ERGCOPY  - COPY

Isso também melhora o controle de mudanças.


9. RESTART: começando de novo ou retomando a jornada

Na imagem:

RESTART ==> NO

Utilitários Db2 podem ser longos.

Um REORG de um tablespace gigantesco pode durar horas. Durante esse tempo, podem ocorrer:

  • falha de energia;

  • cancelamento operacional;

  • falta de espaço;

  • erro de sort;

  • indisponibilidade de dataset;

  • falha de dispositivo;

  • interrupção do Db2;

  • timeout;

  • erro de autorização.

Para evitar que todo o trabalho seja perdido, algumas utilities mantêm pontos de controle.

As opções apresentadas incluem:

NO
CURRENT
PHASE
PREVIEW

NO

RESTART = NO

Indica uma nova execução.

Não deseja retomar uma execução anterior.

CURRENT

Tenta continuar a utility a partir do ponto atual registrado.

PHASE

Permite reiniciar a partir de uma fase específica suportada.

PREVIEW

Permite visualizar ou avaliar informações da execução sem realizar todo o processamento normal, dependendo da utility e do contexto.

Exemplo conceitual

Uma utility REORG pode passar por fases como:

UTILINIT
UNLOAD
RELOAD
SORT
BUILD
LOG
SWITCH
UTILTERM

Se houver falha durante BUILD, o restart pode evitar a repetição completa das fases anteriores.

Cuidado

Nunca altere parâmetros de restart aleatoriamente.

O estado registrado no Db2 precisa corresponder ao comando informado. Alterações incompatíveis podem impedir a retomada ou gerar resultados inesperados.


10. RUNSTATS: ensinando o otimizador a enxergar

Agora vamos falar de uma utility indispensável.

O otimizador do Db2 escolhe caminhos de acesso com base em estatísticas.

Ele precisa saber:

  • quantidade de linhas;

  • número de páginas;

  • cardinalidade das colunas;

  • distribuição dos valores;

  • quantidade de valores distintos;

  • organização dos dados;

  • níveis do índice;

  • clustering;

  • frequência de determinados valores.

Sem estatísticas atualizadas, o otimizador toma decisões com informações antigas.

Imagine que uma tabela possuía 10 mil registros quando o último RUNSTATS foi executado.

Hoje ela possui 500 milhões.

O catálogo ainda diz:

CARDF = 10000

O otimizador pode escolher um caminho de acesso adequado para uma pequena tabela, mas desastroso para uma tabela gigantesca.

Exemplo de JCL para RUNSTATS

//RUNST01  JOB (ACCT),'RUNSTATS',
//             CLASS=A,
//             MSGCLASS=X,
//             NOTIFY=&SYSUID
//STEP01   EXEC PGM=DSNUTILB,
//             REGION=0M,
//             PARM='DB9G,RUNST01'
//STEPLIB   DD DISP=SHR,DSN=DB2.V13.SDSNLOAD
//SYSPRINT  DD SYSOUT=*
//UTPRINT   DD SYSOUT=*
//SYSIN     DD *
  RUNSTATS TABLESPACE DBFIN.TSCLIENT
    TABLE(ALL)
    INDEX(ALL)
    SHRLEVEL CHANGE
    UPDATE ALL
    REPORT YES
/*
//

Explicação

RUNSTATS TABLESPACE DBFIN.TSCLIENT

Solicita estatísticas do tablespace.

TABLE(ALL)

Processa todas as tabelas relevantes existentes naquele tablespace.

INDEX(ALL)

Coleta estatísticas de todos os índices associados.

SHRLEVEL CHANGE

Permite que aplicações continuem alterando os dados, dentro das regras e limitações da utility.

UPDATE ALL

Atualiza as estatísticas correspondentes no catálogo.

REPORT YES

Solicita relatório das informações coletadas.


11. COPY: criando uma linha do tempo para recuperação

A utility COPY cria uma image copy de um tablespace ou indexspace.

Não pense nela apenas como um “backup de arquivo”.

Ela faz parte da estratégia de recuperação do Db2.

Fluxo simplificado:

Image Copy
    +
Active Logs
    +
Archive Logs
    =
Recuperação até um ponto desejado

Exemplo

//COPY01   JOB (ACCT),'COPY TABLESPACE',
//             CLASS=A,
//             MSGCLASS=X,
//             NOTIFY=&SYSUID
//STEP01   EXEC PGM=DSNUTILB,
//             REGION=0M,
//             PARM='DB9G,COPY01'
//STEPLIB   DD DISP=SHR,DSN=DB2.V13.SDSNLOAD
//SYSPRINT  DD SYSOUT=*
//UTPRINT   DD SYSOUT=*
//SYSIN     DD *
  COPY TABLESPACE DBFIN.TSCLIENT
    FULL YES
    SHRLEVEL CHANGE
    COPYDDN COPYDD
/*
//COPYDD   DD DSN=BACKUP.DBFIN.TSCLIENT.D20260713,
//            DISP=(NEW,CATLG,DELETE),
//            UNIT=SYSDA,
//            SPACE=(CYL,(500,100),RLSE),
//            DCB=(RECFM=FB,LRECL=4096,BLKSIZE=0)
//

FULL YES

Cria uma cópia completa.

SHRLEVEL CHANGE

Permite alterações concorrentes durante grande parte do processo.

COPYDDN COPYDD

Liga o comando Db2 ao DD statement chamado COPYDD.

DISP

DISP=(NEW,CATLG,DELETE)

Significa:

NEW    - o dataset será criado;
CATLG  - se o step terminar normalmente, será catalogado;
DELETE - se o step falhar, será excluído.

SPACE

SPACE=(CYL,(500,100),RLSE)

Solicita:

Unidade de alocação: cilindros
Primária: 500
Secundária: 100
RLSE: liberar espaço não utilizado

12. REORG TABLESPACE: colocando a casa em ordem

Com o tempo, os dados podem perder a organização física ideal.

Isso ocorre por:

  • inserts fora da sequência;

  • deletes;

  • updates que aumentam o tamanho da linha;

  • page splits;

  • crescimento irregular;

  • espaços vazios;

  • registros deslocados;

  • baixa correlação com o índice de clustering.

O REORG TABLESPACE reorganiza os dados.

Exemplo

//REORG01  JOB (ACCT),'REORG TABLESPACE',
//             CLASS=A,
//             MSGCLASS=X,
//             NOTIFY=&SYSUID
//STEP01   EXEC PGM=DSNUTILB,
//             REGION=0M,
//             PARM='DB9G,REORG01'
//STEPLIB   DD DISP=SHR,DSN=DB2.V13.SDSNLOAD
//SYSPRINT  DD SYSOUT=*
//UTPRINT   DD SYSOUT=*
//SYSIN     DD *
  REORG TABLESPACE DBFIN.TSCLIENT
    LOG YES
    SHRLEVEL CHANGE
    SORTDEVT SYSDA
    SORTNUM 12
    STATISTICS
      TABLE(ALL)
      INDEX(ALL)
/*
//

LOG YES

Registra as alterações necessárias nos logs conforme as regras do utilitário.

SHRLEVEL CHANGE

Busca manter o objeto disponível para leitura e alteração durante boa parte da execução.

Isso não significa ausência absoluta de impacto.

Pode existir uma fase curta de troca ou sincronização na qual bloqueios são necessários.

SORTNUM 12

Solicita até doze datasets de sort.

Mais datasets não significam automaticamente mais desempenho. É necessário considerar:

  • tamanho do objeto;

  • memória;

  • paralelismo;

  • configuração do DFSORT;

  • disponibilidade de discos;

  • limites do sistema.


13. LISTDEF: selecionando objetos por regras

Na imagem:

LISTDEF? ==> NO

LISTDEF permite definir uma lista de objetos de forma lógica.

Sem LISTDEF:

REORG TABLESPACE DB01.TS001
REORG TABLESPACE DB01.TS002
REORG TABLESPACE DB01.TS003
REORG TABLESPACE DB01.TS004

Com LISTDEF, você pode criar uma regra:

LISTDEF LISTFIN
  INCLUDE TABLESPACE DBFIN.*

Depois:

RUNSTATS LIST LISTFIN

ou, conforme a utility e sintaxe suportada:

COPY LIST LISTFIN

O grande benefício aparece em ambientes com centenas ou milhares de objetos.

Exemplo conceitual

LISTDEF LISTAPPL
  INCLUDE TABLESPACE DBAPP.*
  EXCLUDE TABLESPACE DBAPP.TSTEMP*

A lista inclui todos os tablespaces do banco DBAPP, exceto os temporários.

Isso permite automação sem manter uma lista manual interminável.


14. TEMPLATE: fabricando nomes de datasets automaticamente

Na imagem:

TEMPLATE? ==> NO

O TEMPLATE permite definir padrões para datasets utilizados pelas utilities.

Sem TEMPLATE, cada COPY precisa de um DD statement:

//COPY01 DD DSN=BACKUP.DB1.TS1...
//COPY02 DD DSN=BACKUP.DB1.TS2...
//COPY03 DD DSN=BACKUP.DB1.TS3...

Com TEMPLATE, o Db2 pode gerar os nomes dinamicamente.

Exemplo conceitual:

TEMPLATE COPYTMP
  DSN 'BACKUP.&DB..&TS..D&DATE..T&TIME.'
  UNIT SYSDA
  DISP (NEW,CATLG,DELETE)
  SPACE CYL
  PCTPRIME 20

Depois:

COPY LIST LISTFIN
  COPYDDN COPYTMP

Os símbolos podem representar elementos como:

  • database;

  • tablespace;

  • data;

  • hora;

  • partição;

  • utility ID;

  • sequência.

O resultado pode ser:

BACKUP.DBFIN.TSCLIENT.D20260713.T231500

Isso reduz drasticamente o tamanho do JCL.


15. CHECK INDEX e CHECK DATA: o exame médico do banco

CHECK INDEX verifica a consistência entre o índice e os dados.

Ele procura situações como:

  • chave no índice sem linha correspondente;

  • linha existente sem chave no índice;

  • problemas estruturais;

  • inconsistências lógicas.

Exemplo:

//CHKIDX01 JOB (ACCT),'CHECK INDEX',
//             CLASS=A,
//             MSGCLASS=X
//STEP01   EXEC PGM=DSNUTILB,
//             REGION=0M,
//             PARM='DB9G,CHKIDX01'
//STEPLIB   DD DISP=SHR,DSN=DB2.V13.SDSNLOAD
//SYSPRINT  DD SYSOUT=*
//UTPRINT   DD SYSOUT=*
//SYSIN     DD *
  CHECK INDEX
    (DBFIN.IXCLIENT)
/*
//

CHECK DATA verifica relacionamentos e consistência de dados, especialmente em situações envolvendo constraints e dependências.

Esses utilitários não devem ser confundidos com consultas SQL de validação funcional.

Eles atuam no nível estrutural e operacional do Db2.


16. LOAD e UNLOAD: a doca de carga do Db2

UNLOAD

Extrai dados de uma tabela ou tablespace para um dataset sequencial.

Exemplo conceitual:

UNLOAD TABLESPACE DBFIN.TSCLIENT
  FROM TABLE FINANCEIRO.CLIENTE
  UNLDDN SYSREC

JCL:

//SYSREC DD DSN=EXPORT.CLIENTE.D20260713,
//          DISP=(NEW,CATLG,DELETE),
//          UNIT=SYSDA,
//          SPACE=(CYL,(100,50),RLSE),
//          DCB=(RECFM=VB,LRECL=32756,BLKSIZE=0)

LOAD

Carrega grandes volumes de dados.

Exemplo:

LOAD DATA
  INDDN SYSREC
  INTO TABLE FINANCEIRO.CLIENTE

A utility LOAD é muito mais eficiente que executar milhões de comandos INSERT individualmente.

Mas ela exige planejamento.

Dependendo das opções utilizadas, pode:

  • substituir dados;

  • acrescentar dados;

  • deixar índices em estado pendente;

  • exigir reconstrução;

  • afetar constraints;

  • gerar ou não logs detalhados;

  • exigir cópia posterior.


17. RECOVER: quando o treinamento vira batalha real

RECOVER restaura um objeto usando image copies e logs.

Imagine que alguém executou:

DELETE FROM FINANCEIRO.CLIENTE;
COMMIT;

O ROLLBACK já não pode ajudar porque houve COMMIT.

Uma estratégia de recuperação pode utilizar:

Image Copy anterior
+
Logs posteriores
+
Ponto no tempo antes do erro

Exemplo conceitual:

RECOVER TABLESPACE DBFIN.TSCLIENT
  TORBA X'00000000123456789012'

ou outra opção de point-in-time recovery suportada no ambiente.

Essa não é uma operação improvisada.

Antes de recuperar, a equipe precisa responder:

  • Qual foi o horário do erro?

  • Há image copy válida?

  • Os archive logs estão disponíveis?

  • Existem objetos relacionados?

  • Há integridade referencial?

  • Outros tablespaces precisam voltar ao mesmo ponto?

  • Quais aplicações devem ser interrompidas?

  • Como os dados posteriores serão reconciliados?

Um recovery tecnicamente bem-sucedido pode ainda produzir inconsistência de negócio se objetos relacionados forem recuperados para momentos diferentes.


18. Como acompanhar o job no SDSF

Depois de submeter o JCL, você normalmente abre o SDSF.

Comandos comuns:

ST

Mostra jobs ativos e concluídos conforme seus filtros.

Localize:

RBIDX01

Abra o job com S.

Você verá DDs como:

JESMSGLG
JESJCL
JESYSMSG
SYSPRINT
UTPRINT
SYSUDUMP

JESMSGLG

Contém mensagens do JES e informações gerais da execução.

JESJCL

Mostra o JCL expandido.

É especialmente útil quando foram utilizados:

  • procedures catalogadas;

  • símbolos;

  • includes;

  • overrides.

JESYSMSG

Contém mensagens do sistema, alocações e término dos steps.

SYSPRINT

Normalmente contém a narrativa principal da utility Db2.


19. Return codes: nem todo zero conta a história completa

Os códigos de retorno mais comuns são:

RC=0000
RC=0004
RC=0008
RC=0012
RC=0016

RC 0000

Execução normal.

Mesmo assim, leia as mensagens.

RC 0004

Aviso.

A utility pode ter terminado, mas algo merece atenção.

RC 0008

Erro relevante.

Parte do processamento pode não ter ocorrido.

RC 0012 ou superior

Erro grave.

A operação provavelmente falhou ou foi interrompida.

Nunca analise apenas o número final.

Procure mensagens Db2 com prefixos como:

DSNU
DSN
IEC
IGD
ICE
ICH

Cada família pode indicar uma origem diferente:

  • Db2 utility;

  • sistema;

  • dataset;

  • SMS;

  • sort;

  • segurança.


20. Passo a passo seguro para o Padawan

Antes de executar uma utility, siga uma sequência disciplinada.

Passo 1 — Confirme o ambiente

Verifique:

SSID
LPAR
Usuário
Qualificador dos datasets
Banco
Tablespace
Índice

Passo 2 — Entenda o motivo

Não execute REORG apenas porque “sempre executamos”.

Pergunte:

  • Há fragmentação?

  • As estatísticas indicam necessidade?

  • Existe impacto de desempenho?

  • O objeto está em estado pendente?

  • Houve LOAD?

  • O índice está inconsistente?

  • Existe recomendação de manutenção?

Passo 3 — Estime o impacto

Considere:

  • tamanho do objeto;

  • duração;

  • CPU;

  • I/O;

  • espaço de sort;

  • logs;

  • concorrência;

  • bloqueios;

  • janela de manutenção.

Passo 4 — Confira a recuperação

Antes de uma operação destrutiva ou de grande impacto, confirme:

  • última image copy;

  • disponibilidade dos logs;

  • estratégia de rollback;

  • procedimento de restart;

  • contato da equipe responsável.

Passo 5 — Use EDITJCL

Revise o JCL gerado.

Passo 6 — Valide o SYSIN

Um pequeno erro no objeto muda tudo.

Compare:

DBFIN.TSCLIENT

com:

DBFIM.TSCLIENT

Uma letra pode apontar para outro banco ou causar falha.

Passo 7 — Submeta e acompanhe

Não envie o job e abandone a sessão.

Observe:

  • início;

  • consumo;

  • mensagens;

  • fases;

  • locks;

  • tempo;

  • espaço;

  • término.

Passo 8 — Valide o resultado

Depois da utility:

  • confira o return code;

  • leia o SYSPRINT;

  • valide estados pendentes;

  • confirme disponibilidade;

  • execute consultas funcionais;

  • atualize documentação;

  • registre duração e consumo.


21. Curiosidades e easter eggs do mundo Db2

A tela simples esconde um sistema distribuído de responsabilidades

O painel ISPF coleta parâmetros.

O JES2 agenda o job.

O z/OS gerencia memória e recursos.

O Db2 controla catálogo, logs e objetos.

O DFSORT pode ordenar dados.

O SMS aloca datasets.

O RACF valida autorizações.

O WLM decide prioridades.

Uma única execução de REORG pode envolver quase todo o ecossistema do mainframe.

DSNUTILB parece apenas um programa, mas é um maestro

Ele não “faz tudo sozinho”.

Ele coordena serviços do Db2, acessa objetos, solicita sort, gerencia fases e registra estados de restart.

O nome da utility ID é mais importante do que parece

Uma utility ID não é apenas uma etiqueta estética.

Ela pode estar associada ao controle de execução e restart.

Reutilizar IDs sem compreender o estado anterior pode gerar confusão.

REORG não é um ritual religioso

Em algumas empresas, utilities são executadas em calendários fixos herdados de décadas anteriores.

Por exemplo:

Todo sábado: REORG em tudo.

Isso pode ser desnecessário e caro.

A abordagem moderna deve considerar indicadores reais e políticas inteligentes.

RUNSTATS pode melhorar ou piorar um plano

Estatísticas novas ajudam o otimizador, mas também podem provocar mudança de access path.

Por isso ambientes críticos costumam combinar RUNSTATS com:

  • análise de EXPLAIN;

  • gerenciamento de packages;

  • avaliação de regressão;

  • controles de estabilidade;

  • monitoramento pós-implantação.


Conclusão: a Utility é a oficina do Db2

Para o programador COBOL Padawan, o Db2 começa com comandos como:

SELECT
INSERT
UPDATE
DELETE

Mas o banco de dados não sobrevive apenas de SQL.

Ele precisa de manutenção.

Precisa saber como os dados estão distribuídos.

Precisa reorganizar estruturas.

Precisa reconstruir índices.

Precisa criar cópias.

Precisa recuperar informações.

Precisa validar sua própria integridade.

É exatamente isso que as Db2 Utilities oferecem.

A tela mostrada parece modesta:

FUNCTION ==> EDITJCL
UTILITY  ==> REBUILD

Entretanto, por trás dela existe uma cadeia poderosa:

ISPF
  |
  v
JCL
  |
  v
JES2
  |
  v
DSNUTILB
  |
  v
Db2
  |
  v
Catálogo + Logs + Tablespaces + Índices

O grande aprendizado não é simplesmente decorar que REBUILD reconstrói um índice ou que RUNSTATS atualiza estatísticas.

O verdadeiro aprendizado é entender que cada utility participa de uma estratégia maior de disponibilidade, desempenho, integridade e recuperação.

No mainframe, a tela verde raramente conta toda a história.

Ela mostra apenas a porta.

Atrás dela existe uma engenharia construída durante décadas, refinada por milhões de execuções e responsável por manter sistemas bancários, governamentais, industriais e corporativos funcionando enquanto o restante do mundo dorme.

E quando o Padawan finalmente entende o JCL, as mensagens do spool, as fases da utility e o motivo de cada parâmetro, aquela velha tela deixa de parecer antiga.

Ela passa a parecer exatamente o que sempre foi:

um console de manutenção de uma das plataformas de dados mais resilientes do planeta.

quarta-feira, 29 de julho de 2020

🔥☕ LABORATÓRIO DB2 UTILITIES z/OS — 20 INCIDENTES REAIS DE PRODUÇÃO ☕🔥

Bellacosa Mainframe apresenta Laboratorio de incidentes no Db2


🔥☕ LABORATÓRIO DB2 UTILITIES z/OS — 20 INCIDENTES REAIS DE PRODUÇÃO ☕🔥

“Quando o DBA entra na sala de máquinas do mainframe”

Este laboratório é baseado no menu DB2 UTILITIES da sua tela:

  • REBUILD
  • COPY
  • RECOVER
  • REORG
  • RUNSTATS
  • LOAD
  • CHECK
  • REPAIR
  • UNLOAD
  • QUIESCE

Aqui você vai encontrar:

  • 🚨 problemas reais
  • 🔍 investigação
  • 💣 diagnóstico
  • ✅ solução
  • 🧠 análise operacional

🔥 LAB 01 — REBUILD PENDING

🚨 Problema

Aplicação começou a falhar.

SQLCODE:

-904 RESOURCE UNAVAILABLE

🔍 Investigação

-DIS DATABASE(ESCOLA)

💣 Resultado

INDEXSPACE IXALUNO
STATUS RBDP

✅ Solução

Executar:

//STEP1 EXEC DSNUPROC,SYSTEM=DB9G
//SYSIN DD *
REBUILD INDEX(ESCOLA.IXALUNO)
/*

🧠 Explicação

Índice inválido.

O optimizer não consegue utilizá-lo.


🔥 LAB 02 — COPY PENDING

🚨 Problema

INSERT falhando após LOAD.


🔍 Investigação

-DIS DATABASE(FINANCE)

💣 Resultado

COPY PENDING

✅ Solução

COPY TABLESPACE FINANCE.CLIENTE

🧠 Explicação

Objeto exige backup válido.


🔥 LAB 03 — SQL MUITO LENTO

🚨 Problema

Queries demorando minutos.


🔍 Investigação

RUNSTATS não executa há meses.


💣 Diagnóstico

Optimizer usando access path ruim.


✅ Solução

RUNSTATS TABLESPACE FINANCE.CLIENTE

🧠 Explicação

Sem estatísticas atualizadas:

  • DB2 escolhe índices ruins
  • pode fazer full tablescan

🔥 LAB 04 — TABELA FRAGMENTADA

🚨 Problema

I/O elevadíssimo.


🔍 Investigação

AREO*

💣 Diagnóstico

Fragmentação pesada.


✅ Solução

REORG TABLESPACE FINANCE.CLIENTE

🧠 Explicação

Páginas desorganizadas.


🔥 LAB 05 — LOAD QUEBROU ÍNDICES

🚨 Problema

Após LOAD REPLACE:

  • índices sumiram
  • SQL lento

🔍 Investigação

RBDP

✅ Solução

REBUILD INDEX

🧠 Explicação

LOAD REPLACE invalida índices.


🔥 LAB 06 — UTILITY PRESA

🚨 Problema

REORG nunca termina.


🔍 Investigação

-DIS UTIL(*)

💣 Resultado

Utility em WAIT.


✅ Solução

-TERM UTIL(REORG01)

🧠 Explicação

Utility aguardando drain/lock.


🔥 LAB 07 — RECOVER NECESSÁRIO

🚨 Problema

Disco falhou.


🔍 Investigação

Objeto inacessível.


✅ Solução

RECOVER TABLESPACE FINANCE.CLIENTE

🧠 Explicação

Restauração via image copy + logs.


🔥 LAB 08 — INDEX CORROMPIDO

🚨 Problema

Abends em SQL.


🔍 Investigação

CHECK INDEX INDEXSPACE IXCLI01

💣 Resultado

Corrupção detectada.


✅ Solução

REBUILD INDEX

🧠 Explicação

Estrutura B-tree inconsistente.


🔥 LAB 09 — ORPHAN ROWS

🚨 Problema

Violação referencial.


🔍 Investigação

CHECK DATA TABLESPACE FINANCE.CLIENTE

💣 Resultado

Orphan rows encontradas.


✅ Solução

Corrigir dados.

Executar CHECK novamente.


🧠 Explicação

Foreign key inconsistente.


🔥 LAB 10 — BUFFERPOOL EXPLODINDO

🚨 Problema

REORG causando pressão memória.


🔍 Investigação

-DIS BUFFERPOOL(*)

💣 Resultado

Page stealing elevado.


✅ Solução

  • aumentar BP
  • reduzir concorrência utilities

🧠 Explicação

REORG consome memória intensamente.


🔥 LAB 11 — LOG FULL

🚨 Problema

Batch travado.


🔍 Investigação

-DIS LOG

💣 Resultado

Logs quase esgotados.


✅ Solução

  • aumentar commits
  • acelerar archive
  • reduzir transações longas

🧠 Explicação

LOAD/REORG podem gerar muito log.


🔥 LAB 12 — UNLOAD GIGANTE

🚨 Problema

Necessidade de exportar bilhões de linhas.


✅ Solução

UNLOAD TABLESPACE BIGDB.TRANSAC

🧠 Explicação

UNLOAD é muito mais rápido que SELECT tradicional.


🔥 LAB 13 — REORG BLOQUEANDO ONLINE

🚨 Problema

Usuários reclamam indisponibilidade.


🔍 Investigação

REORG executado SHRLEVEL NONE.


✅ Solução

REORG SHRLEVEL CHANGE

🧠 Explicação

Permite acesso concorrente.


🔥 LAB 14 — QUIESCE ANTES DE DEPLOY

🚨 Problema

Necessidade de rollback seguro.


✅ Solução

QUIESCE TABLESPACESET FINANCE

🧠 Explicação

Cria ponto consistente recuperação.


🔥 LAB 15 — REPAIR MAL UTILIZADO

🚨 Problema

DBA júnior removeu pendência errada.


💣 Resultado

Objeto inconsistente.


🧠 Explicação

REPAIR ignora validações normais DB2.


🚨 Moral

REPAIR é bisturi nuclear.


🔥 LAB 16 — RUNSTATS ESQUECIDO

🚨 Problema

Plano SQL mudou drasticamente.


🔍 Investigação

Stats desatualizadas.


✅ Solução

RUNSTATS TABLESPACE FINANCE.PEDIDOS

🧠 Explicação

Optimizer “envelheceu”.


🔥 LAB 17 — TEMPLATE ERRADO

🚨 Problema

COPY falhando.


🔍 Investigação

Dataset template inválido.


💣 Resultado

Allocation errors.


✅ Solução

Corrigir TEMPLATE.


🧠 Explicação

Naming padrão incorreto.


🔥 LAB 18 — LISTDEF MAL DEFINIDO

🚨 Problema

REORG atingiu tablespaces errados.


🔍 Investigação

LISTDEF genérico demais.


✅ Solução

Restringir INCLUDE.


🧠 Explicação

Automação perigosa.


🔥 LAB 19 — LOAD MASSIVO SEM SORT

🚨 Problema

LOAD extremamente lento.


🔍 Investigação

Sem SORT adequado.


✅ Solução

Adicionar SORTDEVT/SORTNUM.


🧠 Explicação

LOAD depende muito de sort eficiente.


🔥 LAB 20 — O COLAPSO DA JANELA BATCH

🚨 Problema

Batch noturno explodiu.


🔍 Investigação

Rodando simultaneamente:

  • COPY
  • REORG
  • RUNSTATS
  • LOAD

💣 Resultado

  • lock contention
  • log saturation
  • I/O overload
  • CPU spike

✅ Solução

Separar scheduling utilities.


🧠 Explicação

Utilities competem brutalmente por:

  • disco
  • bufferpool
  • log
  • CPU

🔥 DESAFIO EXTRA — COMANDOS PARA TREINAR

Ver utilities

-DIS UTIL(*)

Terminar utility

-TERM UTIL(utilid)

Ver status objetos

-DIS DATABASE(DB1)

Ver logs

-DIS LOG

🔥 EXERCÍCIO AVANÇADO

Monte um fluxo completo:

COPY
REORG
RUNSTATS
CHECK INDEX
CHECK DATA

E explique:

  • por que essa sequência existe,
  • quais riscos evita,
  • e como impacta performance.

☕ VISÃO “BELLACOSA MAINFRAME”

As DB2 Utilities são os “robôs industriais” do z/OS.

Elas:

  • reconstruem,
  • reorganizam,
  • restauram,
  • limpam,
  • validam,
  • e mantêm vivo o banco mais crítico da empresa.

No mundo distribuído muita gente reinicia serviço.

No mainframe…
o DBA conversa diretamente com os mecanismos internos do banco. ☕💣


Vagner Renato Bellacosa, IBM Champion e especialista em IBM Mainframe
IBM Z17 SYSTEM ONLINE
Sobre o autor

Vagner Renato Bellacosa

IBM Champion 2026 • Especialista em IBM Mainframe

Vagner Renato Bellacosa trabalha com IBM Mainframe desde 1988 , é IBM Champion e especialista em COBOL, CICS, Db2, z/OS e IBM Z. Compartilha experiências profissionais, conhecimento técnico, história da computação e práticas do universo mainframe para aproximar novas gerações das tecnologias que sustentam empresas, bancos e governos ao redor do mundo.

IBM Champion IBM Z COBOL CICS Db2 z/OS Mainframe desde 1988
GitHub LinkedIn
Inicializando conteúdo...