☕ Um Café no Bellacosa Mainframe
Gostou do conteúdo? Ajude a manter o café quente, o COBOL compilando e o mainframe acordado. 😄
☕ Pague um café ao Bellacosa

Translate

Mostrar mensagens com a etiqueta Db2 for z/OS. Mostrar todas as mensagens
Mostrar mensagens com a etiqueta Db2 for z/OS. Mostrar todas as mensagens

segunda-feira, 27 de julho de 2026

AWS vs Mainframe: O Grande Dicionário Bilíngue da Computação Corporativa

 

Bellacosa Mainframe compara o aws com o mainframe

☕ Um Café no Bellacosa Mainframe

AWS vs Mainframe: O Grande Dicionário Bilíngue da Computação Corporativa

Quando um Programador COBOL Descobre que a Nuvem Não Inventou Tudo... Apenas Deu Novos Nomes às Velhas Ideias

Existe uma frase muito conhecida entre os profissionais de tecnologia:

"Toda tecnologia nova parece revolucionária... até você descobrir que o mainframe já fazia algo parecido há décadas."

Naturalmente, essa frase é um exagero. A computação em nuvem trouxe inúmeras inovações reais: elasticidade praticamente infinita, cobrança sob demanda, infraestrutura global distribuída, APIs padronizadas e uma velocidade de provisionamento que seria impensável nos anos 1970.

Por outro lado...

Quem trabalhou muitos anos em IBM Z percebe rapidamente algo curioso.

Boa parte dos conceitos fundamentais da Cloud Computing já existiam, apenas recebiam outros nomes.

É justamente isso que o infográfico procura mostrar.

Não se trata de afirmar que AWS = Mainframe.

Muito menos que um substitui o outro.

A proposta é muito mais inteligente:

Traduzir conceitos.

Da mesma forma que um brasileiro aprende inglês associando "house" com "casa", um programador COBOL aprende AWS muito mais rapidamente quando pensa:

"EC2... isso lembra uma LPAR."

É exatamente essa mudança mental que acelera o aprendizado.

Vamos aprofundar essa comparação.


Antes de tudo...

Existe um erro extremamente comum.

Muitos profissionais perguntam:

"Qual é o equivalente do AWS Lambda no Mainframe?"

Na verdade essa pergunta está errada.

O correto seria perguntar:

"Qual tecnologia do Mainframe resolve um problema semelhante?"

Porque tecnologias diferentes podem resolver o mesmo problema de maneiras completamente distintas.

É exatamente isso que veremos.


EC2 × LPAR

AWS

EC2 fornece máquinas virtuais sob demanda.

Você cria.

Liga.

Desliga.

Apaga.

Escala.

Tudo em minutos.


Mainframe

A comparação natural é a LPAR (Logical Partition).

Mas aqui existe uma enorme diferença filosófica.

Uma instância EC2 normalmente é um servidor virtual.

Uma LPAR é praticamente um computador completo.

Dentro dela existe:

  • z/OS

  • JES

  • RACF

  • CICS

  • Db2

  • MQ

  • milhares de usuários

Ou seja...

Uma única LPAR frequentemente faz o trabalho de centenas de servidores Linux.

Por isso muitos profissionais dizem:

"Comparar uma EC2 com uma LPAR é como comparar um apartamento com um condomínio inteiro."


Curiosidade

O conceito de particionamento lógico apareceu comercialmente décadas antes da virtualização popularizada pelo VMware.

A IBM fazia isso quando a maioria dos servidores ainda era física.


S3 × VSAM / DASD

Esta comparação merece cuidado.

S3 não é um disco.

É um armazenamento de objetos.

VSAM não é armazenamento de objetos.

É um método de acesso.

Então por que a comparação?

Porque ambos representam onde os dados vivem.


S3

Armazena objetos.

  • fotos

  • backups

  • vídeos

  • PDFs

  • logs

Escala praticamente infinita.


Mainframe

No IBM Z os dados normalmente ficam em:

  • DASD

  • VSAM

  • Sequential datasets

  • GDGs

  • PDS/PDSE

O conceito é diferente.

Enquanto S3 trabalha com objetos identificados por chaves, o mainframe trabalha com datasets catalogados e métodos de acesso especializados.

Um VSAM KSDS, por exemplo, comporta-se muito mais como um banco de dados indexado do que como um bucket S3.


Melhor analogia

Talvez fosse mais correto dizer:

S3 ≈ Conjunto de datasets altamente duráveis.

Não existe equivalente perfeito.


RDS × Db2 for z/OS

Aqui a aproximação é muito boa.

AWS oferece banco relacional gerenciado.

Db2 oferece banco relacional corporativo.

Mas termina aí.


O que muda?

No AWS:

Você administra menos infraestrutura.

No Mainframe:

Você administra muito mais parâmetros.

Em compensação...

Obtém níveis absurdos de disponibilidade.

Db2 z/OS foi construído para:

  • bancos

  • cartões

  • bolsas

  • governos

  • seguradoras

Milhões de transações por segundo.

Décadas de evolução.

Consistência extrema.


Easter Egg

Quando alguém diz:

"Meu banco usa RDS."

O programador de mainframe responde:

"Interessante... o meu banco inteiro usa Db2."


Lambda × CICS

Essa comparação é conceitual.

Lambda executa código quando um evento ocorre.

CICS executa transações quando uma requisição chega.

Ambos respondem a eventos.

Mas de maneiras completamente diferentes.


Lambda

Sem servidor visível.

Escala automaticamente.

Cada chamada inicia uma execução.


CICS

Servidor transacional residente.

As tarefas reutilizam recursos.

Baixíssima latência.

Controle rigoroso.

Extrema confiabilidade.


Uma transação CICS pode durar poucos milissegundos.

E atender milhares de usuários simultaneamente.

Há bancos onde o cliente insere a senha no caixa eletrônico...

E em menos de um décimo de segundo:

  • RACF valida

  • CICS executa

  • Db2 consulta

  • MQ envia mensagens

  • resposta retorna

Tudo isso antes do usuário piscar.


API Gateway × CICS Web Services

Nos últimos anos o CICS tornou-se um verdadeiro servidor de APIs.

Hoje é possível expor programas COBOL como:

  • REST

  • SOAP

  • JSON

Sem reescrever décadas de código.

A ideia é semelhante ao API Gateway:

publicar serviços de forma segura.

A diferença é que no CICS o backend muitas vezes continua sendo um programa escrito em 1989.

E funcionando perfeitamente.


CloudWatch × RMF / SMF

Talvez uma das melhores comparações.

CloudWatch monitora.

RMF mede.

SMF registra praticamente tudo.


No mainframe existem registros para:

CPU.

I/O.

Memória.

Logons.

Jobs.

CICS.

Db2.

MQ.

Segurança.

Tudo vira SMF.

Depois essas informações alimentam:

  • relatórios

  • capacity planning

  • billing interno

  • auditoria

  • performance

É praticamente uma caixa-preta de avião.


VPC × VTAM / TCP-IP

VPC cria uma rede privada lógica.

No mainframe temos:

  • TCP/IP

  • Enterprise Extender

  • SNA

  • VTAM (historicamente)

São tecnologias diferentes.

Mas ambas organizam comunicações seguras entre aplicações.

Hoje, o TCP/IP é predominante no z/OS, enquanto o VTAM permanece como parte importante da arquitetura SNA e do gerenciamento de sessões legadas.


IAM × RACF

Esta talvez seja a comparação mais intuitiva.

IAM controla identidades.

RACF controla identidades.

Mas RACF faz isso desde os anos 1970.


No RACF encontramos:

  • usuários

  • grupos

  • perfis

  • datasets

  • transações

  • comandos

  • permissões

Tudo centralizado.

Em ambientes corporativos enormes, RACF continua sendo um dos sistemas de segurança mais robustos do mercado.


CloudFront

Aqui o infográfico coloca:

Sem equivalente.

Concordo parcialmente.

CloudFront é uma CDN.

Mainframe nunca precisou distribuir imagens para milhões de navegadores.

Mas existe um conceito parecido.

CICS, z/OS Connect e balanceadores corporativos podem distribuir carga entre regiões, embora isso não seja uma CDN. Portanto, realmente não há um equivalente direto.


DynamoDB

Também não existe equivalente perfeito.

O mainframe tradicional trabalha principalmente com:

  • Db2

  • IMS DB

  • VSAM

Entretanto...

IMS Hierarchical Database possui algumas características que lembram bancos NoSQL modernos.

Não são iguais.

Mas resolvem certos problemas semelhantes.


SQS × IBM MQ

Esta comparação é excelente.

Ambos trabalham com filas.

Mensagens.

Processamento assíncrono.

Desacoplamento.

A principal diferença está no foco.

IBM MQ nasceu para ambientes corporativos críticos.

SQS nasceu para aplicações distribuídas na nuvem.

Ambos resolvem brilhantemente problemas de integração, mas IBM MQ oferece recursos avançados de transação, persistência e integração com sistemas legados que o tornam um pilar do processamento empresarial.


SNS × WTO / Console Messages

Aqui talvez seja a comparação mais discutível.

SNS distribui notificações para diversos assinantes.

Já WTO (Write To Operator) envia mensagens ao console do operador do z/OS.

Embora ambos "notifiquem", cumprem papéis muito diferentes.

Uma analogia funcional mais próxima seria:

  • SNS ↔ combinação de IBM MQ + Event Notification + automação (como IBM Z System Automation ou NetView), dependendo do cenário.

WTO é muito mais voltado para operação do sistema do que para publicação de eventos para consumidores.


O que ficou faltando?

O universo AWS é enorme. Diversos serviços modernos também encontram paralelos conceituais no ecossistema IBM Z:

AWSMainframe
EBSVolumes DASD
EFSzFS / HFS
Elastic Load BalancerSysplex Distributor
Auto ScalingWLM + Capacity on Demand
Secrets ManagerRACF Key Rings + ICSF
KMSICSF + Hardware Crypto Express
CloudTrailSMF + RACF Auditing
Systems Managerz/OSMF
ECS/EKSzCX (z/OS Container Extensions)
EventBridgeIBM MQ + CICS START + automação
Step FunctionsJCL + Scheduler (TWS/IWS, CA 7, Control-M)
GlueDFSORT, SyncSort, DataStage e ferramentas ETL
AthenaDb2 Analytics, SQL Federation e consultas distribuídas
RedshiftDb2 Analytics Accelerator (IDAA)
CognitoRACF + provedores de identidade (LDAP, SAF, z/OS Connect)

A Filosofia por Trás da Comparação

A maior lição do infográfico não é decorar equivalências.

É perceber que os problemas fundamentais da computação permanecem os mesmos:

  • executar aplicações;

  • armazenar dados;

  • proteger acessos;

  • integrar sistemas;

  • monitorar ambientes;

  • processar eventos;

  • escalar capacidade.

O que muda é a forma como cada arquitetura resolve esses desafios.

O IBM Z foi concebido para oferecer estabilidade, consistência transacional e disponibilidade extrema em um ambiente centralizado. A AWS foi projetada para privilegiar elasticidade, automação, distribuição geográfica e provisionamento sob demanda em uma infraestrutura de nuvem.

Essas filosofias não são concorrentes em todos os casos — são frequentemente complementares. Hoje, é comum encontrar bancos, seguradoras e governos executando seus sistemas críticos em IBM Z enquanto utilizam AWS para APIs, analytics, inteligência artificial, aplicações móveis e serviços digitais.


Conclusão: O Melhor Profissional Fala Dois "Idiomas"

No início da carreira, muitos especialistas em mainframe enxergavam a nuvem como uma ameaça. Da mesma forma, muitos profissionais de cloud acreditavam que o mainframe era apenas uma tecnologia ultrapassada.

Com o tempo, o mercado mostrou uma realidade bem diferente.

Os ambientes corporativos mais sofisticados são híbridos.

O cartão de crédito pode ser autorizado por um programa COBOL executando em CICS e Db2 no IBM Z, enquanto o aplicativo móvel utiliza APIs hospedadas na AWS, com autenticação moderna, monitoramento em nuvem e microsserviços.

Em vez de escolher entre "mainframe ou cloud", as organizações escolhem mainframe e cloud.

Para o profissional de tecnologia, isso significa uma oportunidade extraordinária: dominar os dois mundos. Quem entende como traduzir conceitos entre AWS e IBM Z consegue atuar como uma ponte entre equipes, acelerar projetos de modernização e preservar décadas de conhecimento corporativo enquanto incorpora as práticas mais recentes da computação em nuvem.

No fim das contas, aprender AWS não exige esquecer o mainframe. Pelo contrário: para quem já conhece IBM Z, muitas ideias da nuvem deixam de parecer completamente novas e passam a ser apenas uma nova linguagem para resolver problemas que a computação empresarial enfrenta — e resolve — há mais de meio século.

quarta-feira, 14 de dezembro de 2022

Db2 Connect e a Banheira do Tempo — Quando Quatro Programadores Voltaram a 1986, Encontraram um JDBC no Fliperama e Descobriram que TCP/IP Não Sabia Executar SELECT

 
Bellacosa Mainframe e o db2 connect e a banheira do tempo

☕ Um Café no Bellacosa Mainframe

Db2 Connect e a Banheira do Tempo — Quando Quatro Programadores Voltaram a 1986, Encontraram um JDBC no Fliperama e Descobriram que TCP/IP Não Sabia Executar SELECT

Ou: o jovem padawan COBOL entrou numa banheira instalada ao lado do datacenter, Igor derramou energético sobre o painel do DDF, o Db2 for z/OS abriu um DBAT e todos descobriram que conexão, sessão, transação e pacote não são quatro nomes para a mesma coisa



Prólogo — A banheira que apontava para o mainframe

Era sexta-feira, 23h47, no datacenter Bellacosa Mainframe.

O processamento noturno já havia começado, o café estava com gosto de óleo hidráulico e Igor acabara de instalar uma banheira de hidromassagem ao lado do rack de desenvolvimento.

— Para reduzir o estresse da equipe — explicou ele, segurando um cabo de rede molhado.

Sobre a borda da banheira havia um notebook executando uma aplicação Java. Na tela, uma mensagem nada relaxante:

ERRORCODE=-4499
SQLSTATE=08001

A aplicação precisava consultar uma tabela no Db2 for z/OS, mas não conseguia estabelecer a conexão.

O jovem padawan COBOL examinou o diagrama preso na parede:

Aplicação → API → TCP/IP → Db2

— Parece simples. Se o ping funciona, o banco deveria funcionar.

Nesse instante, Igor deixou cair uma lata de energético sobre o controlador da banheira. As luzes piscaram, o ventilador do mainframe mudou de tom e os três foram transportados para 1986.

Quando abriram os olhos, havia terminais verdes, cabelos volumosos, fitas cassete e um operador perguntando:

— Que negócio é esse de JDBC? É uma banda de rock?

Aquela viagem ensinaria uma lição importante:

Um diagrama simples pode apresentar a direção da estrada, mas não explica quem dirige o carro, qual idioma é falado na fronteira, quem verifica o passaporte e quem executa a SQL quando todos finalmente chegam ao Db2.



1. O que é Db2 Connect?

Db2 Connect é a família de recursos, drivers, clientes, componentes e direitos de uso que permite a aplicações distribuídas acessar bancos Db2 executados principalmente em plataformas host, como:

  • Db2 for z/OS;

  • Db2 for IBM i;

  • Ambientes host compatíveis previstos pela solução;

  • Outros servidores Db2 suportados, conforme produto, versão e driver.

Imagine uma aplicação Java executada em Linux que precisa consultar uma conta bancária armazenada no Db2 for z/OS.

Os dois sistemas vivem em mundos diferentes:

Aplicação Java
Linux
JDBC
Objetos Java
UTF-8
Containers

Do outro lado:

Db2 for z/OS
DDF
DBAT
Packages
RACF
WLM
Tablespaces

Db2 Connect participa da construção da ponte entre esses mundos.

Mas aqui começa a primeira armadilha: Db2 Connect não é apenas “um conversor de TCP/IP”.

TCP/IP é o transporte. Ele entrega bytes de um endereço a outro. Não conhece:

  • SELECT;

  • INSERT;

  • Cursor;

  • Package;

  • COMMIT;

  • ROLLBACK;

  • SQLCODE;

  • Result set;

  • Unidade de trabalho.

O diálogo de banco utiliza principalmente o DRDA — Distributed Relational Database Architecture. A IBM define Db2 Connect como uma implementação da arquitetura DRDA para acesso distribuído a servidores Db2. IBM — Db2 Connect e DRDA

A arquitetura básica não é apenas:

Aplicação → TCP/IP → Db2

É mais próxima de:

Aplicação
    ↓
API
    ↓
Driver IBM
    ↓
DRDA
    ↓
TLS, quando configurado
    ↓
TCP/IP
    ↓
DDF
    ↓
DBAT
    ↓
Package e SQL
    ↓
Dados

O infográfico original mostra o portal da máquina do tempo. Nosso trabalho é abrir a tampa e descobrir quais peças fazem a viagem acontecer.



2. Aplicação, linguagem, API e driver não são a mesma coisa

O diagrama coloca no mesmo bloco:

  • JDBC;

  • ADO.NET;

  • Python;

  • SQL;

  • ODBC;

  • Db2 CLI;

  • Perl;

  • OLE DB;

  • Embedded SQL;

  • Ruby.

O problema é que esses elementos pertencem a categorias diferentes.

CategoriaExemplosO que representa
LinguagemJava, Python, Ruby, Perl, PHP, COBOLLinguagem em que o programa foi escrito
APIJDBC, ODBC, CLI, ADO.NETInterface usada pelo programa para solicitar serviços do banco
DriverIBM JCC, IBM ODBC/CLI Driver, IBM .NET ProviderImplementação que conversa efetivamente com o Db2
Linguagem de bancoSQLForma de consultar e alterar os dados
Técnica de programaçãoEmbedded SQL, SQLJForma de incorporar SQL ao programa

Dizer que Python, JDBC e SQL são todos “APIs” seria como dizer que COBOL, CICS e EXEC CICS READ são a mesma coisa.

Eles cooperam, mas exercem funções diferentes.

Exemplo Java

Connection conn = DriverManager.getConnection(
    "jdbc:db2://db2host.empresa.com:448/DBP1",
    usuario,
    senha
);

Neste exemplo:

  • Java é a linguagem;

  • JDBC é a API;

  • O IBM Data Server Driver for JDBC and SQLJ implementa a comunicação;

  • A URL descreve o destino;

  • DRDA organiza o diálogo com o servidor;

  • TCP/IP transporta as mensagens.

Exemplo Python

import ibm_db

conexao = ibm_db.connect(
    "DATABASE=DBP1;"
    "HOSTNAME=db2host.empresa.com;"
    "PORT=448;"
    "PROTOCOL=TCPIP;"
    "UID=APPUSER;"
    "PWD=senha;",
    "",
    ""
)

Python continua sendo a linguagem. O módulo e o driver cuidam do acesso. Depois, a aplicação pode executar SQL:

sql = """
    SELECT NOME, SALDO
      FROM CLIENTE
     WHERE ID_CLIENTE = 100
"""

stmt = ibm_db.exec_immediate(conexao, sql)

Exemplo COBOL

EXEC SQL
    SELECT NOME,
           SALDO
      INTO :WS-NOME,
           :WS-SALDO
      FROM CLIENTE
     WHERE ID_CLIENTE = :WS-ID-CLIENTE
END-EXEC.

COBOL é a linguagem. SQL é a linguagem de banco. EXEC SQL delimita o comando embutido. O programa ainda precisa passar por pré-compilação, compilação, linkedição e preparação dos componentes Db2.

O jovem padawan deve guardar:

A API é o painel da banheira. O driver é a máquina escondida embaixo dela. DRDA é o manual de comunicação temporal. TCP/IP é o túnel. O Db2 é o destino.



3. O personagem que o infográfico esqueceu: o driver

O driver é um dos componentes mais importantes da arquitetura.

