AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / dba / Perguntas / 279556
Accepted
J.D.
J.D.
Asked: 2020-11-12 14:22:12 +0800 CST2020-11-12 14:22:12 +0800 CST 2020-11-12 14:22:12 +0800 CST

Scripts de replicação pré e pós-instantâneo não estão sendo executados e sem erros

  • 772

Eu tenho uma configuração de publicação de replicação de instantâneo no servidor 1. O servidor 2 assina a publicação no servidor 1. Os dados estão sendo replicados com êxito.

O trabalho do Agente Distribuidor e do Agente para o Assinante do Servidor 2 é executado no Servidor 1 (onde reside o banco de dados do Distribuidor).

Criei um procedimento armazenado no Servidor 2 para descartar (pré-replicação) e criar (pós-replicação) entidades vinculadas ao esquema no banco de dados de assinantes do Servidor 2. (Eu fiz isso com sucesso no passado porque a Snapshot Replication pode parar se houver entidades no banco de dados do assinante que estejam vinculadas ao esquema às entidades replicadas.)

Eu também criei um script que executa este procedimento armazenado do Servidor 1 por meio de um servidor vinculado ao Servidor 2. (Verifiquei se o servidor vinculado está configurado corretamente e posso consultar dados e executar manualmente o procedimento armazenado por meio do servidor vinculado do Servidor 1 para o servidor 2.) Adicionei este script às propriedades "Snapshot" da publicação de instantâneo: insira a descrição da imagem aqui

Inicialmente, recebi um erro no trabalho do Snapshot Agent porque meu Snapshot Agent não tinha acesso de compartilhamento de arquivos ao caminho nos scripts, mas adicionei essa conta e, em seguida, o erro desapareceu e o trabalho do Snapshot foi concluído com êxito agora.

Mas as entidades no script SQL não são descartadas ou criadas e não vejo erros em nenhum lugar. Eu também tentei mover o arquivo de script antes e depois para um compartilhamento de pasta local para o Servidor 1 e referenciá-lo com um caminho UNC (em oposição ao caminho de rede na captura de tela) e ainda não houve alteração no comportamento.

Atualizei o script TEST.sql com um teste bem simples com o seguinte código:

INSERT INTO DatabaseA.dbo.Table1 (Field1) -- DatabaseA is on Server1, so it should insert to the local table
SELECT 'Test' AS Field1

Quando executo novamente o Snapshot Agent, ele ainda é executado com êxito, mas a tabela não é inserida (no Servidor 1).

Por que meus pré e pós-scripts não estão sendo executados, mas também não estou recebendo nenhum erro?

(Também tenho outra publicação para replicação transacional no servidor 1 que está sincronizando dados perfeitamente com o servidor 2 no mesmo banco de dados que a replicação de instantâneo. Publicação Transacional no Servidor 1, ainda não recebo erros e o SQL não é executado.)

Edit: Eu também tentei mover o arquivo de script para uma pasta local do Servidor 1, dando ao Snapshot Agent acesso de leitura a essa pasta e arquivo de script e re-executando o Snapshot Agent, e ainda nada. Sem execução do script e sem erros.

MAS, curiosamente, se eu modificar manualmente o próprio trabalho do Subscription Agent e adicionar uma etapa para executar a mesma consulta SQL exata, ele funcionará.

Também notei que o trabalho do SQL Agent é executado em uma conta SQL diferente "sqlmin" do que eu esperava para determinadas etapas (novas etapas que criei ou a primeira etapa do trabalho chamada "mensagem de inicialização do Snapshot Agent" - acho que porque essas etapas não são t do tipo "REPL-Distribuidor"). Mas as outras etapas pré-existentes executam como o SQL Agent que designei, que é "DBReplication". A conta "sqlmin" que conheço tem permissões SQL mínimas no Servidor 1 e no Servidor 2, pode ser por isso que os scripts de pré e pós-replicação não estão sendo executados (mas também não estou recebendo um erro em nenhum lugar) quando eu definir os scripts nos campos pré e pós das propriedades Snapshot Publication - Snapshot?

Também detalhes adicionais sobre a conta do distribuidor (que também é minha conta do Snapshot Agent): O distribuidor é uma conta do Windows AD que possui um LOGIN SQL no Servidor 1 e no Servidor 2 e com a função SQL de db_owner na origem e no destino replicados bancos de dados, bem como db_owner no banco de dados de distribuição (que reside no Servidor 1).

sql-server replication
  • 2 2 respostas
  • 596 Views

2 respostas

  • Voted
  1. John K. N.
    2020-11-17T23:24:25+08:002020-11-17T23:24:25+08:00

    Apenas um breve resumo de algumas das coisas que eu tentaria, ao analisar as várias opções....


    Você já tentou passar o identificador de objeto de quatro partes nos scripts?

    Ao invés de usar:

    ... Database.Schema.Table ...
    

    Tente usar:

    ... Server.Database.Schema.Table ...
    

    Ou no seu caso onde você está usando o Linked Server seria:

    ... LinkedServerName.Database.Schema.Table ...
    

    Onde você define os valores como:

    LinkedServerName : The name of the linked server as you defined in the Linked Server connection.
    Database ........: The name of the database
    Schema ..........: The name of the schema
    Table ...........: The name of the table
    

    Depende de onde o script deve modificar os dados. Isso não está muito claro em sua descrição, mas visto que você mencionou servidores vinculados, pensei em mencioná-lo.


    O script é executado no Assinante conforme explicado em:

    Você pode especificar scripts a serem executados no Assinante antes ou depois da aplicação do instantâneo. Os scripts podem ser usados ​​por vários motivos, como criar logins e esquemas (proprietários de objetos) em cada Assinante.

    E as informações adicionais fornecidas aqui são muito importantes:

    O script é executado iniciando o utilitário sqlcmd. Antes de implantar um script, execute-o com sqlcmd para garantir que ele seja executado conforme o esperado. O conteúdo dos scripts executados antes e depois da aplicação do instantâneo deve ser repetível. Por exemplo, se você criar uma tabela no script, primeiro verifique sua existência e tome as medidas apropriadas, se existir. O script deve ser repetível porque se você precisar reinicializar uma assinatura para a qual o script já foi aplicado, o script será aplicado novamente quando o novo instantâneo for aplicado durante a reinicialização.

    Referência: Modificar opções de inicialização de instantâneo para replicação SQL (Microsoft | SQL Docs)

    Se o script não funcionar em conjunto com a conta usada para o agente de assinatura e em conjunto com sqlcmd , ele não funcionará na assinatura.

    Dica
    Use ;no final de cada linha nos scripts.
    Adicione GOentre as linhas.


    Então você pode querer dar uma olhada no artigo Solucionador de problemas: localizar erros com a replicação transacional do SQL Server . Eu não estou dizendo que você não fez isso ainda, mas você não disse que tinha. Quem sabe, talvez você possa encontrar o problema no histórico de trabalho do agente de replicação...

    • 2
  2. Best Answer
    Stephen Morris - Mo64
    2020-11-18T01:26:02+08:002020-11-18T01:26:02+08:00

    repostando meu comentário como resposta

    extraia abaixo de BoL "Você pode especificar scripts para executar AT THE SUBSCRIBER (minha ênfase, também conhecido como Server2) antes ou depois que o snapshot é aplicado. Scripts podem ser usados ​​por vários motivos, como criar logins e esquemas (proprietários de objetos) em cada Assinante."

    https://learn.microsoft.com/en-us/sql/relational-databases/replication/snapshot-options?view=sql-server-ver15

    • 2

relate perguntas

  • Práticas recomendadas para executar a replicação atrasada do deslocamento de tempo

  • Quando devo usar uma restrição exclusiva em vez de um índice exclusivo?

  • Quais são as principais causas de deadlocks e podem ser evitadas?

  • Como determinar se um Índice é necessário ou necessário

  • Qual é a diferença entre a replicação do PostgreSQL 9.0 e o Slony-I?

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host

    • 12 respostas
  • Marko Smith

    Como fazer a saída do sqlplus aparecer em uma linha?

    • 3 respostas
  • Marko Smith

    Selecione qual tem data máxima ou data mais recente

    • 3 respostas
  • Marko Smith

    Como faço para listar todos os esquemas no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Listar todas as colunas de uma tabela especificada

    • 5 respostas
  • Marko Smith

    Como usar o sqlplus para se conectar a um banco de dados Oracle localizado em outro host sem modificar meu próprio tnsnames.ora

    • 4 respostas
  • Marko Smith

    Como você mysqldump tabela (s) específica (s)?

    • 4 respostas
  • Marko Smith

    Listar os privilégios do banco de dados usando o psql

    • 10 respostas
  • Marko Smith

    Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Como faço para listar todos os bancos de dados e tabelas usando o psql?

    • 7 respostas
  • Martin Hope
    Jin conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane Como faço para listar todos os esquemas no PostgreSQL? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh Por que o log de transações continua crescendo ou fica sem espaço? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland Listar todas as colunas de uma tabela especificada 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney O MySQL pode realizar consultas razoavelmente em bilhões de linhas? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx Como posso monitorar o andamento de uma importação de um arquivo .sql grande? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison Como você mysqldump tabela (s) específica (s)? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas Como posso cronometrar consultas SQL usando psql? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas Como faço para listar todos os bancos de dados e tabelas usando o psql? 2011-02-18 00:45:49 +0800 CST

Hot tag

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve