Reparar Banco local ( Firebird PDV emissor )

ANTES DE UTILIZAR AS FERRAMENTAS IBEXPERT E/OU FB RECOVERY

Avise o cliente que vai precisar mexer no banco de dados, é necessário fechar todos os PDV, Emissor e Integrador. O cliente poderá continuar usando Atendesmart na web, mas os executáveis PDV, Integrador, Emissor, etc, tem que fechar tudo, e sempre faça BKP.

No servidor, gerenciador de tarefas, serviços, interrompa o serviço Firebird (Parar).
O intuito de parar o serviço Firebird é interromper a conexão de qualquer terminal que possa estar com executável aberto consultando o banco de dados, por isso é fundamental informar o cliente e obter sua autorização para parar o sistema da loja.

Na pasta \banco , renomeie o arquivo banco de dados CONTROLP.FDB, pode alterar para qualquer nome aleatório.
O intuito de renomear o arquivo banco de dados é uma prevenção para o caso de, ao reativar o serviço Firebird, um possível software que estivesse conectado ao banco ocupe o arquivo novamente.

Na pasta \banco , faça uma cópia de segurança do banco de dados CONTROLP.FDB (CTRL+C e CTRL+V).

No gerenciador de tarefas, reative o serviço Firebird.

Após reativado Firebird no gerenciador de tarefas, volte à pasta \Banco e nomeie novamente o banco local como CONTROL.FDB (ou o nome em que a estrutura esteja implantada).

Após procedimento acima, o banco de dados CONTROLP.FDB estará desocupado para ser tratado pelo FB Recovery, dê prioridade para utilizar o FB Recovery para recuperar o banco de dados por se tratar de ferramenta mais amigável.

Existem casos onde rodar o FB Recovery, não é o suficiente para corrigir o banco… e nestes casos, é necessário um procedimento manual no banco, abaixo seguem os passos para recuperação manual de um banco local utilizando o Ibexpert

Se mesmo após procedimento acima o FB Recovery não conseguir concluir reparação com sucesso, siga os passos abaixo para utilizar o IBExpert.

CASOS EM QUE O FB RECOVERY NÃO CONSEGUE REALIZAR A REPARAÇÃO DE BANCO DE DADOS

É raro, mas dependendo da situação que se encontra o banco local do PDV, o FB Recovery não consegue concluir toda a reparação do arquivo. Nesses casos podemos contar com ferramenta mais robusta como IBExpert para realizar tal ação.

ANTES DE UTILIZAR AS FERRAMENTAS IBEXPERT E/OU FB RECOVERY

Avise o cliente que vai precisar mexer no banco de dados, é necessário fechar todos os PDV, Emissor e Integrador. O cliente poderá continuar usando Atendesmart na web, mas os executáveis PDV, Integrador, Emissor, etc, tem que fechar tudo, e sempre faça BKP.

No servidor, abra o IBExpert, no menu Services, clique na opção Database Shutdown, (caso nao seja possível, abra gerenciador de tarefas, serviços, interrompa o serviço Firebird (Parar) e repita o procedimento)
O intuito é interromper a conexão de qualquer terminal que possa estar com executável aberto consultando o banco de dados, por isso é fundamental informar o cliente e obter sua autorização para parar o sistema da loja, o shutdown ira permitir somente um conexão com o banco de dados, negando as demais conexões…

VALIDAR BANCO DE DADOS ATRAVES DO IBEXPERT

Navegue em IBExpert menu Services Database Validation.

Primeira parte da validação:
Ao abrir a tela, já virão marcados Validate Database e Validate Full, apenas altere VERBOSE para “To Screen” e aperte PLAY. O IBExpert responderá se encontrou erros ou não.

Segunda parte da validação:
A janela de Database Validation ainda estará aberta, retorne à aba OPTIONS, marque as opções Check Database, Ignore Checksum, Kill Shadows e Mend Database, DESMARQUE as opções usadas anteriormente: Validate database e Validate Full, e  aperte PLAY. O IBExpert responderá se encontrou erros ou não.

www.help.atendesmart.com.br-reparar-banco-00110-1 Reparar Banco local ( Firebird PDV emissor )

Se ao validar o banco aplicando as duas etapas acima, e o IBExpert retornar erros, repare o banco de dados.

Navegue em IBExpert, menu Services, Backup database.

Desmarque opção Garbage collection que normamente já virá marcada, marque a opção Ignore transactions in Limbo, no VERBOSE, marque On Screen e aperte START BACKUP. O Ibexpert criará na pasta onde está o arquivo banco de dados, um arquivo chamado controlp.fbk.
Conforme imagens abaixo.

Navegue em IBExpert, menu Services, Database Restore – restaura o CONTROLP.FDB com o arquivo BKP que vc criou.
Marque as opções Commit after each table, Replace Existing Database, Fix malforme UNICODE_FSS data using charsert e Fix malformed UNICODE_FSS data using charset.
Nas caixas de texto das opções FIX preencher o charset: ISO8859_1
Aperte Start Restore, o IBExpert solicitará uma senha, digite: masterkey , e confirme.
Conforme imagens abaixo.

Após isso, o banco deve estar online, mas certifique-se que o banco de dados está online, navegue no menu Services, database online, bring online, se estiver correto, deve aparecer um alerta informando que a base ja esta online… então, Pode testar o sistema, porem….

se a base não estava online…. significa que existem índices inativos

neste caso, execute este script abaixo, e execute novamente o backup / restore

delete from produto where ((nome = “NULL”) or (nome = null) or (nome =””));
delete from produto_variante pv where pv.codigo_interno_produto not in (select p.codigo_interno from produto p);
delete from produto_djpdv pj where pj.produto_id not in (select p.codigo_interno from produto p);
delete from tbl_cliente_endereco t where t.tbl_cliente_id not in (select c.codigo from cliente c);
delete from cliente_web t where t.cliente_id not in (select c.codigo from cliente c);
delete from tbl_produto_codigo pj where pj.tbl_produto_id not in (select p.codigo_interno from produto p);
delete from cabecalho_venda cv where cv.abertura_cod not in (select a.codigo_da_abertura from abertura_de_caixa a);
delete from cabecalho_do_cupom cc where cc.numero_do_cupom not in (select cv.cupom_cabecalho_cod from cabecalho_venda cv);
delete from caixa_numerario cn where cn.numerario_cod not in (select t.codigo from tipopagamento t);
update caixa_numerario cn set cn.numerario_cod = 1 where cn.numerario_cod not in (select codigo from tipopagamento);
delete from caixa_numerario cn where cn.caixa_abertura_cod not in (select t.codigo_da_abertura from abertura_de_Caixa t);
delete from tbl_diretiva_detalhe where tbl_diretiva_cod not in (select tbl_diretiva_cod from tbl_diretiva);
update fornecedor f set f.transportadora_cod = null where f.transportadora_cod not in (select f.codigo from fornecedor f);
delete from tbl_forn_prod t where t.produto_id not in (select p.codigo_interno from Produto p);
delete from estocagem e where e.codigo_do_local not in (select l.codigo from local_de_estocagem l);
update tbl_nfitem_usuario u set u.usuario_id = 1 where u.usuario_id not in (select a.usuario_cod from usuario a);
delete from tbl_nfitem ni where ni.tbl_nfitem_owner_id not in (select n.tbl_nf_id from tbl_nfitem n);
delete from tbl_nfitem ni where ni.tbl_nf_id not in (select n.tbl_nf_id from tbl_nf n);
delete from tbl_diretiva_detalhe t where t.componente_cod not in (select c.componente_cod from componente c);
update tbl_nfitem_usuario t set t.tbl_funcionario_id = (select min(fa.codigo) from funcionario fa) where t.tbl_funcionario_id not in (select f.codigo from funcionario f);
delete from tbl_nf_numero tn where tn.tbl_nf_id not in( select nf.tbl_nf_id from tbl_nf nf);
delete from tbl_nfitem_usuario tu where tu.tbl_nfitem_id not in( select nf.tbl_nfitem_id from tbl_nfitem nf);
delete from TBL_NFLOTENF t where t.tbl_nf_id not in( select n.tbl_nf_id from tbl_nf n);
delete from tbl_nfloteprotocolo t where t.tbl_nf_id not in( select n.tbl_nf_id from tbl_nf n);
delete from tbl_produto_codigo t where t.tbl_produto_id not in( select p.codigo_interno from produto p);
update venda v set v.tbl_tipo_desconto_id = null where v.tbl_tipo_desconto_id not in ( select t.tbl_tipo_desconto_id from tbl_tipo_desconto t);
delete from tbl_nfitem_usuario u where u.usuario_id not in (select usuario_cod from usuario);
delete from tbl_nfitem_usuario u where u.tbl_nfitem_usuario_id not in (select codigo from funcionario);
update caixa_numerario c set c.numerario_cod = null where c.numerario_cod not in (select t.codigo from tipopagamento t);
delete from tbl_nfdestinatario n where n.tbl_nf_id not in (select t.tbl_nf_id from tbl_nf t);
delete from abertura_de_caixa_web ac where ac.abertura_de_caixa_id not in (select aw.codigo_da_abertura from abertura_de_caixa aw);
delete from tbl_df d where d.tbl_atendimento_id not in (select cv.numero_cupom from CABECALHO_VENDA cv);
delete from forma_fechamento_caixa fc where fc.tipo_pagamento_cod not in (select t.codigo from tipopagamento t);
delete from cabecalho_venda_web cv where cv.cabecalho_venda_id not in (select cw.numero_cupom from cabecalho_venda cw);
delete from tbl_cab_venda_impr cv where cv.tbl_cabecalho_venda_id not in (select cw.numero_cupom from cabecalho_venda cw) ;
delete from detalhe_do_cupom dc where dc.nf_saida_detalhe_cod not in (select tbl_nfitem_id from TBL_NFITEM);
delete from tbl_nfitem dc where dc.tbl_nfitem_owner_id not in (select tbl_nfitem_ID from TBL_NFITEM);
update cliente p set p.taxa_cod = null where p.taxa_cod not in(select t.taxa_cod from taxas t) ;
delete from detalhe_do_cupom de where de.cupom_detalhe_cod not in (select i.codigo from venda i);
update USUARIO u set u.tbl_diretiva_cod = null where u.tbl_diretiva_cod not in (select t.tbl_diretiva_cod from tbl_diretiva t);
delete from cliente_web cw where cw.cliente_id not in (select c.codigo from cliente c);
delete from venda v where v.numero_cupom not in (select cv.numero_cupom from cabecalho_venda cv);
delete from venda_numerario v where v.venda_cabecalho_cod not in (select cv.cupom_cabecalho_cod from cabecalho_venda cv);
delete from usuario u where u.tbl_diretiva_cod not in (select d.tbl_diretiva_cod from tbl_diretiva d);
delete from tbl_atendimento_ident i where i.tbl_atendimento_id not in (select cv.numero_cupom from cabecalho_venda cv);
delete from tbl_nfdestinatario where tbl_pessoa_id not in (select codigo from cliente);
delete from tbl_cab_venda_impr;
delete from tbl_cab_venda_impr_resp;
delete from contas_a_receber cr where cr.tbl_nf_id not in (select n.tbl_nf_id from tbl_nf n);
delete from tbl_condicao_parcela tp where tp.condicao_cod not in (select c.condicao_cod from condicao c);
delete from venda_web vw where vw.venda_id not in(select v.codigo from venda v);
delete from produto_ifood i where i.produto_id not in (select p.codigo_interno from produto p);
delete from caixa_numerario_web cw where cw.caixa_numerario_id not in (select c.caixa_numerario_cod from caixa_numerario c);
delete from thread_estoque;
delete from tbl_venda_cont_impr;
delete from tbl_ifood_order o where o.cabecalho_venda_cod < (select min(c.numero_cupom) from cabecalho_venda c);
delete from tbl_ifood_order i where i.cabecalho_venda_cod not in (select c.numero_cupom from cabecalho_venda c );
delete from tbl_ifood_order o where o.cabecalho_venda_cod is null;
delete from tbl_ifood_event t where t.tbl_ifood_pool_id < (select min(tbl_ifood_order_id) from tbl_ifood_order);
delete from tbl_ifood_item i where i.tbl_ifood_order_id < (select min(tbl_ifood_order_id) from tbl_ifood_order);

