☕ 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

domingo, 10 de setembro de 2023

Viagem ao Fundo dos Dados — O Dia em que o Programador COBOL Entrou no Db2 e Descobriu um IMS Morando no Porão

Bellacosa Mainframe e a modelagem de dados para o db2

☕ Um Café no Bellacosa Mainframe

Viagem ao Fundo dos Dados — O Dia em que o Programador COBOL Entrou no Db2 e Descobriu um IMS Morando no Porão

Ou: por que trocar segmentos por tabelas não elimina a hierarquia, como diferenciar QSAM, VSAM, IMS e banco relacional, e o que Edgar Codd diria ao encontrar uma chave de 47 bytes carregando toda a árvore genealógica do cliente


Prólogo — A entrada para o mundo subterrâneo

O professor Otto Lidenbrock encontrou um manuscrito misterioso escondido dentro de um livro antigo. O documento indicava uma passagem para o centro da Terra através da cratera de um vulcão islandês. Um programador COBOL iniciante, por sua vez, encontrou algo igualmente inquietante: uma tabela Db2 com uma chave composta por empresa, filial, departamento, cliente, contrato, produto, parcela e sequência.

Não havia runas. Havia um copybook de 1989.

Na primeira página, alguém escrevera:

01  CHAVE-MESTRA.
    05 CD-EMPRESA       PIC 9(03).
    05 CD-FILIAL        PIC 9(04).
    05 NR-CLIENTE       PIC 9(09).
    05 NR-CONTRATO      PIC 9(12).
    05 NR-PARCELA       PIC 9(03).

O sistema utilizava uma versão moderna do Db2, possuía SQL, índices, tablespaces, packages e planos. Mesmo assim, para chegar a uma parcela, o programa precisava conhecer empresa, filial, cliente e contrato. Qualquer consulta começava pela raiz e descia pelos mesmos túneis. As tabelas pareciam segmentos. Os cursores pareciam GN. Algumas rotinas faziam tantos SELECT encadeados que quase se podia ouvir um distante GNP ecoando nas cavernas.

Foi então que surgiu a pergunta que leva muitos veteranos do mainframe a desconfiar do chão sob seus pés:

Se estou usando Db2, por que ainda sinto que os dados são IMS/DL/I?

A resposta curta é: porque tecnologia relacional e pensamento relacional não são a mesma coisa. É possível colocar dados num SGBD relacional e continuar projetando, navegando e mantendo tudo como se fosse uma velha hierarquia. A placa na entrada diz Db2, mas a planta dos túneis continua sendo IMS.

Vamos descer.



1. Hierarquia não é pecado; prisão de caminho é outra história

A realidade está cheia de hierarquias legítimas:

  • uma empresa contém departamentos;

  • um pedido contém itens;

  • uma conta recebe lançamentos;

  • um funcionário pode responder a um gerente;

  • um produto pode ser formado por componentes;

  • um país possui estados, que possuem municípios.

Portanto, encontrar relações pai-filho dentro de um Db2 não prova que a modelagem esteja errada. O modelo relacional representa hierarquias perfeitamente bem. A questão decisiva é saber se a hierarquia descreve o negócio ou aprisiona o acesso ao dado.

No banco hierárquico, o caminho é parte essencial da estrutura. Imagine:

CLIENTE
  └── CONTA
       └── LANÇAMENTO

Para alcançar determinado lançamento, a navegação tradicional começa no cliente, localiza a conta e finalmente desce ao lançamento. O programador não faz apenas uma pergunta sobre os dados; ele informa ou conhece o caminho para encontrá-los.

No modelo relacional, o lançamento pode ser encontrado diretamente por sua identidade:

SELECT *
  FROM LANCAMENTO
 WHERE ID_LANCAMENTO = 987654;

Também pode ser encontrado pela conta:

SELECT *
  FROM LANCAMENTO
 WHERE ID_CONTA = 12345;

Ou relacionado ao cliente:

SELECT L.*
  FROM CLIENTE C
  JOIN CONTA A
    ON A.ID_CLIENTE = C.ID_CLIENTE
  JOIN LANCAMENTO L
    ON L.ID_CONTA = A.ID_CONTA
 WHERE C.ID_CLIENTE = 100;

O dado não deixa de ter parentes. Ele apenas deixa de possuir um único roteiro obrigatório de visitação.

Essa é uma das diferenças mais importantes entre os dois mundos: no modelo hierárquico, pensamos em percorrer caminhos; no relacional, pensamos em combinar conjuntos de fatos.



2. IMS — a caverna desenhada antes da expedição

O IMS organiza dados em segmentos. Existe um segmento raiz e, abaixo dele, segmentos dependentes. Um desenho simplificado poderia ser:

CLIENTE
├── ENDEREÇO
├── TELEFONE
└── CONTA
    └── LANÇAMENTO

Cada ocorrência de CONTA vive sob determinado CLIENTE; cada LANÇAMENTO vive sob determinada CONTA. A aplicação percorre essa estrutura usando chamadas DL/I como:

  • GU — Get Unique;

  • GN — Get Next;

  • GNP — Get Next Within Parent;

  • ISRT — Insert;

  • REPL — Replace;

  • DLET — Delete.

É uma lógica navegacional. Ela se parece com a expedição de Júlio Verne: entre pela cratera correta, atravesse a galeria indicada, contorne o lago subterrâneo e procure a passagem depois da rocha marcada. Se você quiser chegar ao mesmo ponto por outro lado, talvez precise de outro índice, outro caminho lógico ou uma nova solução estrutural.

Isso não torna o IMS primitivo. Muito pelo contrário. O IMS continua sendo uma tecnologia poderosa, madura e extremamente eficiente em cargas com caminhos previsíveis. Possui índices secundários, logical relationships e diversos recursos que tornam o modelo muito mais sofisticado do que uma árvore escolar desenhada no quadro.

Suas qualidades aparecem quando:

  • o relacionamento pai-filho é estável;

  • os caminhos de acesso são conhecidos;

  • o volume transacional é elevado;

  • a previsibilidade é valiosa;

  • a estrutura combina naturalmente com o negócio.

As dificuldades aparecem quando consultas novas exigem atravessar a árvore de maneiras não previstas, quando muitos-para-muitos se multiplicam ou quando alterar a estrutura obriga muitos programas a reaprender o mapa subterrâneo.

3. Db2 — a pergunta lógica e o caminho escolhido pelo otimizador

No modelo relacional, uma tabela representa uma relação: um conjunto de fatos do mesmo tipo. Cada linha deveria afirmar algo claro sobre o mundo.

Uma tabela CLIENTE pode declarar:

Existe um cliente identificado por este código, com este nome e esta data de nascimento.

Uma tabela CONTA pode declarar:

Existe uma conta identificada por este código e relacionada a determinado cliente.

O relacionamento não deveria morar apenas na memória do analista ou numa condição dentro do COBOL. Ele pode ser declarado ao SGBD:

ALTER TABLE CONTA
  ADD CONSTRAINT FK_CONTA_CLIENTE
  FOREIGN KEY (ID_CLIENTE)
  REFERENCES CLIENTE (ID_CLIENTE);

Quando a regra existe somente no programa, temos uma convenção. Quando é declarada como constraint, temos uma regra protegida pelo banco para todos os programas autorizados a alterar aqueles dados.

No Db2, escrevemos o que desejamos obter. O otimizador decide como alcançar o resultado, considerando estatísticas, índices, cardinalidades, custos e alternativas de acesso. Pode escolher a ordem dos joins e diferentes estratégias físicas sem exigir que a regra de negócio seja reescrita.

É como pedir:

Quero todos os fósseis encontrados por expedições islandesas entre duas datas.

Em vez de ordenar:

Entre pelo túnel A, caminhe 300 metros, vire à esquerda, abra a terceira caixa e leia registro por registro.

Essa separação entre intenção lógica e acesso físico é uma das grandes conquistas do modelo relacional.

4. Quando o Db2 usa gravata, mas pensa em DL/I

Existem sintomas clássicos de que o sistema migrou de tecnologia sem migrar de pensamento.

4.1 Chaves que contêm todo o caminho dos ancestrais

Imagine estas chaves:

CLIENTE
  CD_EMPRESA + CD_FILIAL + NR_CLIENTE

CONTA
  CD_EMPRESA + CD_FILIAL + NR_CLIENTE + NR_CONTA

LANÇAMENTO
  CD_EMPRESA + CD_FILIAL + NR_CLIENTE + NR_CONTA + DT_MOVIMENTO + SEQUENCIA

Uma chave composta não é automaticamente ruim. Em muitos casos, a composição representa a verdadeira identidade do negócio. O problema começa quando o filho transporta toda a ancestralidade apenas porque antigamente o caminho físico precisava estar embutido na chave.

Uma possibilidade mais independente seria:

CLIENTE
  ID_CLIENTE PK

CONTA
  ID_CONTA PK
  ID_CLIENTE FK

LANCAMENTO
  ID_LANCAMENTO PK
  ID_CONTA FK

Agora, cada entidade tem identidade própria. O relacionamento continua existindo, mas não se confunde com a identidade completa do registro.

