Bom, todo DBA que se prese deve acompanhar o crescimento da base conforme o tempo. Prever o espaço em disco necessário nos próximos meses, saber qual época ocorre maior crescimento da base. Acompanhar de perto objetos críticos que ocupam mais espeço, etc. É claro que a própria Oracle e outros fornecedores possuem ferramentas bastente sofisticadas para fazer algumas destas coisas. É bem verdade que boa parte delas faz em maior ou menor grau algo bem semelhante ao que vou mostrar adiante. No entanto, eu gosto da minha solução, pois eu consigo entendê-la facilmente e modificar para necessidades específicas. No mínimo é um bom exercício de aprendizado.

Vejamos alguns requisitos que eu montei:

  • Ser compatível com pelo menos o Oracle 8 em diante;
  • Armazenar todas informações num tablespace separado, para que a coleta de dados não influencie nos demais tablespaces;
  • Utilizar um esquema separado para a criação de todos os objetos envolvidos. O usuário em questão deverá ser bloqueado e ter o mínimo de privilégios necessários;
  • Criar uma tabela para registrar a data de duração no disparo de cada script e outra para os erros que por ventura venham a ocorrer;
  • Coletar as seguintes informações com as respectivas periodicidades:
    • Dados sobre o tamanho dos tablespaces uma vez por mês;
    • Dados sobre a quantidade e tipo de objetos por esquema uma vez por dia, atualizando apenas as mudanças ocorridas;
    • Nome dos objetos inválidos auma vez por dia, atualizando apenas as mudanças ocorridas;
    • Tamanhode objetos que ocupem mais de 64MB ou tenham mais de 50 extents ou mais de um milhão de registros uma vez por semana, atualizando apenas as mudanças ocorridas;

Objetos

CREATE TABLESPACE 'DBA_LOG_DADOS'
  DATAFILE '/u01/oradata/nome_da_base/dba_log_dados_01.dbf'
  SIZE 100M LOGGING EXTENT MANAGEMENT LOCAL SEGMENT SPACE MANAGEMENT AUTO;
 
CREATE USER dba_log IDENTIFIED BY dba
    DEFAULT TABLESPACE dba_log_dados
    QUOTA UNLIMITED ON dba_log_dados
    ACCOUNT LOCK;
 
GRANT CREATE PROCEDURE TO dba_log;
GRANT CREATE TABLE TO dba_log;
 
-- Executar como SYSDBA
GRANT SELECT ON dba_objects TO dba_log;
GRANT SELECT ON dba_segments TO dba_log;
GRANT SELECT ON dba_data_files TO dba_log;
GRANT SELECT ON dba_free_space TO dba_log;
GRANT SELECT ON dba_tables TO dba_log;
 
CREATE SEQUENCE dba_log.log_seq;
 
CREATE TABLE dba_log.log(
    id_log      number(10),
    rotina      varchar2(100),
    usuario     varchar2(30) DEFAULT USER,
    inicio      date DEFAULT SYSDATE,
    fim         date,
    CONSTRAINT  log_pk PRIMARY KEY(id_log)
);
 
CREATE TABLE dba_log.erros (
    id_log      number(10),
    cod_erro    number(10),
    mensagem     varchar2(64),
    DATA        TIMESTAMP DEFAULT SYSTIMESTAMP
);
 
CREATE TABLE dba_log.tablespace (
    nome        varchar2(30),
    maximo      number(8) NOT NULL,
    alocado     number(8) NOT NULL,
    utilizado   number(8) NOT NULL,
    livre       number(8) NOT NULL,
    DATA        date DEFAULT SYSDATE,
    CONSTRAINT tablespaces_pk PRIMARY KEY (nome,DATA)
);
 
CREATE OR REPLACE PROCEDURE dba_log.tablespace_load AS
  v_log_seq number(10);
  v_code number(10);
  v_errm varchar2(64);
BEGIN
 
  SELECT dba_log.log_seq.NEXTVAL INTO v_log_seq FROM dual;
  INSERT INTO dba_log.log (id_log, rotina) VALUES (v_log_seq,'tablespace_load');
 
  INSERT INTO dba_log.tablespace (nome, maximo, alocado, utilizado, livre)
    SELECT
      u.tablespace_name,
      m.maximo,
      m.alocado,
      u.utilizado,
      l.livre
      FROM
        (SELECT tablespace_name, CEIL (SUM (bytes) / 1048576) utilizado
           FROM dba_segments
           GROUP BY tablespace_name) u,
        (SELECT
           tablespace_name,
           CEIL (SUM (bytes) / 1048576) alocado,
           CEIL (SUM (DECODE (autoextensible, 'NO', bytes, maxbytes)) / 1048576) maximo
           FROM dba_data_files
           GROUP BY tablespace_name) m,
        (SELECT
           tablespace_name,
           CEIL (SUM (bytes) / 1048576) livre
           FROM dba_free_space
           GROUP BY tablespace_name) l
      WHERE
        l.tablespace_name = u.tablespace_name AND
        l.tablespace_name = m.tablespace_name
    ;
  UPDATE dba_log.log SET fim = SYSDATE WHERE id_log = v_log_seq;
  COMMIT;
 
  EXCEPTION
    WHEN OTHERS THEN
      v_code := SQLCODE;
      v_errm := SUBSTR(SQLERRM, 1 , 64);
      INSERT INTO dba_log.erros (id_log, cod_erro, mensagem) VALUES (v_log_seq, v_code, v_errm);
END;
/
 
CREATE TABLE dba_log.objeto_qt (
    tipo        varchar2(19),
    esquema     varchar2(30),
    STATUS      varchar2(7),
    qt          number(5) NOT NULL,
    DATA        date DEFAULT SYSDATE,
    CONSTRAINT objeto_qt_pk PRIMARY KEY (tipo, esquema, STATUS, DATA)
);
 
CREATE OR REPLACE PROCEDURE dba_log.objeto_qt_load AS
  v_log_seq number(10);
  v_code number(10);
  v_errm varchar2(64);
BEGIN
  SELECT dba_log.log_seq.NEXTVAL INTO v_log_seq FROM dual;
  INSERT INTO dba_log.log (id_log, rotina) VALUES (v_log_seq,'objeto_qt_load');
 
  INSERT INTO dba_log.objeto_qt (tipo, esquema, STATUS, qt)
    SELECT b.tipo, b.esquema, b.STATUS, b.qt
      FROM
        (SELECT object_type tipo, owner esquema, STATUS FROM dba_objects
           MINUS
           SELECT tipo, esquema, STATUS FROM dba_log.objeto_qt) a,
        (SELECT object_type tipo, owner esquema, STATUS, count(*) qt
           FROM dba_objects
           GROUP BY owner, object_type, STATUS) b
      WHERE
        a.tipo = b.tipo AND
        a.esquema = b.esquema AND
        a.STATUS = b.STATUS
      ORDER BY esquema, tipo, STATUS
   ;
 
  INSERT INTO dba_log.objeto_qt (tipo, esquema, STATUS, qt)
    SELECT o.tipo, o.esquema, o.STATUS, o.qt
      FROM
        dba_log.objeto_qt q,
        (SELECT object_type tipo, owner esquema, STATUS, count(*) qt
           FROM dba_objects
           GROUP BY owner, object_type, STATUS) o,
        (SELECT tipo, esquema, STATUS, max(DATA) DATA
           FROM dba_log.objeto_qt
           GROUP BY tipo, esquema, STATUS) d
      WHERE
        o.tipo = q.tipo AND
        o.tipo = d.tipo AND
        o.esquema = q.esquema AND
        o.esquema = d.esquema AND
        o.STATUS = q.STATUS AND
        o.STATUS = d.STATUS AND
        q.DATA = d.DATA AND
        o.qt != q.qt
        ORDER BY o.esquema, o.tipo, o.STATUS
  ;
  UPDATE dba_log.log SET fim = SYSDATE WHERE id_log = v_log_seq;
  COMMIT;
 
  EXCEPTION
    WHEN OTHERS THEN
      v_code := SQLCODE;
      v_errm := SUBSTR(SQLERRM, 1 , 64);
      INSERT INTO erros (id_log, cod_erro, mensagem) VALUES (v_log_seq, v_code, v_errm);
END;
/
 
CREATE TABLE dba_log.objeto_invalido (
    tipo        varchar2(19),
    esquema     varchar2(30),
    nome        varchar2(128),
    DATA        date DEFAULT SYSDATE,
    CONSTRAINT objeto_invalido_pk PRIMARY KEY (tipo, esquema, nome, DATA)
);
 
CREATE OR REPLACE PROCEDURE dba_log.objeto_invalido_load AS
  v_log_seq number(10);
  v_code number(10);
  v_errm varchar2(64);
 
BEGIN
  SELECT dba_log.log_seq.NEXTVAL INTO v_log_seq FROM dual;
  INSERT INTO dba_log.log (id_log, rotina) VALUES (v_log_seq,'objeto_invalido_load');
  INSERT INTO dba_log.objeto_invalido (tipo, esquema, nome)
    SELECT object_type tipo, owner esquema, object_name nome
      FROM dba_objects
      WHERE STATUS != 'VALID'
    MINUS
    SELECT tipo, esquema, nome FROM dba_log.objeto_invalido
  ;
  UPDATE dba_log.log SET fim = SYSDATE WHERE id_log = v_log_seq;
  COMMIT;
 
  EXCEPTION
    WHEN OTHERS THEN
      v_code := SQLCODE;
      v_errm := SUBSTR(SQLERRM, 1 , 64);
      INSERT INTO dba_log.erros (id_log, cod_erro, mensagem) VALUES (v_log_seq, v_code, v_errm);
END;
/
 
CREATE TABLE dba_log.objeto_tamanho (
    tipo        varchar2(19),
    tablespace  varchar2(30),
    esquema     varchar2(30),
    nome_part   varchar2(112),
    tamanho     number(8),
    extents     number(5),
    num_reg     number(10),
    DATA        date DEFAULT SYSDATE,
    CONSTRAINT objetos_tamanho_pk PRIMARY KEY (tipo, esquema, nome_part, DATA)
);
 
CREATE OR REPLACE PROCEDURE dba_log.objeto_tamanho_load AS
  v_log_seq number(10);
  v_code number(10);
  v_errm varchar2(64);
 
BEGIN
 
  SELECT dba_log.log_seq.NEXTVAL INTO v_log_seq FROM dual;
  INSERT INTO dba_log.log (id_log, rotina) VALUES (v_log_seq,'objeto_tamanho_load');
 
  INSERT INTO dba_log.objeto_tamanho 
    (tipo, tablespace, esquema, nome_part, tamanho, extents, num_reg)
    SELECT b.tipo, b.tablespace, b.esquema, b.nome_part, b.tamanho, b.extents, b.num_reg
    FROM
      (SELECT
         segment_type tipo,
         owner esquema,
         NVL2(partition_name, segment_name || '/' || partition_name, segment_name) nome_part
         FROM dba_segments
      MINUS
      SELECT tipo, esquema, nome_part FROM dba_log.objeto_tamanho) a,
      (SELECT
        s.segment_type tipo,
        s.tablespace_name tablespace,
        s.owner esquema,
        NVL2(s.partition_name, s.segment_name || '/' || s.partition_name, s.segment_name) nome_part,
        CEIL(s.bytes/1048576) tamanho,
        s.extents,
        t.num_rows num_reg
        FROM
          dba_segments s,
          dba_tables t
       WHERE
         (s.bytes > 67108864 OR s.extents > 50 OR t.num_rows > 1000000) AND
          s.owner = t.owner (+)AND
          s.segment_name = t.table_name (+)) b
    WHERE
      a.tipo = b.tipo AND
      a.esquema = b.esquema AND
      a.nome_part = b.nome_part
  ;    
 
  INSERT INTO dba_log.objeto_tamanho 
    (tipo, tablespace, esquema, nome_part, tamanho, extents, num_reg)
    SELECT o.tipo, o.tablespace, o.esquema, o.nome_part, o.tamanho, o.extents, o.num_reg
      FROM
        dba_log.objeto_tamanho l,
        (SELECT tipo, esquema, nome_part, max(DATA) DATA
          FROM dba_log.objeto_tamanho
          GROUP BY tipo, esquema, nome_part) d,
        (SELECT
          s.segment_type tipo,
          s.tablespace_name tablespace,
          s.owner esquema,
          NVL2(s.partition_name, s.segment_name || '/' || s.partition_name, s.segment_name) nome_part,
          CEIL(s.bytes/1048576) tamanho,
          s.extents,
          t.num_rows num_reg
          FROM
            dba_segments s,
            dba_tables t
          WHERE
            (s.bytes > 67108864 OR s.extents > 50 OR t.num_rows > 1000000) AND
            s.owner = t.owner (+)AND
            s.segment_name = t.table_name (+)) o
      WHERE
        l.tipo = d.tipo AND
        l.tipo = o.tipo AND
        l.esquema = d.esquema AND
        l.esquema = o.esquema AND
        l.nome_part = d.nome_part AND
        l.nome_part = o.nome_part AND
        l.DATA = d.DATA AND
        (o.tamanho != CEIL(l.tamanho) OR l.extents != o.extents OR l.num_reg != o.num_reg)
      ORDER BY o.esquema, o.tablespace, o.tipo DESC
  ;
  UPDATE dba_log.log SET fim = SYSDATE WHERE id_log = v_log_seq;
  COMMIT;
 
  EXCEPTION
    WHEN OTHERS THEN
      v_code := SQLCODE;
      v_errm := SUBSTR(SQLERRM, 1 , 64);
      INSERT INTO dba_log.erros (id_log, cod_erro, mensagem) VALUES (v_log_seq, v_code, v_errm);
END;
/

Agendamento

Se você estiver utilizando o Oracle 10g ou superior, deve preferir usar o SCHEDULER:

BEGIN
 
  DBMS_SCHEDULER.CREATE_WINDOW(
    window_name=>'SYS.MONTH_START_WINDOW',
    resource_plan=>'SYSTEM_PLAN',
    start_date=>SYSTIMESTAMP,
    duration=>numtodsinterval(240, 'minute'),
    repeat_interval=>'FREQ=MONTHLY;BYMONTHDAY=1;BYHOUR=3',
    end_date=>null,
    window_priority=>'LOW',
    comments=>'Start of the month window for maintenance task'
  );
 
  DBMS_SCHEDULER.CREATE_JOB(
    job_name => 'DBA_LOG.TABLESPACE_LOAD_MENSAL',
    job_type => 'STORED_PROCEDURE',
    job_action => 'DBA_LOG.TABLESPACE_LOAD',
    schedule_name => 'SYS.MONTH_START_WINDOW',
    enabled => TRUE
  );
 
  DBMS_SCHEDULER.SET_ATTRIBUTE(
    name => '"DBA_LOG"."TABLESPACE_LOAD_MENSAL"',
    attribute => 'job_priority',
    value => 4
  );
 
  DBMS_SCHEDULER.CREATE_JOB(
    job_name => 'DBA_LOG.OBJETO_TAMANHO_LOAD_SEMANAL',
    job_type => 'STORED_PROCEDURE',
    job_action => 'DBA_LOG.OBJETO_TAMANHO_LOAD',
    schedule_name => 'SYS.WEEKEND_WINDOW',
    enabled => TRUE
  );
 
  DBMS_SCHEDULER.SET_ATTRIBUTE(
    name => 'DBA_LOG.OBJETO_TAMANHO_LOAD_SEMANAL',
    attribute => 'job_priority',
    value => 4
  );
 
  DBMS_SCHEDULER.CREATE_JOB(
    job_name => 'DBA_LOG.OBJETO_INVALIDO_LOAD_DIARIO',
    job_type => 'STORED_PROCEDURE',
    job_action => 'DBA_LOG.OBJETO_INVALIDO_LOAD',
    schedule_name => 'SYS.WEEKNIGHT_WINDOW',
    enabled => TRUE
  );
 
  DBMS_SCHEDULER.SET_ATTRIBUTE(
    name => 'DBA_LOG.OBJETO_INVALIDO_LOAD_DIARIO',
    attribute => 'job_priority',
    value => 4
  );
 
  DBMS_SCHEDULER.CREATE_JOB(
    job_name => 'DBA_LOG.OBJETO_QT_LOAD_DIARIO',
    job_type => 'STORED_PROCEDURE',
    job_action => 'DBA_LOG.OBJETO_QT_LOAD',
    schedule_name => 'SYS.WEEKNIGHT_WINDOW',
    enabled => TRUE
  );
 
  DBMS_SCHEDULER.SET_ATTRIBUTE(
    name => 'DBA_LOG.OBJETO_QT_LOAD_DIARIO',
    attribute => 'job_priority',
    value => 4
  );
 
END;
/

Se estiver utilizando o Oracle 9i ou inferiro, terá que utilizar os JOBs para agendar a coleta de dados:

VARIABLE jobno NUMBER;
BEGIN
  DBMS_JOB.SUBMIT(:jobno, 'BEGIN DBA_LOG.OBJETO_QT_LOAD; END;',
    TRUNC(SYSDATE) + 1/24, 'TRUNC(SYSDATE) + 1/24 + 30');
  COMMIT;
END;
/
 
VARIABLE jobno NUMBER;
BEGIN
  DBMS_JOB.SUBMIT(:jobno, 'BEGIN DBA_LOG.TABLESPACE_LOAD; END;',
    TRUNC(SYSDATE) + 1/24, 'TRUNC(SYSDATE + 30,''MONTH'') + 1/24');
  COMMIT;
END;
/
 
VARIABLE jobno NUMBER;
BEGIN
  DBMS_JOB.SUBMIT(:jobno, 'BEGIN DBA_LOG.OBJETO_TAMANHO_LOAD; END;',
    TRUNC(SYSDATE) + 1/24, 'NEXT_DAY(TRUNC(SYSDATE), ''SATURDAY'') + 1/24');
  COMMIT;
END;
/
 
VARIABLE jobno NUMBER;
BEGIN
  DBMS_JOB.SUBMIT(:jobno, 'BEGIN DBA_LOG.OBJETO_INVALIDO_LOAD; END;',
    TRUNC(SYSDATE) + 1/24, 'TRUNC(SYSDATE) + 25/24');
  COMMIT;
END;
/
 
VARIABLE jobno NUMBER;
BEGIN
  DBMS_JOB.SUBMIT(:jobno, 'BEGIN DBA_LOG.OBJETO_QT_LOAD; END;',
    TRUNC(SYSDATE) + 1/24, 'TRUNC(SYSDATE) + 25/24');
  COMMIT;
END;
/

Conclusão

Com os dados coletados nas tabelas, você só precisa agora exercitar um pouco do seu conhecimento de SQL para fazer consultas criativas e gerar relatórios dos mais diversos e entregar para o seu chefe no final do ano. Não, adianta nada criar os objetos agora e tentar fazer mágica. Após um anos, você poderá observar com alguma precisão a sazonalidade das aplicações e fazer boas projeções. Que tal começar o ano com um mínimo de coleta de dados na sua base? Quando a turma do ITIL bater na sua porta, algumas coisas já estarão encaminhadas para o seu lado.

Tags: , ,

Comments Nenhum comentário »

É muito comum ter várias aplicações numa única base do Oracle organizadas por esquemas. Se for este o seu caso, você se verá com alguma frequência para migrar um esquema inteiro da base de produção para homologação, do teste para homologação e por aí vai. Exportar os objetos e importar é muito simples, tanto com utilizando o IMP e EXP comuns até a versão 9i como com o Data Pump no 10g em diante:

Com o imp e exp:

exp usuario@nome_base_origem file=dump_esquema.dmp owner=nome_esquema
imp usuario@nome_base_destino file=dump_esquema.dmp fromuser=nome_esquema touser=nome_esquema

Com o data pump:

expdp usuario@nome_base_origem dumpfile=data_pump_dir dumpfile=dump_esquema.dmp schemas=nome_esquema
impdp usuario@nome_base_destino dumpfile=data_pump_dir dumpfile=dump_esquema.dmp schemas=nome_esquema

Bom, até aí não há muito motivo para espanto, é algo trivial. O detalhe é quando você precisa apagar todos os objetos já existentes antes de importar os novos. Para isso, um pouco de SQL sempre ajuda:

SELECT 'DROP TABLE ' || owner || '.' || table_name || ' CASCADE CONSTRAINTS;'
  FROM dba_tables
  WHERE owner = 'NOME_ESQUEMA'';
 
