参考---创建sql数据库复制的发布、订阅的问题处理-阿里云开发者社区

开发者社区> 数据库> 正文

参考---创建sql数据库复制的发布、订阅的问题处理

简介: 操作使用的一些技巧(事务复制类型):1.如何修改一个已经发布的表的属性?将发布所有订阅删除,(发布不用删除),就可以在发布属性的项目中取消表,然后就 可以修改该表了,修改后,再将表加入发布内就可以了.

操作使用的一些技巧(事务复制类型):
1.如何修改一个已经发布的表的属性?
将发布所有订阅删除,(发布不用删除),就可以在发布属性的项目中取消表,然后就

可以修改该表了,修改后,再将表加入发布内就可以了.
2.常用的操作界面:
(1)一般都在监视器--发布项目,可以看到快照 分发和订阅的即时信息.

(2)另外一个操作地方是发布的属性,(在属性--状态里可以启动代理)

(3)还有一个是工具--复制--配置发布、订阅服务器和分发,需要订阅的服务器必

须在这里指定授权后订阅才能成功.
============
问题:
数据库无法登陆的老问题:数据库属性-安全里面,不要选仅windows登陆,换另外一

个模式.

0.订阅一个快照发布(不是事务复制)出错,"21776 名称xxx在TransPublication集

合上没有找到",在企业管理器中,将发布数据库和订阅数据库都停止或者断开,再

启动,重新连接就可以订阅快照发布了.真是奇怪,有莫名其妙的问题可以尝试重启

服务器试试,有时后一台机器上可以正常控制订阅操作,而另外一台机器上却订阅

操作出错,也重新连接服务器试试.

1.一开始遇到的问题是,注册的local服务器不能用,删除后重新命名搞定,

2.sql server代理正在使用系统帐户,它会导致复制失败,. 这个提示点确定后,

本账户的选项为灰色,

原来是配置发布的服务器不是本机,到本机上操作发布,就可以选"本账户"了.


3.又遇到不能署名订阅,"不允许请求的署名订阅",明明发布和订阅服务器双方都

注册了,也双方都建立了

订阅的用户帐号,原因:在这步,点注册服务器,然后不能选默认的模拟sql登陆,而

是要选"使用sql 身份验证",然后输入名称和密码.

如果始终弹出"不允许请求的署名订阅",不能进到选择登陆模式的界面,退出订阅

向导,在企业管理器中,进入发布服务器,复制-右键-"配置发布、订阅服务器和分

发"-订阅服务器-添加订阅服务器机器名和帐号,如果已经有了,直接确定下.再在

进订阅服务器订阅就不会显示不能署名订阅了.
以上过程可能发现明明订阅服务器名字已经在发布服务器添加了,还是出现这个问

题,就一定要在订阅服务器进入发布服务器,然后添加订阅服务器的名字,为什么会

这样,可能是在发布服务器指定了改订阅服务器的名字后,但订阅服务器没有刷新,

可以断开一次订阅服务器和发布服务器,再来订阅,也可以解决.


4.请求订阅已经建立好了,但订阅状态显示"正在重试", 上次动作"进程未能连接

到subscriber SHD-SHD",
原因是我安装sql后,曾经改过电脑的名字,改回SHD-SHD.(有的人是因为sql服务器

端口修改过造成).还有可能是MSSQLserver和Sqlserveragent服务没有用域用户身

份启动并运行,
(于是我把B加到A所在的域,并且把A的管理员用户加到B的SQLServerAgent服务的

登陆用户中,)

5.但订阅状态显示"请求共享代理程序失败", "进程未能连接到distributor

...",怀疑是订阅设置时,连接
发布数据库的帐号有问题,在订阅(右键)的历史记录中查看具体的错误原因.帐号

正确后,历史记录又说

订阅端机器没有配置,于是全部删除订阅和发布来试,结果发布确无法删除发布,出

现20015错误,原来是订阅

的机器通过局域网,打开了快照的共享目录没有关闭,关闭后,成功删除发布.
如果还无法删,干脆把共享的快照目录取消共享,再删,然后重新配置快照目录共享

.

6.订阅服务器上的订阅又无法删除了,提示"无法更新或删除从   MSX   服务器上

发起的作业",

这是因为:计算机更换名之后就出现这种错误,自己不能修改自己创建的作业。


解决办法:  
在msdb的sysjobs表中把originating-server中的值全部改为更改后的计算机名


update   msdb..sysjobs   set   originating_server   =   '现服务器名'

有时可以到管理-sql server代理--作业,查看更多情况和操作.
7.全部重新创建发布和订阅成功,执行却又出现"发布内容 null"的提示,是因为订

阅服务器没有连接到分发服务器,(1)SQLSERVERAGENT没启动.(2)MSSQLserver和

