☕ 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 Recuperação. Mostrar todas as mensagens
Mostrar mensagens com a etiqueta Recuperação. Mostrar todas as mensagens

quarta-feira, 21 de abril de 2021

Jimi Dini Entrou no Catálogo — O Dia em que um GDG Criou uma Geração, Sofreu ABEND e Descobriu que IDCAMS Não É Um Curandeiro de Arquivos

 

Bellacosa Mainframe e o idcams criando gdgs

☕ Um Café no Bellacosa Mainframe

Jimi Dini Entrou no Catálogo — O Dia em que um GDG Criou uma Geração, Sofreu ABEND e Descobriu que IDCAMS Não É Um Curandeiro de Arquivos

Ou: como deixar de chamar todo arquivo com G0001V00 de “backup”, entender por que (+1) pode virar confusão e descobrir que o verdadeiro rock-and-roll do batch é saber o que ficou no catálogo depois do RC=12


Prólogo — a fita cassete que se chamava ontem

Imagine Jimi Dini, uma criatura de camisa de flanela, café frio e paciência limitada para apresentações com setenta slides, entrando na sala de operações às três da manhã. No monitor, um job de fechamento acabou de cair com ABEND. O operador aponta para a tela e decreta:

— Relaxa. O arquivo está no GDG.

Jimi olha para o spool, toma um gole de café e responde:

— “No GDG” quer dizer o quê? Está criado? Catalogado? É a geração ativa? É a de ontem? Está pendurada em deferred roll-in? Ou alguém só viu um G0042V00 no volume e resolveu chamar isso de plano de recuperação?

É aqui que começa a educação sentimental do programador COBOL. GDG não é uma palavra mágica para “backup”; IDCAMS não é uma ambulância que ressuscita dado errado; e o catálogo não é um detalhe administrativo que alguém do storage resolve quando o seu JCL ficou feio. Os três formam uma parte muito importante da segurança operacional do batch.

Vamos desmontar essa história sem misticismo — mas com respeito pelo momento em que um DELETE ... PURGE é digitado no ambiente errado e a sala inteira fica subitamente muito silenciosa.


1. GDG: uma estante, não uma pasta com nome bonito

GDG significa Generation Data Group. É um grupo de datasets relacionados, mantidos em ordem de geração pelo z/OS. Pense numa coleção de edições de jornal: a base é o título da coleção; cada GDS (Generation Data Set) é uma edição física.

Base lógica:

BELLACOSA.FOLHA.RELATORIO

Gerações físicas que o sistema administra:

BELLACOSA.FOLHA.RELATORIO.G0001V00
BELLACOSA.FOLHA.RELATORIO.G0002V00
BELLACOSA.FOLHA.RELATORIO.G0003V00

O sufixo G0003V00 não é um ornamento que você inventa no teclado. Ele é formado pelo sistema: o número da geração e, quando necessário, o número de versão. A grande vantagem aparece quando o programa não precisa conhecer esse nome físico. Ele só pede a edição que precisa.

Referência no JCLTradução humana
(+1)“Vou criar a próxima edição.”
(0)“Quero a edição mais recente ativa.”
(-1)“Quero a imediatamente anterior.”
(-2)“Quero a de duas execuções atrás.”
G0042V00“Quero exatamente esta edição física.”

Para um lote diário de extratos, isto é ouro. O job de hoje cria (+1). O processo de conferência lê (0). Uma rotina de comparação lê (-1). O JCL expressa intenção, não uma data carimbada à mão numa convenção de nomes que um dia alguém vai esquecer de atualizar.

Mas atenção: GDG administra gerações, não prova que o conteúdo está certo. Se o COBOL calculou juros usando uma taxa incorreta, você não possui um backup apenas porque o arquivo se chama G0088V00. Você possui uma versão perfeitamente organizada de um erro.


2. IDCAMS: o cartório do condomínio de datasets

IDCAMS, Access Method Services, é a ferramenta que conversa com o catálogo e administra vários objetos de dados. Ele é famoso entre programadores por criar VSAM, mas chamar IDCAMS de “o programa que cria KSDS” é como chamar um cartório de “o lugar onde se reconhece firma”. Verdadeiro, mas dramaticamente incompleto.

Com IDCAMS, podemos, entre outras coisas:

  • definir e alterar bases GDG;

  • listar entradas do catálogo;

  • criar, apagar e alterar clusters VSAM;

  • copiar ou carregar dados com REPRO;

  • trabalhar com índices alternativos;

  • investigar atributos que o JCL sozinho não torna tão visíveis.

O esqueleto clássico é:

//IDCAMS   EXEC PGM=IDCAMS
//SYSPRINT DD SYSOUT=*
//SYSIN    DD *
  comandos IDCAMS
/*

Guarde uma regra de sobrevivência: se IDCAMS voltar com condição diferente de zero, não pare no RC=8. Abra o SYSPRINT. O retorno é o alarme; as mensagens são o laudo médico. Elas costumam revelar se a base já existe, se uma geração possui retenção, se houve problema de autorização RACF ou se o catálogo localizou algo diferente do que você imaginava.

3. Criando a base: antes de nascer a primeira geração

Definir a base GDG não cria um arquivo de negócio. Cria a regra de vida das futuras gerações no catálogo.

//DEFGDG   EXEC PGM=IDCAMS
//SYSPRINT DD SYSOUT=*
//SYSIN    DD *
  DEFINE GENERATIONDATAGROUP -
    (NAME(BELLACOSA.FOLHA.RELATORIO) -
     LIMIT(7) -
     NOEMPTY -
     SCRATCH -
     NOPURGE)
/*

Também é válido escrever DEFINE GDG. Eu, porém, gosto de começar com GENERATIONDATAGROUP: evita que o jovem padawan imagine que está definindo um dataset sequencial. Está definindo a base, a estante e suas regras.

LIMIT(7): quantas edições cabem na estante?

LIMIT determina o número de gerações ativas. Para um job diário, LIMIT(7) pode representar uma semana. Para fechamento mensal, LIMIT(13) costuma cobrir doze meses e o atual. Para uma interface cuja correção pode levar noventa dias, talvez sete seja uma receita para uma conversa desagradável com auditoria.

O limite não deve nascer do folclore — “sempre fizemos 30” —, mas de perguntas concretas: por quantos dias pode ocorrer reprocessamento? Há retenção legal? Quem recupera um arquivo se o parceiro rejeitar a carga depois de duas semanas? Há espaço para isso? Em GDG clássico, o limite pode chegar a 255; um GDG estendido pode suportar até 999, sujeito à política do ambiente.

NOEMPTY: retire o mais antigo, não a banda inteira

Com NOEMPTY, quando chega uma nova geração acima do limite, apenas a mais velha sofre roll-off — deixa de fazer parte da base. É o comportamento normal em processamento contínuo.

Com LIMIT(3), ao criar a quarta geração:

antes: G0001, G0002, G0003
depois: G0002, G0003, G0004

EMPTY é outra conversa: quando o limite estoura, todas as gerações existentes saem da base. Há usos específicos para ciclos fechados, mas para relatório diário isso equivale a contratar Jimi Dini para organizar os arquivos e entregar-lhe um lança-chamas. Use NOEMPTY como padrão mental até que alguém explique, por escrito, por que EMPTY é necessário.

SCRATCH, NOSCRATCH, PURGE e NOPURGE: o que acontece quando a geração cai da estante?

Quando uma geração sofre roll-off, ela pode simplesmente deixar a base ou também ser removida do armazenamento:

  • SCRATCH: remove o dataset físico conforme o processamento aplicável;

  • NOSCRATCH: não o apaga automaticamente; ele pode continuar existindo e, no cenário SMS, ficar recatalogado fora da base como rolled off;

  • NOPURGE: respeita retenção/data de expiração;

  • PURGE: pode ultrapassar essa barreira de retenção.

Para operação comum, NOEMPTY, SCRATCH e NOPURGE são uma combinação honesta: remove somente a geração mais velha, libera espaço e não atropela proteção de retenção. Mas ela exige que seu LIMIT seja correto. Se a empresa precisa manter sessenta dias, LIMIT(7) com SCRATCH não é automação; é descarte programado.

4. O COBOL encontra o JCL: quem faz o quê?

O COBOL não deveria carregar a preocupação com o nome absoluto da geração. Ele abre um DDNAME. O JCL decide o dataset. O catálogo resolve a geração. Esta separação é uma das pequenas elegâncias do mainframe.

JCL que cria uma geração:

//GERAEXTR EXEC PGM=PGMEXTR
//STEPLIB  DD DSN=BELLACOSA.LOADLIB,DISP=SHR
//SYSOUT   DD SYSOUT=*
//EXTRATO  DD DSN=BELLACOSA.BATCH.EXTRATO(+1),
//            DISP=(NEW,CATLG,DELETE),
//            SPACE=(CYL,(20,10),RLSE),
//            DCB=(RECFM=FB,LRECL=200,BLKSIZE=0)

No programa:

SELECT ARQ-EXTRATO ASSIGN TO EXTRATO
       ORGANIZATION IS SEQUENTIAL
       FILE STATUS IS WS-FS-EXTRATO.

O programa escreve em EXTRATO. Não precisa saber se virou G0042V00. E isto dá liberdade para a equipe ajustar as regras de infraestrutura sem reescrever lógica de negócio.

Na execução seguinte, o mais novo pode ser lido assim:

//ENTRADA DD DSN=BELLACOSA.BATCH.EXTRATO(0),DISP=SHR

E a comparação com o anterior:

//HOJE    DD DSN=BELLACOSA.BATCH.EXTRATO(0),DISP=SHR
//ONTEM   DD DSN=BELLACOSA.BATCH.EXTRATO(-1),DISP=SHR

Esse é um ponto em que a vida do iniciante melhora: (+1) é para criar; (0) é a geração ativa mais recente; (-1) é a anterior. Não tente tratar (+1) como “o arquivo de hoje para leitura em qualquer etapa paralela”. O momento do catalogamento e o fluxo do job importam.

5. A cena do crime: job caiu ao criar (+1)

Agora chegamos à pergunta que separa quem decorou sintaxe de quem começa a entender operação.

O job aloca:

BELLACOSA.BATCH.EXTRATO(+1)

O z/OS reserva o nome físico, o programa começa a escrever e então acontece um ABEND: um S0C7, falta de espaço, falha de I/O, queda de subsistema ou aquela rotina antiga que decide que o valor HIGH-VALUES é uma proposta de carreira.

Pode sobrar uma geração física criada, por exemplo G0042V00, sem que ela tenha sido incluída como geração ativa na base. Esse é um estado conhecido como deferred roll-in. Na prática, o arquivo pode estar no DASD, mas (0) ainda aponta para a geração anterior.

O primeiro impulso de alguém é executar de novo. Às vezes funciona. Às vezes transforma um incidente simples numa investigação arqueológica.

Primeiro, investigue:

//LISTGDG  EXEC PGM=IDCAMS
//SYSPRINT DD SYSOUT=*
//SYSIN    DD *
  LISTCAT ENT(BELLACOSA.BATCH.EXTRATO) ALL
  LISTCAT LVL(BELLACOSA.BATCH.EXTRATO) ALL
/*

Depois, leia o spool: JESMSGLG, JESJCL, SYSPRINT e os SYSOUTs do programa. Você quer saber: a geração existe? O conteúdo foi fechado corretamente? O job morreu antes ou depois de gravar? A geração deveria sobreviver? Há outro job dependente em execução?

Se a GDS estiver íntegra e for realmente a geração que deve entrar na base, IDCAMS oferece a correção de catálogo:

//ROLLIN   EXEC PGM=IDCAMS
//SYSPRINT DD SYSOUT=*
//SYSIN    DD *
  ALTER BELLACOSA.BATCH.EXTRATO.G0042V00 ROLLIN
/*

O ROLLIN torna a geração ativa no GDG. É a ferramenta certa para a pergunta certa: “a geração existe e está boa, mas não foi associada à base”. Não a use como ritual automático após todo ABEND. Se o programa morreu depois de gravar metade do arquivo, colocar essa geração no GDG é apenas catalogar oficialmente um problema.

6. Reexecutar, corrigir ou recuperar? Três verbos, três decisões

Jimi Dini escreveria isto na parede da sala de controle: não conserte catálogo antes de decidir se o dado merece ser preservado.

Caso A — o conteúdo está correto, mas a geração não entrou

Valide volume, tamanho, quantidade de registros, totais de controle e sinal de término da aplicação. Se tudo estiver íntegro, ALTER ... ROLLIN pode ser a escolha adequada.

Caso B — o conteúdo está errado

Não “edite” a geração em silêncio para fingir que nada ocorreu. Corrija a causa, gere uma nova (+1) e documente o reprocessamento. A beleza do GDG é justamente preservar a sequência. Uma geração nova, correta e auditável costuma ser muito mais defensável que uma cirurgia clandestina na geração anterior.

Caso C — a geração está incompleta ou descartável

Depois de confirmação operacional, a geração física pode precisar ser excluída e o job reexecutado de maneira controlada. Isto não deve ser decidido pelo programador isolado em produção: há scheduler, dependências, retenção, RACF e possíveis consumidores do arquivo.

O vilão frequente é o segundo job disparado antes que o primeiro tenha sido tratado. Em GDS SMS no DASD, o mecanismo de GDS reclaim pode reutilizar uma geração pendente quando outro job tenta criar o mesmo (+1). Isso pode sobrescrever conteúdo anterior. Portanto, interrompa dependentes, entenda o estado e só então rerode.

7. ALTER, LISTCAT, DELETE: ferramentas, não martelos

LISTCAT é sua lanterna:

LISTCAT ENT(BELLACOSA.BATCH.EXTRATO) ALL

Ele permite enxergar atributos da base, limite e gerações. Use antes de tomar decisão destrutiva.

ALTER ajusta a política:

ALTER BELLACOSA.BATCH.EXTRATO LIMIT(45)

Isso aumenta a capacidade futura de retenção. Não traz de volta dados que já sofreram scratch. Também vale lembrar: reduzir limite pode provocar roll-off das gerações mais antigas. Não trate um ALTER LIMIT como ajuste cosmético.

DELETE faz exatamente o que o nome promete:

DELETE BELLACOSA.BATCH.EXTRATO.G0042V00

apaga uma geração específica; enquanto:

DELETE BELLACOSA.BATCH.EXTRATO GDG

atinge a base GDG. Isso é reconstrução, não manutenção corriqueira. Antes de qualquer DELETE, confirme ambiente, HLQ, entrada de catálogo, volumes e autorização. O personagem que diz “é só um GDG de teste” merece ao menos uma segunda verificação — porque o ambiente de teste costuma ter um nome suspeitosamente parecido com produção numa sexta-feira.

8. VERIFY não é varinha mágica

Outro equívoco comum: ouvir que IDCAMS possui VERIFY e concluir que ele corrige qualquer GDG. Não. VERIFY está ligado à verificação de consistência de estruturas VSAM e catálogo em cenários próprios. Ele não confere se a regra de cálculo do seu COBOL estava correta; não repõe registros faltantes num arquivo sequencial; não transforma uma GDS truncada em extrato válido.

Para GDG, pense assim:

SintomaAção inicial correta
Arquivo lógico aponta para a geração erradaLISTCAT, avaliar estado e ROLLIN se aplicável
Geração não existeInvestigar job, retenção, scratch, backup e catálogo
Dados têm erro de negócioCorrigir programa/parâmetro e reprocessar para nova geração
Retenção está pequenaALTER LIMIT, com avaliação de espaço e auditoria
Estrutura VSAM está inconsistenteAcionar procedimento VSAM/storage; pode envolver VERIFY
Catálogo parece corrompidoEscalar ao storage/system programmer; não recriar base no improviso

O IDCAMS é excelente, mas não substitui diagnóstico. Ele administra registros de catálogo; seu processo operacional decide o que é dado confiável.

9. Passo a passo do jovem padawan antes de mexer num GDG

Quando um job com GDG falhar, siga este roteiro:

  1. Pare o reflexo de rerodar. Veja se existem dependentes e evite duas tentativas criando o mesmo (+1).

  2. Leia o ABEND e o spool. Descubra a causa, não só o código final.

  3. Liste a base. Use LISTCAT ENT(nome-da-base) ALL.

  4. Identifique a geração física. Ela existe? Está ativa, rolled off ou pendente?

  5. Valide o conteúdo. Totais, contagem, trailer, retorno da aplicação, volume e integridade esperada.

  6. Escolha conscientemente. ROLLIN se a geração boa não entrou; novo (+1) se deve reprocessar; descarte controlado se está incompleta.

  7. Registre a decisão. Ticket, evidência de totals e horário da intervenção valem ouro na auditoria.

  8. Libere a cadeia somente após a consistência. O próximo consumidor não deve descobrir o problema por acidente.

10. Curiosidades para contar no café — sem quebrar produção

Uma GDG pode ser muito mais antiga que boa parte do código Java que hoje a consome. E ainda assim ela resolve um problema moderno: versionamento de dados em lote. A diferença é que, no z/OS, esse versionamento está acoplado a catálogo, retenção, JCL, segurança e operação de grandes volumes — não a uma pasta chamada backup_final_agora_vai_3.

Outra curiosidade: o sufixo absoluto existe para quando uma referência precisa ser imutável. Usar (0) é ótimo para “a mais recente”; usar G0042V00 é apropriado quando uma auditoria, reconciliação ou reexecução exige provar que foi aquela geração, e não a que veio depois.

Por fim, GDG não elimina backup, disaster recovery, retenção corporativa ou cópia para fita/cloud. Ele ajuda a manter versões operacionais de datasets. Backup protege contra outra classe de problemas: perda de volume, desastre, corrupção ampla, retenção longa e erros que só foram percebidos quando todas as gerações úteis já saíram da estante.

Epílogo — o som que fica depois do ABEND

No fim da madrugada, Jimi Dini fecha o SYSPRINT, confere o LISTCAT e deixa uma frase para o programador COBOL iniciante:

— O mainframe não é antigo; ele só não confia em improviso.

GDG oferece uma cronologia clara. IDCAMS administra a cronologia no catálogo. JCL declara como cada etapa usa essa cronologia. COBOL processa os registros. Quando algo falha, a resposta madura não é “reroda e vê”. É descobrir o que foi alocado, o que foi catalogado, o que está íntegro e qual ação preserva tanto o negócio quanto a rastreabilidade.

Quando você entende isso, (+1) deixa de ser uma sequência estranha entre parênteses. Ele se torna uma promessa operacional: “esta é a próxima versão do dado; trate-a com o respeito que ela terá quando alguém precisar explicar seu conteúdo daqui a três meses.




terça-feira, 10 de novembro de 2020

CICS Forward Recovery: Sherlock Holmes, COBOL e o Mistério do VSAM Desaparecido

 

Bellacosa Mainframe e o cics forward recovery

☕ Um Café no Bellacosa Mainframe

CICS Forward Recovery: Sherlock Holmes, COBOL e o Mistério do VSAM Desaparecido

Imagine a cena.

São 14h37 de uma terça-feira aparentemente tranquila. O café ainda está quente, o sistema bancário está processando milhares de transações por minuto e os programas COBOL continuam trabalhando discretamente, como sempre fizeram: lendo clientes, atualizando saldos, gravando pagamentos e respondendo às telas CICS.

De repente, o telefone toca.

— O arquivo de clientes está com erro.

Alguns segundos depois, chega uma mensagem mais preocupante:

— O VSAM não abre.

Em seguida, a sentença que nenhum operador, programador ou analista de produção deseja ouvir:

— Parece que houve uma falha no storage. O arquivo pode estar corrompido.

Nesse momento, o programador COBOL iniciante talvez pense:

“É só restaurar o backup.”

Elementar, meu caro padawan do mainframe.

Mas incompleto.

Restaurar o backup pode trazer o arquivo de volta. Porém, dependendo do horário em que esse backup foi criado, todas as atualizações realizadas depois dele podem desaparecer.

O arquivo volta, mas volta ao passado.

É como encontrar a vítima viva, porém sem memória das últimas doze horas.

É nesse ponto que Sherlock Holmes deixa a lupa sobre a mesa, observa as pegadas deixadas pelos journals e declara:

“O backup mostra onde estivemos. Os logs mostram tudo o que aconteceu depois.”

Bem-vindo ao CICS Forward Recovery, o mecanismo utilizado para reconstruir dados fisicamente danificados por meio da combinação de uma cópia de segurança com registros de alterações posteriores.

Neste artigo, vamos investigar o conceito passo a passo, entender a diferença entre backup, backout e forward recovery, acompanhar um caso bancário completo e descobrir por que os journals são como testemunhas silenciosas de cada atualização feita em um arquivo VSAM.


O primeiro indício: o que é Forward Recovery?

Forward Recovery, ou recuperação para a frente, é um processo utilizado para reconstruir um dataset danificado a partir de dois elementos principais:

Backup consistente
        +
Registros de alterações posteriores
        =
Dataset reconstruído

O backup fornece o ponto de partida.

Os registros de journal fornecem os acontecimentos posteriores.

A recuperação aplica essas alterações sobre a cópia restaurada até que o arquivo alcance o estado consistente mais recente possível.

Considere o seguinte cenário:

00:00 – Backup completo do arquivo VSAM
00:10 – Cliente 100 recebe um depósito
01:25 – Cliente 200 atualiza o endereço
03:40 – Cliente 300 encerra a conta
08:15 – Cliente 400 faz uma transferência
12:00 – Cliente 500 paga um boleto
14:37 – O volume de disco sofre uma falha

Se restaurarmos somente o backup da meia-noite, o arquivo será recuperado no estado em que estava às 00:00.

Todas as operações realizadas entre 00:00 e 14:37 desaparecerão.

O Forward Recovery restaura o backup e, depois, reaplica as alterações registradas após sua criação.

Backup de 00:00
       ↓
Atualização de 00:10
       ↓
Atualização de 01:25
       ↓
Exclusão de 03:40
       ↓
Transferência de 08:15
       ↓
Pagamento de 12:00
       ↓
Estado recuperado próximo de 14:37

A palavra forward existe porque o processo caminha para a frente no tempo.

Ele parte de um ponto conhecido e reconstrói o caminho até o estado mais recente.


A cena do crime: o que exatamente foi perdido?

Antes de pensar em recuperação, precisamos investigar o tipo de falha.

Nem todo problema exige Forward Recovery.

Essa distinção é fundamental.

Em um ambiente CICS, podemos encontrar pelo menos duas grandes categorias de falha:

  1. Falha lógica ou transacional.

  2. Falha física ou estrutural.

Uma falha lógica acontece quando uma transação não consegue concluir corretamente.

Uma falha física acontece quando o próprio dataset, volume ou meio de armazenamento sofre dano ou se torna indisponível.

Observe a diferença.

Falha lógica

Uma transação deveria:

1. Debitar R$ 500 da conta A
2. Creditar R$ 500 na conta B

O débito acontece, mas o crédito falha.

Nesse caso, o arquivo não desapareceu. O disco não foi destruído. O dataset ainda existe.

O problema está na transação incompleta.

O CICS pode desfazer as alterações já realizadas por meio do backout.

Falha física

Agora imagine:

CUSTOMER.MASTER.FILE

O dataset está em um volume que sofreu corrupção.

O CICS tenta abrir o arquivo e recebe erro.

O catálogo pode apontar para o dataset, mas os dados não podem ser lidos corretamente.

Nesse caso, não basta desfazer uma transação. É preciso reconstruir o arquivo.

É aqui que entra o Forward Recovery.

Sherlock Holmes resumiria assim:

Backout corrige o ato. Forward Recovery reconstrói a cena.


O arquivo VSAM: o cofre onde os dados vivem

Para um programador COBOL iniciante, VSAM pode parecer apenas “o arquivo que o programa lê”.

Mas ele é muito mais que isso.

VSAM, ou Virtual Storage Access Method, é uma tecnologia de armazenamento amplamente utilizada no IBM Z.

Entre os tipos mais conhecidos estão:

  • KSDS — Key-Sequenced Data Set;

  • ESDS — Entry-Sequenced Data Set;

  • RRDS — Relative Record Data Set;

  • LDS — Linear Data Set.

Em aplicações CICS, o KSDS é extremamente comum.

Ele permite acessar registros por meio de uma chave.

Por exemplo:

01  CUSTOMER-RECORD.
    05 CUSTOMER-ID       PIC 9(10).
    05 CUSTOMER-NAME     PIC X(40).
    05 CUSTOMER-BALANCE  PIC S9(11)V99 COMP-3.

A chave poderia ser:

CUSTOMER-ID

Quando uma transação consulta um cliente, o programa pode executar uma leitura semelhante a:

EXEC CICS READ
     FILE('CUSTFILE')
     INTO(CUSTOMER-RECORD)
     RIDFLD(CUSTOMER-ID)
     RESP(WS-RESP)
END-EXEC.

Quando modifica o registro, pode utilizar:

EXEC CICS REWRITE
     FILE('CUSTFILE')
     FROM(CUSTOMER-RECORD)
     RESP(WS-RESP)
END-EXEC.

O programador enxerga comandos como READ, WRITE, REWRITE e DELETE.

Porém, por trás dessas instruções há uma cadeia completa de responsabilidades:

Programa COBOL
      ↓
Comando EXEC CICS
      ↓
CICS File Control
      ↓
VSAM
      ↓
Storage

Se o problema estiver no programa, talvez tenhamos um erro lógico.

Se o problema estiver no armazenamento físico, talvez tenhamos um caso de Forward Recovery.


A testemunha silenciosa: o journal

O journal é um dos elementos centrais da recuperação.

Ele registra informações sobre alterações realizadas nos dados.

Dependendo da configuração do ambiente, dos recursos utilizados e da estratégia de recuperação, os registros necessários podem ser gravados em logs e journals mantidos para esse propósito.

Uma forma simplificada de imaginar um registro de alteração é:

Arquivo: CUSTFILE
Operação: UPDATE
Chave: 0000001234
Horário: 10:25:31
Novo saldo: 000000015500.00

Outro registro poderia representar uma inclusão:

Arquivo: CUSTFILE
Operação: INSERT
Chave: 0000009876
Nome: JOHN WATSON
Saldo: 000000000100.00

Outro poderia indicar uma exclusão:

Arquivo: CUSTFILE
Operação: DELETE
Chave: 0000004444

Durante o Forward Recovery, essas informações são aplicadas sobre o arquivo restaurado.

É como reconstruir um romance perdido utilizando uma edição antiga e todas as correções feitas pelo autor depois dela.

O backup contém o livro antigo.

O journal contém as páginas alteradas.


Backup não é journal, journal não é backup

Esse é um ponto que merece ser gravado em letras garrafais na parede da sala de operações:

Backup e journal são complementares, não substitutos.

O backup é uma fotografia completa ou consistente do dataset em determinado momento.

O journal é uma sequência de mudanças.

Se você possui apenas o backup, pode recuperar o arquivo até o horário da cópia.

Se possui apenas registros de alterações, talvez não tenha uma base íntegra sobre a qual aplicá-los.

A estratégia completa se parece com isto:

BACKUP + JOURNAL + PROCEDIMENTO TESTADO = RECUPERAÇÃO CONFIÁVEL

Ainda falta uma peça importante: o procedimento precisa ser conhecido, documentado e testado.

Um backup que nunca foi restaurado é apenas uma promessa gravada em fita, disco ou nuvem.


O método Sherlock Holmes de recuperação

Sherlock Holmes nunca começa acusando alguém aleatoriamente.

Ele coleta fatos.

Em um incidente real, uma recuperação responsável também precisa seguir evidências.

Podemos organizar a investigação em etapas.

Passo 1 — Confirmar o sintoma

Antes de declarar que o arquivo está corrompido, verifique:

  • Qual mensagem foi emitida?

  • Qual código de resposta CICS apareceu?

  • O arquivo está CLOSED, DISABLED ou UNENABLED?

  • O problema ocorre para todas as chaves ou apenas algumas?

  • O dataset está catalogado?

  • O volume está disponível?

  • O erro é físico ou uma definição incorreta?

  • Houve alteração de catálogo, migração ou restore recente?

Nem todo erro de acesso significa corrupção.

Um arquivo pode estar fechado.

Uma definição pode apontar para o dataset errado.

Uma chave pode estar malformada.

Um programa COBOL pode ter fornecido um RIDFLD incorreto.

Holmes diria:

“Não confunda ausência de evidência com evidência de destruição.”

Passo 2 — Proteger a cena

Ao suspeitar de dano físico, o ambiente não deve continuar gravando descontroladamente.

A equipe pode precisar:

  • suspender transações;

  • fechar ou desabilitar o arquivo;

  • impedir novas atualizações;

  • registrar o horário exato da falha;

  • preservar logs e journals;

  • comunicar produção, storage, suporte e negócio.

Essa etapa evita que a investigação seja contaminada.

Passo 3 — Identificar o último backup válido

A equipe precisa descobrir:

  • quando o backup foi criado;

  • se ele foi concluído corretamente;

  • se é full ou incremental;

  • qual dataset corresponde ao arquivo afetado;

  • se o backup é consistente;

  • onde está armazenado;

  • quanto tempo será necessário para restaurá-lo.

Exemplo:

Último backup completo: 05/08/2026 00:00
Último backup incremental: 05/08/2026 12:00
Falha detectada: 05/08/2026 14:37

Nesse caso, talvez o ponto de partida mais eficiente seja o backup incremental das 12:00, desde que ele faça parte de uma cadeia consistente.

Passo 4 — Determinar o intervalo de journals

Precisamos identificar quais registros cobrem o período entre o backup e a falha.

Início: horário do backup
Fim: último ponto consistente antes da falha

Não basta dizer “aplique todos os logs”.

É necessário saber:

  • quais logs pertencem ao período;

  • se não há lacunas;

  • se a sequência está completa;

  • se os registros correspondem ao dataset correto;

  • se há duplicidade;

  • se existe um ponto de recuperação específico.

Uma lacuna no journal é como uma página arrancada do diário do suspeito.

Talvez ainda seja possível resolver o caso, mas a confiança diminui.

Passo 5 — Restaurar o dataset

O backup é restaurado para o local planejado.

Em ambientes bem estruturados, a equipe pode primeiro restaurar para um dataset alternativo.

Por exemplo:

PROD.CUSTOMER.MASTER

poderia ser restaurado temporariamente como:

RECOVERY.CUSTOMER.MASTER

Isso permite validações antes da substituição definitiva.

A ferramenta utilizada depende do ambiente e pode envolver recursos de:

  • IDCAMS;

  • DFSMSdss;

  • produtos de backup corporativo;

  • snapshots;

  • soluções de storage;

  • software especializado em recuperação de VSAM.

Passo 6 — Aplicar as alterações para a frente

Com o backup restaurado, inicia-se a aplicação dos registros posteriores.

Conceitualmente:

Estado no backup
      +
Alterações registradas
      =
Estado recuperado

As operações podem incluir:

  • criação de registros;

  • atualização de registros;

  • exclusão de registros.

A aplicação precisa respeitar a ordem correta.

Imagine:

10:00 – Cliente criado
10:05 – Cliente atualizado
10:10 – Cliente excluído

Se a ordem for alterada, o resultado poderá ser incoerente.

A cronologia é parte da verdade.

Passo 7 — Validar a consistência

Nunca disponibilize o arquivo apenas porque a ferramenta terminou com condition code zero.

Um CC 0000 indica que o utilitário concluiu conforme sua lógica. Não prova, sozinho, que o negócio está correto.

A validação pode envolver:

  • contagem de registros;

  • comparação de totais;

  • verificação de chaves;

  • validação de saldos;

  • relatórios de reconciliação;

  • testes de leitura;

  • testes de atualização;

  • verificação de índices alternativos;

  • conferência com outros sistemas;

  • validação pelos responsáveis de negócio.

Exemplo:

Quantidade esperada de clientes: 8.542.190
Quantidade recuperada:          8.542.190

Mas a quantidade sozinha não basta.

É preciso verificar valores críticos.

Total contábil esperado: R$ 982.450.221,37
Total recuperado:        R$ 982.450.221,37

Agora temos uma evidência melhor.

Passo 8 — Reabrir o arquivo e retomar a aplicação

Depois da aprovação:

  • o dataset recuperado é colocado no local correto;

  • definições são conferidas;

  • o arquivo é reaberto ou habilitado;

  • as transações são liberadas;

  • o sistema é monitorado;

  • a equipe acompanha erros e tempos de resposta.

A recuperação não termina quando o arquivo abre.

Ela termina quando o serviço volta com estabilidade e o negócio confirma que os dados estão corretos.


O caso do Banco Baker Street

Vamos construir um exemplo completo.

O Banco Baker Street mantém o cadastro de clientes em um KSDS chamado:

BANK.PROD.CUSTOMER.MASTER

A aplicação CICS utiliza a definição:

CUSTFILE

O backup completo ocorre diariamente à meia-noite.

Às 14h37, um problema de storage torna parte do dataset ilegível.

As transações começam a receber erro ao executar READ e REWRITE.

O programa COBOL possui tratamento de resposta:

EXEC CICS READ
     FILE('CUSTFILE')
     INTO(CUSTOMER-RECORD)
     RIDFLD(CUSTOMER-ID)
     RESP(WS-RESP)
END-EXEC

EVALUATE WS-RESP
    WHEN DFHRESP(NORMAL)
         CONTINUE
    WHEN DFHRESP(NOTFND)
         MOVE 'CLIENTE NAO ENCONTRADO' TO WS-MESSAGE
    WHEN OTHER
         PERFORM HANDLE-FILE-ERROR
END-EVALUATE.

O programa informa erro, mas não é ele quem recuperará fisicamente o dataset.

Essa é uma lição importante para o iniciante:

Nem todo problema encontrado pelo programa deve ser resolvido dentro do programa.

O COBOL detecta a falha.

O CICS gerencia o recurso.

A equipe de infraestrutura e recuperação reconstrói o dataset.

O processo poderia seguir assim:

1. Suspender as transações que atualizam CUSTFILE.
2. Registrar o horário da falha.
3. Fechar ou desabilitar o arquivo.
4. Confirmar o último backup válido.
5. Localizar os journals posteriores ao backup.
6. Restaurar o backup em uma área de recuperação.
7. Aplicar os registros até o ponto consistente.
8. Executar reconciliação.
9. Substituir ou disponibilizar o arquivo recuperado.
10. Reabrir CUSTFILE.
11. Executar transações controladas.
12. Liberar o serviço.

Depois da recuperação, o cliente Sherlock consulta seu saldo.

O valor está correto.

Watson atualiza o endereço.

A alteração é gravada.

Moriarty tenta causar outro incidente, mas encontra o runbook documentado, os backups testados e os journals devidamente preservados.

Desta vez, até o vilão pede transferência para a baixa plataforma.


Forward Recovery versus Transaction Backout

Essa comparação é uma das perguntas favoritas em entrevistas.

Transaction Backout

O backout desfaz alterações de uma unidade de trabalho que não foi concluída corretamente.

Exemplo:

Débito realizado
Crédito não realizado
Transação falha
CICS desfaz o débito

Seu foco é a consistência transacional.

Ele normalmente trabalha com informações que permitem restaurar valores anteriores, frequentemente chamadas de before-images.

Forward Recovery

O Forward Recovery reconstrói um dataset fisicamente danificado.

Exemplo:

Dataset perdido
Backup restaurado
Alterações posteriores reaplicadas
Arquivo reconstruído

Seu foco é a recuperação do dado armazenado.

CaracterísticaTransaction BackoutForward Recovery
Tipo de problemaFalha lógicaFalha física
EscopoUnidade de trabalhoDataset
DireçãoVolta ao estado anteriorAvança do backup ao estado recente
FinalidadeDesfazer transação incompletaReconstruir dados perdidos
Dataset precisa estar destruído?NãoPode estar corrompido ou perdido
Base principalInformações para desfazer mudançasBackup e registros posteriores

Uma frase para memorizar:

Backout apaga os passos defeituosos. Forward Recovery refaz os passos corretos.


Before-image e after-image

Considere um saldo inicial:

R$ 1.000,00

Depois de um depósito:

R$ 1.200,00

A imagem anterior é:

Before-image = R$ 1.000,00

A imagem posterior é:

After-image = R$ 1.200,00

Para desfazer a alteração, interessa o valor anterior.

Para reconstruir o estado atualizado a partir de um backup, interessam as informações que permitam reaplicar a mudança.

A implementação exata depende da infraestrutura, do tipo de recurso e da configuração de logging e journaling.

O programador iniciante não precisa decorar toda a mecânica interna no primeiro dia.

Mas precisa compreender o princípio:

BACKOUT → desfazer
FORWARD RECOVERY → reaplicar

RPO e RTO: o relógio de Moriarty

Toda recuperação séria deve considerar dois indicadores.

RPO — Recovery Point Objective

O RPO define quanto dado a organização aceita perder.

Exemplo:

RPO de 12 horas

Significa que, em determinado cenário, perder até 12 horas de dados estaria dentro do limite planejado.

Em um banco, isso provavelmente seria inaceitável para muitos sistemas.

Com journaling adequado, o ponto de recuperação pode ficar muito próximo do momento da falha.

RTO — Recovery Time Objective

O RTO define quanto tempo o serviço pode permanecer indisponível.

Exemplo:

RTO de 30 minutos

Isso significa que a organização espera restaurar o serviço dentro desse intervalo.

Forward Recovery influencia ambos.

Journals completos ajudam a reduzir a perda de dados.

Automação, backups rápidos e procedimentos testados ajudam a reduzir o tempo de recuperação.

O vilão mais perigoso de uma recuperação não é a falha de disco.

É o improviso.


O papel do CICS VSAM Recovery

Em ambientes corporativos, pode ser utilizado o CICS VSAM Recovery, frequentemente conhecido como CICS VR, para auxiliar no gerenciamento e na recuperação de dados VSAM relacionados a cargas CICS.

Uma solução especializada pode ajudar a:

  • identificar backups disponíveis;

  • localizar logs necessários;

  • planejar pontos de recuperação;

  • automatizar etapas;

  • reduzir erros operacionais;

  • manter informações sobre recursos recuperáveis;

  • apoiar a reconstrução de datasets.

É importante não imaginar que existe uma única ferramenta universal utilizada por todas as empresas.

Cada instalação possui sua arquitetura, seus produtos, seus padrões e seus procedimentos.

Algumas utilizam CICS VR.

Outras combinam ferramentas de storage, backup corporativo e rotinas próprias.

A tecnologia pode variar.

O princípio continua o mesmo:

Restaurar uma base válida
+
Reaplicar alterações válidas
+
Validar o resultado

Curiosidades da sala de máquinas

1. Um backup rápido não é necessariamente um restore rápido

Alguns processos produzem backups em poucos minutos, mas a restauração pode levar muito mais tempo.

Por isso, o planejamento deve medir os dois lados.

2. O índice alternativo também importa

Um KSDS pode possuir Alternate Index, ou AIX.

A estratégia de recuperação precisa considerar a consistência entre o cluster base e seus caminhos de acesso alternativos.

Não adianta recuperar os registros e esquecer a estrutura usada pelas aplicações para encontrá-los.

3. O catálogo pode sobreviver ao dataset

É possível que o catálogo ainda contenha a definição do arquivo, embora o conteúdo físico esteja indisponível.

É como possuir o endereço de uma casa que foi destruída.

4. Alta disponibilidade não elimina recuperação

Replicação, redundância e failover reduzem interrupções, mas não tornam o ambiente imune a corrupção lógica, erro humano ou propagação de dados inválidos.

Uma cópia perfeitamente replicada de um erro continua sendo um erro perfeitamente replicado.

5. Journals também exigem proteção

Se o arquivo e os journals estiverem sujeitos ao mesmo ponto único de falha, a estratégia poderá fracassar justamente quando for necessária.

6. O melhor runbook é aquele executado em teste

Documentos de recuperação não devem ser tratados como relíquias sagradas.

Devem ser ensaiados, atualizados e criticados.

Uma linha desatualizada em um procedimento pode custar horas durante um incidente real.


Dicas para o programador COBOL iniciante

Mesmo que você não seja o responsável por executar o restore, seu código pode ajudar muito durante incidentes.

Sempre trate RESP e RESP2

Evite assumir que todo comando CICS funcionará.

EXEC CICS WRITE
     FILE('CUSTFILE')
     FROM(CUSTOMER-RECORD)
     RIDFLD(CUSTOMER-ID)
     RESP(WS-RESP)
     RESP2(WS-RESP2)
END-EXEC.

Depois, avalie a resposta.

Não transforme todo erro em “registro não encontrado”

Um erro físico não é igual a NOTFND.

Tratar qualquer falha como ausência de cliente mascara problemas graves.

Registre contexto suficiente

Quando permitido pelos padrões da empresa, registre:

  • transação;

  • programa;

  • arquivo;

  • operação;

  • chave;

  • RESP;

  • RESP2;

  • horário;

  • identificador de correlação.

Isso ajuda a investigação.

Evite mensagens genéricas

Mensagem ruim:

ERRO NO ARQUIVO

Mensagem melhor:

TRAN=CU01 PROG=PGMCUST FILE=CUSTFILE OP=READ
RESP=xx RESP2=yy KEY=0000001234

Sem expor dados sensíveis, forneça evidências úteis.

Entenda a unidade de trabalho

Saiba onde ocorre o commit.

Saiba quais atualizações fazem parte da mesma transação.

Saiba o que deve ser desfeito se algo falhar.

Não tente “consertar” corrupção física com lógica improvisada

Um programa que ignora erros e continua gravando pode transformar um incidente recuperável em um desastre maior.


Easter eggs escondidos no dataset

Como prometido, aqui estão alguns pequenos easter eggs para o leitor atento.

O arquivo do exemplo chama-se BANK.PROD.CUSTOMER.MASTER, mas os clientes utilizados incluem Sherlock Holmes, John Watson e Moriarty.

O horário da falha, 14h37, não possui poder místico. Ele foi escolhido justamente para lembrar que incidentes reais raramente respeitam horários redondos.

O café aparece porque toda grande investigação de produção possui três elementos inevitáveis:

Logs
Hipóteses
Cafeína

E há um quarto elemento não documentado:

Alguém dizendo:
“Isso nunca aconteceu antes.”

Na prática, quando alguém pronuncia essa frase, procure um ticket semelhante aberto três anos antes.

Provavelmente ele existe.


Perguntas de entrevista

O que é Forward Recovery no CICS?

É o processo de reconstrução de um dataset danificado, normalmente restaurando um backup consistente e aplicando registros de alterações posteriores até atingir o ponto de recuperação desejado.

Qual é a diferença entre Forward Recovery e Backout?

Backout desfaz alterações de uma transação incompleta. Forward Recovery reaplica alterações sobre um backup para reconstruir um dataset perdido ou corrompido.

Por que o backup sozinho pode ser insuficiente?

Porque ele representa o estado do arquivo no momento em que foi criado. Todas as atualizações posteriores precisam ser recuperadas por outros registros, como journals apropriados.

Em que situações o Forward Recovery pode ser necessário?

Em casos como:

  • falha de volume;

  • corrupção de dataset;

  • perda de mídia;

  • dano físico no armazenamento;

  • necessidade de reconstrução de arquivo crítico.

Qual é o papel do journal?

Preservar informações sobre alterações que podem ser aplicadas depois da restauração do backup.

O que deve ser validado após a recuperação?

Estrutura, quantidade de registros, chaves, totais financeiros, consistência de índices, funcionamento das transações e reconciliação com sistemas relacionados.


Checklist do detetive de produção

Antes da falha:

[ ] Existe backup?
[ ] O backup foi testado?
[ ] Journaling está configurado?
[ ] Os logs estão protegidos?
[ ] O RPO está definido?
[ ] O RTO está definido?
[ ] O procedimento está documentado?
[ ] A equipe treinou a recuperação?
[ ] Existem contatos de escalonamento?
[ ] O negócio conhece os impactos?

Durante a falha:

[ ] Registrar o horário
[ ] Preservar evidências
[ ] Suspender atualizações
[ ] Identificar o dataset
[ ] Confirmar a natureza da falha
[ ] Encontrar o último backup válido
[ ] Localizar os journals necessários
[ ] Executar o runbook

Depois da recuperação:

[ ] Validar registros
[ ] Reconciliar totais
[ ] Testar leituras
[ ] Testar atualizações
[ ] Monitorar transações
[ ] Comunicar o negócio
[ ] Documentar a causa
[ ] Atualizar o procedimento
[ ] Realizar post-mortem

A conclusão de Sherlock Holmes

Forward Recovery não é apenas um comando, um utilitário ou uma função isolada do CICS.

É uma estratégia.

Ela começa muito antes da falha, quando a empresa decide:

  • como produzir backups;

  • como registrar alterações;

  • onde armazenar cópias;

  • quanto dado pode perder;

  • quanto tempo pode ficar parada;

  • quem será chamado;

  • como validar a recuperação.

Quando o incidente acontece, não é hora de inventar a solução.

É hora de executar aquilo que já foi planejado.

Para o programador COBOL iniciante, a principal lição é compreender que um sistema transacional possui camadas.

Seu programa pode executar:

READ
WRITE
REWRITE
DELETE

Mas a sobrevivência desses dados depende de uma arquitetura maior:

COBOL
  ↓
CICS
  ↓
VSAM
  ↓
Logging e Journaling
  ↓
Backup
  ↓
Storage
  ↓
Recuperação
  ↓
Continuidade do negócio

Quando todas essas peças trabalham juntas, uma falha física não precisa se transformar em perda irreversível.

O dataset pode ser reconstruído.

As transações podem voltar.

O negócio pode continuar.

E o jovem programador, observando os logs como pistas espalhadas pela Baker Street do IBM Z, finalmente compreende que o mainframe não é apenas uma máquina que processa dados.

É uma fortaleza construída para preservar a história de cada transação.

Porque, no mundo dos sistemas críticos, cada registro conta.

Cada journal é uma testemunha.

Cada backup é uma fotografia.

E toda recuperação bem-sucedida começa com a pergunta certa:

“O que aconteceu depois da última cópia confiável?”

Elementar, meu caro programador 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...