数据库 14013 错误解决方法
最近在迁移数据库,迁移订阅发布主机的时候,出现如下错误
1、出现14013错误,提示未开启订阅发布选项;
2、故执行如下语句:
USE master
GO
exec sp_replicationdboption
@dbname = N'test',
@optname = N'publish',
@value = N'true'
报错:
链接服务器"repl_distributor"的 OLE DB 访问接口 "SQLNCLI" 返回了消息 "Login timeout expired"。
链接服务器"repl_distributor"的 OLE DB 访问接口 "SQLNCLI" 返回了消息 "An error has occurred while establishing a connection to the server. When connecting to SQL Server 2005, this failure may be caused by the fact that under the default settings SQL Server does not allow remote connections."。
Msg 53, Level 16, State 1, Line 0
Named Pipes Provider: Could not open a connection to SQL Server [53].
3、检查链接服务器"repl_distributor"无效,但提示“法删除服务器 'repl_distributor',因为该服务器用作复制过程中的分发服务器”,无法删除或更新。
解决方法如下:
1、删除数据库“Distribution”;
2、连接到实例-->展开实例-->复制-->右键-->Disable Publishing and Distribution ,可删除链接服务器"repl_distributor"
3、连接到实例-->展开实例-->复制-->右键-->配置发布,重新生成数据库“Distribution”
4、新建订阅发布,成功。
附一篇很好的资料:
1. SQL Server数据复制需要重点注意的事项:
1) 服务的启动帐户
MSSQLserver和Sqlserveragent服务是否是以域用户身份启动并运行的(.\administrator用户也是可以的,不是sqlserver用户,是windows用户),最好在配置当中专门设置一个域用户,各个发布服务器都用这个用号,统一管理,并且这个域用户对发布服务器有管理员的权限。
如果登录用的是本地系统帐户local,将不具备网络功能,会产生以下错误: 进程未能连接到Distributor '@Server name'
注意:如果您的服务器已经用了SQL Server全文检索服务, 请不要修改MSSQLserver和Sqlserveragent服务的local启动。会照成全文检索服务不能用。请换另外一台机器来做SQL Server 2000里复制中的分发服务器。)
注意:修改服务启动的登录用户,需要重新启动MSSQLserver和Sqlserveragent服务才能生效。
2) 数据库的注册属性
数据库的注册属性,不能过再使用本地默认的“.”“local”或者“IP地址”,只能使用服务器名称,这样一来就不会在创建复制的过程中出现14010、20084、18456、18482、18483错误了。 如果在广域网中最好是在 hosts文件中把对应的IP地址和服务器名称写上,以便网络能够通过计算机名互相访问。
3) 快照文件夹
最好手动建立一个,这个文件夹的属性中,要设置为共享,共享权限中允许Everyone修改(可以不这样做)。
4) 检查相关的几台SQL Server服务器是否改过名称
需要srvid=0的本地机器上srvname和datasource一样,如果不一致,是由于在安装完SQl Server后重新修改了计算机名造成的,处理的方法可以借助一下代码来完成。
在查询分析器里执行:
use master
select srvid,srvname,datasource from sysservers
如果没有srvid=0或者srvid=0(也就是本机器)但srvname和datasource不一样, 需要按如下方法修改:
USE master
GO
-- 设置两个变量
DECLARE @serverproperty_servername varchar(100), @servername varchar(100)
-- 取得Windows NT 服务器和与指定的 SQL Server 实例关联的实例信息
SELECT @serverproperty_servername = CONVERT(varchar(100), SERVERPROPERTY(ServerName))
-- 返回运行 Microsoft SQL Server 的本地服务器名称
SELECT @servername = CONVERT(varchar(100), @@SERVERNAME)
-- 显示获取的这两个参数
select @serverproperty_servername,@servername
--如果@serverproperty_servername和@servername不同(因为你改过计算机名字),再运行下面的
--删除错误的服务器名
EXEC sp_dropserver @server=@servername
--添加正确的服务器名
EXEC sp_addserver @server=@serverproperty_servername, @local=local
修改这项参数,需要重新启动MSSQLserver和Sqlserveragent服务才能生效。
这样一来就不会在创建复制的过程中出现18482、18483错误了。
5) 检查相关的几台SQL Server服务器网络是否能够正常访问
如果ping主机IP地址可以,但ping主机名不通的时候,需要在
winnt\system32\drivers\etc\hosts (WIN2000)
windows\system32\drivers\etc\hosts (WIN2003)
文件里写入数据库服务器IP地址和主机名的对应关系。
关于服务器之间的连通问题可以参见 远程连接sql server 2000服务器的解决方案.doc文件中的描述。
6) 系统需要的扩展存储过程是否存在(如果不存在,需要恢复):
sp_addextendedproc xp_regenumvalues,@dllname =xpstar.dll
go
sp_addextendedproc xp_regdeletevalue,@dllname =xpstar.dll
go
sp_addextendedproc xp_regdeletekey,@dllname =xpstar.dll
go
sp_addextendedproc xp_cmdshell ,@dllname =xplog70.dll
7) 对于个人版,事务复制仅在订阅服务器上支持,企业版,开发版,标准版支持所有的事务复制功能
在个人版上不能做事务复制的发布服务器。
8) 复制类型以及应用场景
复制类型 |
工作原理 |
应用场景 |
快照复制 |
完全按照数据和数据库对象出现时的状态对其进行复制和分发的过程。 |
1、主要是静态数据,不经常更改 2、一个时期内允许有自己过时的数据副本 3、复制小批量数据 4、站点经常离线,并且可以接受高滞后时间 5、不能完成数据的合并,报主键错误 6、数据单向同步,订阅库同步分发数据 |
事务复制 |
将数据的初始快照传播到订阅服务器。然后,当发布服务器上发生数据修改时,捕获个别事物并将其传播到订阅服务器。 |
1、希望将修改的数据在几秒之内传播到订阅服务器 2、需要的事务是不可再细分的原子事务 3、订阅服务器连接到发布服务器时 4、应用程序不能接受订阅服务器接受更新的高延迟 5、个人版不能用,可以合并,不能复制大二进制字段 6、数据单向同步,订阅库同步分发数据 |
合并复制 |
使各站点得以自主工作(联机或脱机),并且经过一段时间以后将多个站点上的数据修改合并为一个统一的结果。 |
1、多个订阅服务器需要在不同的时刻更新数据,并将这些更改传播到发布服务器和其他订阅服务器 2、订阅服务器需要接收数据、脱机更改数据、然后将更改同步到发布服务器和其他订阅服务器 3、应用程序延迟请求为高或低时 4、对站点(高速连接)独立要求很高的环境 5、订阅和出版方修改数据都可以同步,加入两方一块修改则优先级别高得起作用,一般是出版方优先级高 6、个人版不能用,可以合并,不能复制大二进制字段 7、数据双向同步 |
9) 复制中各种角色的对应如下:
发布服务器:提供原数据;定义发布
出版社:将新书成批量印制,卖到书店
分发服务器:保存元数据,历史纪录,接收并保存数据变化;把数据的变化转发到订阅服务器
书店:将从出版社购买来的新书,对外卖
订阅服务器:接收数据;保存数据副本
读者:从书店购买新书
以上三种角色的创建过程:首先创建分发服务器,就好比书店需要新书;
然后创建发布服务器,好比书店有需求了,出版社才按需供应;
最后创建订阅服务器,好比读者购买
2. 复制前的准备工作:
主要是要注意权限的问题,一般做发布/订阅,建议你做如下准备工作:
10)发布服务器,订阅服务器都创建一个同名的windows用户,并设置相同的密码,做为发布快照文件夹的有效访问用户
我的电脑
--控制面板
--管理工具
--计算机管理
--用户和组
--右键用户
--新建用户
--建立一个隶属于administrator组的登陆windows的用户
11)在发布服务器上,新建一个共享目录,做为发布的快照文件的存放目录,操作:
我的电脑--D:\ 新建一个目录,名为: PUB
--右键这个新建的目录
--属性--共享
--选择"共享该文件夹"
--通过"权限"按纽来设置具体的用户权限,保证第一步中创建的用户具有对该文件夹的所有权限
--确定
12)设置SQL代理(SQLSERVERAGENT)服务的启动用户(发布/订阅服务器均做此设置)
开始--程序--管理工具--服务
--右键SQLSERVERAGENT
--属性--登陆--选择"此账户"
--输入或者选择第一步中创建的windows登录用户名
--"密码"中输入该用户的密码
13)设置SQL Server身份验证模式,解决连接时的权限问题(发布/订阅服务器均做此设置)
企业管理器
--右键SQL实例--属性
--安全性--身份验证
--选择"SQL Server 和 Windows"
--确定
14)在发布服务器和订阅服务器上互相注册
企业管理器
--右键SQL Server组
--新建SQL Server注册...
--下一步--可用的服务器中,输入你要注册的远程服务器名--添加
--下一步--连接使用,选择第二个"SQL Server身份验证"
--下一步--输入用户名和密码
--下一步--选择SQL Server组,也可以创建一个新组
--下一步--完成
15)对于只能用IP,不能用计算机名的,为其注册服务器别名
(在连接端配置,比如,在订阅服务器上配置的话,服务器名称中输入的是发布服务器的IP)
开始--程序--Microsoft SQL Server--客户端网络实用工具
--别名--添加
--网络库选择"tcp/ip"--服务器别名输入SQL服务器名
--连接参数--服务器名称中输入SQL服务器ip地址
--如果你修改了SQL的端口,取消选择"动态决定端口",并输入对应的端口号
3. 实施过程中遇到的问题
1) (NULL) 未配置为分发服务器错误 14114:
原因:
针对本地服务器在 sysservers 表 master 数据库中没有一个项不足显示错误消息。
要验证是否为本地服务器在 master 数据库, sysservers 表中没有项有连接到本地服务器并运行 " 从查询分析器选择 @ @ servername "。 如果返回 (NULL), 然后针对本地服务器一个项不存在 master 数据库中 sysservers表中。
解决方法:
1、 运行此代码:
use master
go select * from sysservers go
2、 标识列表中的本地服务器名称。 如果名称存在, 并且svrID 不是 0, 则运行下列语句删掉本地服务器重建,并且替换 " yourservername " 为本地服务器:
sp_dropserver 'yourservername','droplogins'
3、 将本地服务器添加到列表通过运行此代码:
sp_addserver 'localservername', 'local'
三步执行完后,检查srvid是否为0,如果为0,重新启动计算机进行下一步工作
2) 错误18483:未能连接到服务器 'xx',因为'distributor_admin'未在该服务器上定义为远程登录。如果是错误5也是该处理方法
原因:出现这种问题,应该是你曾经更改过计算机名
解决方法:执行下面的语句,完成后重新启动SQL服务
if serverproperty('servername') <> @@servername
begin
declare @server sysname
set @server = @@servername
exec sp_dropserver @server = @server
set @server = cast(serverproperty('servername') as sysname)
exec sp_addserver @server = @server , @local = 'LOCAL'
end
检查一下有没有这两个文件:
c:\program files\Microsoft sqlserver\80\tools\binn\osql.exe
D:\mssql\install\instdist.sql
前者可以在任意一台sql运行正常的电脑上去复制
如果是后者不存在,则有可能是你的sql版本问题,建议御载后重新安装
3) 当我在发布服务器上的数据库中插入一条记录时,分发代理程序报错,说是“未能找到存储过程 'sp_MSins_project_inspect_register'。“project_inspect_register”就是我插入记录的表的表名
没有安装sql补丁或补丁失效,解决的办法是安装sql sp3
检查你的SQL有没有打补丁,没有的话要打上补丁,检查的方法是在查询分析器中运行:
select @@version
如果出来的版本号是8.00.760以下,则表明你未安装sp3的补丁,要装上
4) 我现在发现,如果在应用快照时,初始化订阅数据库的框架时就不会有这种错误。但是我在做合并发布时,如果只发布一个表来合并就好好的,一但表多了就出现快照代理程序报错不能完成,说是“进程未能从表‘[dbo].[administrator_execute_law]'向外大容量复制”。我以为是这个表有问题,就删了它,发现还是有这个问题,只是表名换了,奇怪的是,第次都是我数据库中的第一个表出现这样的问题。
原因:进程未能从表‘[dbo].[administrator_execute_law]'向外大容量复制
这个与字段类型有关,把所有表的char/varchar/text字段修改为nchar/nvarchar/ntext就行了
5) 已在下列订阅服务器上成功创建订阅:
LHUI
SQL Server 企业管理器 未能启动服务器“YXZ”上的服务“SQLSERVERAGENT”。
5 - (拒绝访问。)
因为该发布的快照尚不可用,所以不能立即初始化订阅服务器“LHUI”上的订阅。若要初始化该订阅,请在快照可用后启动分发代理程序。
这个问题说是要打补丁,可是打了补丁之后还是有提示,但不影响复制。
6) 在数据发布时报如下错误信息:
在BCP数据文件中遇到意外的EOF(源:ODBC SQL Server Driver(ODBC):错误代码:S1000)
这是因为数据库中含有TEXT或nTExt或Image字段引起的,只要在某项发布属性页中选择<快照>-<快照格式>-<字符模式格式>,即可解决该问题.
7) 另外,在建数据发布时,报如下错误:
违反了Primary Key约束'PK_@snapshot_seqnos_7fab3fda'.不能在对象'#7EB71BA1'中插入重复键.
(源: (数据源);错误代码:2627)
这是因为在建发布时,数据库数据正在执行插入或修改动作引起的,只要该发布的快照重新运行一下即可。
8) 对某些大型数据表无法生成快照的问题,数据库报如下错误:
进程未能从表"[dbo].[syncobj_0x3436383044343035]"向外大容量复制,在写 BCP 数据文件时发生 I/O 错误(源: ODBC SQL Server Driver (ODBC); 错误代码: 0)
这是因为该表有问题或表数据太大造成的,可用如下方法试着解决一下:
a、用DBCC checktable 对该表检查一下,数据表是否有问题,然后再试一下重新生成数据快照。
b、如果上述问题仍无法解决,可以用数据导出功能将数据表导到订阅服务器中。
c、然后重建一个针对该数据表的数据发布,选择不生成快照功能,然后运行下述问题4的解决方法,解决出现的问题。
9) 九、在建立订阅时,选择不初始化订阅方数据表,则在订阅服务器不产生相应的复制存贮过程,运行该发布时,会报如下错误:
未能找到存贮过程'sp_MSupd_XXX'...
原因如下:
Problem Description :
======
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
subscription, 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_scriptpublicationcustomprocs 'pulication_name'"
to create the scripts of those three system stored procedures. Then we run these
scripts in the subscribing database. The problem will be resolved.
解决方案:
在发布服务器上运行如下命令:sp_scriptpublicationcustomprocs 'xxxx', 其中xxxx为发布名称,该命令会生成创建上述三个存贮过程的脚本,然后在订阅服务器运行生成三个存贮过程即可。
10)在订阅数据时,发生如下错误:
该订阅已标记为不活动,必须重新初始化该订阅。需要删除并重新创建 NoSync 订阅。
(源: (数据源); 错误代码: 21074)
解决方案:
在发布服务器上,选择某项发布,在属性-》订阅-》重新初始化。可以解决上述问题
11)在数据发布时,发生如下错误:
不能在具有唯一索引 'PK_tbMeetingMemo' 的对象 'tbMeetingMemo' 中插入重复键的行。
(源: (数据源); 错误代码: 2601)
原因:可能是在发布该表时,在不同的发布中存在多次发布该表的情况.
解决方法:
a、查明是否有多次发布该表的情况.
在发布服务器的发布数据库中用运行如下SQL语句:select * from sysarticles order by dest_table
查看在dest_table列中是否出现多次该表的信息,如是,则说明该表已被多 次发布,可以用下一步中说明的方法来查看是哪些发布发布了该表。
b、运行语句:select * from syspublications,查看pubid与上述信息相同的pubid的内容,则就能确定是何种发布发布了相同的数据表。
c、找到了发布后,如果是增加数据表,则不用删除该发布下的所有订阅,如果是去除发布的数据表,则需删除该发布下的所有的订阅信息,修改相应的发布内容,重新制定相应的订阅.
注:
1、如何忽略在分发中出现的报错
a、在发布服务器的管理-》SQL server代理->作业->中,找到该发布的发布JOB,在属性->步骤->2运行代码程序-》编辑->命令->在命令语句最后添加 -skiperrors xxxx(xxxx是分发时报的错误号) , 指的是忽略该错误的意思。
b、然后重新启动分发引擎.
2.如何输出出错的信息
在待输出出错信息的JOB命令最后加入 -Output c:\temp\error.txt, -Output是命令,后面是待输出的文件路径和文件夹名
12)服务器不能互相访问
1、如果能ping通 ip地址,但ping不通服务器名称,可以修改
winnt\system32\drivers\etc\hosts (WIN2000)
windows\system32\drivers\etc\hosts (WIN2003)
2、ping通的情况下如果在企业管理器中不能注册上。
有可能是sqlserver的端口发生变化看看是不是1433
防火墙是否开放1433端口。
可以用telnet ip 1433 ,看是否1433端口放开
3、win2003安装sqlserver2000标准版,需要打补丁3