Sqlserveragent服务必须以域用户身份启动并运行,

以上问题检查中随时注意SQLSERVERAGENT(控制面板-管理-服务)服务是否已经启

动,

8.订阅服务器已经登陆上发布服务器,但在建立订阅时看不见该服务器的发布,是

因为没有配置分发
服务器,工具-复制-"配置发布、订阅服务器和分发",再检查SQLSERVERAGENT是否

运行.
然后再在发布属性-发布访问列表,添加订阅服务器登陆的登陆名,订阅端终于看见

发布了.

9.发布 'xxx' 的初始快照尚不可用。

保证SQLSERVERAGENT已经运行,
复制=》发布内容=》发布项目mytab=》右击右侧的订阅=》重新初始化
如果还不行,
复制监视器--发布服务器--xxx--发布的项目--快照,看到
进程未能创建文件“\\XXZ\SQLPUB\unc”,到该文件夹重新配置sql的帐号对该文

件夹权限为"完全".

10.订阅端产生 "快照尚不可用 发生操作系统错误 53",订阅服务器帐号访问快照

文件
夹出权限不够,分配权限,还有检查防火墙,被禁止了访问.

11.有个表无法发布,选择框显示红叉,没有主键的表无法发布.

12.进程未能从表“[dbo].[syncobj_0x3745373834413345]”向外大容量复制。
在写 BCP 数据文件时发生 I/O 错误(源: ODBC SQL Server Driver (ODBC); 错

误代码: 0)
解决方法:就是字符类型全部改为n类型的解决问题(char-nchar,varchar-

nvarchar,ntext).
13、在数据发布时报如下错误信息:
在BCP数据文件中遇到意外的EOF(源:ODBC SQL Server Driver(ODBC):错误代码

:S1000)
这是因为数据库中含有TEXT或nTExt或Image字段引起的,只要在某项发布

属性页中选择<快照>-<快照格式>-<字符模式格式>,即可解决该问题.
14、另外,在建数据发布时,报如下错误:
违反了Primary Key约束'PK_@snapshot_seqnos_7fab3fda'.不能在

对象'#7EB71BA1'中插入重复键.
(源:zzb_stockserver(数据源);错误代码:2627)
这是因为在建发布时,数据库数据正在执行插入或修改动作引起的,只要该

发布的快照重新运行一下即可。
15、对某些大型数据表无法生成快照的问题,数据库报如下错误:
进程未能从表"[dbo].[syncobj_0x3436383044343035]"向外大容量复制

,在写 BCP 数据文件时发生 I/O 错误(源: ODBC SQL Server Driver (ODBC);

错误代码: 0)
这是因为该表有问题或表数据太大造成的,可用如下方法试着解决一下:
a、用DBCC checktable 对该表检查一下,数据表是否有问题,然后再试一

下重新生成数据快照。
b、如果上述问题仍无法解决,可以用数据导出功能将数据表导到订阅服务

器中。
c、然后重建一个针对该数据表的数据发布,选择不生成快照功能,然后运

行下述问题4的解决方法,解决出现的问题。
16、在建立订阅时,选择不初始化订阅方数据表,则在订阅服务器不产生相应的

复制存贮过程,运行该发布时,会报如下错误:
未能找到存贮过程'sp_MSupd_XXX'...
原因如下:
Problem Deion :
======
Replication Distribution Agent reports error. The error message is "It

could not
find the stored procedure sp_MSins_***".

Reason :
======
If we choose "the subscriber has schema and data already" option when

we create the
subion, those three system auto created stored procedures will not be

created
in the subscribing database side, they are
"sp_MSins_***"/"sp_MSupd_***"/"sp_MSdel_***".

Soltuion :
======
We could use the system command "sp_publicationcustomprocs

'pulication_name'"
to create the s of those three system stored procedures. Then we run

these
s in the subscribing database. The problem will be resolved.
解决方案:
在发布服务器上运行如下命令:sp_publicationcustomprocs 'xxxx', 其中

xxxx为发布名称,该命令会生成创建上述三个存贮过程的脚本,然后在订阅服务

器运行生成三个存贮过程即可。

17、在订阅数据时,发生如下错误:
该订阅已标记为不活动,必须重新初始化该订阅。需要删除并重新创建 NoSync

订阅。
(源: zzb_stockserver (数据源); 错误代码: 21074)
解决方案:
在发布服务器上,选择某项发布,在属性-》订阅-》重新初始化。可以解决上

述问题

18、在数据发布时,发生如下错误:
不能在具有唯一索引 'PK_tbMeetingMemo' 的对象 'tbMeetingMemo' 中插入

重复键的行。
(源: ZZB-XHSTOCK (数据源); 错误代码: 2601)
原因:可能是在发布该表时,在不同的发布中存在多次发布该表的情况.
解决方法:
a、查明是否有多次发布该表的情况.
在发布服务器的发布数据库中用运行如下SQL语句:select * from sysarticles

order by dest_table
查看在dest_table列中是否出现多次该表的信息,如是,则说明该表已被多次

发布,可以用下一步中说明的方法来查看是哪些发布发布了该表。
b、运行语句:select * from syspublications,查看pubid与上述信息相同的

pubid的内容,则就能确定是何种发布发布了相同的数据表。
c、找到了发布后,如果是增加数据表,则不用删除该发布下的所有订阅,如果是

去除发布的数据表,则需删除该发布下的所有的订阅信息,修改相应的发布内容

,重新制定相应的订阅.

19.创建发布,14294错误,"请提供@job_id标识作业",
是因为你删除了以前系统自动生成的作业。方法:工具-复制--禁用发布,重新配置

发布、订阅服务器和分发,完成后,发布的数据库显示为一个手型的共享图标,再创

建发布

20.订阅和发布都删除完了,但禁用发布不成功,提示:无法除去分发数据

库'distribution',该数据库正在使用.停止数据库,再启动数据库,再禁止发布.

21.配置发布和分发向导,最后完成时错误18481:配置分发服务器:未能连接到

服务器,因为distributor_admin未在该服务器上定义为远程登录
你肯定在装完SQL SERVER以后,改了计算机名,虽然sql server 还可以用,但一用

复制时,SQL SERVER读取了旧的计算机实例名,不信,你试试
select @@SERVERNAME
显示出来的,肯定不是你现在的计算机名.

于是,你用
sp_dropserver <(用select @@SERVERNAME显示出来的旧名)>
go
sp_addserver <你现在的计算机名>, LOCAL
go

例如:sp_dropserver    'E0184D34429345F\SQL2K'
go  
sp_addserver    'deboywang\SQL2K',    LOCAL  
go

重启sql server服务,问题就可以解决了

除此之外,如果要修改@@Servername还可以使用下面的方法:

1. exec sp_helpserver 检查你的server名字
2. 如果不正确,用exec sp_setnetname修正

另外,当注册的名字改为其他名字后,注册登记是成功的(在客户端工具里添加

了匿名),发布时就会出现这个问题。


22.强制订阅无法删除:在发布服务器上先后删除订阅和发布后,订阅服务器上该强

制订阅始终存在,无法删除,问微软支持,得结论:
sp_removedbreplication 'job'
JOB为订阅复制的数据库名称。

其他问题:
=============
注:
0.不要去乱删 管理--sql server代理--作业的内容.严格按照先删订阅,再删发布

来进行.
1、如何忽略在分发中出现的报错
a、在发布服务器的管理-》SQL server代理->作业->中,找到该发布的发布

JOB,在属性->步骤->2运行代码程序-》编辑->命令->在命令语句最后添加 -

skiperrors xxxx(xxxx是分发时报的错误号) , 指的是忽略该错误的意思。
b、然后重新启动分发引擎.

2.如何输出出错的信息?
在待输出出错信息的JOB命令最后加入 -Output c:\temp\error.txt, -Output

是命令,后面是待输出的文件路径和文件夹名.
================

因为该发布不允许使用可更新的订阅,当 IDENTITY 列被传输到订阅服务器时,

不会传输 IDENTITY 属性。(例如,在发布服务器上定义为 INT IDENTITY 的列

在订阅服务器上将定义为 INT。)

如果想将 IDENTITY 属性传输到订阅表,则必须进行如下操作:

     ? 使用 IDENTITY 属性和 NOT FOR REPLICATION 选项手工创建订阅表。您

可以通过让 SQL Server 在应用快照之前执行自定义脚本来执行该操作。若要指

定自定义脚本,请先创建发布,再创建脚本,然后在发布属性的“快照”选项卡

上输入该脚本的名称。

     ? 设置名称冲突项目属性,以便 SQL Server 在订阅服务器上应用快照时不

会除去现有的表。该属性在项目属性的“快照”选项卡上。

下列已发布表包含“标识”列:

[dbo].[BookIndex]
===================

SQL Server 要求发布的存储过程所引用的所有对象(如表和用户定义函数)在订

阅服务器上都可用。如果引用的对象在此发布中未作为项目发布,则它们必须在

订阅服务器上手工创建。

在此发布中发布了下列存储过程:

[dbo].[getChaNameList]
[dbo].[setUpWebsite]

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

分享:
数据库
使用钉钉扫一扫加入圈子
+ 订阅

分享数据库前沿,解构实战干货,推动数据库技术变革

其他文章