Ele:

  • Implementa JDBC, ODBC, CLI ou .NET;

  • Converte chamadas da aplicação em mensagens entendidas pelo servidor;

  • Monta e interpreta o protocolo DRDA;

  • Converte tipos de dados;

  • Entrega result sets;

  • Envia COMMIT e ROLLBACK;

  • Controla propriedades de timeout;

  • Participa de pooling e concentração de conexões;

  • Pode colaborar com automatic client reroute;

  • Pode colaborar com Sysplex workload balancing;

  • Negocia capacidades com o servidor;

  • Reporta SQLCODE, SQLSTATE e erros de comunicação.

A IBM distribui drivers e clientes diferentes para JDBC/SQLJ, ODBC/CLI, .NET, OLE DB e outras interfaces. IBM — Tipos de clientes e drivers

Por isso, ao atualizar um driver, não estamos apenas trocando “um arquivo .jar qualquer”.

A atualização pode alterar:

  • Suporte a TLS;

  • Conversão de timestamps;

  • Tipos de dados suportados;

  • Propriedades de failover;

  • Comportamento de timeouts;

  • Pacotes utilizados no servidor;

  • Recursos de compatibilidade;

  • Balanceamento no Sysplex.

Uma aplicação pode funcionar com determinada versão do driver em homologação e falhar em produção porque os pacotes correspondentes não foram preparados no Db2 for z/OS.

Easter egg número 1: se Igor disser “é só trocar o db2jcc4.jar escondido e ninguém perceberá”, esconda a senha do RACF e chame o change manager.



4. TCP/IP é a estrada; DRDA é o idioma

Durante a viagem de volta a 1986, o jovem padawan viu um telefone público.

Igor levantou o aparelho e começou a falar COBOL com a telefonista.

MOVE TELEFONISTA TO WS-CONEXAO.

A telefonista desligou.

O telefone funcionava. A linha estava ativa. Mas ninguém falava o mesmo idioma.

Essa é a diferença entre TCP/IP e DRDA.

TCP/IP estabelece o transporte confiável e ordenado entre endpoints. DRDA define como clientes e servidores de bancos relacionais distribuem solicitações e respostas.

Uma forma didática de separar as camadas é:

SQL          → O que queremos fazer
API          → Como a aplicação solicita
Driver       → Quem implementa a solicitação
DRDA         → Como cliente e Db2 conversam
TLS          → Como o conteúdo pode ser protegido
TCP/IP       → Como os bytes viajam

Por isso, executar:

ping db2host

e receber resposta não prova que o Db2 funciona.

O ping pode confirmar que algum caminho IP está disponível, mas não confirma:

  • Que a porta do DDF está aberta;

  • Que o listener está ativo;

  • Que o firewall permite o tráfego da aplicação;

  • Que o TLS consegue negociar;

  • Que o certificado é confiável;

  • Que o usuário consegue autenticar;

  • Que o location name está correto;

  • Que os pacotes existem;

  • Que o usuário possui autorização;

  • Que a SQL pode ser executada.

É como chegar à cidade correta e concluir que sua reserva no hotel está garantida.



5. No z/OS, quem abre o portal é o DDF

Quando o destino é Db2 for z/OS, entra em cena o:

DDF — Distributed Data Facility

O DDF é o componente que permite ao Db2 for z/OS participar do processamento distribuído, recebendo e iniciando comunicações com sistemas remotos.

Para uma aplicação externa estabelecer uma conexão, o DDF precisa estar:

  • Instalado e configurado;

  • Ativo;

  • Associado a portas TCP/IP;

  • Publicado no endereço correto;

  • Integrado à segurança;

  • Preparado para o protocolo utilizado.

A IBM deixa claro que o subsistema Db2 for z/OS precisa ter o DDF habilitado para receber conexões JDBC por TCP/IP. IBM — JDBC acessando Db2 for z/OS

No diagnóstico, dois comandos são particularmente conhecidos:

-DISPLAY DDF DETAIL

e:

-DISPLAY LOCATION

Eles podem ajudar a verificar informações como:

  • Estado do DDF;

  • Location name;

  • Endereços;

  • Portas;

  • Informações de comunicação;

  • Características do ambiente distribuído.

Se o DDF estiver parado, a aplicação poderá enxergar o host, alcançar o z/OS e mesmo assim não falar com o Db2.

Easter egg número 2: no filme, a banheira precisava de uma combinação improvável de água, energia e bebida derramada. No datacenter, DDF não deve depender de Igor derramando energético no console.



6. DBAT: o funcionário que recebe o visitante

Depois que a conexão chega ao DDF, o trabalho precisa ser processado. Entra o:

DBAT — Database Access Thread

O DBAT é uma thread de acesso ao banco utilizada no processamento de solicitações distribuídas.

Imagine a recepção de um hotel:

  • A conexão é o hóspede;

  • DDF é a recepção;

  • A autenticação verifica o documento;

  • O DBAT é o funcionário que atende a solicitação;

  • O package define determinados recursos e regras de execução;

  • O Db2 acessa os dados.

Uma conexão lógica não significa necessariamente um DBAT permanentemente dedicado.

O Db2 for z/OS pode utilizar pooling de DBATs. Depois de uma unidade de trabalho, um DBAT elegível pode ser liberado para atender outra conexão. Isso reduz o consumo de recursos em ambientes com grandes quantidades de conexões remotas. IBM — Gerenciamento de DBATs

Também existem high-performance DBATs. Nesse caso, o DBAT permanece associado à conexão através das fronteiras de transação, reduzindo determinados custos de liberação e reassociação, mas mantendo recursos dedicados por mais tempo. IBM — Como DBATs processam conexões remotas

Portanto:

Conexão ≠ DBAT permanentemente ativo

Essa diferença torna-se crucial quando containers entram na história.

Suponha:

50 pods
× 100 conexões máximas
= 5.000 conexões potenciais

Agora o Kubernetes faz autoscaling:

200 pods
× 100 conexões
= 20.000 conexões potenciais

O desenvolvedor olha para uma configuração e pensa:

“Cem conexões é um número pequeno.”

O Db2 olha para o conjunto e vê vinte mil visitantes atravessando o portal temporal.



7. Conexão direta ou servidor Db2 Connect?

Nas arquiteturas antigas, era comum encontrar:

Aplicação
    ↓
Servidor Db2 Connect
    ↓
Db2 for z/OS

O servidor Db2 Connect funcionava como um ponto intermediário de conectividade.

Essa arquitetura ainda pode fazer sentido em situações específicas:

  • Centralização de determinados componentes;

  • Ambientes com requisitos legados;

  • Federation;

  • Monitores transacionais;

  • Necessidades operacionais específicas;

  • Administração concentrada.

Mas não é obrigatório colocar um gateway intermediário em todos os cenários.

Muitas aplicações modernas utilizam:

Aplicação + driver IBM
    ↓
DRDA/TCP/IP
    ↓
Db2 for z/OS

A própria IBM recomenda conexão direta por cliente ou driver em muitos ambientes, reduzindo a necessidade de uma máquina intermediária. IBM — Opções de conexão cliente-servidor

Conexão direta

Vantagens:

  • Menos saltos de rede;

  • Menor latência;

  • Menos infraestrutura intermediária;

  • Diagnóstico potencialmente mais simples;

  • Recursos implementados diretamente pelo driver.

Cuidados:

  • Controle de versões dos drivers;

  • Distribuição de certificados;

  • Configuração em múltiplos servidores;

  • Licenciamento;

  • Padronização entre equipes.

Gateway Db2 Connect

Vantagens possíveis:

  • Ponto central de conectividade;

  • Administração concentrada;

  • Suporte a arquiteturas específicas;

  • Menor dispersão de certas configurações.

Cuidados:

  • Mais um salto;

  • Mais um componente monitorado;

  • Possível gargalo;

  • Possível ponto único de falha;

  • Maior cadeia de diagnóstico.

Um gateway não é automaticamente ruim. Conexão direta não é automaticamente melhor. A escolha deve nascer dos requisitos, não da nostalgia de um diagrama de 1998.



8. O que acontece durante um SELECT?

Considere:

SELECT NOME,
       LIMITE_CREDITO
  FROM CLIENTE
 WHERE CPF = ?

A aplicação Java executa algo aparentemente simples:

ResultSet rs = statement.executeQuery();

Por baixo dessa linha, a banheira do tempo entra em funcionamento:

  1. A requisição da aplicação precisa de uma conexão;

  2. A aplicação solicita essa conexão ao pool;

  3. O pool entrega uma conexão existente ou cria outra;

  4. JDBC recebe a solicitação;

  5. O driver IBM converte os parâmetros;

  6. O driver monta a conversa DRDA;

  7. TLS pode proteger o tráfego;

  8. TCP/IP transporta as mensagens;

  9. DDF recebe a requisição no z/OS;

  10. O usuário é autenticado;

  11. A conexão é associada a um DBAT;

  12. O Db2 identifica o package e o contexto;

  13. As autorizações são verificadas;

  14. A SQL é preparada ou localizada;

  15. O access path é utilizado;

  16. Os dados são lidos;

  17. As linhas retornam por DRDA;

  18. O driver converte os tipos;

  19. JDBC entrega o ResultSet;

  20. A aplicação consome os registros;

  21. COMMIT ou ROLLBACK encerra a unidade de trabalho;

  22. A conexão pode retornar ao pool.

Portanto, “tempo da query” pode significar coisas diferentes:

  • Espera pelo pool;

  • Abertura da conexão;

  • Autenticação;

  • Negociação TLS;

  • Transporte de rede;

  • Espera por DBAT;

  • Espera por WLM;

  • Prepare;

  • Execução;

  • Locks;

  • Fetch das linhas;

  • Conversão no driver;

  • Processamento na aplicação.

Quando alguém disser “o Db2 demorou oito segundos”, primeiro descubra onde os oito segundos foram gastos.



9. Packages: o detalhe que aparece quando chega o -805

Uma conexão pode alcançar o host, atravessar a porta, autenticar o usuário e ainda assim falhar.

Um erro clássico é:

SQLCODE -805
SQLSTATE 51002

Ele normalmente indica que um package necessário não foi encontrado, não está disponível no contexto esperado ou não corresponde ao que está sendo solicitado.

Drivers JDBC e CLI utilizam packages preparados no servidor. A collection NULLID aparece frequentemente nesses ambientes.

A IBM disponibiliza, por exemplo, o utilitário DB2Binder para vincular packages utilizados pelo IBM Data Server Driver for JDBC and SQLJ no Db2 for z/OS. IBM — DB2Binder

É possível também trabalhar com collections diferentes e níveis distintos de APPLCOMPAT.

Exemplo conceitual:

NULLID
NULLID_V12R1M500
NULLID_V12R1M501

Cada collection pode representar uma combinação planejada de packages e compatibilidade.

Isso permite que uma aplicação nova utilize determinadas capacidades sem obrigar todas as aplicações antigas a avançarem imediatamente.

Dica de produção:

Antes de atualizar o driver, confirme quais packages serão necessários, quem realizará o bind, quais opções serão usadas e como será feito o rollback.

Atualizar o .jar e esquecer o servidor é uma maneira elegante de transformar uma melhoria técnica em incidente noturno.



10. COMMIT, ROLLBACK e a viagem que talvez já tenha acontecido

Considere uma transferência:

UPDATE CONTA
   SET SALDO = SALDO - 100
 WHERE CONTA_ID = 10;

UPDATE CONTA
   SET SALDO = SALDO + 100
 WHERE CONTA_ID = 20;

As duas operações precisam pertencer à mesma unidade de trabalho.

Em JDBC:

connection.setAutoCommit(false);

try {
    debitar.executeUpdate();
    creditar.executeUpdate();
    connection.commit();
} catch (Exception e) {
    connection.rollback();
    throw e;
}

O commit() não acontece apenas dentro da aplicação Java. A solicitação precisa viajar até o servidor e ser processada pelo Db2.

Agora imagine:

  1. A aplicação envia o COMMIT;

  2. O Db2 recebe;

  3. O Db2 confirma a transação;

  4. A resposta retorna;

  5. A rede cai antes de a aplicação receber a confirmação.

A aplicação pode concluir:

“Não recebi sucesso; tentarei novamente.”

Mas o Db2 talvez já tenha confirmado.

Se o retry repetir a operação inteira, podemos debitar o cliente duas vezes.

Esse é o lado realmente perigoso das falhas distribuídas: nem sempre sabemos imediatamente se a viagem temporal ocorreu.

Por isso, operações críticas precisam considerar:

  • Idempotência;

  • Identificador único de transação;

  • Controle de duplicidade;

  • Reconciliação;

  • Logs técnicos e de negócio;

  • Estado desconhecido após falhas;

  • Estratégias específicas de retry.

Retry não é GO TO TENTE-NOVAMENTE aplicado cegamente a qualquer erro.



11. Pool de conexões: o táxi que retorna à praça

Abrir uma conexão para cada requisição custa caro. Por isso, servidores de aplicações normalmente mantêm pools.

Requisição
    ↓
Solicita conexão
    ↓
Pool entrega uma conexão
    ↓
Aplicação executa SQL
    ↓
Commit ou rollback
    ↓
Conexão retorna ao pool

O problema surge quando a aplicação devolve a conexão em estado inadequado.

Ela pode retornar com:

  • Transação aberta;

  • Cursor abandonado;

  • Isolation level alterado;

  • CURRENT SCHEMA modificado;

  • Registros especiais alterados;

  • Erro não tratado;

  • Estado inválido após falha de comunicação.

Exemplo:

SET CURRENT SCHEMA = FINANCEIRO;

Se a aplicação devolve a conexão sem restaurar o estado, o próximo usuário pode herdar aquela configuração.

O pool é como um táxi reutilizado. O próximo passageiro não deveria encontrar no banco traseiro:

  • A carteira do anterior;

  • Uma transação aberta;

  • Um cursor;

  • O schema financeiro;

  • Nem Igor tentando voltar a 1986.

Boas práticas incluem:

  • Sempre fechar recursos;

  • Usar blocos try-with-resources;

  • Executar rollback em exceções;

  • Configurar validação de conexões;

  • Definir timeouts;

  • Dimensionar mínimo e máximo;

  • Monitorar espera pelo pool;

  • Evitar pools enormes em cada instância;

  • Considerar o total agregado de containers.



12. Segurança: TCP/IP não é colete à prova de balas

A existência de uma conexão TCP/IP não garante que seu conteúdo esteja protegido.

No Db2 for z/OS, TLS pode ser implementado com participação do z/OS Communications Server e AT-TLS. O SECPORT pode identificar a porta utilizada para conexões seguras. IBM — TLS no Db2 for z/OS

Devemos separar quatro perguntas:

Quem é você?

Autenticação:

  • Usuário e senha;

  • RACF PassTicket;

  • Kerberos;

  • Outros mecanismos previstos pela arquitetura.

A conversa está protegida?

Transporte:

  • TLS;

  • Certificados;

  • Truststore;

  • Cipher suites;

  • AT-TLS;

  • Políticas de rede.

O que você pode fazer?

Autorização:

  • SELECT;

  • INSERT;

  • UPDATE;

  • DELETE;

  • EXECUTE em package;

  • EXECUTE em stored procedure;

  • Uso de uma collection.

Quem é a aplicação?

Identificação operacional:

  • Application name;

  • Workstation;

  • Client user;

  • Accounting string;

  • Correlation ID.

Sem identificação adequada, o monitoramento pode apresentar centenas de conexões chamadas simplesmente de:

db2jcc_application

É como receber 500 viajantes temporais e registrar todos como “Igor”.



13. Por que uma SQL rápida no SPUFI pode ser lenta no Java?

Essa comparação aparece frequentemente:

“No SPUFI leva meio segundo; no Java leva dez segundos. Logo, Java ou Db2 Connect está lento.”

Talvez. Mas ainda não foi provado.

Compare:

  • A SQL é exatamente igual?

  • Os valores dos parâmetros são iguais?

  • O usuário é o mesmo?

  • O schema é o mesmo?

  • O package é o mesmo?

  • O APPLCOMPAT é igual?

  • O isolation level é igual?

  • A aplicação executa apenas uma SQL?

  • O tempo inclui espera no pool?

  • Há latência de rede?

  • Quantas linhas retornam?

  • Qual é o fetch size?

  • A aplicação processa cada linha lentamente?

  • Existe gateway intermediário?

  • Há conversões de tipos?

  • A conexão foi aberta durante a medição?

SPUFI e aplicação distribuída podem usar caminhos operacionais muito diferentes.

A aplicação talvez faça:

1 consulta para obter clientes
+ 1 consulta para cada cliente

Para mil clientes:

1 + 1.000 = 1.001 SQLs

Esse é o conhecido problema N+1.

O Db2 pode executar cada consulta rapidamente, mas a aplicação acumula mil viagens de rede.

O relatório final dirá “Db2 lento”. O Db2, inocente, estará apenas respondendo mil vezes à mesma insistência.



14. Fetch size: quantas malas entram em cada viagem?

Se uma consulta retorna 100 mil linhas, trazê-las uma por uma pode ser desastroso.

Imagine:

100.000 linhas
÷ 10 linhas por bloco
= 10.000 trocas

Com blocos de cem linhas:

100.000
÷ 100
= 1.000 trocas

Ajustar fetch size e blocagem pode reduzir viagens, mas aumentar indiscriminadamente também não é solução.

Blocos maiores podem:

  • Consumir mais memória;

  • Aumentar o volume transferido antecipadamente;

  • Ser desperdiçados se a aplicação abandonar o cursor;

  • Pressionar o heap do servidor.

O ajuste deve considerar:

  • Tamanho médio da linha;

  • Volume do resultado;

  • Latência;

  • Memória disponível;

  • Padrão de consumo;

  • Necessidade real do usuário.

A melhor otimização pode ser não buscar 100 mil linhas.

Às vezes, a solução correta é:

FETCH FIRST 100 ROWS ONLY

ou implementar paginação adequada.



15. Data Sharing, Sysplex e a banheira com várias saídas

Em um Db2 Data Sharing Group, vários membros podem atender o workload.

Aplicação
    ↓
Driver com recursos de disponibilidade
    ↓
Location do grupo
    ↓
DB2A / DB2B / DB2C

O driver pode colaborar com:

  • Sysplex workload balancing;

  • Automatic client reroute;

  • Failover;

  • Afinidade;

  • Concentração de transporte.

Mas esses recursos precisam ser planejados e configurados. Não surgem apenas porque alguém escreveu “HA” no PowerPoint.

Também é importante compreender:

Reconectar não significa continuar uma transação interrompida exatamente de onde ela parou.

O driver pode encontrar outro membro disponível, mas a aplicação ainda precisa tratar:

  • Unidade de trabalho anterior;

  • Commit de resultado incerto;

  • Cursores perdidos;

  • Estado da sessão;

  • Reexecução segura.

Alta disponibilidade reduz interrupções. Não revoga as leis do processamento distribuído.



16. Mapa rápido dos erros

SintomaCamada provávelO que verificar
Host desconhecidoDNSNome e resolução
Connection refusedTCP/DDFPorta, listener, firewall
Timeout de conexãoRedeRota, firewall, endereço
Falha de handshakeTLSCertificado, truststore, cipher
Usuário inválidoSegurançaCredencial, RACF, método
SQLCODE -805PackageCollection, bind, versão
SQLCODE -551AutorizaçãoPrivilégios
SQLCODE -911/-913ConcorrênciaLock, deadlock, timeout
SQLCODE -904RecursoReason code e resource name
SQL30081NComunicaçãoProtocolo, socket e códigos
-4499JDBC/comunicaçãoExceções encadeadas e timeout
Muitas conexões ociosasPoolMínimo, máximo e total agregado
Lentidão intermitenteVáriasPool, DBAT, WLM, lock, rede

Nunca pare na primeira mensagem genérica.

Em JDBC, investigue as exceções encadeadas. Registre:

  • SQLCODE;

  • SQLSTATE;

  • Reason code;

  • Timestamp;

  • Host de origem;

  • Nome da aplicação;

  • Versão do driver;

  • Correlation ID;

  • URL sem senha;

  • Operação executada;

  • Estado da transação.


17. Passo a passo do jovem padawan COBOL

Passo 1 — Desenhe o caminho real

Aplicação
→ servidor
→ driver
→ gateway, se houver
→ firewall
→ porta
→ DDF
→ Db2

Não use o desenho idealizado. Use o caminho de produção.

Passo 2 — Identifique o driver

Descubra:

  • Nome;

  • Versão;

  • Arquivo;

  • Configuração;

  • Compatibilidade;

  • Licença aplicável.

Passo 3 — Confirme host, porta e location

Não confunda:

  • Nome DNS;

  • Nome do subsistema;

  • Location name;

  • Alias;

  • Nome do data sharing group;

  • Database da URL JDBC.

Passo 4 — Teste a rede

Verifique:

  • DNS;

  • Rota;

  • Porta;

  • Firewall;

  • Origem real da aplicação.

O teste deve ser executado a partir do servidor onde o programa roda, não do notebook do analista.

Passo 5 — Verifique TLS

Confirme:

  • Porta segura;

  • Validade do certificado;

  • Cadeia de confiança;

  • Truststore;

  • Nome do host;

  • Política AT-TLS.

Passo 6 — Verifique DDF

No z/OS:

  • DDF está ativo?

  • A porta está correta?

  • O location está correto?

  • Existem mensagens DSNL?

  • A conexão chega?

Passo 7 — Verifique autenticação

Pergunte:

  • O usuário existe?

  • Está revogado?

  • A credencial expirou?

  • O método é compatível?

  • O RACF registrou falha?

Passo 8 — Verifique packages

Se houver -805:

  • Qual package?

  • Qual collection?

  • Qual versão do driver?

  • Houve atualização?

  • O bind foi feito?

  • O APPLCOMPAT é compatível?

Passo 9 — Verifique autorização

Se houver -551:

  • Qual authid?

  • Qual objeto?

  • Qual operação?

  • A autorização é direta ou por papel?

  • O usuário pode executar o package?

Passo 10 — Verifique a unidade de trabalho

  • Autocommit está ativo?

  • Existe commit explícito?

  • O rollback é garantido?

  • A conexão volta limpa ao pool?

  • Há transações longas?

Passo 11 — Verifique performance

  • Espera no pool;

  • Tempo de conexão;

  • Tempo de SQL;

  • Tempo de fetch;

  • Tempo da aplicação;

  • Lock;

  • DBAT;

  • WLM;

  • Número de viagens.

Passo 12 — Documente o resultado

Uma solução que vive apenas na memória do analista sofrerá um DELETE quando ele sair de férias.






18. Curiosidades escondidas na banheira

Curiosidade 1 — O nome histórico pode denunciar a idade do desenho

O infográfico usa “Db2 for i5/OS”. A nomenclatura atual é Db2 for IBM i.

Também aparece algo parecido com “Db2 for x/OS”, provavelmente um erro gráfico para Db2 for z/OS.

Curiosidade 2 — SQL não é API de transporte

SQL descreve operações relacionais. JDBC, ODBC e CLI oferecem interfaces para a aplicação. O driver transforma essas chamadas em comunicação com o servidor.

Curiosidade 3 — “Conectou” não significa “funcionou”

Existem vários marcos:

Host respondeu
≠ porta abriu
≠ TLS negociou
≠ usuário autenticou
≠ package foi encontrado
≠ autorização concedida
≠ SQL executou
≠ commit confirmou

Curiosidade 4 — O nome da aplicação é recurso de produção

Preencher corretamente os atributos do cliente ajuda:

  • Accounting;

  • WLM;

  • Monitoramento;

  • Profile tables;

  • Diagnóstico;

  • Chargeback;

  • Identificação de ofensores.

Curiosidade 5 — O erro mais perigoso pode vir depois do sucesso

A SQL pode ter sido executada e confirmada, mas a resposta pode ter se perdido. Isso cria estado incerto e torna retries cegos particularmente perigosos.

Curiosidade 6 — Microserviço não reduz automaticamente o consumo

Transformar um monólito em cem containers pode multiplicar:

  • Pools;

  • Conexões;

  • Certificados;

  • Logs;

  • Timeouts;

  • Pontos de falha;

  • Viagens ao Db2.

A arquitetura ficou distribuída. O bom senso também precisa ser.



19. O mapa mental definitivo

Quando uma aplicação distribuída acessa Db2 for z/OS, pense nesta sequência:

A aplicação pede
A API formaliza
O driver traduz
DRDA organiza
TLS protege
TCP/IP transporta
DDF recebe
RACF autentica
WLM classifica
DBAT trabalha
O package sustenta
Db2 executa
O cursor entrega
COMMIT confirma
O pool reutiliza
A monitoração conta a história

Se cada componente possuir dono, versão, configuração, métrica e procedimento, a arquitetura será administrável.

Se tudo for chamado genericamente de “Db2 Connect”, o incidente será uma excursão temporal sem mapa.



Epílogo — Ninguém voltou para 1986, mas o chamado foi encerrado

De volta ao datacenter, o jovem padawan COBOL examinou novamente o erro:

ERRORCODE=-4499
SQLSTATE=08001

Dessa vez ele não começou pelo SELECT.

Primeiro confirmou:

  • O servidor de origem;

  • A versão do driver;

  • O hostname;

  • A porta segura;

  • A cadeia de certificados;

  • O status do DDF;

  • As mensagens no z/OS.

Descobriu que o certificado havia sido renovado no servidor, mas o truststore da aplicação ainda continha a cadeia anterior.

A rede funcionava.

O DDF funcionava.

O Db2 funcionava.

A SQL nunca havia chegado ao banco.

Igor olhou para a banheira e perguntou:

— Então podemos colocá-la em produção?

O padawan respondeu:

IF IGOR-IN-PRODUCTION
    MOVE 'N' TO APPROVAL-FLAG
    PERFORM CHAMAR-CHANGE-MANAGER
END-IF

A maior lição daquela noite não foi apenas aprender o que Db2 Connect faz.

Foi compreender que arquiteturas distribuídas são formadas por contratos encadeados. Cada camada promete alguma coisa à camada seguinte:

  • A aplicação promete usar corretamente a API;

  • O driver promete implementar a conversa;

  • DRDA promete organizar o diálogo;

  • TCP/IP promete transportar;

  • TLS promete proteger;

  • DDF promete receber;

  • DBAT promete processar;

  • O Db2 promete preservar integridade;

  • A aplicação promete saber quando confirmar ou desfazer.

Quando uma promessa é quebrada, o erro aparece em algum lugar da cadeia — nem sempre no lugar onde nasceu.

Db2 Connect, portanto, não é uma simples ponte entre um computador e um banco.

É uma máquina do tempo cuidadosamente controlada: leva aplicações escritas hoje até dados acumulados durante décadas, permite que Java, Python, .NET, ferramentas ODBC e sistemas modernos conversem com o Db2 for z/OS e demonstra que o mainframe não está preso ao passado.

O passado continua em produção.

E, ao contrário da banheira de Igor, processa bilhões de transações sem derramar energético no DDF.




sexta-feira, 26 de agosto de 2022

DB2 COMMANDS sem Mistérios: do Primeiro -DISPLAY ao JCL de Manutenção

 

Bellacosa Mainframe e o db2 commands


☕ Um Café no Bellacosa Mainframe

DB2 COMMANDS sem Mistérios: do Primeiro -DISPLAY ao JCL de Manutenção

Imagine a cena, jovem Padawan do COBOL.

São 2h17 da madrugada. O processamento batch que atualiza milhões de registros de clientes está parado. O operador informa que o programa terminou com SQLCODE -904. O desenvolvedor revisa o SELECT, procura vírgula fora do lugar, confere as host variables, examina a SQLCA e recompila o programa.

Nada parece errado.

Nesse momento, o DBA abre o DB2I, entra no painel DB2 COMMANDS e executa:

-DIS DB(DSN00122) SPACENAM(ALUNOST1) RESTRICT

A resposta revela:

STATUS = COPY

O programa COBOL não estava com defeito. O table space estava em uma condição restritiva.

Essa é uma das primeiras grandes lições do universo Db2 for z/OS:

Nem todo erro recebido pelo programa nasceu dentro do programa.

O COBOL é apenas um dos viajantes dessa galáxia. Para alcançar uma linha armazenada no Db2, ele depende de uma longa cadeia:

Programa COBOL
      ↓
Instrução SQL
      ↓
DBRM
      ↓
Package
      ↓
Plan ou Package List
      ↓
Thread Db2
      ↓
Tabela
      ↓
Table Space
      ↓
Buffer Pool
      ↓
Data Set VSAM
      ↓
DASD

A tela apresentada mostra justamente uma das portas usadas para observar essa infraestrutura: o painel DB2 COMMANDS, acessível pelo DB2I dentro do TSO/ISPF.

Prepare a caneca, ajuste os óculos e vamos atravessar esse painel linha por linha.


Bellacosa Mainframe e o painel db2 commands

1. O que é o painel DB2 COMMANDS?

DB2I significa Db2 Interactive. Trata-se de um conjunto clássico de painéis ISPF que permite executar diversas atividades relacionadas ao Db2 for z/OS, como:

  • rodar SQL pelo SPUFI;

  • gerar DCLGEN;

  • preparar programas;

  • realizar BIND;

  • executar utilitários;

  • emitir comandos administrativos;

  • acessar funções de ajuda e diagnóstico.

O painel da imagem apresenta no alto:

DB2 COMMANDS                       SSID: DB9G

A expressão DB2 COMMANDS identifica a função atual. Já SSID: DB9G informa para qual subsistema Db2 os comandos serão enviados.

A IBM documenta que comandos como -DISPLAY DATABASE e -DISPLAY BUFFERPOOL podem ser emitidos pelo console do z/OS, por uma sessão DSN no TSO, pelo painel DB2 COMMANDS, por terminais IMS ou CICS e por programas que usem a Instrumentation Facility Interface. (IBM)

Isso significa que o painel DB2I não é o único caminho. Ele é, porém, um dos mais didáticos para quem está começando.


2. SSID: o nome do reino Db2

Na imagem aparece:

SSID: DB9G

SSID significa Subsystem Identifier, ou identificador do subsistema.

Em um mesmo ambiente z/OS podem existir vários subsistemas Db2:

DB2D  → desenvolvimento
DB2T  → testes
DB2H  → homologação
DB2P  → produção
DB9G  → treinamento ou laboratório

