O que é o catálogo DB2

O catálogo é um banco de dados interno do DB2, acessível via SQL normal. Todas as tabelas ficam no schema SYSIBM e são atualizadas automaticamente pelo DB2 sempre que você cria, altera ou apaga objetos, roda utilitários ou faz BIND de programas.

🦕 Analogia: Pense no catálogo como a planta de um prédio: ela não é o prédio em si, mas descreve cada sala, cada porta, cada instalação. Quando você precisa saber quantas tomadas tem a sala 302, você consulta a planta — não desmonta a parede.

As principais famílias de tabelas do catálogo:

Tabela O que descreve
SYSIBM.SYSTABLESTabelas, views e aliases
SYSIBM.SYSCOLUMNSColunas de cada tabela
SYSIBM.SYSINDEXESÍndices definidos
SYSIBM.SYSKEYSColunas que compõem cada índice
SYSIBM.SYSTABLESPACETablespaces e seus atributos
SYSIBM.SYSPLANPlanos de acesso (resultado do BIND PLAN)
SYSIBM.SYSDBRMMódulos DBRM dentro de cada plano
SYSIBM.SYSPACKAGEPacotes (resultado do BIND PACKAGE)
SYSIBM.SYSPACKSTMTStatements SQL dentro de cada pacote
SYSIBM.SYSCOPYHistórico de COPY, REORG e RECOVER
SYSIBM.SYSTABLEAUTHAutorizações de acesso a tabelas
SYSIBM.SYSDBAUTHAutorizações de banco de dados
Dica: Você só pode ler o catálogo — nunca execute UPDATE ou DELETE nessas tabelas diretamente. O DB2 as mantém internamente. Tentativas de modificação são rejeitadas com erro.

SYSIBM.SYSTABLES — tabelas e views

SYSTABLES lista todos os objetos tabulares: tabelas reais (T), views (V), aliases (A) e tabelas de trabalho internas. As colunas mais úteis:

Coluna Tipo Significado
NAMECHAR(18)Nome da tabela
CREATORCHAR(8)Schema (owner)
TYPECHAR(1)T=tabela, V=view, A=alias, G=tabela global temporária
DBNAMECHAR(8)Database DB2 ao qual pertence
TSNAMECHAR(8)Tablespace onde a tabela reside
CARDFFLOATNúmero estimado de linhas (atualizado pelo RUNSTATS)
NPAGESINTEGERNúmero de páginas usadas
REMARKSVARCHAR(254)Comentário definido com COMMENT ON

Exemplos de consulta:

-- Listar todas as tabelas de um schema
SELECT NAME, TSNAME, CARDF, NPAGES
  FROM SYSIBM.SYSTABLES
 WHERE CREATOR = 'BANCODB2'
   AND TYPE    = 'T'
 ORDER BY NAME;

-- Encontrar tabelas pelo nome (parcial)
SELECT CREATOR, NAME, TSNAME
  FROM SYSIBM.SYSTABLES
 WHERE NAME LIKE 'CONTA%'
   AND TYPE = 'T'
 ORDER BY CREATOR, NAME;

-- Tabelas com estatísticas desatualizadas (CARDF = -1)
SELECT CREATOR, NAME
  FROM SYSIBM.SYSTABLES
 WHERE CARDF = -1
   AND TYPE  = 'T'
 ORDER BY CREATOR, NAME;
CARDF = -1 significa que o RUNSTATS nunca foi executado para essa tabela. O otimizador usará estimativas padrão, o que pode resultar em planos ruins.

SYSIBM.SYSCOLUMNS — colunas e tipos

SYSCOLUMNS descreve cada coluna de cada tabela. É a primeira consulta a fazer quando você herda um programa sem documentação e precisa entender a estrutura de uma tabela.

Coluna Tipo Significado
TBNAMECHAR(18)Nome da tabela
TBCREATORCHAR(8)Schema da tabela
NAMECHAR(18)Nome da coluna
COLNOSMALLINTPosição da coluna (começa em 1)
COLTYPECHAR(8)Tipo: INTEGER, CHAR, VARCHAR, DECIMAL, DATE...
LENGTHSMALLINTTamanho em bytes
SCALESMALLINTCasas decimais (para DECIMAL)
NULLSCHAR(1)Y=aceita NULL, N=NOT NULL
DEFAULTCHAR(1)Y=tem default, N=não tem
DEFAULTVALUEVARCHAR(254)Valor default definido
REMARKSVARCHAR(254)Comentário da coluna
-- Estrutura completa de uma tabela
SELECT COLNO, NAME, COLTYPE, LENGTH, SCALE, NULLS
  FROM SYSIBM.SYSCOLUMNS
 WHERE TBCREATOR = 'BANCODB2'
   AND TBNAME    = 'CONTA_CORRENTE'
 ORDER BY COLNO;

-- Procurar coluna pelo nome em todas as tabelas
SELECT TBCREATOR, TBNAME, COLNO, COLTYPE, LENGTH
  FROM SYSIBM.SYSCOLUMNS
 WHERE NAME = 'NR_AGENCIA'
 ORDER BY TBCREATOR, TBNAME;
🦕 Uso real: Você recebeu um DCLGEN antigo e não tem certeza se bate com a tabela atual. Consulte SYSCOLUMNS e compare coluna a coluna. Diferença na ordem de COLNO ou no tipo indica que a tabela mudou e o DCLGEN precisa ser regerado.

SYSIBM.SYSINDEXES e SYSKEYS — índices

SYSINDEXES lista os índices existentes. SYSKEYS detalha quais colunas compõem cada índice e em que ordem. As duas tabelas se juntam por IXNAME e IXCREATOR.

SYSIBM.SYSINDEXES — colunas principais

Coluna Significado
NAMENome do índice
CREATORSchema do índice
TBNAMETabela indexada
TBCREATORSchema da tabela
UNIQUERULEU=único, D=duplicatas permitidas, P=chave primária
CLUSTERINGY=clustering index, N=non-clustering
CLUSTERRATIOPercentual de clustering (0–100, -1 se sem RUNSTATS)
NLEAFNúmero de páginas folha do B-tree
NLEVELSNúmero de níveis do B-tree
FIRSTKEYCARDFCardinalidade da primeira coluna do índice
FULLKEYCARDFCardinalidade da chave completa

SYSIBM.SYSKEYS — colunas do índice

Coluna Significado
IXNAMENome do índice (FK para SYSINDEXES.NAME)
IXCREATORSchema do índice
COLNAMENome da coluna participante
COLNOPosição na tabela
ORDERINGA=ASC, D=DESC
COLSEQOrdem desta coluna dentro do índice (1, 2, 3...)
-- Todos os índices de uma tabela com suas colunas
SELECT I.NAME         AS INDICE,
       I.UNIQUERULE,
       I.CLUSTERING,
       I.CLUSTERRATIO,
       K.COLSEQ,
       K.COLNAME,
       K.ORDERING
  FROM SYSIBM.SYSINDEXES I
  JOIN SYSIBM.SYSKEYS    K
    ON K.IXNAME    = I.NAME
   AND K.IXCREATOR = I.CREATOR
 WHERE I.TBCREATOR = 'BANCODB2'
   AND I.TBNAME    = 'CONTA_CORRENTE'
 ORDER BY I.NAME, K.COLSEQ;

-- Índices com cluster ratio baixo (candidatos a REORG)
SELECT TBCREATOR, TBNAME, NAME, CLUSTERRATIO
  FROM SYSIBM.SYSINDEXES
 WHERE CLUSTERING    = 'Y'
   AND CLUSTERRATIO >= 0
   AND CLUSTERRATIO  < 85
 ORDER BY CLUSTERRATIO;
Cluster ratio abaixo de 80% é um sinal de que o REORG é necessário. Use essa consulta como parte de um monitoramento semanal automatizado.

SYSIBM.SYSTABLESPACE — tablespaces

SYSTABLESPACE descreve os tablespaces — os containers físicos onde as tabelas vivem. Cada tablespace pode conter uma ou mais tabelas (dependendo do tipo: simple, segmented ou partitioned).

Coluna Significado
NAMENome do tablespace
DBNAMEDatabase ao qual pertence
PARTITIONSNúmero de partições (0 = não particionado)
PGSIZETamanho da página em KB (4, 8, 16 ou 32)
LOCKSIZEGranularidade de lock: ANY, ROW, PAGE, TABLESPACE
LOCKMAXLimite de locks antes da escalada (0=SYSTEM)
CLOSEY=fechado quando não usado (economia de recursos)
COMPRESSY=compressão ativa
STATUSFlags de estado: RO=read-only, RW=read-write
INSTANCEContador de REORGs executados
-- Tablespaces com lock no nível de página (candidatos a ROW)
SELECT DBNAME, NAME, LOCKSIZE, LOCKMAX, PGSIZE
  FROM SYSIBM.SYSTABLESPACE
 WHERE LOCKSIZE <> 'ROW'
 ORDER BY DBNAME, NAME;

