Em um mundo replicado normal, ocorre a seguinte sequência:
- MAIN ASE: excluir N linhas emitidas
- RS: exclua N linhas enviadas ao destino de replicação
- TARGET: excluir as mesmas N linhas
No entanto, o que acontece se ocorrer a seguinte sequência de eventos?
- TARGET: excluir N linhas (antes que o servidor principal as exclua)
- MAIN ASE: excluir N linhas emitidas
- RS: exclua N linhas enviadas ao destino de replicação
- TARGET: Nenhuma dessas linhas para excluir?!?!?!
O que acontece depois?
O servidor do representante falha? A transação ASE principal é abortada? Todo mundo age como se isso nunca tivesse acontecido e a replicação funcionasse (já que o resultado final é como se tivesse acontecido)?
PS Sim, eu sei, normalmente você nunca deve fazer tal manobra e os dados nunca devem ser alterados no destino de replicação. E se não, você deve usar "definir a replicação" na sessão do servidor principal. A questão é "o que acontece se isso ocorrer, em violação do 'deveria'".
O que acontece do ponto de vista do SAP/Sybase Replication Server (SRS)?
Depende da versão do SRS e de como os DBAs configuraram a instância do SRS.
Antes do SRS 15.2, o DELETE 'vazio' não causaria problemas, ou seja, o DELETE seria emitido no destino, nenhuma linha encontrada/afetada e o SRS continuaria a processar a próxima transação.
A chave aqui é que uma instrução DELETE que não encontra nenhuma linha para excluir apenas é concluída com sucesso (ou seja, sem erro), com
@@rowcount=0
.NOTA: A mesma 'lógica' se aplica a UPDATEs, INSERT/SELECTs e SELECT/INTOs que são concluídos com sucesso, mas não afetam nenhuma linha.
NOTA: A mesma 'lógica' se aplica a instruções DML que são concluídas com êxito, mas afetam um número diferente de linhas.
Com o SRS 15.2+, uma classe de erro do servidor de replicação foi introduzida com a ênfase principal em observar quando as transações afetam um número diferente de linhas no destino ... e quando esse problema ocorre para gerar um erro (por exemplo, 5185) e suspender o DSI conexão.
Cada transação proveniente da origem é marcada com o número de linhas afetadas. Se a transação, quando aplicada ao destino, afetar um número diferente de linhas, o SRS (por padrão) suspenderá o DSI e despejará uma mensagem de erro no log de erros.
O DBA pode modificar o comportamento de incompatibilidade de contagem de linhas padrão atribuindo uma ação diferente ao número de erro correspondente na classe de erro do servidor de replicação (consulte o comando assign action para obter mais detalhes).
Obviamente (?) o DBA deve pesquisar quaisquer erros de incompatibilidade de contagem de linhas para determinar se eles estão corretos/válidos ou se indicam um problema com o destino fora de sincronia com a origem.
Outros cenários que o DBA gostaria de investigar podem incluir:
Lembre-se de que, embora o SRS seja usado rotineiramente para manter um banco de dados de DR/backup sincronizado com o banco de dados primário, o SRS também pode ser usado para:
O resultado líquido é que a ocorrência de incompatibilidades de contagem de linhas pode ou não ser aceitável ... tudo depende dos ambientes SRS individuais.
Em Control Row Count Validation no Replication Server Administration Guide Volume 2:
Acho que talvez, a versão mais antiga do repserver exija a suspensão/retomada do DSI depois de fazer a alteração específica do DSI.