Esses nomes são apenas exemplos. Cada empresa define seu próprio padrão.

O SSID é uma informação crítica porque um comando emitido para o subsistema errado pode causar um incidente. Veja a diferença:

-DIS DB(DSN00122)

Esse comando apenas consulta informações.

Já:

-STOP DB(DSN00122)

pode tornar o database ou seus espaços indisponíveis, dependendo dos parâmetros e do contexto.

O primeiro hábito de um bom DBA Padawan deve ser:

1. Confirmar o ambiente.
2. Confirmar o SSID.
3. Confirmar o objeto.
4. Confirmar se o comando é consultivo ou modificador.
5. Somente então pressionar ENTER.

No mainframe, a tecla ENTER não é apenas uma tecla. Algumas vezes, ela é um pequeno botão vermelho com o poder de acordar três gerentes, dois sysprogs e um diretor.


3. Por que os comandos começam com hífen?

Os comandos do subsistema Db2 geralmente começam com um hífen:

-DISPLAY DATABASE
-START DATABASE
-STOP DATABASE
-DISPLAY BUFFERPOOL
-DISPLAY THREAD
-DISPLAY LOG

O hífen ajuda o ambiente a reconhecer que a linha contém um comando Db2.

Compare:

SELECT NOME
  FROM ALUNOS
 WHERE MATRICULA = 1001;

Isso é uma instrução SQL.

-DIS DB(DSN00122)

Isso é um comando administrativo do subsistema Db2.

TSO LISTCAT

Isso é um comando TSO.

F ALUNOS,APPL=DISPLAY

Isso poderia ser um comando direcionado a uma started task ou aplicação pelo console, dependendo da instalação.

O hífen é, portanto, uma pequena placa dizendo:

“Esta mensagem pertence ao reino do Db2.”


4. A primeira linha: -DIS DATABASE(DSN00122)

Na tela encontramos:

-DIS DATABASE(DSN00122)

A forma completa é:

-DISPLAY DATABASE(DSN00122)

A abreviação documentada é:

-DIS DB(DSN00122)

O comando DISPLAY DATABASE apresenta informações sobre o estado de databases, table spaces, index spaces, partições e outros objetos relacionados. (IBM)

O que é um database no Db2 for z/OS?

Aqui existe uma armadilha conceitual.

Em produtos distribuídos, a palavra “database” frequentemente representa uma instância lógica ampla que contém schemas, tabelas, índices e outros objetos. No Db2 for z/OS, um database é principalmente um agrupador lógico e administrativo de espaços.

Considere:

DATABASE DSN00122
   |
   +-- TABLESPACE ALUNOST1
   |      |
   |      +-- TABLE ESCOLA.ALUNOS
   |
   +-- TABLESPACE CURSOST1
   |      |
   |      +-- TABLE ESCOLA.CURSOS
   |
   +-- INDEXSPACE ALUNOSX1
          |
          +-- INDEX ESCOLA.IXALUNO

O database ajuda a organizar, administrar, iniciar, parar e consultar grupos de objetos.

Ao executar:

-DIS DB(DSN00122)

você está perguntando:

“Db2, qual é o estado administrativo do database DSN00122?”

Uma resposta simplificada poderia apresentar:

DATABASE = DSN00122
STATUS   = RW

RW normalmente representa Read/Write, indicando disponibilidade para leitura e gravação.

Entretanto, aqui existe um detalhe importante: o database pode estar normal enquanto um de seus table spaces está restrito. O inverso também merece atenção: um espaço pode aparecer em modo RW, mas continuar inacessível se o database que o contém estiver em condição restritiva.

Por isso, a IBM orienta que uma investigação completa de estados restritivos pode exigir dois comandos: um para o database e outro usando SPACENAM para seus espaços. (IBM)

Exemplo:

-DIS DB(DSN00122) RESTRICT

Depois:

-DIS DB(DSN00122) SPACENAM(*) RESTRICT

O primeiro procura restrições no nível do database.

O segundo procura table spaces e index spaces em estados restritivos.


5. A segunda linha: procurando ALUNOST1

A imagem apresenta:

-DIS DATABASE (*) SPACENAM(ALUNOST1)

Uma escrita padronizada seria:

-DIS DB(*) SPACENAM(ALUNOST1)

ou, se soubermos o database:

-DIS DB(DSN00122) SPACENAM(ALUNOST1)

O que significa o asterisco?

O asterisco funciona como um curinga:

DATABASE(*)

significa:

“Considere todos os databases aplicáveis.”

Assim, o comando procura um espaço chamado ALUNOST1, mesmo que o operador não saiba em qual database ele está.

Isso pode ser muito útil em um laboratório, mas em produção é preferível ser específico sempre que possível:

-DIS DB(DSN00122) SPACENAM(ALUNOST1)

Quanto mais preciso o comando, menor a quantidade de saída, menor a chance de confusão e mais rápida a análise.

O que é SPACENAM?

SPACENAM significa space name.

Ele restringe a consulta a um table space ou index space específico:

SPACENAM(ALUNOST1)

Pergunta ao Db2:

“Qual é o estado do espaço chamado ALUNOST1?”

Uma resposta hipotética poderia ser:

DATABASE = DSN00122
SPACENAM = ALUNOST1
TYPE     = TS
STATUS   = RW

Onde:

TYPE = TS

indica um table space.


6. Table space: a casa física da tabela

Uma tabela Db2 não paira magicamente sobre o catálogo. Seus dados residem em um table space.

Considere:

CREATE TABLE ESCOLA.ALUNOS
(
    MATRICULA INTEGER       NOT NULL,
    NOME      VARCHAR(100)  NOT NULL,
    CURSO     CHAR(10),
    NOTA      DECIMAL(5,2),
    PRIMARY KEY (MATRICULA)
)
IN DSN00122.ALUNOST1;

A cláusula:

IN DSN00122.ALUNOST1

indica o database e o table space associados.

A relação simplificada é:

ESCOLA.ALUNOS
      ↓
DSN00122.ALUNOST1
      ↓
Data sets administrados pelo Db2
      ↓
Volumes DASD

Nos ambientes modernos, são comuns os Universal Table Spaces, incluindo:

  • partition-by-growth, ou PBG;

  • partition-by-range, ou PBR.

Em um PBG, o Db2 pode adicionar partições automaticamente à medida que o espaço cresce; ele mantém uma única tabela e utiliza características de gerenciamento segmentado. (IBM)

O programador COBOL não precisa administrar essas estruturas diariamente, mas deve compreender que seu SELECT depende delas.


7. O poderoso parâmetro RESTRICT

Um dos comandos mais úteis para diagnóstico é:

-DIS DB(DSN00122) SPACENAM(*) RESTRICT

A opção RESTRICT reduz a saída aos objetos que estão em estado restritivo. (IBM)

Sem RESTRICT, você pode receber dezenas ou centenas de linhas.

Com RESTRICT, a pergunta fica mais objetiva:

“Mostre somente aquilo que pode estar impedindo o funcionamento normal.”

Um comando ainda mais amplo seria:

-DIS DB(*) SPACENAM(*) RESTRICT

A própria IBM apresenta essa forma como maneira de descobrir espaços em condição restritiva, inclusive após determinadas operações de LOAD. (IBM)

Entretanto, em grandes ambientes, usar curingas amplos pode gerar muita saída. No dia a dia, prefira:

-DIS DB(DSN00122) SPACENAM(ALUNOST1) RESTRICT

8. Estados que o Padawan precisa reconhecer

Os códigos podem variar de acordo com o objeto, versão, comando e contexto, mas alguns conceitos aparecem frequentemente.

RW — Read/Write

O objeto aceita leitura e gravação.

STATUS = RW

Esse é normalmente o cenário desejado para objetos transacionais.

RO — Read Only

O objeto está disponível apenas para leitura.

Um comando como:

SELECT NOME
  FROM ESCOLA.ALUNOS;

pode funcionar.

Porém:

UPDATE ESCOLA.ALUNOS
   SET NOTA = 9.50
 WHERE MATRICULA = 1001;

pode falhar porque exige gravação.

STOP

O objeto foi parado ou está indisponível.

Após analisar a situação, um administrador autorizado poderia utilizar:

-START DB(DSN00122) SPACENAM(ALUNOST1)

A IBM define -START DATABASE como o comando que torna o database ou objetos especificados disponíveis para uso, conforme as opções escolhidas. (IBM)

Não se deve executar START automaticamente sem entender por que o objeto estava parado. Ele pode ter sido interrompido propositalmente para manutenção.

COPY-pending

Indica que o Db2 requer uma image copy ou que existe uma condição relacionada à proteção para recuperação.

A solução pode envolver o utilitário COPY, mas é preciso examinar:

  • qual operação criou o estado;

  • se a cópia deve ser full ou incremental;

  • se haverá cópia local e de recovery site;

  • qual política de retenção existe;

  • se o objeto está participando de outro utilitário;

  • qual nível de concorrência é necessário.

REORG-pending

Indica necessidade de materializar alguma alteração ou reorganizar o objeto, conforme o estado específico.

O utilitário REORG TABLESPACE pode reorganizar um table space, partição ou intervalo de partições, recuperar espaço fragmentado, melhorar o acesso e materializar alterações de definição pendentes. (IBM)

Mas atenção:

Nem toda estatística ligeiramente ruim exige REORG.

A IBM recomenda considerar diversos fatores e executar a reorganização quando houver indicação real de necessidade, não apenas por hábito. (IBM)

RECOVER-pending

O objeto precisa de recuperação antes de retornar ao uso normal.

Essa situação pode exigir o utilitário RECOVER, image copies e registros de log. É um procedimento de alta responsabilidade.

CHECK-pending

Pode indicar que a consistência entre dados, restrições ou objetos relacionados precisa ser validada.

Dependendo da situação, o procedimento pode utilizar CHECK DATA ou outra ação administrativa apropriada.

PRO — Persistent Read Only

O estado PRO permite acesso de leitura por SQL ou utilitários, mas bloqueia atualizações na partição afetada. Tentativas de gravação podem receber erro de recurso indisponível. (IBM)


9. A terceira linha: buffer pools

A tela mostra:

-DIS BUFFERPOOL(*)

A forma completa é:

-DISPLAY BUFFERPOOL(*)

A abreviação oficial documentada pela IBM é:

-DIS BPOOL(*)

O comando apresenta o estado atual de um ou mais buffer pools ativos ou inativos. (IBM)

Eu recomendaria padronizar a linha como:

-DIS BPOOL(*)

ou escrever tudo por extenso:

-DISPLAY BUFFERPOOL(*)

Evite misturar uma abreviação do verbo com uma forma não padronizada do restante do comando em procedimentos operacionais. Padronização reduz erros.


10. O que é um buffer pool?

Imagine que o DASD seja uma gigantesca biblioteca subterrânea.

As páginas das tabelas e índices estão armazenadas nessa biblioteca. Sempre que um programa precisa ler um registro, o Db2 precisa encontrar a página correspondente.

Buscar tudo diretamente no disco seria mais lento. Por isso, o Db2 mantém páginas utilizadas em áreas de memória chamadas buffer pools.

A IBM define buffer pools como áreas de armazenamento virtual usadas para atender às necessidades de buffering de table spaces e índices. Em versões atuais do Db2 for z/OS, essas estruturas ficam acima da “barra” de 2 GB. (IBM)

O fluxo simplificado é:

Programa solicita uma linha
          ↓
Db2 identifica a página
          ↓
Página já está no buffer pool?
      /                     \
    Sim                     Não
     ↓                       ↓
Leitura lógica       Leitura física no DASD
     ↓                       ↓
Entrega os dados      Carrega a página no pool
                              ↓
                       Entrega os dados

Alguns nomes comuns:

BP0
BP1
BP2
BP8K0
BP16K0
BP32K

A nomenclatura pode indicar o tamanho de página suportado:

BP0      → normalmente 4 KB
BP8K0    → 8 KB
BP16K0   → 16 KB
BP32K    → 32 KB

A configuração real deve ser confirmada no ambiente.

Consultando todos

-DIS BPOOL(*)

Consultando os ativos

-DIS BPOOL(ACTIVE)

Consultando um específico

-DIS BPOOL(BP0)

Solicitando detalhes

-DIS BPOOL(BP0) DETAIL

A IBM informa que o monitoramento pode fornecer relatório resumido ou detalhado. (IBM)


11. O hit ratio e a armadilha dos números bonitos

Uma ideia bastante usada em análises de buffer pool é o buffer pool hit ratio.

Uma fórmula didática simplificada é:

Hit Ratio =
  (Getpages - Leituras físicas)
  ----------------------------- × 100
             Getpages

Suponha:

Getpages          = 1.000.000
Leituras físicas  =    80.000

Então:

Hit Ratio = (1.000.000 - 80.000) / 1.000.000 × 100
Hit Ratio = 92%

Isso sugere que grande parte das solicitações foi atendida sem nova leitura física.

Mas um hit ratio alto não é automaticamente sinal de perfeição.

Pode existir:

  • I/O síncrono justamente nas páginas críticas;

  • buffer pool superdimensionado;

  • disputa por memória real;

  • mistura inadequada de workloads;

  • prefetch pouco eficiente;

  • páginas sem utilidade permanecendo na memória;

  • desempenho ruim causado por SQL, não pelo cache.

O Easter egg técnico aqui é:

Um número verde no painel pode esconder um dragão vermelho no subterrâneo.

Analise sempre o contexto, a evolução ao longo do tempo, o tipo de aplicação e as métricas SMF ou de uma ferramenta de monitoramento.


12. Ligando a SQLCA aos comandos Db2

Considere um programa COBOL:

       EXEC SQL
           SELECT NOME,
                  NOTA
             INTO :WS-NOME,
                  :WS-NOTA
             FROM ESCOLA.ALUNOS
            WHERE MATRICULA = :WS-MATRICULA
       END-EXEC.

Depois da instrução, o programa verifica:

       EVALUATE SQLCODE
           WHEN 0
               DISPLAY 'ALUNO ENCONTRADO'
           WHEN 100
               DISPLAY 'ALUNO NAO ENCONTRADO'
           WHEN -904
               DISPLAY 'RECURSO INDISPONIVEL'
           WHEN OTHER
               DISPLAY 'ERRO SQL: ' SQLCODE
       END-EVALUATE.

Se SQLCODE for -904, o programa recebeu um erro de recurso indisponível. O próximo passo não deve ser imediatamente alterar o SQL.

Uma investigação responsável inclui:

1. Ler SQLCODE e SQLSTATE.
2. Examinar SQLERRMC na SQLCA.
3. Identificar o recurso indicado.
4. Descobrir database e table space.
5. Consultar o estado pelo DISPLAY DATABASE.
6. Verificar locks, claims ou utilitários.
7. Corrigir a causa.
8. Validar novamente.

Exemplo:

-DIS DB(DSN00122)

Depois:

-DIS DB(DSN00122) SPACENAM(ALUNOST1) RESTRICT

Se houver suspeita de bloqueio:

-DIS BLOCKERS

O comando DISPLAY BLOCKERS apresenta locks e claims mantidos por threads ativas contra databases, tabelas, índices ou espaços especificados. Sua abreviação é -DIS BL. (IBM)


13. JCL para executar uma image copy

Quando um table space está em COPY-pending e o procedimento aprovado determina a criação de uma image copy, um job semelhante ao seguinte pode ser usado.

Este é um modelo educacional. Procedures, nomes de DDs, unidades, classes, templates e políticas variam entre instalações.

//BCSCOPY  JOB (ACCT),'COPY ALUNOS',
//             CLASS=A,
//             MSGCLASS=X,
//             MSGLEVEL=(1,1),
//             NOTIFY=&SYSUID
//*
//COPYTS   EXEC DSNUPROC,
//             SYSTEM=DB9G,
//             UID='CPYALU01'
//*
//DSNUPROC.SYSIN DD *
  COPY TABLESPACE DSN00122.ALUNOST1
       FULL YES
       SHRLEVEL CHANGE
/*
//

Explicação detalhada da JOB statement

//BCSCOPY JOB (ACCT),'COPY ALUNOS',

BCSCOPY é o nome do job.

Ele deve seguir os padrões da instalação. Alguns ambientes usam identificação do usuário, aplicação e função:

VAGCOPY
PRDCOPY
DB2CPY01

JOB informa ao JES que uma nova unidade de trabalho está começando.

(ACCT)

É a informação contábil. Ela pode representar centro de custo, projeto ou código de cobrança. O formato depende da empresa.

'COPY ALUNOS'

É a descrição do job. Ela aparece em ferramentas como SDSF e ajuda a identificar sua finalidade.

CLASS

CLASS=A

Define a classe de execução.

A classe pode influenciar:

  • prioridade;

  • iniciador;

  • limites;

  • ambiente;

  • horário;

  • recursos disponíveis.

Não presuma que CLASS=A seja correta em sua empresa.

MSGCLASS

MSGCLASS=X

Define a classe de saída do spool.

Ela determina para onde irão mensagens JES, listagens e relatórios do job.

MSGLEVEL

MSGLEVEL=(1,1)

O primeiro valor controla a impressão das instruções JCL.

O segundo controla mensagens de alocação e desalocação.

Em termos didáticos, (1,1) solicita boa visibilidade para diagnóstico, mas o padrão corporativo pode ser diferente.

NOTIFY

NOTIFY=&SYSUID

Solicita que o usuário que submeteu o job seja notificado ao término.

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


14. Explicando o passo EXEC

//COPYTS EXEC DSNUPROC,

COPYTS é o nome do step.

EXEC informa que o step executará um programa ou procedure.

DSNUPROC representa uma procedure para execução de utilitários Db2. O nome real pode ser:

DSNUPROC
DSNUTIL
DB2UTIL
DSNUPR13

Isso depende da instalação.

SYSTEM=DB9G

Passa à procedure o subsistema Db2 de destino.

Esse parâmetro precisa corresponder ao ambiente correto.

UID='CPYALU01'

Define um identificador para a execução do utilitário.

O UID ajuda a distinguir jobs e pode aparecer em mensagens, registros e controles internos. Seu tamanho e padrão precisam obedecer às regras da procedure utilizada.


15. Explicando o SYSIN

//DSNUPROC.SYSIN DD *

Essa linha fornece as instruções de controle do utilitário.

DD significa Data Definition.

O asterisco indica que os dados estão escritos diretamente no JCL, logo abaixo da linha.

Dependendo de como a procedure foi criada, a referência pode ser:

//SYSIN DD *

ou:

//DSNUPROC.SYSIN DD *

Quando existe uma procedure catalogada, o formato qualificado pode substituir o DD interno do step da procedure.

Agora vem a instrução:

COPY TABLESPACE DSN00122.ALUNOST1

Ela solicita uma cópia do table space ALUNOST1, pertencente ao database DSN00122.

FULL YES

Solicita uma image copy completa, em vez de uma cópia incremental baseada em alterações.

SHRLEVEL CHANGE

Permite determinado nível de concorrência com aplicações durante a cópia. A compatibilidade exata depende do tipo do objeto e das operações concorrentes; existem claims, drains e restrições específicas que devem ser verificadas. (IBM)

A IBM também permite definir data sets de cópia local e de recovery site por opções como COPYDDN e RECOVERYDDN. (IBM)

O delimitador:

/*

encerra os dados instream de SYSIN.


16. Versão com TEMPLATE

Em ambientes modernos, é comum utilizar TEMPLATE para gerar dinamicamente nomes dos data sets de cópia.

Exemplo educacional:

//BCSCOPY  JOB (ACCT),'COPY ALUNOS',
//             CLASS=A,MSGCLASS=X,NOTIFY=&SYSUID
//COPYTS   EXEC DSNUPROC,
//             SYSTEM=DB9G,
//             UID='CPYALU02'
//DSNUPROC.SYSIN DD *
  TEMPLATE CPYDS
       DSN 'BCS.DB2.&DB..&TS..D&DATE..T&TIME.'
       UNIT SYSALLDA
       DISP (NEW,CATLG,DELETE)

  COPY TABLESPACE DSN00122.ALUNOST1
       COPYDDN(CPYDS)
       FULL YES
       SHRLEVEL CHANGE
/*
//

TEMPLATE

TEMPLATE CPYDS

Cria um template chamado CPYDS.

DSN 'BCS.DB2.&DB..&TS..D&DATE..T&TIME.'

Define o padrão do nome do data set.

As variáveis simbólicas do utilitário podem inserir informações como database, table space, data e hora, conforme as opções suportadas.

Um nome resultante poderia ser semelhante a:

BCS.DB2.DSN00122.ALUNOST1.D20260714.T021700
UNIT SYSALLDA

Solicita alocação em uma unidade de disco elegível no grupo SYSALLDA.

DISP (NEW,CATLG,DELETE)

Significa:

  • NEW: o data set será criado;

  • CATLG: se o step terminar normalmente, será catalogado;

  • DELETE: se falhar, será excluído.

A IBM fornece exemplos de uso de TEMPLATE e COPYDDN para image copies. (IBM)


17. JCL de REORG TABLESPACE

Quando a análise demonstra necessidade real de reorganização, um modelo poderia ser:

//BCSREORG JOB (ACCT),'REORG ALUNOS',
//             CLASS=A,
//             MSGCLASS=X,
//             MSGLEVEL=(1,1),
//             NOTIFY=&SYSUID
//*
//REORGTS  EXEC DSNUPROC,
//             SYSTEM=DB9G,
//             UID='RGOALU01'
//*
//DSNUPROC.SYSIN DD *
  REORG TABLESPACE DSN00122.ALUNOST1
        SHRLEVEL CHANGE
        SORTDATA
        STATISTICS
        TABLE ALL
        INDEX ALL
/*
//

REORG TABLESPACE

REORG TABLESPACE DSN00122.ALUNOST1

Solicita a reorganização do table space.

O utilitário pode recuperar espaço fragmentado, reorganizar registros e materializar certas mudanças de definição pendentes. (IBM)

SHRLEVEL CHANGE

Permite que aplicações continuem realizando leituras e gravações durante grande parte do processo.

Em uma reorganização online, o Db2 pode trabalhar com uma shadow copy, registrar mudanças no log, aplicar essas alterações à cópia e realizar uma fase de troca. (IBM)

Isso não significa “zero impacto”. Ainda podem existir:

  • drains;

  • fases críticas;

  • espera por aplicações;

  • aumento de logging;

  • necessidade de espaço;

  • impacto de CPU e I/O;

  • timeout na troca final.

SORTDATA

Solicita ordenação dos dados, normalmente de acordo com a chave de clustering aplicável.

Nos exemplos documentados, SORTDATA é o padrão em cenários tradicionais e pode ser omitido, mas escrevê-lo ajuda didaticamente a deixar a intenção clara. (IBM)

STATISTICS

Solicita a coleta de estatísticas durante o REORG.

Essas informações podem atualizar o catálogo e auxiliar o otimizador na escolha de access paths.

TABLE ALL

Solicita estatísticas para todas as tabelas aplicáveis do table space.

INDEX ALL

Inclui estatísticas dos índices associados, conforme as regras do utilitário e do objeto.

Em produção, as opções devem seguir a estratégia da empresa. Coletar estatísticas indiscriminadamente pode causar alterações de access path após um novo BIND ou REBIND.


18. JCL de RUNSTATS separado

Nem sempre você precisa reorganizar para atualizar estatísticas.

Um job de RUNSTATS poderia ser:

//BCSRSTAT JOB (ACCT),'RUNSTATS ALUNOS',
//             CLASS=A,
//             MSGCLASS=X,
//             NOTIFY=&SYSUID
//RSTAT    EXEC DSNUPROC,
//             SYSTEM=DB9G,
//             UID='RSTALU01'
//DSNUPROC.SYSIN DD *
  RUNSTATS TABLESPACE DSN00122.ALUNOST1
           TABLE(ALL)
           INDEX(ALL)
           SHRLEVEL CHANGE
           REPORT YES
           UPDATE ALL
/*
//

RUNSTATS TABLESPACE

Define o objeto cujas estatísticas serão coletadas.

TABLE(ALL)

Inclui todas as tabelas aplicáveis.

INDEX(ALL)

Inclui os índices associados.

SHRLEVEL CHANGE

Busca permitir concorrência com aplicações, observadas as regras da versão e do objeto.

REPORT YES

Produz relatório com informações coletadas.

UPDATE ALL

Solicita atualização das estatísticas aplicáveis no catálogo.

O cuidado Jedi é não tratar RUNSTATS como uma rotina sem consequências. Estatísticas alteradas podem influenciar o otimizador. Após REBIND, um programa pode escolher outro índice, usar outro método de join ou abandonar um access path antigo.


19. Um fluxo completo de diagnóstico

Considere o incidente:

PROGRAMA  : CADP001
TABELA    : ESCOLA.ALUNOS
SQLCODE   : -904
SQLSTATE  : 57011

Passo 1 — Ler toda a SQLCA

Não olhe apenas para SQLCODE.

Verifique também:

SQLSTATE
SQLERRMC
SQLERRD
SQLWARN

SQLERRMC pode conter identificadores úteis sobre o recurso indisponível.

Passo 2 — Localizar o objeto físico

Uma consulta ao catálogo pode ajudar:

SELECT DBNAME,
       TSNAME
  FROM SYSIBM.SYSTABLES
 WHERE CREATOR = 'ESCOLA'
   AND NAME    = 'ALUNOS';

Resultado hipotético:

DBNAME    TSNAME
--------  ---------
DSN00122  ALUNOST1

Passo 3 — Consultar o database

-DIS DB(DSN00122) RESTRICT

Passo 4 — Consultar o espaço

-DIS DB(DSN00122) SPACENAM(ALUNOST1) RESTRICT

Passo 5 — Verificar utilitários

Dependendo da situação e das autorizações:

-DIS UTIL(*)

Isso ajuda a descobrir se COPY, LOAD, REORG, RECOVER ou outro utilitário está em execução.

Passo 6 — Verificar bloqueadores

-DIS BL

ou uma forma mais específica, conforme a sintaxe e o objeto investigado.

Passo 7 — Escolher a ação

Possibilidades:

COPY-pending    → avaliar e executar COPY
REORG-pending   → planejar REORG
RECOVER-pending → seguir procedimento de RECOVER
STOP            → descobrir a causa antes de START
LOCK/CLAIM      → analisar thread e aplicação

Passo 8 — Validar

Depois da ação:

-DIS DB(DSN00122) SPACENAM(ALUNOST1) RESTRICT

Se nenhuma restrição for mostrada, execute também uma validação funcional controlada.


20. Biblioteca de comandos para o painel

As linhas disponíveis no painel podem guardar uma pequena coleção:

Cmd 1 ===> -DIS DB(DSN00122)

Cmd 2 ===> -DIS DB(DSN00122) SPACENAM(ALUNOST1)

Cmd 3 ===> -DIS DB(DSN00122) SPACENAM(*) RESTRICT

Cmd 4 ===> -DIS BPOOL(ACTIVE)

Cmd 5 ===> -DIS BPOOL(BP0) DETAIL

Cmd 6 ===> -DIS THD(*)

Cmd 7 ===> -DIS LOG

O comando é executado posicionando o cursor em sua linha e pressionando ENTER.

Isso permite montar uma pequena “maleta de primeiros socorros” para o DBA Padawan.


21. Curiosidades e Easter eggs do templo Db2

O prefixo DSN

Muitos componentes, programas, procedures e mensagens do Db2 usam o prefixo DSN:

DSN
DSNUTILB
DSNUPROC
DSNTIAUL
DSNTEP2
DSNTEP4
DSN9022I

O prefixo funciona quase como a assinatura arqueológica do produto.

Ao encontrar algo iniciado por DSN, existe uma boa chance de você estar diante de um artefato relacionado ao Db2 for z/OS.

NORMAL COMPLETION não significa objeto saudável

Uma mensagem como:

DSN9022I ... NORMAL COMPLETION

significa que o comando foi processado normalmente.

Ela não significa que o objeto consultado esteja normal.

O comando pode terminar com sucesso e mostrar:

STATUS = COPY

É como um exame médico: a coleta foi bem-sucedida, mas o resultado pode apontar um problema.

O programa COBOL enxerga a consequência

O desenvolvedor recebe:

SQLCODE -904

O DBA enxerga:

COPY-pending

O operador enxerga:

job terminado com RC 12

O storage administrator pode enxergar:

problema de volume ou data set

Todos observam o mesmo incidente por janelas diferentes.

O profissional completo aprende a juntar essas janelas.


Conclusão: o SELECT é apenas a superfície

A tela DB2 COMMANDS parece simples: fundo preto, letras em ciano e algumas linhas de comando.

Mas por trás dela existe uma arquitetura capaz de sustentar bancos, seguradoras, governos, indústrias, companhias aéreas e sistemas que movimentam valores gigantescos.

Os três comandos da imagem percorrem três níveis fundamentais:

-DIS DB(DSN00122)

Observa o agrupamento administrativo.

-DIS DB(DSN00122) SPACENAM(ALUNOST1)

Observa o espaço que armazena os dados.

-DIS BPOOL(*)

Observa a memória que mantém páginas desses objetos.

Para o programador COBOL Padawan, compreender esses níveis transforma a maneira de diagnosticar problemas. Em vez de concluir que todo SQLCODE nasceu de um erro de programação, ele começa a pensar em camadas:

Código
  ↓
SQL
  ↓
Package
  ↓
Autorização
  ↓
Thread
  ↓
Lock ou claim
  ↓
Estado do objeto
  ↓
Buffer pool
  ↓
Data set
  ↓
Storage
  ↓
Log e recuperação

Essa é a passagem de aprendiz para profissional de verdade.

O Padawan pergunta:

“Por que meu SELECT falhou?”

O Jedi do mainframe pergunta:

“Qual componente da cadeia deixou de cumprir sua parte?”

E, muitas vezes, a resposta começa com uma linha curta, digitada em uma tela 3270:

-DIS DB(DSN00122) SPACENAM(ALUNOST1) RESTRICT

Apenas alguns caracteres.

Mas, no universo IBM Z, alguns caracteres podem revelar todo um império escondido atrás do programa COBOL.

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...