SELECT 'DROP ' || object_type || ' ' || owner || '.' || object_name || ';'
  FROM dba_objects
  WHERE
    object_type != 'PACKAGE BODY' AND
    owner = 'NOME_ESQUEMA';

É claro que você poderia criar uma função para fazer tudo isso (limpar os objetos e importar o dump) numa tacada só. Mas eu diria que dois comandos SQLs não são motivo para tanto. :-)

Tags: ,

Comments Nenhum comentário »

. Hello Goodbye

O celular toca pela segunda vez, melhor ir logo. Interrompo o meu chefe no telefone e peço para ir embora. Sem problemas. Saio do prédio e logo alcanço a Avenida Paulista. Decidi não pegar o metrô. Precisava de um tempo antes de chegar ao hospital. Melhor ir caminhando. Sempre senti que caminhar pela Avenida Paulista me traz um pouco de paz de espírito. Claro, isso se ela não estiver lotada de gente como na hora do hush. Mas é cedo ainda, as calçadas largas estão vazias. Embora cercado por um mar de prédios, a sensação é como a de se andar pelo calçadão de uma praia. Praia de paulista, um mar de concreto.

Lembro-me de empinar pipa na praia. Aprendi com ele a juntar algumas varetas e papel de seda para fazer uma pipa. Nunca usei cerol. A graça era subir a pipa. Ou melhor, a graça mesmo era construir a pipa. Fazer arranjos de cores diferentes, formatos diferentes. Lembro-me de fazer uma pipa em forma de estrela. Ganhei linha de pesca, o que me conferia alguma imunidade contra outras pipas mais agressivas. Uma herança paterna muito forte foi a aversão pelas por prejudicar os outros. Era a seu modo um pacifista nato. Nada de brigas, soco ou pontapé. Parece estranho isso, mas nunca fui de brigar na rua. Nunca tomei iniciativa de combate corporal. Já com as palavras, as coisas sempre foram muito diferentes. Herdei um instinto que foi lapidado pelos anos de defender com unhas e dentes tudo aquilo em que acredito que é certo. Ele sempre foi assim. Nunca hesitou ou fugiu da raia. Não teve medo de represálias. Uma vez apareceu no jornal por isso. Ele abusou da diabetes numa discussão acalorada em público. Sua glicemia baixou e ele desmaiou. Ele sempre estava lutando por alguma coisa. Por aquilo que achava correto, por aquilo que ele acredita que é o melhor para todos, não apenas para ele. Até o final de 2007, mesmo após transplantes, enfarte, fraturas, ele estava lá no conselho estadual de saúde. Brigando por aquilo que acreditava.

Foi num destes dias em que fui encontra-lo na saída de uma reunião do conselho que eu o vi pela primeira vez de terno e gravata. Apesar de ter me acostumado com a visão de um homem de camisa, calça e sapatos brancos… eu até hoje só tinha o visto de terno nas suas fotos do casamento, nunca mais. Fora do trabalho, camiseta, bermuda, tênis ou chinelo. Ele me disse que como o secretário de saúde sempre usava terno e gravata, ele se sentia mais a vontade conversando de igual para igual. Estava mais sereno, não esbravejava tanto. Uma manifestação de grevistas do lado de fora e…, não ele não estava no carro de som. Mas estava lá na mesa do conselho. Mas lembro bem de tempos mais conturbados, ainda no inicio da década de 80. Nos pediam para não se aventurar para fora do prédio. O dia seria agitado era dia de ação. Não sabia muito bem o que acontecia, nem o que era a ditadura militar. Anos depois, as coisas fariam mais sentido.

Ele sempre assistia a TV junto comigo, mesmo a novela e os programas bestas que criança adora, como os seriados japoneses. Ele era do tempo do Nacionaro Kid e eu do Spectra Man. Meu filho gosta dos Power Rangers… pois é. Mas em uma coisa as 3 gerações se encontram… todos adoramos o Pica-Pau. Quando assistíamos a novela ou o jornal, muitas vezes era cansativo. Tudo era alvo de crítica, tudo havia uma intencionalidade por trás. Lembro dele contar que ao contrário do que dizia o repórter do Jornal Nacional, apesar de greve dos médicos poder provocar a morte de alguns pacientes, os maus salários e a má gestão da saúde pública, mata muito mais gente… hoje as pessoas se preocupam mesmo é com o trânsito.

Logo passo pela Rua Augusta, lembro-me da minhas primeiras aventuras fotográficas por ali. Fui fotografar os carros a noite. Ganhei minha câmera já com uns 18 anos. Uma monoreflex moderna, bem diferente das antigas Minoltas dele. Mas ele me deu apenas uma lente, uma 50mm. Foi com ela que eu aprendi a fotografar antes de comprar outras lentes. Ganhei alguns filtros antigos dele também. O meu predileto sempre foi o polarizador que encaixa na minha 50mm e tenho até hoje. Guardei por muito tempo o ampliador P&B que ele tinha. Nunca tive espaço para montar um pequeno laboratório. Quando me casei e deixei de morar em apartamento, já não havia mais nenhuma peça praticamente. Ainda resta uma ou outra lente do ampliador. Eu adorava queimar papel com elas usando a luz do sol quando era pequeno. Meu pai tinha caixas e caixas de slides, negativos, fotos, albuns etc e tal. Na parede de casa sempre tinha as nossas fotos na parede. Menos a dele, é claro. Ele estava sempre fotografando. Suas fotos sempre fizeram parte da nossa infância. Ainda guardo comigo as minhas fotos da minha infância num dos albuns que montaram para cada um dos filhos.

O sol da Avenida Paulista se mistura com o vento frio canalizado entre os prédios. Algumas nuvens escuras deixam claro que a chuva virá mais tarde. Resolvo parar no McDonalds para comer algo no caminho. Não é hora de almoço ainda, não há filas. Me lembro da primeira vez que fui no McDonalds no Shopping Morumbi recém inaugurado. Realmente meu pai era um diabético que curtiu a vida. A gente sempre adorou Junk Food. Antes íamos ao Jack In The Box, que faliu numa ação clara de Trust do McDonalds que chegou no Brasil com um preço bem abaixo da concorência. Na última vez que fomos no Jack In The Box, meu pai já quase que se despedia do lugar. Até Junk Food servia para uma aula de economia. Trust, Monopólio, Cartel, coisas que nunca são citadas nas aulas de micro-economia-na-ilha-de-Robinson-Crusoe estavam em pauta lá na lanchonete.

Eu demorei para entender porquê meus amigos da escola eram tão mais abastados do que eu. Eles voltavam das férias contando sobre as suas viagens para a Disneilandia, Europa, Buzios enquanto eu ia para Itanhaém onde conseguiamos um canto emprestado de um amigo ou parente. Nunca tivemos patrimônio. Nem casa própria, nem ações, nem poupança.

Mas tivemos uma vida emocionante. Viajamos quase todo ano, almoçamos fora, íamos ao cinema, Play Center, Ibirapuera, e um montão de coisas que podiam parecer pequenas perto da opulência dos amigos da escola, mas é muito mais do que a maioria deles já teve. Pais que estavam sempre conosco. Um pai que levava todos os amigos para passear de moto, que fazia minhas pipas e pintava as bolhas dos meus carrinhos de autorama. Não posso esquecer dos passeios de bicicleta. Um montão de moleques indo pela Avenida Iburapuera com meu pai atrás na Caloi 10 dele. Sim senhor, tem coisas que não se podem comprar. Pais assim não tem preço. Foram tantas as histórias, como a caça aos ovos no prédio que culminou com o tesouro de um ovo enorme… parecia ter um metro de altura para mim. As festas de aniversário com meu pai de DJ, efeitos especiais de iluminação e tudo o mais.

Terminei de comer rápido, a ansiedade e o stress sempre me deram fome. Não que eu coma muito mais do que quando pequeno. Mas antes eu não tinha a vida sedentária de hoje. Uma vez depois de um longo dia no clube chegamos em casa, meus pais exaustos e eu querendo brincar… meu pai me mandou ir correr 4 voltas pelo quarteirão… e eu fui, dei lá umas 15 voltas. Eu sempre fui guloso mesmo. Queria o doce mais caro, um salgadinho a mais… e não me lembro de me negarem algo. É claro que tudo tinha limite. Mas meu pai era um negociador habilidoso. Não era bem um “não”. Era uma negociação para um futuro “sim”, um “sim” mais viável.

Verdade seja dita é que meu pai não se tornou pediatra ao acaso. Depois de conhecer o neto, meu pai me dizia que gostava de criança em qualquer época da vida. Bebê, criança, adolescente. Não havia como duvidar. Foi um bom pediatra sem dúvida. As consultas sempre demoravam 40, 60 minutos. Longas conversas com os pais, conversas com as crianças também. É notável que ele sempre pareceu ter um talento natural para isso. Nunca apanhei, uma vez na verdade. Mas ele me pediu desculpa horas depois. Mas numa das piores coisas que já aprontei não mereceram sermão. Ele apenas olhou para a minha cara com decepção e falou uma ou duas palavras. Mas eu nunca mais esqueci disso.

Na saída, arrematei uma casquinha e me pus a comer no caminho. Um pouco mais adiante contei as moedas e comprei um maço de cigarros. Engraçado imaginar alguém que optou tão cedo pela vida breve e farta nunca ter fumado ou bebido. O seu vicio era o mais letal para alguém com Diabete Juvenil: o açúcar. E junto com ele, curtimos a vida adoidado. E nunca o vi se arrepender da sua opção. Nos 10 anos que se seguiram do infarte e inversão de papeis dentro do hospital, nunca o vi reclamar, nunca o vi resmungar, exeto é claro, da qualidade da comida. Estava sempre de bom humor. Chegamos a comemorar seu aniversário no hospital com violão e tudo o mais. Não fosse isso, certamente ele não teria sobrevivido a tantas intervenções: infarte, catarata, glaucoma na vista, transplante de córnea, 2 anos e tanto de hemodiálise, transplante de rim e pâncreas, fratura de um fêmur, fratura do outro, sangramentos na retina, escaras no calcanhar, etc. etc, etc. Sim, muita vontade de viver. E digo mais. Engana-se quem pense que fora do hospital ficou parado. Lembro-me de ir ver o Iamandú Costa, numa reedição da “Rua do Choro”. Não teve o Altamiro Carrilho, como outrora, mas estavamos lá. E sempre me contava de um show, de um lugar, de uma viagem uma teoria sobre a conjuntura política mundial e por aí vai. Diria que seu vício mesmo, sempre foi a vida.

É duro pensar como passei um tempão sem ver tanto dele em mim. Depois de perder uma filha, num carro que ele mesmo dirigia, perdeu um ano depois a esposa. Não posso avaliar a sua vida como marido, não cabe a mim fazer este tipo de comentário. Mas eu fiquei magoado nesta época. Eu tinha os meus 18 anos, estava ganhando o mundo, meu primeiro emprego sério, com bom salário e coisa e tal. Não queria dele os defeitos, suas piadas que se repetiam, sua forma dura de defender suas convicções. Fui morar com a minha mãe e me afastei muito. Mas ele se casou de novo, e a este casamento ele certamente deve uma nova vida perdura até hoje. Tomou rumo e foi alguns anos depois que a diabetes começou a cobrar seu preço com juros. E foi na sua forma de encarar tudo que eu o reencontrei como uma pessoa fantástica, com um sem número de amigos leais que eu nunca tinha ouvido falar. Com bom humor perante os infortúnios e com mais sabedoria. Passei a admitir que também gosto de filmes da Sessão da Tarde e não apenas dos filmes Cult do Espaco Unibanco. É claro que tenho que lhe creditar o fato dele ter me levado para assistir na cinemateca o “Mon uncle” do Jacques Tati e outras pérolas como o Frankstein original em P&B.

Alias, foi na adolescência que me vi escutando os antigos discos em vinil do meu pai. Não eram apenas a coleção dos Beatles que nunca deixei de escutar. Foi o Deep Purple, o Credence Clewater, The Who, os discos da Marcus Pereira, do Milton, Chico e Elis, do Beethoven e tantos outros. O aparelho de som que ganhei lá pelos meus 12 ou 13 anos ainda funciona e hoje é meu filho que está com ele. Já tem bem uns 20 anos e sobrevive firme e forte. E hoje sou eu quem mostro o Pink Floyd, o Led Zeppelin e claro, os Beatles para ele escutar no seu Ipod, que ele liga no aparelho de som que ele me deu.

Passo pelo Masp. Penso se meus filhos também pegarão meus discos emprestados, irão em museus por conta própria, colocarão uma barraca nas costas e sairão para viajar sem destino como eu. Será que eles também carregarão um pouco das minhas histórias neles mesmos? Será que alguma influência positiva ficará para eles? É claro que eu nunca fui tão inteligente quanto ele. Minha mão me dizia que o apelido dele antes de entrar na faculdade era o de “barsinha”. De fato, um conhecimento vasto sobre um pouco de tudo. Passou em 5º lugar na faculdade de medicina da USP, fez mestrado e começou o doutorado. É claro que ele não foi fazer mestrado em saúde pública a tôa. A opção pelo público, a opção pela luta de classes foi clara. E é claro que foi minha mãe quem lhe trouxe esta influência. Mas ele a levou até o fim. Na epopéia de consultas em médicos de todos os tipos em que ele foi se tratar após o infarte, conheci muitos dos seus colegas de faculdade. Todos estão bem de vida, tem um padrão bem mas confortável. Ele não. É claro que ele nunca juntou dinheiro. Mas a opção não foi apenas por viver cada dia como se fosse o último: não optou por uma carreira de prestígio como especialista como seus colegas também brilhantes. Optou pela saúde pública, pelas melhores condições nos postos de saúde, por investigar a questão da desnutrição infantil.

Foi assim que ele se viu em sua tese de mestrado. O mestrado levou incríveis 5 anos para ser concluído. Pesquisa quantitativa e qualitativa. O transferiram mais de uma vez para que ele não concluísse um ciclo satisfatório de coleta de dados… o tema do mestrado? Uma crítica sobre os programas de distribuição de leite em pó. Um assunto que não agradou muita gente com muito dinheiro. Depois de 5 anos de trabalho, não teve nota 10 com louvor. A banca lhe conferiu nota 8 e apenas o orientador nota 10. Hoje não se dá mais notas. Mas para quem conheceu o sistema da época, sabe que isso foi um tanto humilhante. Anos depois o doutorado falava sobre o aproveitamento de “refugo” do benefício de grãos em programas de combate a desnutrição infantil. Desta vez deram um jeito de lhe cortar a bolsa no meio da pesquisa e enfim ele teve que desistir. Não da vida pública, mas do doutorado. Não, não precisa lhe chamar de doutor. Este título não lhe cabe enfim, mas ele nunca fez questão deste tipo de coisa. Mesmo porquê… seu currículo, se bem me lembro, dava um catatau de folhas, umas 40, e ele não precisaria de doutorado para ser respeitado pela sua história de vida.

Sim, foi durante o mestrado que o primeiro computador apareceu em casa. Um CP 400 onde ele começou a escrever. Logo veio a impressora, uma P500, também da Prológica. E depois veio o Apple II e o Apple IIe e enfim o primeiro PC já era um 386sx. Uma vez ele me pegou desmontando o Apple… ficou uma fera. Demorou um tempo para eu parar de quebrar as coisas e começar a conserta-las. No começo eram os brinquedos, e logo eu já desmontava os eletrodomésticos e outras traquitanas. É claro que eu nem sempre conseguia montar tudo de novo…

Esse gosto por montar e desmontar começou cedo. Com brinquedos com porcas, parafusos, blocos, kits de montagem, etc. Mas uma das coisas mais bacanas era ajudar meu pai quando ele resolvia bancar o marceneiro. Tinha uma bancada Hobby, serra tico-tico, formão, furadeira, etc. No final, eu sempre me lembro da gente montando um novo portão para segurar os cachorros num canto do quintal, e eles sempre destruirem tudo no final. O último dos portões de madeira foi eu quem construí sozinho. Também foi destruído. Um serralheiro pois um ponto final na questão depois de anos. Estes dias estava eu construindo um novo estrado para a cama do meu filho, que foi destruído depois de tanto pularem na cama. O mais novo já está lá… sempre querendo ajudar e vez ou outra eu acho algo onde ele possa ver o produto do seu trabalho se concretizar. Sempre achei que o construtivismo lá da pedagogia vinha de alguma coisa assim…

Estou chegando no hospital, saio da Avenida Paulista. Acendo um último cigarro. Ando um pouco mais devagar. Sempre que eu vou vê-lo no hospital fico pensando num monte de coisas que eu gostaria de lhe dizer. Já ensaiei esta carta várias vezes. Durante a caminhada não poderia ser diferente. Quando chego lá, todos saem do quarto. Me deixam a sós com meu pai, como eu quisesse privacidade. A verdade é que nunca soube o que lhe dizer ao vivo. Escrevo tarde demais, agora. Na hora as palavras me faltam e mesmo agora as teclas vacilam várias vezes. Tanta coisa que pensei e lembrei e não escrevi. Acho que nunca poderei fazer jus ao meu pai. Nunca poderei lhe retribuir a altura. Não fui visitá-lo com freqüência, nem mesmo depois que neto nasceu. Mas espero que eu possa me desculpar sendo um bom pai também. Talvez eu tenha aprendido algo de bom e possa transmitir um pouco do carinho que recebi. Talvez meu filho também se canse de ouvir que eu o amo e da insistência por um abraço.

Não sei… mas sei que você, pai, não passa desapercebido pela vida. Deixou muita coisa viva em mim e em tantas pessoas que eu nem sei o nome. Sei que provavelmente você mesmo ainda vivo não possa mais ler ou ouvir estas palavras. Mas as deixo para o mundo. O mundo ao qual você me trouxe e me ensinou a viver nele. Um mundo de despedidas sim, mas de muitos encontros, como dizia o poeta. Um mundo cheio de contradições e injustiças das quais não conseguimos ainda nos desfazer, mas sobre tudo um mundo onde ainda se vale a pena viver e lutar por ele.

“And in the end
The love you take
Is equal to the love you make”

Lennon/McCartney

Comments 5 comentários »

merlinm: queries written by a computer always have certain features
lunk: such as ‘majorly sucking’
merlinm: thats what i was thinking, but didnt say it :-)

Essa é para quem acredita ainda que ferramentas de ORM possam ser eficientes ao escrever SQL. Conversando um dia destes com o Sr. David Fetter, ouvi um argumento no qual eu ainda não havia pensado: a Inteligência Artificial está longe de atingir um ponto onde o racínio humano possa ser substituido.

Tags: , ,

Comments Nenhum comentário »

Após ler o post do Sr. Eduardo Maçan, resolvi testar o Blip.fm . Devo dizer que ele é realmente divertido. A idéia de poder fazer uma rede social com as músicas que cada um mais gosta parece interessante. Eu de fato me cansei um pouco da redes sociais. Entrei no Orkut, no Multiply, no Via6, no LinkedIn, Last.fm e recentemente no Twitter. Achei que já estava saturado desse tipo de coisa. Pois é… mas numa tarde de véspera de feriado eu resolvi experimentar. E viciei. Pense numa música, coloque na busca e pimba: lá está ela, pronta para você e seus amigos ouvirem. Com amigos de bom gosto, você acaba ouvindo muita coisa boa. Nesta tarde rolou uma sessão extraordinária. Ainda estou com a música ainda fresca do duelo de banjos, dica do Maçan novamente.

A ferramenta só não é perfeita por alguns detalhes: não, não dá para baixar as músicas para a sua máquina, mas não é isso. Não dá para fazer o upload direto também, antes dava. Agora você tem que mandar o link para a música em algum lugar onde o mp3 já esteja hospedado. O resultado é que só encontro as músicas mais manjadas. As coisas mais interessantes de se colocar no Blip eu acabo não encontrando. Bom, não é perfeito… mas além de você encontrar muita coisa bacana, com bons DJs na sua lista, você pode escutar música sem parar. Realmente, bem legal para se conhecer coisas novas e relembrar coisas antigas. Fora o bate papo musical que rola com os amigos on-line!

Bom, ao fim e ao cabo, se você tem banda larga vale a pena experimentar.

Comments 1 comentário »