本篇文章是SQL Server Replication系列的第十篇,详细内容请参考原文。
复制故障排除是一项艰巨的任务。在任何复制设置中,都涉及到很多移动部件,而可用的工具并不总是很容易识别问题。This last level of the Replication Stairway will show you the places that provide the information necessary to solve most problems.
发现问题
第九篇介绍了复制监视器。如果你启用了那个工具的所有警告,只要有不正确它就会发出警告。But often that is all the information you can get from that tool.偶尔,即使你设法找到一个实际的错误信息,它却指向错误的方向。To show you how to get more information we will walk through the troubleshooting process of some of the more common issues.
我们以一个事务复制作为例子,模拟忘记给相关Windows帐户以及他们关联的SQL Server登录授予权限(相关帐户没有任何权限,拒绝请求订阅帐户对共享文件夹的读取权限)。
发布
当你打开复制监视器,你会看到红色错误标记表明发布存在问题,如图10.1所示。移动到代理页签,揭露与此发布相关的代理有问题。
图10.1 发布代理错误
右击日志读取器代理,选择查看详细信息,打开详细对话框,如图10.2所示
图10.2 日志读取器代理详细信息
正如你所看到的,这里没有更多有用的信息。然后,错误信息建议检查Jobs文件夹中的代理作业历史记录。这是指运行日志读取器代理的SQL Server代理的作业历史记录。
历史记录看起来类似于图10.3
图10.3 日志读取器历史记录
在作业历史记录中,你可以看到在每一次执行和每一次执行的每一步前面有下面四个标记之一:
它们分别表示:失败、成功、正在运行和重试
对于某些作业步骤,超过一个条目被记录在历史中。如果发生这样的情况,就是有失败或重试,最后一个记录行通常不包含任何细节。相反,你需要检查前面的行获取详情。
在图10.3,你可以看到代理一直在重试步骤2。你也可以看到每一步不止一个条目并且重新尝试。
为了查看不停地重试的原因,点击最近重试条目的前一行。这一行在图10.3会高亮显示。
作业历史记录的下半部分会显示执行的详细信息,如图10.4所示
图10.4 信息显示发布服务器不可用
通常在底部你会看到失败的原因:远程服务器未被指定为有效的发布服务器。
This message is just one of the many things that make troubleshooting replication difficult.它可能意味着你选择的发布服务器不再发布。在我们的例子中,它意味着用于日志读取器代理连接分发数据库的登录名没有所需(查看存储于分发数据库中的发布服务器信息)的权限。
然而授予缺少的权限(分发库db_owner)并没有解决问题。日志读取器代理的作业历史记录还是显示不停地重试。检查最新执行的日志信息出现不同的问题:代理不能连接到发布数据库。如图10.5所示
图10.5 信息显示不能打开发布数据库
在对发布数据库授予必要权限(发布库db_owner)的后,日志读取器代理成功启动。
图10.6 信息显示日志读取器代理成功启动
让我们返回到复制监视器。在图10.1中,两个作业都显示出错。然而,取决于你何时关注到这个问题,快照代理可能仍然显示"正在运行"的状态,如图10.7所示
图10.7 正在运行?It depends!
复制监视器实际上依赖于快照代理来定期报告状态信息。如果该报告未能在一个较长的时间内发送,复制监视器将报告问题。
在这种情况下,报告的问题也不是很具体。它只声明快照代理在10分钟内没有记录任何进度消息。你可以通过打开快照代理详细信息对话框(图10.8)查看这条信息
图10.8 快照代理没有进度
错误消息建议手动检查记录仍然被复制以及网络是连通的。目标数据库检查发现记录没有被复制,检查网络没发现问题。我们需要到别的地方查找问题的真实原因。
作业活动监视器告诉我们快照代理作业有问题。如图10.9
图10.9 快照存在问题
打开快照代理作业历史记录,如图10.10显录问题开始于步骤2
图10.10 快照代理历史记录
所选步骤的详细信息如图10.11所示
图10.11 信息显示发布服务器不可用
这个错误信息和之前在图10.4是一样的。它也意味着用于连接到分发数据库的帐户没有授予必要的权限(分发库db_owner)。
不像日志读取器和分发代理,快照代理没有计划成连续运行,因此每次修改后你需要重新启动它来查看修改是否成功。
重启快照代理最简便的方法是在复制监视器下进入到有问题的发布的代理页签。在快照代理上右击,选择启动代理。如图10.12所示
图10.12 启动快照代理
在启动快照后它马上又失败了。你可以在图10.13看到这个错误
图10.13 快照代理不能打开数据库
这次快照代理详细对话框显示的错误消息有了些帮助。它告诉快照代理使用的登录名没有权限访问发布数据库。错误详细信息如图10.14所示
图10.14 快照代理错误消息
在对发布数据库授予访问权限(发布库db_owner)后,重新启动快照代理,它又显示另一个错误。类似访问发布数据库问题所显示的方式,这个错误详细信息如图10.15所示
图10.15 没有共享的访问权限
给帐户对共享文件夹的写入权限,整个发布就正常运行起来了。在复制监视器->发布->代理,显示快照代理成功完成,日志读取器代理正在运行。如图10.16所示
图10.16 发布正常运行
订阅
例子中的订阅还是不能工作。打开复制监视器->发布->所有订阅,显示未初始化的订阅。如图10.17所示
图10.17 未初始化的订阅
为了得到更多信息,对象资源管理器下连接到订阅服务器,打开复制->本地订阅,右击订阅选择"查看同步状态"。如图10.18所示
图10.18 订阅上下文菜单
打开一个关于此订阅的同步状态信息的对话框。如图10.19所示
图10.19 查看同步状态
对话框告诉我们分发代理成功启动,并且它一直在运行。这里看不到任何问题,因此我们去查看分发代理历史记录。你可以通过作业活动监视器或图10.19中点击"查看作业历史记录"。
从分发代理作业历史记录,我们发现步骤一直在重试。如图10.20所示
图10.20 分发代理重试
问题的详细信息如图10.21所示
图10.21 分发代理登录失败
通常在最后我们能看到分发代理不能连接到订阅数据库。
按照之前的方式修复这个问题(订阅库db_owner),这个订阅还是没有初始化。为了获取有效信息,我们再次查看分发代理作业历史记录。代理好像还是在无休止的重试。最近的错误消息如图10.22所示
图10.22 找不到发布服务器
这个错误消息看来起非常熟悉,它意味着问题帐户不能查看可用的发布服务器。这次仅仅给它授权访问分发数据库(分发库db_owner)还不够。为了解决这个问题,分发代理使用的帐户必须是发布访问列表的成员。查看第四篇关于PAL的详细信息。
在解决上面问题后,我们还有最后一个问题要解决。After having not been very helpful to us trying to work on the previous issues, the replication monitor now wakes up and tells us about the remaining one.
图10.23 订阅错误
双击订阅打开订阅详细信息对话框,如图10.24所示
图10.24 订阅错误详细信息
在底部我们找到了问题的原因。快照共享拒绝帐户读取。
在授予帐户读取共享权限后,复制终于开始工作了。依赖于你用多长时间解决所有问题,你可以看到性能警告,如图10.25所示
图10.25 性能警告
对于这条警告你不需要担心。在刚刚设置复制之后看到一些性能警告是正常的。这些警告通常会在几分钟后消失。
其他工具和场景
虽然前面的场景不是很可能发生在你的环境中,它说明了所有你可能需要去检查的地方以查找问题信息。由于例子是一个事务复制,所有显示的对话框是针对这种类型的复制。然后,对于合并复制和快照复制,你可以在相同的地方查找必要的信息。
对于事务复制你应该将跟踪令牌添加到你的工具箱。跟踪令牌是在第九篇中介绍的。它们允许你测量发布服务器和分发服务器之间的延迟以及分发服务器与订阅服务器之间的延迟。它们同样可以用来检查问题。如果你插入一个跟踪令牌,然后在合理的时间内复制到订阅中,你就可以确认每一件事都在运转。如果你定期插入跟踪令牌,你甚至可以检测到延迟增加,在它们变得严重前识别问题。
你需要知道的事实,有时复制监视器可能显示误导信息。图10.26所示例子
图10.26 误导信息
它看起来是按预期工作的。然而,如果你仔细查看会发现滞后时间是"00:00:00"。这个值在生产环境好像不太可能,因此它可能是问题的征兆。在本例订阅没有完成初始化操作,因为某些原因它没找到已存在的快照(我是在创建发布时在快照代理页面去掉所有勾选,相当于没有启动过快照)。订阅详细信息显示初始化快照尚不可用,如图10.27所示
图10.27 初始快照尚不可用
所以即便复制监视器是一个非常有用的工具,if you have been notified of a problem and the replication monitor is looking like everything is in great shape,一定要多看两次,不错过任何可以帮助识别问题的提示。
在复制数据中如果有一个未解决的问题,分发代理会一直尝试解决它。你可以看图10.28中的例子
图10.28 缺少行错误
这个问题是由于在发布上更新一条记录,但在订阅没有找到对应记录。这个问题不会自己解决,但是分发代理会一直尝试,并且每一次它执行,复制监视器的主屏幕显示一切运行正常。取决于你何时打开复制监视器,你可能看到这个问题也可能看不到。因此我们再次重申:如果你怀疑一个问题,确保查看得深入些,不要错过有用的信息。图10.28中最近失败的同步就是问题的征兆。
大部分的问题,比如上面提到的,将显示在订阅详细信息对话框。错误信息还包含链接信息,可以帮助你进一步分析问题。
总结
这一篇,针对事务复制的故障排除做了一次演练。文中指出多处地方提供信息帮助检查复制问题。在最后提到了一些特别的错误场景。
--复制中与数据库权限相关的列表(详情参考本系列第三、四、六、七篇文章) /********事务复制********/ ----创建发布 ->分发服务器 创建两个windows帐户(WORKSnapshot、WORKLogReader) 一个用于执行快照代理 一个用于执行日志读取器代理 上面两个需要分发数据库db_owner权限 ->发布服务器 创建两个SQL Server登录(Snapshot、LogReader) 一个用于快照代理连接发布数据库 一个用于日志代理连接发布数据库 上面两个需发布数据库db_owner权限 ----创建订阅 --请求订阅 ->订阅服务器 创建一个windows帐户(WORKDistPull) 用于执行分发代理 需要订阅数据库db_owner权限 ->分发服务器 创建一个SQL Server登录(DistPull) 用于分发代理连接到分发数据库 需要分发数据库db_owner权限+(PAL成员) --推送订阅 ->分发服务器 创建一个windows帐户(WORKDistPush) 用于执行分发代理 需要分发数据库db_owner权限+(PAL成员) ->订阅服务器 创建一个SQL Server登录(DistPush) 用于分发代理连接到订阅数据库 需要订阅数据库db_owner权限 /********合并复制********/ ----创建发布 ->分发服务器 创建一个windows帐户(WORKMrgSnpSht) 用于执行快照代理 需要分发数据库db_owner权限 ->发布服务器 创建一个SQL Server登录(MrgSnpSht) 用于快照代理连接发布数据库 需发布数据库db_owner权限 ----创建订阅 --请求订阅 ->订阅服务器 创建一个windows帐户(WORKMrgAgntPull) 用于执行合并代理 需要订阅数据库db_owner权限 ->分发服务器 创建一个SQL Server登录(MrgAgntPull) 用于合并代理连接到分发数据库 需要分发数据库Guest access ->发布服务器 创建一个SQL Server登录(MrgAgntPull) 用于合并代理连接到发布数据库 需要是PAL成员 --推送订阅 ->分发服务器 创建一个windows帐户(WORKMrgAgntPush) 用于执行合并代理 需要分发数据库db_owner权限 ->发布服务器 创建一个windows帐户(WORKMrgAgntPush) 用于合并代理连接到发布数据库 需要是PAL成员 ->订阅服务器 创建一个SQL Server登录(MrgAgntPush) 用于合并代理连接到订阅数据库 需要订阅数据库db_owner权限 --(与远程机器连接选择模拟进程用户权限分配与SQL登录相同) /****密码修改****/ 如果修改windows帐户或SQL Server登录的密码,对应代理作业在下次启动时会报错!!!