-- Tablespaces particionados
SELECT DBNAME, NAME, PARTITIONS, PGSIZE, COMPRESS
  FROM SYSIBM.SYSTABLESPACE
 WHERE PARTITIONS > 0
 ORDER BY DBNAME, NAME;

SYSIBM.SYSPLAN e SYSDBRM — planos e módulos

Quando você executa BIND PLAN, o DB2 registra o plano em SYSPLAN e cada módulo DBRM vinculado em SYSDBRM. Isso é fundamental para rastrear qual versão de um programa está em produção.

SYSIBM.SYSPLAN

Coluna Significado
NAMENome do plano (definido no BIND PLAN)
CREATORUsuário que fez o BIND
BINDDATEData do último BIND
BINDTIMEHora do último BIND
ISOLATIONNível de isolamento: UR/CS/RS/RR
VALIDATEB=na hora do BIND, R=em runtime
EXPLAINY=EXPLAIN foi rodado durante o BIND
OPERATIVEY=plano válido e operacional, N=inoperante (precisa REBIND)

SYSIBM.SYSDBRM

Coluna Significado
NAMENome do módulo DBRM (geralmente igual ao programa COBOL)
PLNAMEPlano ao qual pertence
PRECOMPData da pré-compilação do programa
VERSIONVersão do DBRM
-- Planos com BIND recente (últimos 7 dias)
SELECT NAME, CREATOR, BINDDATE, BINDTIME, ISOLATION, OPERATIVE
  FROM SYSIBM.SYSPLAN
 WHERE BINDDATE >= CHAR(CURRENT DATE - 7 DAYS, ISO)
 ORDER BY BINDDATE DESC, BINDTIME DESC;

-- Planos inoperantes (precisam de REBIND)
SELECT NAME, CREATOR, BINDDATE
  FROM SYSIBM.SYSPLAN
 WHERE OPERATIVE = 'N'
 ORDER BY NAME;

-- Ver qual DBRM está dentro de um plano
SELECT D.NAME     AS DBRM,
       D.PLNAME   AS PLANO,
       D.PRECOMP  AS DT_PRECOMP
  FROM SYSIBM.SYSDBRM D
 WHERE D.PLNAME = 'PGMCONTA'
 ORDER BY D.NAME;
⚠️ OPERATIVE = 'N' significa que o plano se tornou inválido — tipicamente porque uma tabela foi alterada (ALTER TABLE) ou um índice foi criado/removido depois do BIND. O programa vai falhar em runtime. Execute REBIND PLAN antes de subir para produção.

SYSIBM.SYSPACKAGE — pacotes

Ambientes modernos usam BIND PACKAGE em vez de BIND PLAN direto. Cada programa COBOL gera um pacote independente, e um plano lista esses pacotes. Isso permite rebind de um único programa sem recompilar o plano inteiro.

Coluna Significado
COLLIDCollection ID (agrupa pacotes relacionados)
NAMENome do pacote (geralmente o programa COBOL)
VERSIONVersão do pacote
CREATORUsuário que fez o BIND
BINDDATEData do último BIND
ISOLATIONNível de isolamento
OPERATIVEY=válido, N=precisa de REBIND
VALIDY=sintaticamente válido, N=inválido
-- Todos os pacotes de uma collection
SELECT COLLID, NAME, VERSION, BINDDATE, ISOLATION, OPERATIVE
  FROM SYSIBM.SYSPACKAGE
 WHERE COLLID = 'BANCODB2'
 ORDER BY NAME;

-- Pacotes inoperantes na collection
SELECT COLLID, NAME, BINDDATE
  FROM SYSIBM.SYSPACKAGE
 WHERE COLLID    = 'BANCODB2'
   AND OPERATIVE = 'N'
 ORDER BY NAME;

-- Verificar o que está dentro de um pacote (statements SQL)
SELECT SEQNO, STMTNO, SECTNO,
       SUBSTR(STMT, 1, 80) AS SQL_INICIO
  FROM SYSIBM.SYSPACKSTMT
 WHERE COLLID = 'BANCODB2'
   AND NAME   = 'PGMCONTA'
 ORDER BY SEQNO;
💗 Plano vs Pacote: Imagine o plano como uma pasta de trabalho e os pacotes como documentos dentro dela. Nos anos 80 tudo era BIND PLAN direto. Hoje o padrão é BIND PACKAGE por programa + um plano que inclui a collection. Assim, para fazer REBIND de um único programa, você rebinda só o pacote dele — não precisa tocar no plano nem nos outros pacotes.

SYSIBM.SYSCOPY — histórico de backup

SYSCOPY registra toda operação de COPY, REORG, RECOVER e LOAD executada em tablespaces e índices. É a tabela que o DB2 consulta internamente para saber qual backup usar durante um RECOVER.

Coluna Significado
DBNAMEDatabase DB2
TSNAMETablespace (ou index space)
DSNAMEDataset de saída do COPY
ICTYPEF=full copy, I=incremental copy, R=REORG, Q=quiesce
TIMESTAMPTimestamp da operação
SHRLEVELNONE/REFERENCE/CHANGE (disponibilidade durante o COPY)
STYPEespaço: S=tablespace, I=index space
DSVOLSERVolume onde o dataset está
DEVTYPE3590/CART/etc
-- Último COPY de cada tablespace de um database
SELECT TSNAME,
       MAX(TIMESTAMP) AS ULTIMO_COPY,
       MAX(ICTYPE)    AS TIPO
  FROM SYSIBM.SYSCOPY
 WHERE DBNAME  = 'BANCODB2'
   AND ICTYPE  IN ('F', 'I')
   AND STYPE   = 'S'
 GROUP BY TSNAME
 ORDER BY ULTIMO_COPY DESC;

-- Histórico completo de um tablespace
SELECT ICTYPE, TIMESTAMP, DSNAME, SHRLEVEL
  FROM SYSIBM.SYSCOPY
 WHERE DBNAME = 'BANCODB2'
   AND TSNAME = 'TSCONTA'
 ORDER BY TIMESTAMP DESC
 FETCH FIRST 20 ROWS ONLY;

-- Tablespaces SEM COPY nos últimos 30 dias (risco de DR)
SELECT T.DBNAME, T.NAME AS TSNAME
  FROM SYSIBM.SYSTABLESPACE T
 WHERE T.DBNAME = 'BANCODB2'
   AND NOT EXISTS (
       SELECT 1
         FROM SYSIBM.SYSCOPY C
        WHERE C.DBNAME    = T.DBNAME
          AND C.TSNAME    = T.NAME
          AND C.ICTYPE    = 'F'
          AND C.TIMESTAMP >= CHAR(CURRENT TIMESTAMP - 30 DAYS, ISO)
   )
 ORDER BY T.NAME;
⚠️ Tablespace sem COPY recente é um risco de recuperação de desastre. Em caso de falha, o DB2 só consegue recuperar até o último COPY full. Se o COPY tem 60 dias, você perde 60 dias de dados do log. Monitore esta consulta regularmente.

Consultas práticas do dia a dia

As consultas abaixo são usadas regularmente em ambientes de produção para diagnóstico e auditoria.

Quais tabelas existem no tablespace X?

SELECT CREATOR, NAME, CARDF, NPAGES
  FROM SYSIBM.SYSTABLES
 WHERE DBNAME = 'BANCODB2'
   AND TSNAME = 'TSCONTA'
 ORDER BY NAME;

Qual tablespace e database contêm a tabela X?

SELECT CREATOR, NAME, DBNAME, TSNAME
  FROM SYSIBM.SYSTABLES
 WHERE NAME = 'CONTA_CORRENTE';

Quais índices cobrem a coluna X?

SELECT K.IXNAME, K.COLSEQ, K.ORDERING,
       I.UNIQUERULE, I.CLUSTERING
  FROM SYSIBM.SYSKEYS    K
  JOIN SYSIBM.SYSINDEXES I
    ON I.NAME    = K.IXNAME
   AND I.CREATOR = K.IXCREATOR
 WHERE I.TBCREATOR = 'BANCODB2'
   AND I.TBNAME    = 'CONTA_CORRENTE'
   AND K.COLNAME   = 'NR_AGENCIA'
 ORDER BY K.IXNAME, K.COLSEQ;

Quando foi o último BIND do programa X?

SELECT NAME, COLLID, BINDDATE, BINDTIME, OPERATIVE
  FROM SYSIBM.SYSPACKAGE
 WHERE NAME = 'PGMCONTA'
 ORDER BY BINDDATE DESC, BINDTIME DESC
 FETCH FIRST 1 ROW ONLY;

Quantas linhas cada tabela tem (resumo de cardinalidade)?

SELECT CREATOR, NAME,
       DECIMAL(CARDF, 15, 0) AS LINHAS_ESTIMADAS
  FROM SYSIBM.SYSTABLES
 WHERE CREATOR = 'BANCODB2'
   AND TYPE    = 'T'
   AND CARDF  >= 0
 ORDER BY CARDF DESC;

Verificar autorizações em uma tabela

SELECT GRANTEE, GRANTOR, SELECTAUTH, INSERTAUTH,
       UPDATEAUTH, DELETEAUTH, ALTERAUTH
  FROM SYSIBM.SYSTABLEAUTH
 WHERE TCREATOR = 'BANCODB2'
   AND TTNAME   = 'CONTA_CORRENTE'
 ORDER BY GRANTEE;

Acessando o catálogo em programas COBOL

Você pode acessar o catálogo em qualquer programa COBOL com DB2 embutido, da mesma forma que acessa qualquer tabela. A diferença é que as tabelas SYSIBM não têm DCLGEN — você declara as variáveis host manualmente ou usa DCLGEN explícito.

Exemplo: verificar se uma tabela existe antes de processar

       WORKING-STORAGE SECTION.

       01  WS-NOME-TABELA         PIC X(18).
       01  WS-CREATOR             PIC X(8).
       01  WS-QTD                 PIC S9(9) COMP.

           EXEC SQL
               SELECT COUNT(*)
                 INTO :WS-QTD
                 FROM SYSIBM.SYSTABLES
                WHERE CREATOR = :WS-CREATOR
                  AND NAME    = :WS-NOME-TABELA
                  AND TYPE    = 'T'
           END-EXEC

           EVALUATE SQLCODE
               WHEN 0
                   IF WS-QTD = 0
                       DISPLAY 'TABELA NAO ENCONTRADA'
                   ELSE
                       PERFORM PROCESSAR-DADOS
                   END-IF
               WHEN OTHER
                   DISPLAY 'ERRO AO CONSULTAR CATALOGO: '
                           SQLCODE
           END-EVALUATE

Exemplo: listar colunas de uma tabela em runtime

       WORKING-STORAGE SECTION.

       01  WS-COLNO               PIC S9(4) COMP.
       01  WS-COLNAME             PIC X(18).
       01  WS-COLTYPE             PIC X(8).
       01  WS-LENGTH              PIC S9(4) COMP.
       01  WS-NULLS               PIC X(1).

       PROCEDURE DIVISION.

           EXEC SQL
               DECLARE CSR-COLUNAS CURSOR FOR
               SELECT COLNO, NAME, COLTYPE, LENGTH, NULLS
                 FROM SYSIBM.SYSCOLUMNS
                WHERE TBCREATOR = :WS-CREATOR
                  AND TBNAME    = :WS-NOME-TABELA
                ORDER BY COLNO
           END-EXEC

           EXEC SQL OPEN CSR-COLUNAS END-EXEC

           PERFORM UNTIL SQLCODE <> 0
               EXEC SQL
                   FETCH CSR-COLUNAS
                     INTO :WS-COLNO, :WS-COLNAME,
                          :WS-COLTYPE, :WS-LENGTH, :WS-NULLS
               END-EXEC
               IF SQLCODE = 0
                   DISPLAY WS-COLNO
                           ' '
                           WS-COLNAME
                           ' '
                           WS-COLTYPE
               END-IF
           END-PERFORM

           EXEC SQL CLOSE CSR-COLUNAS END-EXEC
🟣 Avançado: Programas de geração automática de relatórios usam o catálogo para descobrir em runtime quais colunas uma tabela tem, gerar cabeçalhos e formatar saída dinamicamente. É raro, mas existe em frameworks internos de mainframe de grandes bancos — útil quando a estrutura da tabela muda frequentemente e não se quer manter listas de colunas no código.
Performance: O catálogo é indexado pelo DB2, mas evite fazer FULL TABLE SCAN em SYSCOLUMNS ou SYSPACKSTMT em hora de pico — essas tabelas podem ter centenas de milhares de linhas em ambientes grandes. Sempre filtre por TBCREATOR/TBNAME ou COLLID/NAME.