Não existe mandamento dizendo “usarás sempre chave artificial”. O bom projetista pergunta: a chave é estável? É curta? Tem significado duradouro? Pode mudar por correção cadastral ou legislação? Expõe informação sensível? Realmente identifica a entidade ou simplesmente reproduz a trilha de acesso?

4.2 O programa que faz uma excursão linha a linha

Outro sinal é o programa que seleciona clientes e, para cada cliente, abre uma consulta de contas; para cada conta, consulta lançamentos; para cada lançamento, busca informações complementares.

Em espírito:

SELECT CLIENTE
  SELECT CONTA
    SELECT LANCAMENTO
      SELECT TIPO_LANCAMENTO

É uma navegação hierárquica reconstruída com SQL. Também pode produzir o conhecido problema de muitas consultas repetitivas.

Uma abordagem relacional tenta formular o conjunto desejado:

SELECT C.ID_CLIENTE,
       A.ID_CONTA,
       SUM(L.VALOR) AS TOTAL
  FROM CLIENTE C
  JOIN CONTA A
    ON A.ID_CLIENTE = C.ID_CLIENTE
  JOIN LANCAMENTO L
    ON L.ID_CONTA = A.ID_CONTA
 GROUP BY C.ID_CLIENTE,
          A.ID_CONTA;

Não significa transformar qualquer processamento COBOL em um SQL gigantesco e impossível de manter. Significa reconhecer quando o SGBD pode trabalhar eficientemente com conjuntos, evitando que o programa imite um explorador abrindo cada caixote individualmente.

4.3 Relações protegidas apenas pelo COBOL

Alguns programas verificam se o pai existe antes de inserir o filho:

EXEC SQL
   SELECT COUNT(*)
     INTO :WS-COUNT
     FROM CLIENTE
    WHERE ID_CLIENTE = :WS-ID-CLIENTE
END-EXEC

Depois, se WS-COUNT for maior que zero, inserem a conta. Além de duplicar a regra em diferentes programas, essa estratégia pode sofrer com concorrência: a realidade pode mudar entre a verificação e a inserção.

Uma foreign key expressa diretamente a regra. O COBOL continua tratando o retorno SQL e produzindo a mensagem apropriada, mas o Db2 assume a proteção central da integridade.

4.4 A ordem “natural” da tabela

Uma tabela relacional não possui ordem lógica garantida. Este comando:

SELECT * FROM CLIENTE;

não promete retornar clientes por código, nome, horário de inclusão nem posição física. Se a ordem importa, ela deve ser declarada:

SELECT *
  FROM CLIENTE
 ORDER BY NOME, ID_CLIENTE;

Programa que depende da ordem observada sem ORDER BY está tratando a tabela como arquivo sequencial. Pode funcionar por anos e mudar depois de uma reorganização, alteração de índice ou novo access path. O monstro não nasceu naquele dia; naquele dia alguém apenas acendeu a lanterna.

5. QSAM — a longa estrada em linha reta

QSAM é associado ao acesso sequencial a registros bloqueados e aparece diariamente em processamento batch. É natural encontrá-lo em entradas, saídas, relatórios, interfaces, cargas, descargas e arquivos de erros.

No COBOL:

READ ARQ-CLIENTES
   AT END
      SET FIM-ARQUIVO TO TRUE
END-READ

O layout pode estar num copybook:

01  REG-CLIENTE.
    05 REG-ID       PIC 9(09).
    05 REG-NOME     PIC X(40).
    05 REG-STATUS   PIC X(01).

Para o mecanismo de acesso, existem registros e bytes. O significado “as posições 10 a 49 representam o nome” está no layout conhecido pela aplicação.

QSAM é como uma ferrovia subterrânea: excelente quando se deseja seguir do primeiro ao último vagão. Para processar quarenta milhões de registros numa passada, uma leitura sequencial pode ser exatamente a solução correta.

Entretanto, QSAM não oferece por si só joins, foreign keys ou integridade referencial entre diferentes datasets. Se um arquivo de contas contém o código do cliente, cabe aos programas garantir que esse cliente exista no arquivo correspondente.

Eis uma curiosidade importante para o iniciante: dataset é um termo amplo no z/OS. QSAM não é “um tipo de banco”; é um método de acesso normalmente empregado com datasets sequenciais. Confundir dataset, organização e método de acesso é como chamar toda criatura subterrânea de dinossauro. Algumas nem sequer viveram no mesmo período.

6. VSAM — as galerias com placas e atalhos

VSAM é uma família de organizações e serviços de acesso. O mais famoso no universo COBOL é o KSDS, que permite acesso por chave e também processamento sequencial.

READ ARQ-CLIENTE
   KEY IS WS-ID-CLIENTE
   INVALID KEY
      CONTINUE
END-READ

As organizações mais conhecidas incluem:

  • KSDS — registros acessíveis por chave e em sequência de chave;

  • ESDS — registros mantidos conforme a ordem de entrada, com acesso por endereço relativo;

  • RRDS — registros associados a números relativos;

  • LDS — espaço linear, utilizado em cenários específicos e por componentes que gerenciam sua própria estrutura.

Um KSDS possui entradas indexadas e pode encontrar rapidamente um registro. Ainda assim, o fato de dois clusters terem campos com o mesmo código não cria automaticamente um relacionamento protegido entre eles.

Se o arquivo CONTA contém ID-CLIENTE, um programa pode excluir o cliente e deixar contas órfãs, a menos que as aplicações e os processos impeçam isso. O VSAM não interpreta espontaneamente aquela igualdade como uma foreign key.

VSAM também não é “inferior” ao Db2. Há problemas para os quais sua simplicidade, previsibilidade e acesso direto são excelentes. A pergunta madura não é “qual tecnologia é mais moderna?”, mas “qual semântica, integridade, concorrência e padrão de acesso este problema exige?”.

7. O mapa comparativo da expedição

TecnologiaVisão predominanteRelacionamentosAcesso típicoQuem conhece grande parte da semântica?
QSAMsequência de registrosmantidos pela aplicaçãoleitura/gravação sequencialcopybook e programa
VSAM KSDSregistros indexados por chavemantidos principalmente pela aplicaçãochave ou sequênciadefinição do cluster, copybook e programa
IMSsegmentos numa hierarquiapai-filho estruturado pelo banconavegação DL/IDBD, PSB/PCB e aplicação
Db2conjuntos de fatos relacionadosPK, FK, constraints e valoresSQL declarativocatálogo, modelo e aplicação

O ponto não é dizer que apenas o Db2 conhece regras. Todos esses ambientes podem formar sistemas sólidos. A diferença está em onde a estrutura e a integridade são declaradas e quanto o programa precisa conhecer sobre o percurso físico ou lógico.

8. O que caracteriza uma boa modelagem relacional

Uma boa modelagem começa quando conseguimos terminar esta frase sem hesitar:

Cada linha desta tabela representa...

“Um cliente” é claro. “Uma conta” também. “A participação de um cliente numa conta durante certo período” pode justificar uma tabela associativa. Já “cliente, contrato, endereço atual, última cobrança e alguns campos reservados” revela vários conceitos presos no mesmo fóssil.

8.1 Identidade clara

Cada linha deve ser distinguível. Uma tabela pode usar uma chave técnica e, ao mesmo tempo, proteger a chave natural:

CREATE TABLE CLIENTE (
    ID_CLIENTE BIGINT       NOT NULL,
    NOME       VARCHAR(100) NOT NULL,
    CPF        CHAR(11),
    CONSTRAINT PK_CLIENTE
       PRIMARY KEY (ID_CLIENTE),
    CONSTRAINT UK_CLIENTE_CPF
       UNIQUE (CPF)
);

ID_CLIENTE fornece identidade técnica estável; CPF expressa uma possível regra de unicidade do negócio. O modelo real ainda precisa decidir como tratar estrangeiros, dados provisórios, correções e valores ausentes.

8.2 Relacionamentos declarados

Uma conta pode exigir um cliente existente:

CREATE TABLE CONTA (
    ID_CONTA     BIGINT NOT NULL,
    ID_CLIENTE   BIGINT NOT NULL,
    DATA_ABERTURA DATE  NOT NULL,
    SITUACAO     CHAR(1) NOT NULL,
    CONSTRAINT PK_CONTA
       PRIMARY KEY (ID_CONTA),
    CONSTRAINT FK_CONTA_CLIENTE
       FOREIGN KEY (ID_CLIENTE)
       REFERENCES CLIENTE (ID_CLIENTE),
    CONSTRAINT CK_CONTA_SITUACAO
       CHECK (SITUACAO IN ('A', 'B', 'E'))
);

O DDL passa a documentar e proteger identidade, obrigatoriedade, relacionamento e domínio.

8.3 Um fato em seu devido lugar

Se o limite de crédito pertence à conta, não deveria estar em CLIENTE apenas porque hoje cada cliente possui uma única conta. Se o preço depende do produto e da data de vigência, talvez não pertença simplesmente a PRODUTO.

A pergunta de ouro é:

Este atributo depende de quê?

Se depende da chave, da chave inteira e de nada além da chave, provavelmente está no lugar correto. Eis, em linguagem prática, a alma da normalização.

8.4 Muitos-para-muitos sem colunas numeradas

Um cliente pode participar de várias contas e uma conta pode ter vários titulares. Criar ID_CLIENTE_1, ID_CLIENTE_2 e ID_CLIENTE_3 estabelece um limite artificial e espalha lógica condicional.

O modelo apropriado pode usar:

CLIENTE
  ID_CLIENTE

CONTA
  ID_CONTA

CONTA_TITULAR
  ID_CONTA
  ID_CLIENTE
  TIPO_TITULARIDADE
  DATA_INICIO
  DATA_FIM

CONTA_TITULAR não é apenas uma ponte técnica. Ela representa um fato do negócio: determinada pessoa participa de determinada conta, com certo papel e durante certo intervalo.

8.5 Repetições viram linhas, não colunas numeradas

Uma tabela com TELEFONE_1, TELEFONE_2 e TELEFONE_3 carrega uma pergunta inevitável: o que acontecerá com o quarto telefone?

Uma tabela CLIENTE_TELEFONE permite zero, um ou muitos números, cada um com tipo, preferência, validade e outras regras necessárias.

8.6 NULL não é um saco de mistérios

NULL não deveria significar simultaneamente “não informado”, “não existe”, “não se aplica”, “será calculado”, “ocorreu erro” e “veio em branco no arquivo de 1997”. Esses estados podem exigir tratamentos diferentes.

O modelo precisa definir o significado da ausência. Caso contrário, cada programa inventará sua própria interpretação e o banco ganhará pequenas cavernas particulares.

8.7 O tempo precisa ser modelado

Pergunte sempre:

  • a data é de ocorrência, processamento ou vigência?

  • o dado atual substitui o anterior ou deve existir histórico?

  • períodos podem se sobrepor?

  • DATA_FIM IS NULL significa registro vigente?

  • alterações retroativas são permitidas?

  • precisamos saber quem alterou e quando?

Muitos modelos parecem ótimos até alguém perguntar: “Como essa conta estava no fechamento do mês passado?”. Nesse instante, descobre-se que atualizar uma linha apagou a história.

9. Normalização sem transformar o Db2 num labirinto

Normalizar significa reduzir redundâncias e anomalias, não dividir o universo em centenas de tabelas minúsculas por devoção religiosa.

Na primeira forma normal, evitamos guardar listas escondidas numa coluna:

TELEFONES = "11999999999;11888888888;11777777777"

Esse campo dificulta validação, pesquisa, indexação e alteração individual.

Na segunda forma normal, quando existe chave composta, cada atributo não-chave deve depender da chave inteira. Se ITEM_PEDIDO tem chave ID_PEDIDO + ID_PRODUTO, o nome do cliente não depende dessa combinação; a descrição geral do produto tampouco.

Na terceira forma normal, evitamos dependências indiretas. Se CLIENTE contém ID_CIDADE, NOME_CIDADE e UF, mas nome e UF dependem de ID_CIDADE, talvez esses atributos pertençam a CIDADE.

Entretanto, snapshots, trilhas históricas, integrações e estruturas analíticas podem duplicar dados intencionalmente. A distinção importante é esta:

  • redundância acidental cria várias verdades concorrentes;

  • redundância projetada identifica a fonte oficial, o momento da cópia e o mecanismo de reconciliação.

Desnormalizar por desempenho antes de medir é como abrir uma passagem com dinamite porque talvez exista um atalho atrás da parede. Pode existir. Também pode haver um oceano subterrâneo esperando para entrar.

10. Passo a passo para construir um bom modelo

Passo 1 — Escreva as regras em português

Antes do primeiro CREATE TABLE, registre frases como:

  • um cliente pode participar de várias contas;

  • uma conta pode ter vários titulares;

  • um lançamento pertence a exatamente uma conta;

  • uma conta pode existir sem lançamento;

  • a titularidade possui início, fim e tipo;

  • um lançamento cancelado não desaparece: ganha estado e referência de estorno.

Essas frases revelam entidades, cardinalidades, opcionalidade e tempo.

Passo 2 — Separe entidades, eventos e classificações

Entidades são coisas reconhecíveis, como cliente, conta e produto. Eventos registram algo ocorrido, como pagamento, transferência ou lançamento. Classificações descrevem categorias e estados.

Misturar tudo em TB_CADASTRO_GERAL pode parecer econômico no início, mas logo cria colunas sem sentido para metade das linhas e códigos mágicos decidindo qual formato cada registro possui.

Passo 3 — Defina as cardinalidades

Para cada relacionamento, pergunte:

  • a ocorrência relacionada é obrigatória?

  • pode existir uma ou várias?

  • o relacionamento muda com o tempo?

  • há exceções reais?

Não escolha 1:N porque o arquivo antigo parecia possuir um cabeçalho e vários detalhes. Escolha porque essa é a regra do negócio.

Passo 4 — Escolha chaves com consciência

Examine estabilidade, tamanho, privacidade e significado. Uma chave natural ótima hoje pode mudar amanhã. Uma chave artificial facilita identidade, mas não elimina a necessidade de proteger unicidades do negócio.

Passo 5 — Declare constraints

Use PRIMARY KEY, FOREIGN KEY, UNIQUE, NOT NULL e CHECK quando representam regras verdadeiras. Criar tudo como nullable para “facilitar a carga” apenas transfere a dificuldade para milhares de consultas futuras.

Passo 6 — Teste o ciclo de vida, não apenas o cadastro

Simule:

  • criação;

  • correção;

  • cancelamento;

  • reativação;

  • troca de titular;

  • evento retroativo;

  • auditoria;

  • anonimização;

  • consulta histórica;

  • exclusão permitida e exclusão proibida.

Um modelo que funciona somente no primeiro INSERT ainda não atravessou a primeira galeria.

Passo 7 — Valide com consultas reais

Escreva as perguntas principais que o negócio fará. Se para responder a algo básico for necessário interpretar cinco códigos obscuros e reconstruir manualmente uma sequência implícita, talvez o modelo não represente o negócio com clareza.

Passo 8 — Planeje o físico depois do lógico

Somente então avalie índices, particionamento, clustering, compressão, tablespaces, estatísticas, padrões batch, concorrência, recuperação e retenção.

Índice não corrige semântica. Ele encontra depressa aquilo que talvez tenha sido armazenado errado.

11. A fronteira que nunca parece clara nos projetos reais

Na prática, as fronteiras ficam nebulosas porque sistemas empresariais acumulam décadas de decisões:

  • tabelas nasceram de layouts VSAM;

  • segmentos IMS foram convertidos quase mecanicamente;

  • interfaces batch exigiram registros autocontidos;

  • projetos evitaram foreign keys por medo de desempenho ou dificuldade de carga;

  • regras ficaram duplicadas em COBOL, Java, stored procedures e ETLs;

  • aquisições juntaram conceitos diferentes sob nomes iguais;

  • cada equipe modelou apenas a parte que conhecia;

  • urgências transformaram exceções temporárias em arquitetura permanente.

Por isso, sua sensação não é nostalgia técnica nem impressão equivocada. Muitas instalações Db2 contêm estratos arqueológicos. Na superfície há SQL moderno; alguns metros abaixo aparecem tabelas tratadas como KSDS; mais fundo, chaves carregam caminhos de segmentos; no último nível, um programa ainda acredita que branco, zero e ausência são a mesma criatura.

Uma boa modernização começa reconhecendo esses estratos. Não é necessário demolir tudo. Pode-se:

  1. documentar o significado real das tabelas;

  2. identificar fontes oficiais e redundâncias;

  3. localizar relações sem constraints;

  4. medir órfãos e inconsistências antes de criar FKs;

  5. encapsular legados por views e serviços;

  6. corrigir novas extensões segundo um modelo melhor;

  7. migrar por domínios, com reconciliação e rollback;

  8. manter desempenho e operação envolvidos desde o desenho.

Colocar uma foreign key numa base histórica sem verificar dados existentes pode revelar milhões de órfãos. A constraint não criou o problema; ela apenas encontrou os esqueletos.

12. Checklist do explorador relacional

Ao examinar uma tabela, pergunte:

  1. Cada linha representa exatamente o quê?

  2. Qual regra torna uma linha única?

  3. A chave representa identidade ou caminho de navegação?

  4. Quais foreign keys deveriam existir?

  5. Há registros órfãos?

  6. Existem listas dentro de colunas?

  7. Há colunas numeradas como ENDERECO_1, ENDERECO_2 e ENDERECO_3?

  8. O mesmo fato aparece em várias tabelas?

  9. Qual delas é a fonte oficial?

  10. O programa depende da ordem sem ORDER BY?

  11. Existem sequências de SELECT que imitam pai-filho-neto?

  12. As regras vivem no banco ou espalhadas por programas?

  13. É possível reconstruir o passado?

  14. Branco, zero e NULL possuem significados definidos?

  15. Alterar um relacionamento exige alterar a identidade do registro?

Se muitas respostas causarem desconforto, provavelmente existe um IMS, um VSAM ou um QSAM conceitual vivendo por baixo das tabelas. Isso não condena o sistema, mas indica onde começar a investigação.

Epílogo — O centro da Terra não era o fim da viagem

Depois de atravessar galerias de QSAM, atalhos de VSAM, árvores de IMS e salões relacionais do Db2, nosso programador COBOL finalmente entendeu que nenhuma dessas tecnologias é vilã.

QSAM pode ser perfeito para uma grande varredura batch. VSAM pode oferecer o acesso direto e previsível de que determinada aplicação necessita. IMS pode processar hierarquias estáveis com eficiência extraordinária. Db2 pode representar conjuntos relacionados, proteger integridade e permitir múltiplos caminhos lógicos de consulta.

O erro não está em conservar tecnologia antiga quando ela resolve bem o problema. O erro está em usar uma tecnologia sem compreender seu modelo — ou esperar que a simples migração física transforme automaticamente a maneira de pensar.

Uma boa modelagem relacional apresenta:

  • conceitos com fronteiras compreensíveis;

  • linhas com identidade clara;

  • fatos colocados onde realmente pertencem;

  • relacionamentos declarados e protegidos;

  • cardinalidades fiéis ao negócio;

  • ausência e tempo com significado definido;

  • redundância consciente, quando necessária;

  • independência entre a pergunta lógica e o caminho físico;

  • capacidade de evoluir sem obrigar cada programa a memorizar a árvore inteira.

No final de Viagem ao Centro da Terra, os exploradores não retornam pelo mesmo caminho: são expelidos por outro vulcão, muito longe do ponto de entrada. É um belo easter egg relacional. Num mundo governado por caminhos hierárquicos, a saída deveria repetir a rota conhecida. Num mundo relacional, diferentes caminhos podem alcançar o mesmo conjunto de fatos.

E se Edgar F. Codd estivesse sentado numa poltrona do Bellacosa Mainframe, tomando café enquanto examinava aquela chave de 47 bytes, talvez dissesse com toda a elegância britânica:

Meu caro, isto não é uma relação. É uma árvore genealógica tentando passar pela catraca do Db2.

O programador olharia novamente para o copybook, respiraria fundo e abriria o catálogo.

A expedição verdadeira estaria apenas começando.

sábado, 9 de setembro de 2023

Kubernetes, COBOL e a Viagem ao Fundo do Cluster: quando o programador entrou no Seaview procurando um JCL e encontrou Pods nadando entre Nodes

 

Bellacosa Mainframe e o kubernetes no cobol uma viagem ao fundo do cluster

☕ Um Café no Bellacosa Mainframe

Kubernetes, COBOL e a Viagem ao Fundo do Cluster: quando o programador entrou no Seaview procurando um JCL e encontrou Pods nadando entre Nodes

🌊 Containers, Pods, Deployments, Services, Scheduler, Control Plane, YAML, autoscaling, storage, observabilidade e a estranha descoberta de que administrar Kubernetes às vezes parece comandar um submarino nuclear onde metade da tripulação fala YAML

Imagine a cena.

O jovem programador COBOL entra no CPD numa segunda-feira, café na mão, perfeitamente confortável com aquele universo conhecido:

JOB
JCL
JES2
COBOL
CICS
Db2
VSAM
SDSF

Tudo possui nome.

Tudo possui finalidade.

Tudo possui, em algum lugar, um manual de 2.700 páginas que ninguém leu inteiro, mas algum sysprog aposentado sabe exatamente em qual capítulo está a informação necessária.

Então alguém da arquitetura aparece.

— Precisamos colocar a nova aplicação em Kubernetes.

O COBOLzeiro olha para ele.

— Em quê?

— Kubernetes.

— Isso é banco de dados?

— Não.

— Linguagem?

— Não.

— Sistema operacional?

— Não exatamente.

— Middleware?

— Também não.

— Scheduler?

— Mais ou menos.

— Docker?

— Não.

Silêncio.

O jovem COBOLzeiro bebe café.

— Então vocês inventaram uma coisa que não dá para explicar em uma palavra.

Bem-vindo ao século XXI.

E é nesse momento que nossa viagem começa.

Não a bordo da Enterprise.

Nem da TARDIS.

Hoje descemos centenas de metros abaixo da superfície, entrando num submarino tecnológico imaginário chamado:

USS KUBERNETES

Um enorme navio submersível cheio de containers, workloads, redes, volumes, APIs e operadores correndo pelos corredores gritando:

— CAPITÃO! PERDEMOS UM POD!

E o capitão responde:

— Quantas réplicas estavam declaradas?

— TRÊS!

— Quantas temos?

— DUAS!

— Então pare de gritar. O controller já está criando outra.

E o COBOLzeiro, olhando pela escotilha:

— Que tipo de feitiçaria é essa?

Pegue o café.

Vamos ao fundo do cluster.


🌊 Capítulo 1 — Kubernetes não é Docker

Antes de descermos aos níveis mais profundos precisamos matar um dos monstros marinhos mais resistentes da informática moderna:

“Kubernetes substituiu Docker.”

Não.

O problema começa porque vários conceitos acabaram historicamente misturados.

Docker popularizou containers.

Kubernetes popularizou a orquestração de containers.

E durante algum tempo existiu uma disputa mais direta entre:

Docker Swarm
        versus
Kubernetes

Isso fazia sentido porque ambos tratavam de orquestração.

Mas Docker e Kubernetes não ocupam exatamente a mesma camada.

Pense desta forma:

Aplicação
   |
   v
Imagem
   |
   v
Container
   |
   v
Runtime
   |
   v
Pod
   |
   v
Kubernetes
   |
   v
Cluster

Docker ajudou a tornar simples construir, distribuir e executar containers.

Kubernetes pergunta outra coisa:

“Muito bem. Agora você possui 4.000 desses bichos. Quem administra?”

Essa pergunta muda tudo.


⚓ Capítulo 2 — O que diabos é um container?

O COBOLzeiro geralmente conhece um mundo bastante previsível.

Você compila:

PROGRAMA.CBL
       |
       v
 compilador
       |
       v
 load module

Depois executa num ambiente definido.

No mundo moderno surgiu um problema recorrente.

O programador dizia:

— Funciona na minha máquina.

Produção respondia:

— Pois aqui não funciona.

Então começava a investigação arqueológica:

versão diferente da biblioteca
variável de ambiente ausente
pacote não instalado
configuração divergente
runtime diferente
permissão diferente

O container tenta encapsular boa parte desse ambiente.

Imagine uma caixa contendo:

Aplicação
Bibliotecas
Dependências
Runtime
Configuração básica

Essa caixa pode ser reproduzida em diferentes ambientes.

Mas cuidado.

Container não é simplesmente uma VM pequena.

Uma máquina virtual tradicional possui algo parecido com:

HARDWARE
   |
HYPERVISOR
   |
   +---- VM A
   |      |
   |   Guest OS
   |
   +---- VM B
          |
       Guest OS

Já containers normalmente compartilham o kernel do host:

HARDWARE
   |
HOST OS
   |
KERNEL
   |
   +---- Container A
   +---- Container B
   +---- Container C

O isolamento utiliza mecanismos do sistema operacional, especialmente recursos como:

namespaces
cgroups
filesystem isolation
network isolation

Portanto containers costumam ser muito mais leves que VMs completas.

Não existe um sistema operacional inteiro sendo inicializado dentro de cada container da mesma forma que numa VM tradicional.


🐋 Curiosidade do sonar — Docker não inventou isolamento

A ideia de isolamento de processos é muito anterior ao Docker.

Unix já possuía conceitos relacionados.

Depois vieram tecnologias como:

chroot
FreeBSD Jails
Solaris Zones
Linux namespaces
cgroups
LXC

Docker acertou magistralmente numa coisa:

experiência de uso.

Ele tornou relativamente simples construir uma imagem e executar:

docker run

Em tecnologia, muitas revoluções acontecem não quando algo é inventado, mas quando alguém torna aquilo utilizável por gente normal.


🌊 Capítulo 3 — Três containers não precisam de um almirante

Imagine que temos:

Container A
Container B
Container C

Você pode executá-los manualmente.

Talvez Docker Compose resolva perfeitamente.

Agora aumente:

30 containers
300 containers
3.000 containers

Distribuídos entre:

Node 01
Node 02
Node 03
...
Node 200

Então começam as perguntas.

Onde colocar cada aplicação?

Quem reinicia algo que morreu?

Quem percebe que uma máquina caiu?

Quem encontra capacidade disponível?

Quem faz atualização sem interromper o serviço?

Quem distribui tráfego?

Quem escala?

Quem controla configuração?

Quem mantém o estado desejado?

Essa é a missão do Kubernetes.


🧭 Capítulo 4 — O conceito mais importante: estado desejado

Aqui está o segredo que transforma Kubernetes de “montanha de YAML” em algo compreensível.

O modelo é declarativo.

Você diz:

QUERO 3 RÉPLICAS

Não precisa escrever um script detalhando:

crie processo 1
crie processo 2
crie processo 3
verifique processo 1
se morrer reinicie
verifique processo 2
...

Você declara:

replicas: 3

Agora imagine o sonar:

ESTADO DESEJADO

Pod A
Pod B
Pod C

Mas o Kubernetes observa:

ESTADO REAL

Pod A
Pod B

Alguma coisa está errada.

Desejado:

3

Atual:

2

Diferença:

1

O Kubernetes tenta corrigir.

cria novo Pod

Depois observa novamente.

Essa ideia recebe um nome fundamental:

reconciliation loop.


🔁 O coração mecânico do submarino

Imagine um oficial andando eternamente pelos corredores do USS Kubernetes perguntando:

O que deveria existir?
        |
        v
O que existe agora?
        |
        v
São iguais?
   /        \
 NÃO        SIM
  |          |
corrigir   continuar
  |
observar novamente

Esse processo ocorre continuamente.

É uma diferença filosófica enorme.

Você não está apenas executando uma sequência de comandos.

Você está declarando uma condição que deseja manter verdadeira.


☕ O COBOLzeiro começa a desconfiar

Nesse momento o veterano de mainframe encosta na cadeira.

— Espera.

— Sim?

— Então existe um sistema que observa workloads, recursos, prioridades, falhas e tenta manter um estado operacional desejado?

Sim.

— Isso está começando a parecer menos alienígena.

Exatamente.

Mainframe e Kubernetes são arquiteturas profundamente diferentes.

Mas os problemas fundamentais de computação continuam aparecendo com roupas novas.


🏗️ Capítulo 5 — O cluster Kubernetes

Um ambiente Kubernetes é organizado num cluster.

Simplificando:

                CLUSTER

           CONTROL PLANE
                |
      +---------+---------+
      |         |         |
    NODE 1    NODE 2    NODE 3
      |         |         |
    Pods      Pods      Pods

Temos duas grandes categorias:

Control Plane
Worker Nodes

O Control Plane coordena.

Os Nodes executam os workloads.

Pense no submarino.

Existe a ponte de comando:

CONTROL PLANE

e existem as áreas onde o trabalho realmente acontece:

NODES

🎛️ Capítulo 6 — kube-apiserver: a sala de rádio

Quando você escreve:

kubectl apply -f deployment.yaml

você não está entrando diretamente num servidor e mandando iniciar alguma coisa.

Você está interagindo com a API do Kubernetes.

O kube-apiserver é uma peça central dessa arquitetura.

É através dele que grande parte das interações ocorre.

Conceitualmente:

kubectl
   |
   v
API SERVER
   |
   +--> autenticação
   +--> autorização
   +--> validação
   +--> objetos Kubernetes

Para quem vem de mainframe, pense nisso como uma grande interface controlada entre operadores, automações e o sistema.


🧠 Capítulo 7 — etcd: a memória do navio

O Kubernetes precisa guardar informações fundamentais sobre seu estado.

Para isso existe o etcd.

É um armazenamento distribuído chave-valor.

Ele contém dados críticos relacionados aos objetos e estado do cluster.

Imagine o diário de bordo:

Deployment A deseja 3 réplicas
Service B existe
ConfigMap C contém configuração
Namespace D está configurado

Se estivéssemos numa série submarina antiga, alguém inevitavelmente entraria correndo:

— CAPITÃO! O COMPUTADOR CENTRAL PERDEU A MEMÓRIA!

E todos fariam cara dramática.

No mundo Kubernetes, proteger o estado do etcd é assunto sério.

Backup e recuperação são fundamentais principalmente quando você administra o Control Plane por conta própria.


⚙️ Capítulo 8 — Scheduler: JES2 encontrou Poseidon

Um Pod precisa executar em algum Node.

Mas onde?

Suponha:

Node A
Node B
Node C
Node D

O Pod precisa de:

CPU: 500m
RAM: 512Mi

Talvez:

Node A -> sem recurso
Node B -> possível
Node C -> restrição de afinidade
Node D -> possível

O scheduler analisa as possibilidades e seleciona um Node adequado.

O COBOLzeiro arregala os olhos.

— Temos um componente escolhendo onde colocar workload considerando recursos?

Sim.

— Eu conheço essa música.

Calma.

Não diga:

Kubernetes Scheduler = JES2

Isso estaria tecnicamente errado.

Mas como mapa mental, existe uma familiaridade interessante.

Schedulers são uma obsessão antiga da computação.

Quando temos muitos trabalhos e recursos limitados, alguém precisa decidir:

quem
onde
quando
com quanto

Muda a arquitetura.

A pergunta permanece.


🫧 Capítulo 9 — Pod não é container

Agora encontramos uma criatura que confunde praticamente todo iniciante:

POD

Kubernetes não trabalha primariamente com containers isolados.

Sua menor unidade de execução e scheduling é normalmente o Pod.

Um Pod pode conter:

Pod
 |
 +---- Container A

ou:

Pod
 |
 +---- Container principal
 |
 +---- Container auxiliar

Os containers dentro de um Pod estão fortemente relacionados e compartilham certas características, particularmente contexto de rede.

Uma analogia razoável seria:

Pod = cápsula operacional
Container = ocupante da cápsula

Não confunda isso com host.

O Pod não é simplesmente uma VM.

Ele é uma abstração do Kubernetes.


🐙 Easter egg — o nome Kubernetes

“Kubernetes” vem do grego e está relacionado à ideia de:

timoneiro, piloto, navegador.

Da mesma raiz linguística surgiram palavras relacionadas a governo e cibernética.

Ou seja, aquele logo com um leme não foi escolhido por acaso.

O símbolo do Kubernetes é literalmente um timão naval.

Para nosso submarino, portanto, não poderíamos ter escolhido tema melhor.


🚢 Capítulo 10 — Não crie Pods na unha

Você pode definir diretamente um Pod.

Mas normalmente não é isso que deseja em produção.

Imagine:

Pod A

Ele morre.

Fim.

Por isso usamos objetos controladores como:

Deployment

Você diz:

Quero 3 réplicas.

O Deployment trabalha junto com ReplicaSets para manter essa condição.

Deployment
     |
     v
ReplicaSet
     |
     +--> Pod
     +--> Pod
     +--> Pod

Se um desaparece:

3 desejados
2 existentes

O sistema tenta criar outro.


🩹 Capítulo 11 — Self-healing não é milagre

Essa capacidade é frequentemente chamada de:

self-healing.

Mas existe um perigo de marketing.

Kubernetes não conserta automaticamente seu software.

Suponha que seu container faça:

START
 |
 v
BUG
 |
 v
CRASH

O Kubernetes reinicia.

Resultado:

START
 |
 v
BUG
 |
 v
CRASH
 |
 v
RESTART
 |
 v
BUG
 |
 v
CRASH

Em algum momento você pode encontrar:

CrashLoopBackOff

Kubernetes consegue dizer:

“Esse processo deveria estar funcionando.”

Ele não consegue dizer:

“Seu programador esqueceu de inicializar WS-CONTADOR.”

O S0C7 continua sendo problema seu.

😆


🚨 Capítulo 12 — Perdemos um Node!

Agora começa o episódio dramático.

Node A desapareceu.

NODE A
  X

Pod 1
Pod 2

Silêncio na ponte.

O sonar dispara.

O Control Plane percebe que workloads deixaram de estar disponíveis.

Dependendo das condições e políticas, substitutos podem ser criados em Nodes saudáveis.

NODE B          NODE C
  |               |
Pod 3          novo Pod 1
Pod 4          novo Pod 2

Esse é um dos motivos fundamentais pelos quais Kubernetes existe.

Em vez de depender de um humano perceber às três da manhã:

“Servidor XPTO caiu.”

o sistema possui mecanismos automáticos para reagir.


📡 Capítulo 13 — Mas se Pod muda de IP, como encontro a aplicação?

Excelente pergunta.

Pods são relativamente efêmeros.

Hoje:

10.10.4.31

Amanhã:

10.10.7.88

Você não quer configurar clientes apontando diretamente para cada Pod.

É aí que entra o:

Service

Conceitualmente:

CLIENTE
   |
   v
SERVICE
   |
   +---- Pod A
   +---- Pod B
   +---- Pod C

O Service fornece uma forma estável de alcançar um conjunto de Pods.

Isso desacopla:

quem chama

de:

qual instância específica está viva neste momento

🌐 Capítulo 14 — Load balancing

O Kubernetes oferece mecanismos para distribuir tráfego entre workloads.

Mas não caia numa simplificação perigosa.

Existem várias camadas possíveis:

Internet
   |
Load Balancer externo
   |
Ingress / Gateway
   |
Service
   |
Pods

Cada ambiente pode montar essa arquitetura de forma diferente.

Cloud providers também adicionam componentes próprios.

Portanto dizer:

“Kubernetes possui load balancing”

é correto.

Mas é apenas o começo da história.


📈 Capítulo 15 — O submarino precisa acelerar

Imagine uma aplicação com:

3 Pods

De repente chega uma carga enorme.

CPU sobe.

Requests crescem.

Com mecanismos como Horizontal Pod Autoscaler, podemos aumentar o número de réplicas.

3
|
5
|
8
|
12 Pods

Quando a carga desaparece:

12
 |
 8
 |
 5
 |
 3

Esse é o conceito de autoscaling horizontal.

