sql server 复制、镜像常见故障处理
sql server2008数据库复制实现数据同步常见问题
操作使用的一些技巧(事务复制类型):
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]
数据库镜像期间可能出现的故障处理
物理故障、操作系统故障或 SQL Server 故障都可能导致数据库镜像会话失败。 数据库镜像不会定期检查 Sqlservr.exe 所依赖的组件来验证组件是在正常运行还是已出现故障。 但对于某些类型的故障,受影响的组件将向 Sqlservr.exe 报告错误。由另一个组件报告的错误称为“硬错误”。 为了检测可能未被注意的其他故障,数据库镜像采用了自己的超时机制。 发生镜像超时时,数据库镜像将假定已发生故障并声明一个“软错误”。
重要提示:
在数据库镜像会话中无法检测到数据库(除镜像数据库之外)故障。 此外,也无法检测到数据磁盘故障,除非数据库因为数据磁盘故障而重新启动。
因此,错误检测的速度以及镜像会话对故障的反应时间取决于是硬错误还是软错误。 系统可以立即报告某些硬错误,例如网络故障。 但在某些情况下,特定于组件的超时期限可能会延迟报告某些硬错误。 对于软错误,镜像超时期限的长度决定了错误检测的速度。 默认情况下,此期限为 10 秒钟。 这是建议的最小值。
硬错误导致的故障
可能的硬错误原因包括(但不限于)下列几种情况:
连接或网线断开
网卡出现故障
路由器更改
防火墙更改
端点重新配置
事务日志驻留的驱动器丢失
操作系统或进程故障
例如,如果主体数据库中的日志驱动器停止响应或失败,操作系统会通知 Sqlservr.exe 出现严重错误。
某些组件(如网络组件和某些 IO 子系统)使用它们自己的超时设置来确定故障。 这些超时设置独立于数据库镜像,数据库镜像不了解它们,并且完全不能识别其行为。 在这些情况下,超时延迟会延长发生故障与数据库镜像收到所引发硬错误之间的时间。
注意:
出现软错误时,仅对数据库镜像执行活动的错误检查。 有关详细信息,请参阅本主题后面的“软错误导致的故障”。
若要了解网络出现的错误情况,请咨询网络工程师,询问当 TCP 连接发生下列事件时,哪些错误消息会发送到端口:
DNS 未运行。
网线被拔掉。
Microsoft Windows 防火墙阻止了特定端口。
监视端口的应用程序出现故障。
重命名基于 Windows 的服务器。
重新启动基于 Windows 的服务器。
注意:
镜像无法避免与客户端访问服务器相关的问题。 例如,假设由公用网络适配器处理与主体服务器实例的客户端连接,而由专用网络接口卡处理服务器实例之间的所有镜像通信流量。 此时,尽管数据库可以继续进行镜像,但公用网络适配器的故障将防止客户端访问数据库。
软错误导致的故障
导致镜像超时的情况包括(但不限于)下列各项:
诸如 TCP 链接超时、数据包被删除或损坏或数据包顺序错误等网络错误。
操作系统、服务器或数据库处于挂起状态。
Windows 服务器超时。
计算资源不足,例如 CPU 或磁盘超负荷运转,事务日志填满,或系统用完内存或线程。 在这些情况下,需要增加超时期限、降低工作负荷或更换硬件以处理相应的工作负荷。
镜像超时机制
由于软错误不能由服务器实例直接检测到,因此,软错误可能导致服务器实例无限期等待。 为了防止发生这种情况,数据库镜像采用了它自己的超时机制,此机制基于镜像会话中的每个服务器实例会在每个开放连接上按固定间隔发送 ping。
为了使连接保持开放,服务器实例必须能够在超时期限内在该连接上接收到 ping,此期限为定义的镜像超时时间再加上再发送一个 ping 所需的时间。 在超时期限内收到 ping 指示连接仍是开放的,且服务器实例正在通过此连接进行通信。 接收到 ping 后,服务器实例将重置此连接上的超时计数器。
如果未在超时期限内从此连接上收到 ping,则服务器实例认为此连接已超时。 服务器实例将关闭超时连接,然后根据会话的状态和运行模式处理超时事件。
即使其他服务器实际工作正常,超时也被认为是一个故障。 如果会话的超时值太短而不能使任一伙伴做出正常响应,则会产生虚假故障。 如果一个服务器实例成功地与另一个服务器实例实现通信,但后者的响应时间太短,以致于无法在超时期限过期之前接收到 ping,则会产生错误故障。
在高性能模式会话中,超时期限始终为 10 秒钟。 通常,该期限足以避免虚假故障。 在高安全性模式会话中,默认超时期限为 10 秒钟,但您可以更改该持续时间。 为了避免虚假故障,建议镜像超时期限始终为 10 秒钟或更长。
更改超时值(仅限于高安全性模式)
使用
ALTER
DATABASE
<
database
>
SET
PARTNER TIMEOUT <
integer
> 语句。
查看当前超时值
在 sys.database_mirroring 中查询 mirroring_connection_timeout。
响应错误
无论出现何种错误类型,检测到错误的服务器都会根据实例的角色、会话运行模式以及会话中任何其他连接的状态做出相应的响应。 有关丢失伙伴后会发生的情况的信息,请参阅同步数据库镜像(高安全性模式)或异步数据库镜像(高性能模式)。