您的位置:知识库 » 数据库

SQL Server 2008 数据库复制实现数据同步常见问题

作者: 搏击的小船  来源: 博客园  发布时间: 2010-08-25 16:09  阅读: 26786 次  推荐: 0   原文链接   [收藏]  

操作使用的一些技巧(事务复制类型):

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服务器端口修改过造成)。还有可能是MS SQL Server和SQL Server Agent服务没有用域用户身份启动并运行,于是我把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)MS SQL Server和SQL Server Agent服务必须以域用户身份启动并运行,以上问题检查中随时注意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 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 属性传输到订阅表,则必须进行如下操作:

1. 使用 IDENTITY 属性和 NOT FOR REPLICATION 选项手工创建订阅表。您可以通过让 SQL Server 在应用快照之前执行自定义脚本来执行该操作。若要指定自定义脚本,请先创建发布,再创建脚本,然后在发布属性的“快照”选项卡

上输入该脚本的名称。

2. 设置名称冲突项目属性,以便 SQL Server 在订阅服务器上应用快照时不会除去现有的表。该属性在项目属性的“快照”选项卡上。

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

[dbo].[BookIndex]

===================

SQL Server 要求发布的存储过程所引用的所有对象(如表和用户定义函数)在订阅服务器上都可用。如果引用的对象在此发布中未作为项目发布,则它们必须在订阅服务器上手工创建。

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

[dbo].[getChaNameList]

[dbo].[setUpWebsite]

0
3

数据库热门文章

    数据库最新文章

      最新新闻

        热门新闻