Mas existe uma pegadinha.

Criar mais Pods exige capacidade física ou virtual.

Se todos os Nodes estiverem cheios:

Kubernetes:
"Preciso criar mais 10 Pods."

Cluster:
"Excelente ideia."

Kubernetes:
"Onde estão os recursos?"

Cluster:
"..."

Pods podem ficar:

Pending

Por isso escalabilidade de workloads e escalabilidade da infraestrutura são problemas relacionados, mas não idênticos.


📦 Capítulo 16 — CPU e memória não aparecem por magia

Você pode declarar requests e limits.

Por exemplo:

resources:
  requests:
    memory: "256Mi"
    cpu: "250m"
  limits:
    memory: "512Mi"
    cpu: "500m"

requests ajudam o scheduler a entender o que o workload precisa.

limits estabelecem limites operacionais.

Aqui o programador COBOL familiarizado com WLM começa novamente a reconhecer um tema antigo:

recursos não são infinitos.

Todo sistema operacional sério acaba lidando com:

prioridade
capacidade
contenção
limites
planejamento

❤️ Capítulo 17 — Liveness, Readiness e Startup

Esses três conceitos merecem atenção.

Liveness Probe

Pergunta aproximadamente:

“Essa aplicação continua saudável?”

Se falhar repetidamente, pode levar ao reinício do container.

Readiness Probe

Pergunta:

“Está pronta para receber tráfego?”

Talvez a aplicação esteja viva.

Mas:

banco ainda conectando
cache carregando
dependência inicializando

Então:

VIVO? SIM
PRONTO? NÃO

É perfeitamente possível.

Startup Probe

É útil para aplicações que demoram para inicializar.

Durante o startup, você não quer que uma liveness agressiva mate a aplicação antes de ela terminar de subir.


🩺 Diagnóstico submarino

Imagine:

Paciente respirando?

Liveness.

Paciente consegue trabalhar?

Readiness.

Paciente acabou de acordar da anestesia?

Startup.

É simplificado, mas ajuda muito.


🔐 Capítulo 18 — ConfigMap e Secret

Imagine uma configuração:

API_URL
LOG_LEVEL
TIMEOUT

Você não precisa colocar tudo dentro da imagem.

Kubernetes oferece:

ConfigMap

para configurações.

Para dados sensíveis existe:

Secret

Mas atenção.

A palavra “Secret” não significa automaticamente:

Ninguém jamais conseguirá ler isso.

Segurança real exige arquitetura.

Inclui coisas como:

RBAC
criptografia
controle de acesso
secret managers
gestão de chaves
auditoria
políticas

Nunca confunda nome de objeto com garantia criptográfica.


🗄️ Capítulo 19 — E os dados?

Pods podem desaparecer.

Mas seu banco de dados talvez não possa.

Imagine:

Pod
 |
 X

Tudo que estava exclusivamente no filesystem efêmero daquele Pod pode sumir junto com ele.

Para persistência entram conceitos como:

PersistentVolume
PersistentVolumeClaim
StorageClass
CSI

Uma visão extremamente simplificada:

POD
 |
PVC
 |
PV
 |
STORAGE

A aplicação pode morrer.

Outra pode nascer.

Os dados continuam.

Pelo menos essa é a intenção.

Storage em Kubernetes é um dos pontos onde o mergulho deixa de ser piscina infantil e vira Fossa das Marianas.


📊 Capítulo 20 — Kubernetes não é Prometheus

Outro mito:

“Kubernetes já monitora tudo.”

Não exatamente.

Kubernetes possui informações operacionais fundamentais.

Mas observabilidade completa geralmente envolve ecossistemas adicionais.

Podemos querer:

Métricas
Logs
Traces
Alertas
Dashboards

É comum encontrar tecnologias como:

Prometheus
Grafana
OpenTelemetry

e soluções comerciais.

Lembre:

Kubernetes administra workloads.

Isso não significa:

Kubernetes substitui sua estratégia inteira de observabilidade.

🧾 Capítulo 21 — YAML: o JCL que bebeu chá de cogumelo?

O primeiro contato do COBOLzeiro com Kubernetes geralmente é:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: cafe
spec:
  replicas: 3

Ele olha aquilo.

Olha novamente.

— Então é isso?

Não.

YAML é apenas uma forma comum de representar objetos que serão enviados à API Kubernetes.

O fluxo real é mais interessante:

YAML
 |
 v
API SERVER
 |
 v
OBJETO
 |
 v
ESTADO DESEJADO
 |
 v
CONTROLLERS
 |
 v
ESTADO REAL

Portanto Kubernetes não é YAML.

Assim como:

z/OS não é JCL

apesar de alguém poder conhecer z/OS inicialmente através de JCL.


🧠 Capítulo 22 — JCL e Kubernetes: parentes distantes

Existe uma analogia interessante.

Em JCL declaramos:

programa
datasets
parâmetros
condições
recursos

E entregamos o job.

No Kubernetes declaramos:

imagem
réplicas
volumes
rede
recursos
configuração

E entregamos o objeto ao cluster.

Mas existe uma diferença essencial.

O JCL tradicional está fortemente ligado a uma execução.

Kubernetes frequentemente declara:

“Quero que isso continue verdadeiro.”

Exemplo:

replicas = 5

Isso não significa:

“Crie cinco processos uma vez.”

Significa aproximadamente:

“Mantenha cinco instâncias enquanto essa configuração permanecer.”

Essa persistência do estado desejado é fundamental.


🧙 Capítulo 23 — WLM aparece no periscópio

Agora o COBOLzeiro veterano começa a sorrir.

O WLM no z/OS lida com questões como:

objetivos
prioridades
recursos
classes de serviço
competição entre workloads

Kubernetes possui mecanismos diferentes, mas também precisa responder:

Onde executar?
Quanto recurso reservar?
Quem pode consumir?
Qual workload tem prioridade?
O que acontece quando falta capacidade?

Repita comigo:

Kubernetes NÃO é WLM.

Mas ambos pertencem a uma longa tradição de sistemas tentando administrar cargas computacionais automaticamente.

O problema é antigo.

As soluções mudam.


🧩 Capítulo 24 — Kubernetes e COBOL podem conviver

Agora chegamos a um ponto importantíssimo.

Quando alguém diz:

“Estamos modernizando com Kubernetes.”

alguns COBOLzeiros imaginam imediatamente:

COBOL
 |
 v
LIXO

Não.

Uma arquitetura perfeitamente possível seria:

                Internet
                   |
                   v
            Kubernetes
             /    |    \
          API   API    API
            \    |    /
             API Gateway
                   |
                   v
             z/OS Connect
                   |
          +--------+--------+
          |                 |
        CICS               IMS
          |                 |
        COBOL             COBOL
          |
         Db2

Kubernetes pode hospedar:

APIs
microservices
frontends
integrações
processamento auxiliar
componentes de IA

enquanto o core transacional continua no mainframe.

Modernização não é sinônimo de:

jogar COBOL fora.

Muitas vezes significa:

envolver o legado com novas interfaces.

🏛️ Capítulo 25 — O mainframe não precisa morar dentro do Kubernetes

Isso parece óbvio.

Mas precisa ser dito.

Existe uma tendência na indústria de imaginar que qualquer tecnologia nova precisa substituir a anterior.

Não funciona assim.

Você pode ter:

IBM Z
 +
Kubernetes
 +
cloud
 +
SaaS
 +
APIs

Tudo coexistindo.

Empresas grandes são fósseis vivos tecnológicos.

Possuem camadas acumuladas durante décadas.

E isso não é necessariamente ruim.

O problema não é idade.

O problema é incapacidade de evolução.


💸 Capítulo 26 — Kubernetes custa dinheiro

Agora chega o financeiro à ponte do submarino.

— Quanto custa?

O arquiteto responde:

— O cluster custa X.

Errado.

O cluster custa:

compute
storage
network
load balancers

Mas o Kubernetes organizacional custa também:

treinamento
SRE
DevOps
observabilidade
CI/CD
segurança
networking
upgrades
backup
disaster recovery
GitOps
governança
troubleshooting

Uma pequena empresa pode descobrir que transformou:

5 aplicações

num ambiente que exige:

especialista Kubernetes
especialista cloud
especialista networking
especialista segurança
especialista observabilidade

Parabéns.

Você resolveu um problema que talvez não tivesse.


🛶 Capítulo 27 — Quando NÃO usar Kubernetes

Suponha:

Aplicações: 3
Equipe: 4 pessoas
Deploy: mensal
Tráfego: previsível
Disponibilidade: normal

Você realmente precisa de Kubernetes?

Talvez não.

Às vezes:

VM
Docker Compose
serviço gerenciado
PaaS
container service

resolvem.

Tecnologia boa é a tecnologia proporcional ao problema.

Usar Kubernetes para tudo é como comprar o USS Seaview para atravessar uma piscina.

Funciona.

Mas talvez uma boia bastasse.


🚢 Capítulo 28 — Quando Kubernetes começa a fazer sentido

Kubernetes tende a ficar atraente quando começam a aparecer vários fatores simultaneamente:

  • grande quantidade de serviços;

  • necessidade de automação operacional;

  • múltiplas equipes;

  • alta disponibilidade;

  • atualizações frequentes;

  • escalabilidade dinâmica;

  • infraestrutura heterogênea;

  • necessidade de padronização;

  • automação via API;

  • ambientes híbridos;

  • práticas DevOps e GitOps maduras.

A palavra fundamental é:

complexidade.

Kubernetes não elimina complexidade.

Ele tenta organizar complexidade inevitável.

Essa diferença é enorme.


⚓ Capítulo 29 — Kubernetes gerenciado

Se administrar tudo manualmente parece assustador, existem serviços gerenciados.

Exemplos conhecidos incluem:

Amazon EKS
Azure AKS
Google GKE

O provedor assume parte da operação.

Isso pode reduzir bastante o peso do Control Plane.

Mas não elimina responsabilidades.

Você ainda precisa entender:

workloads
rede
segurança
IAM
RBAC
storage
observabilidade
custos
deployments
capacity planning

Managed Kubernetes não significa:

“Agora ninguém precisa saber Kubernetes.”

Significa:

“Algumas partes dolorosas possuem outro responsável.”


🐳 Capítulo 30 — containerd e o fantasma do Docker

Existe ainda uma curiosidade que confunde iniciantes.

Antigamente era comum associar diretamente Kubernetes ao Docker runtime.

Depois Kubernetes removeu o componente conhecido como dockershim.

Hoje runtimes compatíveis com CRI, especialmente:

containerd
CRI-O

são comuns.

Mas isso não significa que imagens criadas com Docker deixaram de funcionar.

A distinção importante é:

Docker como ferramenta/ecossistema de construção

≠

Docker Engine obrigatório dentro do Kubernetes

Esse detalhe costuma render algumas discussões de bar extremamente desnecessárias.


👻 Easter egg — Pods são descartáveis, dados não

Uma filosofia cloud-native bastante importante diz:

Não se apaixone pela instância.

Se um Pod morre:

crie outro.

Isso é culturalmente diferente de ambientes tradicionais nos quais um servidor pode receber nome, personalidade e quase CPF.

Quem trabalhou em CPD antigo conhece:

SRVPROD01

quinze anos depois:

NÃO DESLIGAR.
NINGUÉM SABE O QUE TEM AQUI.

Kubernetes tenta incentivar outro modelo:

instâncias são substituíveis
estado importante fica fora delas

É uma mudança arquitetural gigantesca.


🔄 Capítulo 31 — Rolling Updates

Imagine que temos:

Versão 1

rodando em cinco Pods.

Queremos:

Versão 2

Não precisamos necessariamente destruir tudo simultaneamente.

Kubernetes pode substituir gradualmente:

V1 V1 V1 V1 V1

V2 V1 V1 V1 V1

V2 V2 V1 V1 V1

V2 V2 V2 V1 V1

V2 V2 V2 V2 V1

V2 V2 V2 V2 V2

Esse conceito é associado a rolling updates.

Se algo der errado, estratégias de rollback podem ajudar.

Para quem viveu décadas com janelas de mudança gigantescas:

SÁBADO
23:00
TODO MUNDO NA SALA
PIZZA
BACKOUT PLAN IMPRESSO

isso parece quase ficção científica.

Embora, sejamos sinceros:

em algumas empresas o Kubernetes apenas adicionou YAML à mesma pizza de sábado.


🔍 Capítulo 32 — kubectl: o periscópio

Uma das ferramentas mais usadas para interagir com Kubernetes é:

kubectl

Alguns comandos básicos:

kubectl get pods

Lista Pods.

kubectl get nodes

Lista Nodes.

kubectl describe pod nome

Mostra informações detalhadas.

kubectl logs nome-do-pod

Mostra logs.

kubectl get deployments

Lista Deployments.

Para o COBOLzeiro:

kubectl

eventualmente começa a assumir um papel psicológico semelhante ao:

SDSF

Não tecnicamente.

Mas emocionalmente.

Quando algo quebra:

COBOLzeiro:
SDSF.

Kuberneteszeiro:
kubectl.

😁


🧪 Capítulo 33 — Primeiro laboratório mental

Vamos montar uma aplicação imaginária.

Nome:

cafe-api

Queremos três réplicas.

apiVersion: apps/v1
kind: Deployment
metadata:
  name: cafe-api
spec:
  replicas: 3

A intenção é:

Deployment
     |
     +--> Pod 1
     +--> Pod 2
     +--> Pod 3

Agora um Pod quebra.

Estado real:

Pod 1
Pod 2

Kubernetes observa.

Desejado = 3
Atual = 2

Control loop:

Criar outro.

Nasce:

Pod 4

Não precisamos recuperar exatamente o velho Pod 3.

Precisamos restaurar:

quantidade desejada = 3

Essa distinção é maravilhosa.

O sistema não possui sentimentalismo.


🧠 Capítulo 34 — Pets versus cattle

Existe uma velha metáfora de infraestrutura:

Pets
versus
Cattle

Pets recebem nomes.

Você cuida individualmente.

Cattle são tratados como grupo.

No modelo tradicional:

Servidor Hercules

cai.

Todos correm para recuperar Hercules.

No modelo cloud-native:

instância 27

cai.

O sistema cria:

instância 42

O objetivo não é preservar o indivíduo.

É preservar o serviço.

Essa ideia aparece fortemente no Kubernetes.


🧯 Capítulo 35 — Kubernetes não elimina incidentes

Outra ilusão perigosa:

“Com Kubernetes teremos alta disponibilidade e não teremos mais problemas.”

Teremos.

Só mudaremos o catálogo.

Antes:

servidor caiu

Agora:

Pod Pending
CrashLoopBackOff
ImagePullBackOff
OOMKilled
PVC Pending
DNS quebrado
Ingress errado
RBAC negando acesso
certificate expired
node pressure
CNI quebrado

Toda tecnologia que resolve dez problemas geralmente introduz sete completamente novos.

O segredo da engenharia não é eliminar problemas.

É trocar problemas ruins por problemas mais administráveis.


🌊 Capítulo 36 — A grande lição da viagem

Chegamos ao fundo do oceano.

O COBOLzeiro olha pela escotilha.

Ao longe vemos:

Pods
Services
Deployments
Nodes
Volumes
Controllers

nadando tranquilamente pelo cluster.

Depois de toda essa viagem, podemos finalmente definir Kubernetes com alguma precisão.

Não diga apenas:

“Kubernetes é uma ferramenta para containers.”

Melhor:

Kubernetes é uma plataforma de orquestração baseada em APIs e control loops que permite declarar como workloads containerizados deveriam estar funcionando e trabalha continuamente para aproximar o estado real do cluster desse estado desejado.

Essa definição explica quase tudo.


☕ O mapa do COBOLzeiro

Se você está começando, memorize esta sequência:

1. APPLICATION
       |
       v
2. IMAGE
       |
       v
3. CONTAINER
       |
       v
4. POD
       |
       v
5. DEPLOYMENT
       |
       v
6. SERVICE
       |
       v
7. NODE
       |
       v
8. CLUSTER

Depois adicione:

ConfigMap
Secret
Volume
Ingress
HPA
RBAC
Observabilidade

Não tente aprender tudo simultaneamente.


🧭 Roteiro de estudo Bellacosa

Para um COBOLzeiro iniciante eu seguiria esta ordem.

Passo 1 — Aprenda container

Entenda:

imagem
container
registry
Dockerfile
runtime

Passo 2 — Aprenda Pod

Descubra por que Kubernetes trabalha com Pods.

Passo 3 — Deployment

Entenda:

replicas
ReplicaSet
rolling update
self-healing

Passo 4 — Service

Aprenda descoberta e acesso aos Pods.

Passo 5 — Configuração

Estude:

ConfigMap
Secret

Passo 6 — Storage

Depois:

PV
PVC
StorageClass

Passo 7 — Probes

Estude:

startup
readiness
liveness

Passo 8 — Scheduling

Entre em:

requests
limits
affinity
taints
tolerations

Passo 9 — Segurança

Não pule:

RBAC
ServiceAccount
NetworkPolicy
Secrets

Passo 10 — Observabilidade

Finalmente:

logs
metrics
traces
alerts

Só depois disso mergulhe alegremente no abismo chamado:

Helm
Operators
GitOps
Service Mesh
CRDs
Admission Controllers

Porque depois desse ponto o submarino já está a 11 mil metros.


🧙‍♂️ Dica do velho operador

Quando um Kubernetes parecer complicado demais, não tente memorizar todos os nomes.

Faça sempre cinco perguntas:

1. O que deveria existir?

2. O que existe realmente?

3. Quem observa essa diferença?

4. Quem deveria corrigi-la?

5. Por que não conseguiu?

Essa técnica resolve uma quantidade surpreendente de investigações.

E curiosamente é quase a mesma forma de pensar usada há décadas para diagnosticar ambientes de produção.


🐙 O monstro final: complexidade

No último episódio de nossa expedição aparece diante do submarino uma criatura colossal.

Não é Docker.

Não é YAML.

Não é networking.

É:

COMPLEXIDADE

Kubernetes nasceu porque sistemas distribuídos modernos ficaram complexos demais para administração manual.

Mas existe um paradoxo.

Para controlar complexidade, Kubernetes introduz sua própria complexidade.

Então a decisão madura nunca é:

Kubernetes é bom?

A pergunta correta é:

“O problema que tenho justifica a complexidade operacional que Kubernetes introduzirá?”

Se sim, ele pode ser extraordinário.

Se não, talvez você esteja usando um submarino nuclear para entregar pizza.


🌅 Epílogo — Emergindo do cluster

O USS Kubernetes finalmente retorna à superfície.

O jovem COBOLzeiro sai pela escotilha.

No início da viagem ele conhecia:

JCL
COBOL
CICS
Db2
JES2

Agora carrega um caderno com:

Container
Pod
Deployment
Service
Node
Cluster
Control Plane
Scheduler
etcd
ConfigMap
Secret
PVC
HPA
Probe

Ele olha para o arquiteto.

— Acho que entendi Kubernetes.

— Excelente!

— É um sistema enorme que recebe uma descrição do estado que queremos, observa continuamente o estado que existe e tenta corrigir as diferenças automaticamente.

O arquiteto sorri.

— Perfeito.

O COBOLzeiro toma o último gole do café.

— Então passamos cinquenta anos distribuindo computação para depois construir um negócio gigantesco para coordenar tudo novamente.

Silêncio na sala.

O sysprog veterano, sentado no canto, finalmente levanta os olhos do terminal.

— Eu estava esperando alguém perceber.

E talvez esse seja o maior easter egg de toda a história.

A tecnologia muda.

Os nomes mudam.

Os logos ficam mais bonitos.

O YAML substitui cartões perfurados.

O container substitui parte da configuração artesanal.

O cluster substitui fileiras de servidores administrados individualmente.

Mas a pergunta original continua ecoando pelos corredores do CPD, pelo datacenter, pela cloud e agora pelas profundezas do nosso submarino:

“Temos um monte de programas, recursos limitados, máquinas que quebram e usuários que não querem saber de nada disso. Quem vai administrar essa porra toda?”

No mainframe, construímos respostas.

No Unix, construímos outras.

Na virtualização, outras.

Na cloud, outras.

E no universo containerizado, uma das grandes respostas recebeu um nome grego, um timão como logotipo e a missão quase naval de manter milhares de pequenas embarcações seguindo o curso declarado:

Kubernetes.

Ou, para os íntimos do Bellacosa Mainframe:

//KUBEJOB JOB ...
//STEP01 EXEC PGM=KEEP-EVERYTHING-ALIVE
//SYSOUT DD SYSOUT=*
//COFFEE DD DISP=SHR,DSN=BELLACOSA.CAFE.FORTE

RC=0000.

Esperamos. ☕☸️🌊

sexta-feira, 8 de setembro de 2023

🎌 Guia Bellacosa Avançado: Etiqueta Otaku no Japão

 


🎌 Guia Bellacosa Avançado: Etiqueta Otaku no Japão
🗾 Como não pagar mico em Akihabara, Comiket e outros santuários do fandom japonês!

Se o seu sonho é mergulhar no coração do universo otaku — andar por Akihabara, visitar maid cafés, participar da Comiket ou comprar doujinshi raros — parabéns, jovem padawan! 🌸
Mas cuidado: o Japão tem regras sociais próprias dentro do mundo otaku, e quem não entende essas regras pode virar meme internacional em 3... 2... 1...

Vamos aprender o código secreto da boa educação otaku japonesa — no estilo Bellacosa, divertido e cultural!


🏙️ 1. Akihabara não é parque temático — é um santuário urbano

Akihabara (秋葉原) é o “bairro elétrico”, cheio de lojas, cafés, fliperamas e tudo o que faz brilhar o coração otaku.
Mas lá, o comportamento deve ser respeitoso e discreto.

🚫 Não fotografe pessoas nas ruas, especialmente maid cafés.
As funcionárias não podem aparecer em fotos por política da casa.
📷 Se quiser uma foto, entre e pergunte — algumas oferecem photo set com preço fixo.

💡 Dica Bellacosa: os japoneses valorizam otakus silenciosos e apaixonados, não barulhentos e invasivos.


🍰 2. Maid Café: respeito é o verdadeiro charme

Nos maid cafés, as atendentes agem como personagens de anime, mas não é paquera real.
Elas fazem parte de um show lúdico — seja gentil, sorria e entre no clima, mas nunca toque, peça contatos ou tente continuar conversa fora dali.

🧁 Ao ir embora, diga:
“Gochisousama deshita, ojousama!” (Obrigado pela refeição, senhorita!)
É parte da brincadeira — e mostra que você entendeu o espírito do lugar.

🎀 Curiosidade Bellacosa:
As maids fazem poses de coração, falam fofinho e até cantam feitiços sobre sua comida (“moe moe kyun!”).
É teatro, não flerte. E você está ali como público educado.


📚 3. Comiket (Comic Market): sobrevivência e respeito

A Comiket é o maior evento otaku do planeta, realizado em Tóquio.
Milhares de fãs vendem e compram doujinshi (mangás independentes) — alguns de conteúdo adulto, mas com etiqueta rígida.

📏 Regras básicas:

  • Chegue cedo, mas não corra — é perigoso e malvisto.

  • Fila é sagrada. Espere calmamente, converse baixo e leve água e comida.

  • Não pegue doujinshi sem permissão.

  • Não fotografe artistas ou mesas sem perguntar.

💡 Dica Bellacosa: leve trocado (moedas e notas pequenas). A maioria dos artistas só aceita dinheiro vivo.

🎬 Curiosidade: muitos criadores famosos começaram na Comiket, incluindo autores de Evangelion, Touhou Project e Fate/Stay Night.


📀 4. Lojas de doujinshi e produtos “adultos”

Sim, elas existem — e são super organizadas.
Mas, diferentemente do Ocidente, o Japão trata o conteúdo adulto com discrição, não vulgaridade.

📚 Áreas “18+” são separadas, com sinalização clara.
Respeite os limites e nunca mexa sem intenção real de comprar.
E por favor, não ria, não tire foto e não aja como se estivesse em um zoológico cultural. 😅

💡 Bellacosa tip: curiosidade não é problema, mas maturidade é exigência.


🛍️ 5. Compras otaku — a arte da delicadeza

Ao comprar figures, CDs ou mangás, pegue com cuidado.
Não abra embalagens sem permissão.
Nas lojas japonesas, o funcionário sempre entrega o item com as duas mãos — faça o mesmo ao receber.

🎁 E não se espante se o vendedor agradecer cinco vezes — isso é normal!
Responda com um simples “Arigatou gozaimasu!” e um leve aceno.


🎭 6. Cosplay em eventos japoneses

O Japão leva cosplay tão a sério quanto o teatro Noh.
Você só pode se vestir nos vestiários oficiais (cosplay rooms), e deve trocar de roupa ali.
Circular de cosplay nas ruas é malvisto e até proibido em algumas cidades.

📸 Fotos?
Sempre peça antes de tirar: “Shashin totte mo ii desu ka?”
E devolva o favor elogiando: “Sugoi desu ne!”

💡 Curiosidade: no Japão, o respeito pelo personagem é sagrado — nunca zombe de um cosplay, mesmo se for simples.


🎤 7. Eventos com Seiyuu, Idols e Shows

Fãs japoneses seguem coreografias de torcida (wotagei) com disciplina de samurai.
Nada de empurrar, gritar ou tentar invadir o palco.
Leve sua penlight (luzinha) e siga o ritmo da multidão — é quase uma dança ritual.

🚫 Jamais tente tocar ou se aproximar de um idol.
No Japão, a distância física é parte do respeito e da fantasia.


🧘‍♂️ 8. O Zen do Fã Japonês

O fã japonês observa mais do que fala.
Não é vergonha ser calado — é virtude.
Eles expressam paixão com coleções, silêncio respeitoso e participação discreta.

💡 Dica Bellacosa final: ser otaku no Japão é um ato de amor disciplinado.
O respeito é a verdadeira energia do fandom.


🗾 Resumo Bellacosa da Etiqueta Otaku Japonesa

SituaçãoO que fazerO que evitar
AkihabaraObservar, pedir permissãoFotografar sem consentimento
Maid CaféEntrar no clima respeitosamenteTocar ou paquerar
ComiketSeguir filas, levar trocadoCorrer, empurrar, fotografar artistas
CosplayTrocar roupa no local, pedir fotoCircular fantasiado na rua
Lojas AdultasSer discreto e maduroRir, comentar alto, tirar fotos
Shows/IdolsSeguir ritmo e regrasGritar, tocar, invadir palco

🌸 Comentário Bellacosa:
O Japão criou um equilíbrio mágico entre paixão e respeito.
Ser fã lá é viver um ritual — cada gesto, cada palavra e cada fila tem um propósito.

E no fim, padawan, ser um otaku bem-educado é o verdadeiro kaizen do fandom:

“Melhore um pouco a cada evento — e um dia você será um mestre da harmonia otaku.” 💮🇯🇵✨

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


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