AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / dba / 问题 / 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

快照前和快照后复制脚本未执行且无错误

  • 772

我在服务器 1 上设置了快照复制发布。服务器 2 订阅了服务器 1 上的发布。数据复制成功。

服务器 2 的订阅服务器的分发服务器代理和代理作业在服务器 1(分发服务器数据库所在的位置)上运行。

我在服务器 2 上创建了一个存储过程,以在服务器 2 的订户数据库上删除(预复制)和创建(复制后)模式绑定实体。(我过去成功地做到了这一点,因为如果订阅数据库中存在绑定到复制实体的模式的实体,快照复制可能会停止。)

我还创建了一个脚本,该脚本通过链接服务器从服务器 1 到服务器 2 执行此存储过程。(我已验证链接服务器设置正确,我可以从服务器查询数据并通过链接服务器手动执行存储过程1 到服务器 2。)我已将此脚本添加到快照发布的“快照”属性中: 在此处输入图像描述

最初,我在快照代理作业中收到错误,因为我的快照代理没有对脚本中路径的文件共享访问权限,但我添加了该帐户,然后错误消失了,快照作业现在成功完成。

但是 SQL 脚本中的实体不会被删除或创建,而且我在任何地方都没有看到错误。我还尝试将之前和之后的脚本文件移动到服务器 1 本地的文件夹共享并使用 UNC 路径(与屏幕截图中的网络路径相反)引用它,但行为仍然没有变化。

我已经使用以下代码使用非常简单的测试更新了 TEST.sql 脚本:

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

当我重新运行快照代理时,它仍然成功运行,但表没有插入(在服务器 1 上)。

为什么我的前置脚本和后置脚本无法运行,但我也没有收到任何错误?

(我在服务器 1 上还有另一个事务复制发布,它将数据同步到与快照复制相同的数据库中的服务器 2。但即使我在服务器 1 上的事务性发布,我仍然没有收到任何错误,并且 SQL 没有执行。)

编辑:我也只是尝试将脚本文件移动到服务器 1 的本地文件夹,授予快照代理对该文件夹和脚本文件的读取权限,然后重新运行快照代理,但仍然没有。没有执行脚本,也没有错误。

但有趣的是,如果我手动修改订阅代理作业本身并添加一个步骤来执行相同的确切 SQL 查询,它确实可以工作。

我还注意到 SQL 代理作业在不同的 SQL 帐户“sqlmin”下运行,然后我期望某些步骤(我创建的新步骤,或者称为“快照代理启动消息”的作业的第一步 - 我猜是因为这些步骤不是t 类型为“REPL-Distributor”)。但是其他预先存在的步骤作为我指定的 SQL 代理执行,即“DBReplication”。我知道的“sqlmin”帐户在服务器 1 和服务器 2 上都具有非常小的 SQL 权限,这可能是为什么当我没有执行复制前和复制后脚本的原因(但我也没有在任何地方收到错误)在快照发布 - 快照属性的前置和后置字段上设置脚本?

还有关于分发者帐户(也是我的快照代理帐户)的其他详细信息:分发者是一个 Windows AD 帐户,在服务器 1 和服务器 2 上都有 SQL LOGIN,并且在复制的源和目标中都具有 db_owner 的 SQL 角色数据库以及分发数据库(位于服务器 1 上)上的 db_owner。

sql-server replication
  • 2 2 个回答
  • 596 Views

2 个回答

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

    在分析各种选项时,我会尝试一些事情的快速总结......


    您是否尝试过在脚本中传递四部分对象标识符?

    而不是使用:

    ... Database.Schema.Table ...
    

    尝试使用:

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

    或者在您使用链接服务器的情况下,它将是:

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

    您将值定义为:

    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
    

    这取决于脚本必须在哪里修改数据。这在您的描述中不是很清楚,但是看到您确实提到了链接服务器,我想我会提到它。


    该脚本在订阅服务器上执行,如下所述:

    您可以指定在应用快照之前或之后在订阅服务器上执行的脚本。可以出于多种原因使用脚本,例如在每个订阅服务器上创建登录名和模式(对象所有者)。

    此处提供的其他信息非常重要:

    该脚本通过启动 sqlcmd 实用程序运行。在部署脚本之前,使用sqlcmd运行它以确保它按预期执行。应用快照前后执行的脚本内容必须是可重复的。例如,如果您在脚本中创建一个表,您应该首先检查它是否存在,如果存在则采取适当的措施。该脚本必须是可重复的,因为如果您需要重新初始化已应用该脚本的订阅,则在重新初始化期间应用新快照时将再次应用该脚本。

    参考: 修改 SQL 复制的快照初始化选项(Microsoft | SQL Docs)

    如果脚本不能与用于订阅代理的帐户一起使用并且不能与sqlcmd一起使用,那么它在订阅中将无法使用。

    提示在脚本中每一行的末尾
    使用。在行之间 添加。;
    GO


    然后,您可能想查看文章疑难解答:查找 SQL Server 事务复制错误。我不是说你还没有这样做,但你没有说你有。谁知道呢,也许你可以在复制代理的工作历史中找到问题...

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

    重新发布我的评论作为答案

    从 BoL 中提取“您可以在应用快照之前或之后指定要在订阅者(我的重点,又名 Server2)处执行的脚本。脚本可以用于多种原因,例如在以下位置创建登录名和模式(对象所有者)每个订阅者。”

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

    • 2

相关问题

  • 运行时间偏移延迟复制的最佳实践

  • 什么时候应该使用唯一约束而不是唯一索引?

  • 死锁的主要原因是什么,可以预防吗?

  • 如何确定是否需要或需要索引

  • PostgreSQL 9.0 Replication 和 Slony-I 有什么区别?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目

    • 12 个回答
  • Marko Smith

    如何让sqlplus的输出出现在一行中?

    • 3 个回答
  • Marko Smith

    选择具有最大日期或最晚日期的日期

    • 3 个回答
  • Marko Smith

    如何列出 PostgreSQL 中的所有模式?

    • 4 个回答
  • Marko Smith

    列出指定表的所有列

    • 5 个回答
  • Marko Smith

    如何在不修改我自己的 tnsnames.ora 的情况下使用 sqlplus 连接到位于另一台主机上的 Oracle 数据库

    • 4 个回答
  • Marko Smith

    你如何mysqldump特定的表?

    • 4 个回答
  • Marko Smith

    使用 psql 列出数据库权限

    • 10 个回答
  • Marko Smith

    如何从 PostgreSQL 中的选择查询中将值插入表中?

    • 4 个回答
  • Marko Smith

    如何使用 psql 列出所有数据库和表?

    • 7 个回答
  • Martin Hope
    Jin 连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane 如何列出 PostgreSQL 中的所有模式? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh 为什么事务日志不断增长或空间不足? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland 列出指定表的所有列 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney MySQL 能否合理地对数十亿行执行查询? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx 如何监控大型 .sql 文件的导入进度? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison 你如何mysqldump特定的表? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 对 SQL 查询进行计时? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas 如何从 PostgreSQL 中的选择查询中将值插入表中? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 列出所有数据库和表? 2011-02-18 00:45:49 +0800 CST

热门标签

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

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve