SISTEMA/MÓDULO: SYSMO S1 / CONFIGURACOES ASSUNTO: CORRUPÇÃO DE BASE DE DADOS VERSÃO: 1.01 DATA: 11/06/2007 1 OBJETIVO O objetivo deste guia é o de servir como referência sobre as causas de corrupção de bases de dados, bem como cuidados a serem tomados para evitá-las. Possui também instruções sobre como corrigir bases em Firebird que estejam danificadas. 2 POSSÍVEIS CAUSAS DE CORRUPÇÃO DA BASE DE DADOS Falha de hardware (placa mãe, processador, memória, disco, placa de rede). Pode ser uma falha momentânea ou contínua. Instalação elétrica incorreta (fio terra eletrificado, tensão incorreta, etc.). Desligar o servidor (por falta de energia, etc.) ou Resetar manualmente o servidor enquanto existem transações abertas com o banco de dados (clientes trabalhando). Desligar o sistema gerenciador de banco (SGBD) ou Matar o seu processo enquanto existem transações abertas com o banco de dados (clientes trabalhando). No caso de estar sendo usado o FirebirdSS (Super-Server) para Linux, não ter sido instalado a versão "ntpl" do Firebird [1]. Falha do sistema operacional. Se for Linux, isso é um fato raro. Ter a opção "forced writes", do banco de dados em Firebird, desligada [2]. Fazer uma cópia física da base de dados sem ter sido interrompido o gerenciador de banco e/ou fechado todas as conexões com o banco. 3 COMO EVITAR CORRUPÇÃO DA BASE DE DADOS Ter o servidor ligado a um No-Break. Este deve suportar oscilações de energia e manter o servidor funcionando em caso de queda de energia. Verificar regularmente a energia elétrica que alimenta o servidor. Usar no servidor somente hardware (placa mãe, memória, processador, disco, placa de rede) de qualidade (Dell, HP, IBM, Intel, etc.). Testar regularmente toda memória RAM do servidor. Para isso use um software adequado. Usar como sistema operacional uma versão recente do Linux. Ter servidor dedicado, rodando somente o SGBD. Usar um firewall para impedir qualquer conexão com o servidor que não seja conexão com o banco de dados. Nunca desligar ou Resetar o servidor enquanto existirem conexões ativas com o banco de dados. Nunca interromper ou Matar o gerenciador de banco enquanto existirem conexões ativas com o banco de dados. Dar acesso (físico) ao servidor somente a pessoas autorizadas (super-usuário). No caso de estar sendo usado o FirebirdSS (Super-Server) para Linux, usar a versão "ntpl" [1]. Ter a opção "forced writes", do banco de dados em Firebird, ligada [2]. Nunca fazer uma cópia física da base de dados sem ter sido interrompido o gerenciador de banco. 1
4 COMO CORRIGIR UMA BASE EM FIREBIRD QUE ESTEJA CORROMPIDA 4.1 No Linux: Retirar todos os usuários do sistema Retirar o cabo da rede com o objetivo de impedir novas conexões com o banco de dados Acessar o Linux (via console) como usuário "root" Entrar no diretório onde estão os dados (normalmente /sysmo/sysmovs/dados/ ) Digitar: # /etc/init.d/firebird stop # cp dados.fdb dados.cop # /etc/init.d/firebird start # /opt/firebird/bin/gfix -mend -full -ignore dados.fdb # /opt/firebird/bin/gfix -mend -full -ignore dados.fdb # /opt/firebird/bin/gbak -B -G -IG -L -V dados.fdb dados.gbk # /opt/firebird/bin/gbak -C -O -P 8192 -R -V dados.gbk dados.fdb No final do processo de restauração deverá aparecer a seguinte mensagem, caso contrário significa que houve algum problema no processo: gbak: finishing, closing, and going home. 4.2 No Windows: Retirar todos os usuários do sistema Retirar o cabo da rede com o objetivo de impedir novas conexões com o banco de dados Parar o serviço do Firebird Acessar o Windows como usuário administrador Abrir um terminal do MS-DOS Entrar no diretório onde estão os dados (normalmente c:\sysmovs\dados\ ) Digitar: copy dados.fdb dados.cop Iniciar o serviço do Firebird Digitar: c:\arquivos de programas\firebird\firebird_1_5\bin\gfix -mend -full -ignore dados.fdb -user sysdba -pas <senha_do_banco> c:\arquivos de programas\firebird\firebird_1_5\bin\gfix -mend -full -ignore dados.fdb -user sysdba -pas <senha_do_banco> c:\arquivos de programas\firebird\firebird_1_5\bin\gbak -B -G -IG -L -V dados.fdb dados.gbk -user sysdba -pas <senha_do_banco> c:\arquivos de programas\firebird\firebird_1_5\bin\gbak -C -O -P 8192 -R -V dados.gbk dados.fdb -user sysdba -pas <senha_do_banco> No final do processo de restauração deverá aparecer a seguinte mensagem, caso contrário significa que houve algum problema no processo: gbak: finishing, closing, and going home. 2
4.3 Observações: Caso esteja usando o Firebird CS no Linux (versão do Firebird a ser usada em máquinas multiprocessadas), os procedimentos para "interromper" e "ativar" o Firebird são diferentes das descritas acima [1]. Neste caso deve ser interrompido/ativado o serviço xinet do Linux. Para mais informações, leia o arquivo "linux/fb/instalacao.doc" disponível no CD de instalação da Sysmo. No Linux, ao rodar o "gfix", verifique o processo do mesmo através do utilitário "top". Caso ele esteja ocupando constantemente mais de 95% da CPU e o disco não esteja trabalhando (0.0% de "wa"), provavelmente ele esteja trancado. Neste caso não adianta deixar rodando indefinidamente, pois existe algum problema sério na base que deve ser corrigido antes [4]. No Windows, ao rodar o "gfix", verifique o processo do mesmo através do utilitário "Gerenciador de Tarefas do Windows". Caso ele esteja ocupando constantemente mais de 95% da CPU provavelmente ele esteja trancado. Neste caso não adianta deixar rodando indefinidamente, pois existe algum problema sério na base que deve ser corrigido antes [4]. Se uma base de dados possui tabelas com registros duplicados (isso somente acontece se a base estiver com problemas), descobre-se isso somente na hora de voltar o backup. Neste caso, anote o RDB$PRIMARY, volte à base original (cópia física) e procure qual tabela está com os índices duplicados. Ao rodar o "gfix" aparecer à mensagem "unavailable database", significa que o serviço do Firebird esta parado. Inicie o serviço e execute o comando novamente. Ao rodar o "gfix" aparecer à mensagem "Connection lost to database", significa que a conexão com a base de dados foi perdida. Ocorre quando existe algum problema sério na base que deve ser corrigido antes. Essa mensagem pode parar o serviço do Firebird automaticamente 5 COMO FAZER (DICAS PARA O FIREBIRD) 5.1 Como acessar a base de dados usando o utilitário isql no Linux Acessar como usuário "root", entrar no diretório onde estão os dados e digitar: # /opt/firebird/bin/isql dados.fdb Para sair digite: exit; 5.2 Como acessar a base de dados usando o utilitário isql no Windows Abrir um terminal do MS-DOS, entrar no diretório onde estão os dados e digitar: c:\arquivos de programas\firebird\firebird_1_5\bin\isql" -user sysdba -pas <senha_do_banco> dados.fdb Para sair digite: exit; 5.3 Como descobrir tabela a que pertence determinado índice primário (exemplo) select RDB$RELATION_NAME from RDB$INDICES where RDB$INDEX_NAME = 'RDB$PRIMARY1'; 3
5.4 Como descobrir quais campos fazem parte da chave primária de uma tabela (exemplos) show index TRSTIP01; show index GCEPRO02; show index PDVCUP02; Obs: A chave primária é descrita na linha que começa com "RDB$PRIMARY". 5.5 Como descobrir se uma determinada tabela está com registros duplicados (exemplos) select COD, count(*) from GCEPRO02 group by COD having count(*)>1; select EMP, DTA, PDV, NUM, FIN, SEQ, count(*) from PDVCUP02 group by EMP, DTA, PDV, NUM, FIN, SEQ having count(*) > 1; select EMP, DTA, PDV, NUM, BAR, count(*) from PDVCUP01 group by EMP, DTA, PDV, NUM, BAR having count(*) > 1; Obs: Caso este comando não apresente nenhum resultado, crie um novo índice que contenha os campos da chave primária e repita o comando. Logo após exclua o índice criado. Os procedimentos para fazer isso estão descritos nos itens abaixo. 5.6 Como apagar registros duplicados (exemplos) A dica anterior, mostrou como listar os registros excluídos. Anote-os e depois exclua os registros usando o comando "delete". Exemplo: delete from GCEPRO02 where COD = 3215; delete from GCEPRO02 where COD = 8786; delete from PDVCUP01 where EMP=123 and PDV = 23 and NUM = 56403 and BAR 321; delete from PDVCUP01 where EMP=123 and PDV = 23 and NUM = 67825 and BAR 925; delete from PDVCUP01 where EMP=124 and PDV = 11 and NUM = 21658 and BAR 33; Obs: Tenha muito cuidado ao executar estes comandos. 5.7 Como criar um índice (exemplos) create index TRSTIP01_999 on TRSTIP01 (COD); create index GCEPRO02_999 on GCEPRO02 (COD); create index PDVCUP02_999 on PDVCUP02 (EMP,DTA,PDV,NUM,FIN,SEQ); create index PDVCUP01_999 on PDVCUP01 (EMP, DTA, PDV, NUM, BAR); 5.8 Como excluir um índice (exemplos) drop index TRSTIP01_999; drop index GCEPRO02_999; drop index PDVCUP02_999; 4
5.9 Como descobrir que índices estão inativos select RDB$INDEX_NAME from RDB$INDICES where RDB$INDEX_INACTIVE=1; 5.10 Como ativar um determinado índice inativo (exemplo) alter index GCEITM01_002 active; Obs: execute o utilitário "fixadb" para ativar todos os índices inativos. 6 OBSERVAÇÕES Está disponível na Intranet da Sysmo (somente para funcionários e representantes) uma documentação à ser usada durante a instalação do sistema em servidores Linux [3]. Nela consta itens à serem verificados que visam garantir um correto funcionamento do gerenciador de dados e do Sysmo S1. Quando o SGBD usado for o Firebird, analise periodicamente o seu arquivo de logs de ocorrências em "firebird.log", arquivo este que se encontra no diretório onde foi instalado o Firebird. Dessa maneira pode-se descobrir se está ocorrendo algum problema que esteja afetando o gerenciador e, por sua vez, a base de dados. 7 NOTAS [1] Os scripts de instalação do Firebird para Linux fornecidos pela Sysmo já instalam a versão CS. [2] Com esta opção desligada, a base de dados fica mais sensível a falhas externas (falta de luz, reset, etc). Para ativar essa opção veja a documentação disponível na Intranet da Sysmo [3]. [3] Link "Documentações->Produtos->Sysmo S1->Configurações->Checklist Instalação S1 Linux". [4] Existe o útilitário IBFirstAID para análise e correção da base. Este utilitário é vendido pela empresa IBSurgeon. 5