Pode testar o sistema.

Mas… se por algum motivo… o banco ainda não puder ser reparado, o ultimo recurso seria colocar um banco em branco, e descer novamente os cadastros do atende.

Porem, dependendo do tamanho do banco do cliente, este pode ser um processo bastante demorado, sendo assim, o recurso mais rápido seria pegar um bkp do dia anterior.

agora… caso os bkps anteriores tbm estejam corrompidos…, podemos até limpar o movimento antigo, pois este já deve estar integrado com o atende, geralmente usamos este recurso de limpeza, caso o banco esteja com tamanho superior a 2gb, para aproveitarmos apenas os cadastros, (produtos e pessoas), além de diminuir a chance de corromper, ainda melhora a performance, sendo assim, se necessário, após restaurar o bkp, execute este script abaixo para limpar toda a movimentação e manter apenas os cadastros, lembrando que esta ação deve ser previamente informada ao cliente.

delete from abertura_de_caixa ;
delete from amortiza;
delete from tbl_troca;
delete from cabecalho_do_cupom a ;
delete from cabecalho_venda ;
delete from detalhe_sat ;
delete from tbl_nf ;
delete from contas_a_receber ;
delete from contas_a_pagar ;
delete from tbl_nf ;
delete from tbl_transfer_fila;
delete from tbl_nfitem ;
delete from cupom_numerario ds ;
delete from tbl_comanda_status;
delete from venda v ;
delete from venda_numerario ;
delete from tbl_ifood_order ;
delete from tbl_ifood_order ;
delete from tbl_ifood_event ;
delete from tbl_ifood_item ;
delete from tbl_ifood_pool ;
delete from tbl_ifood_order i where i.cabecalho_venda_cod not in (select numero_cupom from cabecalho_venda);
delete from contas_a_receber ;
delete from tbl_fila_rm_totvs;

Share this content: