选拔SQLServer同义词和SQL邮件,化解公布订阅中订阅库丢失数据的难题

在三个测试服务器删除发布(Publication)时遇上上面错误,具体如下所示

1、分发与复制
用强制订阅达成数据库同步操作
大气和批量的数量足以用数据库的一同机制处理:
//
说明:
为便利操作,全体操作均在昭示服务器(分发服务器)上操作,并利用推情势
在客户机器使用强制订阅形式。
测试通过
//
–1:环境
服务器环境:
机械名称: ZehuaDb
操作系统:Windows 3000 Server
数据库版本:SQL 两千 Server 个人版

目前给客户做了基于SQLServer的揭穿订阅的“读写分离”功用,然则一些表数据非常大,平时发出某几条数据丢失的主题素材,导致订阅不可能继续开始展览。可是每趟发现难题再一次做三回发布订阅又分外消耗费时间间,所以还得依照“复制监视器”的唤醒,找到丢失的数码,手工处理。

方今给客户做了遵照SQLServer的发布订阅的“读写分离”功效,不过有些表数据一点都不小,平时发出某几条数据丢失的主题材料,导致订阅不可能持续拓展。不过每一趟发现标题再一次做2次发布订阅又卓殊消耗费时间间,所以还得依照“复制监视器”的提醒,找到丢失的数额,手工业处理。

997755.com澳门葡京 1

客户端
机械名称:Zlp
操作系统:Windows 三千 Server
数据库版本:SQL 3000 Server 个人版

稳定缺失数据

先是,找到出标题标一块语句,在揭橥服务器的“复制监视器”上中国人民解放军海军事工业程大学业作订阅的详细消息里面,找到出错的新闻

尝试的命令:
if @@trancount > 0 rollback tran
(事务序列号: 0x0000992600000D09007F00000000,命令 ID: 19)

错误消息:
应用复制的命令时在订阅服务器上找不到该行。 (源: MSSQLServer,错误号: 20598)
获取帮助: http://help/20598
应用复制的命令时在订阅服务器上找不到该行。 (源: MSSQLServer,错误号: 20598)

 

接下来在散发服务器上试行上边包车型大巴SQL语句,

use distribution
go
sp_browsereplcmds '0x0000992600000D09007F00000000' ,'0x0000992600000D09007F00000000'
go

根据指令ID(如下边包车型大巴ID:19),找到实际的五只命令(Command列),类似于如此的:

{CALL [dbo].[sp_MSdel_dboT_TODO] ('697e7cacf5354a36be1ae4cf50dcdaa6')}

那边是 订阅库上的 sp_MSdel_dboT_TODO
存款和储蓄进度,查看存款和储蓄进程定义知道参数是ID的值,这里说找不到要去除的数量,那么我们在订阅Curry面模拟增添这几个ID的笔录就能够。增多数码,

长久缺点和失误数据

第1,找到出难点的联手语句,在公布服务器的“复制监视器”上中国人民解放军海军事工业程大学业作订阅的详细音讯里面,找到出错的新闻

尝试的命令:
if @@trancount > 0 rollback tran
(事务序列号: 0x0000992600000D09007F00000000,命令 ID: 19)

错误消息:
应用复制的命令时在订阅服务器上找不到该行。 (源: MSSQLServer,错误号: 20598)
获取帮助: http://help/20598
应用复制的命令时在订阅服务器上找不到该行。 (源: MSSQLServer,错误号: 20598)

 

接下来在散发服务器上进行上边包车型大巴SQL语句,

use distribution
go
sp_browsereplcmds '0x0000992600000D09007F00000000' ,'0x0000992600000D09007F00000000'
go

根据指令ID(如上边的ID:19),找到切实可行的1块命令(Command列),类似于那样的:

{CALL [dbo].[sp_MSdel_dboT_TODO] ('697e7cacf5354a36be1ae4cf50dcdaa6')}

那里是 订阅库上的 sp_MSdel_dboT_TODO
存款和储蓄进度,查看存款和储蓄进程定义知道参数是ID的值,那里说找不到要删减的数目,那么大家在订阅Curry面模拟扩充那一个ID的笔录就可以。添扩张少,

标题: Microsoft SQL Server Management Studio

 

------------------------------

 

Could not delete publication 'RPL_GES_MIS_QCSDB'.

 

------------------------------

 

其他信息:

 

An exception occurred while executing a Transact-SQL statement or batch. (Microsoft.SqlServer.ConnectionInfo)

 

------------------------------

 

'xxxxx' is not defined as a Subscriber for 'xxxx\xxxx'.

 

Could not update the distribution database subscription table. The subscription status could not be changed.

 

Changed database context to 'xxxx'. (Microsoft SQL Server,错误: 20032)

–②:建用户帐号
在劳务器端建立域用户帐号
自己的Computer管理->本地用户和组->用户->建立
UserName:zlp
UserPwd:zlp

补录数据

网上提供的缓解方案是用三个工具生成差距的SQL数据然后给订阅库试行,但看了下感到不是很有益,想起来SqlServer还提供3个insert…from….语句,那么是不是能够直接从透露数据库查询数据然后插入给订阅数据库呢?

能够选择同义词从发表库查询过来插入到本地订阅库,请看下边具体经过:
先在订阅库上确立叁个同义词,比如下边为表 Biz_Customer 建立三个1模一样词
Biz_Customer_Master,建立的时候,供给钦点同义词所在的服务器名称,数据库名称,架构,表名称等新闻。

997755.com澳门葡京 2

可是此时同义词还无法直接动用,还亟需树立“链接服务器”,具体进程如下:

EXEC sp_addlinkedserver
 @server='192.168.7.4',--被访问的服务器别名(习惯上直接使用目标服务器IP,或取个别名如:JOY)
 @srvproduct='',
 @provider='SQLOLEDB',
 @datasrc='192.168.7.4' --要访问的服务器
 go

 EXEC sp_addlinkedsrvlogin
 '192.168.7.4', --被访问的服务器别名(如果上面sp_addlinkedserver中使用别名JOY,则这里也是JOY)
 'false',
 NULL,
 'sa', --帐号
 '1234567890' --密码
go

select * from sys.servers;

然后选用下边包车型大巴SQL语句插入数据:

insert into [Biz_Customer] 
select * from Biz_Customer_Master where id='7B210173-7382-43EB-BC5E-0000C3BA564A'

询问报错,某些列的数据类型错误,展开表1看,原来是
发表库上的表的字段顺序跟订阅库上不雷同,因为那时候做订阅的时候,为了消除Timestamp
难题,将订阅库的Timestamp字段修改成了binary(八)类型,故订阅库上表的字段顺序改换了。

那儿,只要求在insert 和 select
语句上,钦赐同样顺序的列就能够了。那么哪些取得表全部的列名称?
很简短,直接选拔有些表,新建查询,生成的SQL语句就富含表全体的字段了。
终极正确的话语如下:

insert into [TB_Customer]([Id]
      ,[CustomerId]
      ,[Code]
      ,[Name]
      ,[BusinessId]
      ,[CreatedOn]
      ,[CreatedById]
      ,[ModifiedOn]
      ,[ModifiedById]
      ,[AppraiseTableType]
      ,[Timestamp]
      )
SELECT  [Id]
      ,[CustomerId]
      ,[Code]
      ,[Name]
      ,[BusinessId]
      ,[CreatedOn]
      ,[CreatedById]
      ,[ModifiedOn]
      ,[ModifiedById]
      ,[AppraiseTableType]
      ,[Timestamp]
  FROM dbo.TB_Customer_Master 
  where id='7B210173-7382-43EB-BC5E-0000C3BA564A';

经过如此的措施,很有益于的把揭橥库的数目就补充到订阅库上了,之后,数据库的揭发订阅错误就消除了。

补录数据

网上提供的化解方案是用3个工具生成差距的SQL数据然后给订阅库施行,但看了下以为不是很有利,想起来SqlServer还提供一个insert…from….语句,那么是还是不是能够平素从揭露数据库查询数据然后插入给订阅数据库呢?

能够使用同义词从公布库查询过来插入到本地订阅库,请看上边具体经过:
先在订阅库上树立一个同义词,比如上边为表 Biz_Customer 建立一个均等词
Biz_Customer_Master,建立的时候,要求钦赐同义词所在的服务器名称,数据库名称,架构,表名称等新闻。

997755.com澳门葡京 3

只是此时同义词还不可能直接使用,还供给树立“链接服务器”,具体经过如下:

EXEC sp_addlinkedserver
 @server='192.168.7.4',--被访问的服务器别名(习惯上直接使用目标服务器IP,或取个别名如:JOY)
 @srvproduct='',
 @provider='SQLOLEDB',
 @datasrc='192.168.7.4' --要访问的服务器
 go

 EXEC sp_addlinkedsrvlogin
 '192.168.7.4', --被访问的服务器别名(如果上面sp_addlinkedserver中使用别名JOY,则这里也是JOY)
 'false',
 NULL,
 'sa', --帐号
 '1234567890' --密码
go

select * from sys.servers;

然后选择下边包车型客车SQL语句插入数据:

insert into [Biz_Customer] 
select * from Biz_Customer_Master where id='7B210173-7382-43EB-BC5E-0000C3BA564A'

查询报错,某些列的数据类型错误,张开表1看,原来是
宣布库上的表的字段顺序跟订阅库上不同,因为那儿做订阅的时候,为了化解Timestamp
难点,将订阅库的Timestamp字段修改成了binary(八)类型,故订阅库上表的字段顺序改造了。

此时,只供给在insert 和 select
语句上,内定一样顺序的列就能够了。那么如何收获表全部的列名称?
很轻巧,直接选取某些表,新建查询,生成的SQL语句就隐含表全数的字段了。
终极正确的言辞如下:

insert into [TB_Customer]([Id]
      ,[CustomerId]
      ,[Code]
      ,[Name]
      ,[BusinessId]
      ,[CreatedOn]
      ,[CreatedById]
      ,[ModifiedOn]
      ,[ModifiedById]
      ,[AppraiseTableType]
      ,[Timestamp]
      )
SELECT  [Id]
      ,[CustomerId]
      ,[Code]
      ,[Name]
      ,[BusinessId]
      ,[CreatedOn]
      ,[CreatedById]
      ,[ModifiedOn]
      ,[ModifiedById]
      ,[AppraiseTableType]
      ,[Timestamp]
  FROM dbo.TB_Customer_Master 
  where id='7B210173-7382-43EB-BC5E-0000C3BA564A';

透过这么的法子,很有益于的把发布库的数量就补充到订阅库上了,之后,数据库的发布订阅错误就一蹴而就了。

 

–三:重新启航服务器MSSQLServer
自家的处理器->调整面版->管理工科具->服务->MSSQLServer 服务
(改换为:域用户帐号,大家新建的zlp用户 ./zlp,密码:zlp)

修改订阅仓库储存款和储蓄进度

 然而,若是那样的失实大多,每便都去靠手工业修补数据是可怜的,所以大家还亟需找到订阅库上的系统存款和储蓄进度,做相应的改变。

  •   修改数据,对应的储存进程名字是 sp_MSupd_dboTableName
    ,所以大家能够拿到要操作的表名字:dbo.TableName
  •   删除数据,对应的储存进度名字是
    sp_MSdel_dboTableName,所以大家能够拿到要操作的表名字:dbo.TableName

万1是去除数据,直接把囤积进程中的上面内容注释:

if @@rowcount = 0
    if @@microsoftversion>0x07320000
        exec sp_MSreplraiserror 20598

只倘使修改数据,首先也要把上边的始末注释,然后在蕴藏进度的末尾,增加上边那样的代码:

if @@rowcount = 0
begin
insert into [TB_Customer]([Id]
      ,[CustomerId]
      ,[Code]
      ,[Name]
      ,[BusinessId]
      ,[CreatedOn]
      ,[CreatedById]
      ,[ModifiedOn]
      ,[ModifiedById]
      ,[AppraiseTableType]
      ,[Timestamp]
      )
SELECT  [Id]
      ,[CustomerId]
      ,[Code]
      ,[Name]
      ,[BusinessId]
      ,[CreatedOn]
      ,[CreatedById]
      ,[ModifiedOn]
      ,[ModifiedById]
      ,[AppraiseTableType]
      ,[Timestamp]
  FROM [192.168.7.4].XXDB.dbo.Biz_Customer
  where id=@pkc1

end

此处未有行使同义词,而是直接使用远程服务器名字加数据库名字格局钦赐远程表名字,当您要修改的储存进程比较多,推荐应用那种艺术而不是同义词。

参数 @pkc壹 是储存进程选用的主键参数,各种存款和储蓄进度都以这样的。

修改订阅仓库储存款和储蓄进程

 然而,假如那样的荒唐繁多,每趟都去靠手工业修补数据是13分的,所以大家还需求找到订阅库上的种类存款和储蓄进程,做相应的修改。

  •   修改数据,对应的仓库储存进度名字是 sp_MSupd_dboTableName
    ,所以大家能够得到要操作的表名字:dbo.TableName
  •   删除数据,对应的存款和储蓄进程名字是
    sp_MSdel_dboTableName,所以大家能够得到要操作的表名字:dbo.TableName

只假若去除数据,直接把囤积进程中的上面内容注释:

if @@rowcount = 0
    if @@microsoftversion>0x07320000
        exec sp_MSreplraiserror 20598

倘倘诺修改数据,首先也要把地点的始末注释,然后在储存进度的末尾,增添下边那样的代码:

if @@rowcount = 0
begin
insert into [TB_Customer]([Id]
      ,[CustomerId]
      ,[Code]
      ,[Name]
      ,[BusinessId]
      ,[CreatedOn]
      ,[CreatedById]
      ,[ModifiedOn]
      ,[ModifiedById]
      ,[AppraiseTableType]
      ,[Timestamp]
      )
SELECT  [Id]
      ,[CustomerId]
      ,[Code]
      ,[Name]
      ,[BusinessId]
      ,[CreatedOn]
      ,[CreatedById]
      ,[ModifiedOn]
      ,[ModifiedById]
      ,[AppraiseTableType]
      ,[Timestamp]
  FROM [192.168.7.4].XXDB.dbo.Biz_Customer
  where id=@pkc1

end

此地未有采纳同义词,而是直接使用远程服务器名字加数据库名字格局钦赐远程表名字,当你要修改的存款和储蓄进程比较多,推荐应用那种措施而不是同义词。

参数 @pkc一 是储存进程采纳的主键参数,每一种存款和储蓄进程都以那般的。

 

–四:安装分发服务器
A:配置分发服务器
选拔SQLServer同义词和SQL邮件,化解公布订阅中订阅库丢失数据的难题。工具->复制->配置发布、订阅服务器和散发->下一步->下一步(全部的均运用默许配置)
B:配置发表服务器
工具->复制->创制和管理发布->选拔要公布的数据库(SZ)->下一步->快速照相发表->下一步->
选拔要揭橥的始末->下一步->下一步->下一步->完结
C:强制配置订阅服务器(推方式,拉情势与此雷同)
工具->复制->配置公布、订阅服务器和分发->订阅服务器->新建->SQL
Server数据库->输入客户端服务器名称(ZLP)->使用SQL Server
身份验证(sa,空密码)->鲜明->应用->分明
D:初阶化订阅
复制监视器->揭橥服务器(ZEHUADB)->双击订阅->强制新建->下一步->选拔启用的订阅服务器->ZLP->
下一步->下一步->下一步->下一步->完成

接纳游标生成修改语句

唯独,纵然要修改从存款和储蓄进程多数,这样一个个的去手工业修改存款和储蓄进程是丰裕费劲的,所以大家能够把上边的进度,写几个T-SQL来输出,大家采纳游标来便利表全体的列,生成语句:

declare @ObjTbName varchar(100)
declare @ColName varchar(100)
declare @ColType varchar(50)
declare @AllColName varchar(max)
declare @SqlText varchar(max)

set @ObjTbName='TB_Customer'
set @SqlText ='insert into '+@ObjTbName+'('

DECLARE column_cursor CURSOR FOR
SELECT COLUMN_NAME,DATA_TYPE FROM INFORMATION_SCHEMA.columns WHERE TABLE_NAME=@ObjTbName
OPEN column_cursor
FETCH NEXT FROM column_cursor into @ColName,@ColType
set @AllColName ='['+ @ColName+']'
WHILE @@FETCH_STATUS = 0
BEGIN
   -- This is executed as long as the previous fetch succeeds.
   --print 'Col Name:'+ @ColName +',Col Type:' + @ColType
   FETCH NEXT FROM column_cursor into @ColName,@ColType
   if @@FETCH_STATUS = 0
   --print ' ,'+@ColName
   set @AllColName = @AllColName +',['+ @ColName+']'
END

CLOSE column_cursor
DEALLOCATE column_cursor
--print @AllColName

set @SqlText =@SqlText + char(10)+ @AllColName +')' +CHAR(10)
set @SqlText =@SqlText +'select '+CHAR(10) + @AllColName + CHAR(10)
set @SqlText =@SqlText +' from [192.168.7.4].XXDB.dbo.'+@ObjTbName + ' where id=@pkc1 '

print '--if @@rowcount = 0'
print '--    if @@microsoftversion>0x07320000'
print '--        exec sp_MSreplraiserror 20598'
print 'end '
print 'end '

print 'if @@rowcount = 0'
print 'begin'
print @SqlText
print 'end '

将输音信复制粘贴在要修改的贮存进程尾部就能够。

修改并实践那一个蕴藏进程,等订阅代理重新实施这一个蕴藏进度后,数据就过去了。

为了方便这一个那个历程被先后调用,能够将它封装成存款和储蓄进程,具体内容如下:

/*
--创建数据库复制的时候订阅库修改使用的存储过程
--具体原理和使用,请参考博客文章:
--  http://www.cnblogs.com/bluedoctor/p/5680582.html 
--作者:请参考博客文章作者
--时间:2016.7.20

--调用示例:
  exec BuildReplUpdateTable 'MainSqlServer','HRDB','TB_AuditOrgBalance',1
*/
create procedure BuildReplUpdateTable 
   @LinkServer varchar(100),
   @ObjDBName varchar(50),
   @ObjTbName varchar(100),
   @IsSp_MSupd bit
as
begin
    declare @ColName varchar(100)
    declare @ColType varchar(50)
    declare @AllColName varchar(max)
    declare @SqlText varchar(max)
    declare @TempText varchar(max)

    set @SqlText ='insert into '+@ObjTbName+'('

    DECLARE column_cursor CURSOR FOR
    SELECT COLUMN_NAME,DATA_TYPE FROM INFORMATION_SCHEMA.columns WHERE TABLE_NAME=@ObjTbName
    OPEN column_cursor
    FETCH NEXT FROM column_cursor into @ColName,@ColType
    set @AllColName ='['+ @ColName+']'
    WHILE @@FETCH_STATUS = 0
    BEGIN
       --print 'Col Name:'+ @ColName +',Col Type:' + @ColType
       FETCH NEXT FROM column_cursor into @ColName,@ColType
       if @@FETCH_STATUS = 0
           set @AllColName = @AllColName +',['+ @ColName+']'
    END

    CLOSE column_cursor
    DEALLOCATE column_cursor

    set @SqlText =@SqlText + char(10)+ @AllColName +')' +CHAR(10)
    set @SqlText =@SqlText +'select '+CHAR(10) + @AllColName + CHAR(10)
    set @SqlText =@SqlText +' from ['+@LinkServer+'].['+@ObjDBName +'].[dbo].['+@ObjTbName + '] where id=@pkc1 '

    if @IsSp_MSupd = 1 
    begin
      set @TempText='--if @@rowcount = 0'+CHAR(10)+
                    '--    if @@microsoftversion>0x07320000' +CHAR(10)+
                    '--        exec sp_MSreplraiserror 20598'+CHAR(10)+
                    'end '+CHAR(10)+
                    'end '+CHAR(10)+
                    'if @@rowcount = 0'+CHAR(10)+
                    'begin'+CHAR(10)+
                    @SqlText +CHAR(10)+
                    'end '
       select @TempText        
    end
    else
    begin
       select @SqlText
    end

end

 即便下面封装的贮存进度能够很方便的变型修改订阅存储进度的1部分修改语句,可是1旦系统的表许多,近日还未有达成批量的整体制改良动那几个订阅存款和储蓄进程,假若有1种方式及时布告DBA
哪些订阅数据出现了难题,然后再依照后面包车型大巴章程消除难题,就很有益于了。那一个效果,正是上边说的不2秘技。

行使游标生成修改语句

而是,假设要修改从存款和储蓄进度大多,那样三个个的去手工修改存款和储蓄进度是11分麻烦的,所以大家得以把地点的经过,写一个T-SQL来输出,大家利用游标来便利表全数的列,生成语句:

declare @ObjTbName varchar(100)
declare @ColName varchar(100)
declare @ColType varchar(50)
declare @AllColName varchar(max)
declare @SqlText varchar(max)

set @ObjTbName='TB_Customer'
set @SqlText ='insert into '+@ObjTbName+'('

DECLARE column_cursor CURSOR FOR
SELECT COLUMN_NAME,DATA_TYPE FROM INFORMATION_SCHEMA.columns WHERE TABLE_NAME=@ObjTbName
OPEN column_cursor
FETCH NEXT FROM column_cursor into @ColName,@ColType
set @AllColName ='['+ @ColName+']'
WHILE @@FETCH_STATUS = 0
BEGIN
   -- This is executed as long as the previous fetch succeeds.
   --print 'Col Name:'+ @ColName +',Col Type:' + @ColType
   FETCH NEXT FROM column_cursor into @ColName,@ColType
   if @@FETCH_STATUS = 0
   --print ' ,'+@ColName
   set @AllColName = @AllColName +',['+ @ColName+']'
END

CLOSE column_cursor
DEALLOCATE column_cursor
--print @AllColName

set @SqlText =@SqlText + char(10)+ @AllColName +')' +CHAR(10)
set @SqlText =@SqlText +'select '+CHAR(10) + @AllColName + CHAR(10)
set @SqlText =@SqlText +' from [192.168.7.4].XXDB.dbo.'+@ObjTbName + ' where id=@pkc1 '

print '--if @@rowcount = 0'
print '--    if @@microsoftversion>0x07320000'
print '--        exec sp_MSreplraiserror 20598'
print 'end '
print 'end '

print 'if @@rowcount = 0'
print 'begin'
print @SqlText
print 'end '

将输信息复制粘贴在要修改的仓库储存过程尾巴部分就可以。

修改并实施那些蕴藏进程,等订阅代理重新实施那几个蕴藏进程后,数据就过去了。

为了有利于那个那几个进度被先后调用,能够将它封装成存款和储蓄进程,具体内容如下:

/*
--创建数据库复制的时候订阅库修改使用的存储过程
--具体原理和使用,请参考博客文章:
--  http://www.cnblogs.com/bluedoctor/p/5680582.html 
--作者:请参考博客文章作者
--时间:2016.7.20

--调用示例:
  exec BuildReplUpdateTable 'MainSqlServer','HRDB','TB_AuditOrgBalance',1
*/
create procedure BuildReplUpdateTable 
   @LinkServer varchar(100),
   @ObjDBName varchar(50),
   @ObjTbName varchar(100),
   @IsSp_MSupd bit
as
begin
    declare @ColName varchar(100)
    declare @ColType varchar(50)
    declare @AllColName varchar(max)
    declare @SqlText varchar(max)
    declare @TempText varchar(max)

    set @SqlText ='insert into '+@ObjTbName+'('

    DECLARE column_cursor CURSOR FOR
    SELECT COLUMN_NAME,DATA_TYPE FROM INFORMATION_SCHEMA.columns WHERE TABLE_NAME=@ObjTbName
    OPEN column_cursor
    FETCH NEXT FROM column_cursor into @ColName,@ColType
    set @AllColName ='['+ @ColName+']'
    WHILE @@FETCH_STATUS = 0
    BEGIN
       --print 'Col Name:'+ @ColName +',Col Type:' + @ColType
       FETCH NEXT FROM column_cursor into @ColName,@ColType
       if @@FETCH_STATUS = 0
           set @AllColName = @AllColName +',['+ @ColName+']'
    END

    CLOSE column_cursor
    DEALLOCATE column_cursor

    set @SqlText =@SqlText + char(10)+ @AllColName +')' +CHAR(10)
    set @SqlText =@SqlText +'select '+CHAR(10) + @AllColName + CHAR(10)
    set @SqlText =@SqlText +' from ['+@LinkServer+'].['+@ObjDBName +'].[dbo].['+@ObjTbName + '] where id=@pkc1 '

    if @IsSp_MSupd = 1 
    begin
      set @TempText='--if @@rowcount = 0'+CHAR(10)+
                    '--    if @@microsoftversion>0x07320000' +CHAR(10)+
                    '--        exec sp_MSreplraiserror 20598'+CHAR(10)+
                    'end '+CHAR(10)+
                    'end '+CHAR(10)+
                    'if @@rowcount = 0'+CHAR(10)+
                    'begin'+CHAR(10)+
                    @SqlText +CHAR(10)+
                    'end '
       select @TempText        
    end
    else
    begin
       select @SqlText
    end

end

 纵然上边封装的储存进度能够很有益于的更改修改订阅存款和储蓄进度的壹部分修改语句,但是纵然系统的表繁多,目前还一贯不产生批量的全部修改那几个订阅存款和储蓄进程,假诺有一种办法及时通报DBA
哪些订阅数据出现了难点,然后再根据前面的不二秘籍化解难点,就很便宜了。那一个效果,正是上面说的方法。

实际上那一个环境是仿造过来,生产服务器是布局过宣布订阅,复制克隆后,修改过服务器名称,别的在实际上服务器上,并从未当真订阅那一个Publication,当然这些测试环境的复制恐怕还被人折磨过。这么些正是自家当下案例的条件。

–5:测试配置是否成功
复制监视器->公布服务器(ZEHUADB)->双击SZ:SZ->点意况->点及时运转代理程序
查看:
复制监视器->公布服务器(ZEHUADB)->SZ:SZ->选用ZLP:SZ(类型强制)->鼠标右键->运行同步处理
1经没有不当标记(土黑叉),恭喜你陈设成功
–6:测试数据
–在服务器施行:
选拔八个表,推行如下SQL
insert into WQ_NEWSGROUP_S select ‘测试成功’,五
复制监视器->公布服务器(ZEHUADB)->SZ:SZ->快速照相->运行代理程序
去查看同步的 WQ_NEWSGROUP_S 是不是插入了一条新的笔录

SQL邮件监察和控制订阅错误

SQL邮件提供了监视数据库各个质量,问题,警报,然后发邮件文告管理员的功能,咱们也得以采取那么些效率,当订阅库发生多少同步错误,发壹封邮件及时通告管理员,而不用实时去瞅着“复制监视器”,查看难题了。

  • 先是在“服务器”-管理-数据库邮件节点上,配置2个数据库邮件账号,具体经过略,请参见其余相关小说;
  • 下一场,在Sql Server
    代理-操作员作用上,加多3个操作员,填写上通报该操作员的电子邮件账号;
  • 最终,在Sql Server
    代理-作业节点,选取用于订阅的作业名称,然后张开属性窗口,进行如下设置:

997755.com澳门葡京 4

如图填写上3个得当的重试次数,私下认可那是贰个极大的数字,所以会重试很久都不会暴发难点邮件。该难点本人查找了很久才发现,我们不要走弯路了。

因而这么的布局之后,现身订阅同步难点,会吸收大概如下的邮件内容:

作业运行:    “DNXSQL-HRDB-XX发布-DNXSQL1-HRDB-3D57B9A6-207B-486A-8B5D-41125B68A876”已在 2016/7/22 14:00:46 运行
持续时间:    0 小时,8 分钟,55 秒
状态: 失败
消息:    该作业失败。  用户 sa 调用了该作业。最后运行的是步骤 1 (运行代理。)。.

接收该邮件后,去服务器遵照前边介绍的方法,化解此难点就能够。
到现在,DBA能够放心去干其余作业了。

(注:本文是贰个非正式DBA奋战N多天,不断尝试总括,多次修订本文而成,转发请注明作者,并欢迎使用SOD开采框架,它的数据库工具将会提供自动生成修改的订阅存款和储蓄进度的机能。)

补充:

1经订阅库少了少数记录,能够透过下边好像的询问消除:

update [MainSqlServer].[XXDB].[dbo].TB_Appropriation set ModifiedOn=GETDATE () where ID in 
(
SELECT ID  FROM [MainSqlServer].[XXDB].[dbo].TB_Appropriation where id not in (
  SELECT ID FROM [XXDB].[dbo].TB_Appropriation
)
)

内部,MainSqlServer是宣布服务器对应的链接服务器名称,如若要补偿缺点和失误数据的表有二个ModifiedOn
字段。

 

SQL邮件监察和控制订阅错误

SQL邮件提供了蹲点数据库各类质量,问题,警报,然后发邮件通告管理员的效率,大家也能够应用那个职能,当订阅库发生多少同步错误,发1封邮件及时通报管理员,而不用实时去瞅着“复制监视器”,查看难题了。

  • 首先在“服务器”-管理-数据库邮件节点上,配置三个数据库邮件账号,具体进程略,请参见别的有关文章;
  • 接下来,在Sql Server
    代理-操作员功效上,增多叁个操作员,填写上通报该操作员的电子邮件账号;
  • 末尾,在Sql Server
    代理-作业节点,选择用于订阅的课业名称,然后展开属性窗口,进行如下设置:

997755.com澳门葡京 5

如图填写上3个相宜的重试次数,默许这是三个一点都不小的数字,所以会重试很久都不会发出难题邮件。该难点小编查找了很久才意识,大家不要走弯路了。

经过这样的配备之后,出现订阅同步难点,会接到差不多如下的邮件内容:

作业运行:    “DNXSQL-HRDB-XX发布-DNXSQL1-HRDB-3D57B9A6-207B-486A-8B5D-41125B68A876”已在 2016/7/22 14:00:46 运行
持续时间:    0 小时,8 分钟,55 秒
状态: 失败
消息:    该作业失败。  用户 sa 调用了该作业。最后运行的是步骤 1 (运行代理。)。.

接过该邮件后,去服务器遵照前边介绍的方法,消除此难题就能够。
至此,DBA能够放心去干其余事务了。

(注:本文是3个非正式DBA奋战N多天,不断尝试总括,多次修订本文而成,转发请注明笔者,并迎接使用SOD开垦框架,它的数据库工具将会提供自动生成修改的订阅存款和储蓄进度的作用。)

补充:

设若订阅库少了一点记录,能够透过下面好像的查询消除:

update [MainSqlServer].[XXDB].[dbo].TB_Appropriation set ModifiedOn=GETDATE () where ID in 
(
SELECT ID  FROM [MainSqlServer].[XXDB].[dbo].TB_Appropriation where id not in (
  SELECT ID FROM [XXDB].[dbo].TB_Appropriation
)
)

其间,MainSqlServer是公布服务器对应的链接服务器名称,若是要补偿缺点和失误数据的表有二个ModifiedOn
字段。

 

赶过这一个似是而非时,能够选用下边脚本删除全部Subcrition后,

测试结束,通过。

USE DataBaseName;

GO

 

EXEC sp_dropsubscription 

    @publication =N'RPL_GES_MIS_QCSDB',  --根据具体情况填写Publication名称

    @article= N'all',

    @subscriber=N'all',

    @ignore_distributor=1;

–7修改数据库的二只时间,一般选拔夜间进行数据库同步处理

 

注意表达:

接下来手工业删除分发服务器(当然也足以采纳上面脚本删除,依照实情,修改对应的数据库名称)。

服务器壹端不可能以(local)进行数据的颁发与分发,必要先删除注册,然后新建注册本地Computer名称
卸载情势:工具->复制->禁止公布->是在”ZehuaDb”上稳步发布,卸载全数的数据库同步安插服务器
专注:公布服务器、分发服务器中的SQLServerAgent服务必须运营
      选用推情势: “D:/Microsoft SQL Server/MSSQL/REPLDATA/unc”
目录文件能够不安装共享
      拉方式:则须求共享~!

use DatabaseName;

 

GO

 

exec sp_droppublication @publication = N'RPL_GES_MIS_QCSDB', @ignore_distributor = 1

 

exec sp_helpreplicationdboption @dbname = N'DatabaseName', @reserved = 1

 

use [DatabaseName]

 

exec sp_helppublication 

 

use [DatabaseName]

 

exec sp_replicationdboption @dbname = N'DatabaseName', @optname = N'publish', @value = N'false'

 

 

少量数据库同步能够利用触发器落成,同步单表就能够:

布置进程中大概出现的主题材料,总计如下:

在SQL Server 三千里安装和利用数据库复制在此之前,应先检查不非亲非故系的几台SQL
Server服务器上面几点是还是不是满意:
   
壹、MSSQLserver和Sqlserveragent服务是不是是以域用户身份运行并运行的(./administrator用户也是可以的)
       
假诺登6用的是地点系统帐户local,将不抱有互连网成效,会时有发生以下错误:
        进度不能够连接到Distributor ‘@Server name’
      (假使您的服务器已经用了SQL Server全文字笔迹核算索服务,
请不要修改MSSQLserver和Sqlserveragent服务的local运营。
       会照成全文字笔迹核算索服务无法用。请换其它壹台机器来做SQL Server
3000里复制中的分发服务器。)   
     
修改服务运维的记名用户,要求重新启航MSSQLserver和Sqlserveragent服务才能行之有效。   
    2、检查有关的几台SQL
Server服务器是不是改过名称(供给srvid=0的本土机械上srvname和datasource一样)
       在查询分析器里施行:
         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不一样(因为你改过Computer名字),再运维上边包车型大巴
        –删除错误的服务器名
        EXEC sp_dropserver @server=@servername
        –增添正确的劳动器名
        EXEC sp_addserver @server=@serverproperty_servername,
@local=’local’
      
修改那项参数,要求再次开动MSSQLserver和Sqlserveragent服务技术奏效。   
       那样1来就不会在创建复制的历程中冒出1848二、184八三张冠李戴了。
三、检查SQL Server企管器里面相关的几台SQL
Server注册名是还是不是和上边第1点里介绍的srvname同样
        不能用IP地址的注册名。
      (大家能够删掉IP地址的登记,新建以SQL
Server管理员等第的用户注册的劳务器名)
      
那样一来就不会在创立复制的历程中冒出14010、二零零六肆、1845陆、184八二、184八3荒唐了。   
    四、检查相关的几台SQL Server服务器互连网是否能够健康访问
        要是ping主机IP地址能够,但ping主机名不通的时候,必要在   
            winnt/system32/drivers/etc/hosts   (WIN2000)
            windows/system32/drivers/etc/hosts (WIN2003)
               文件里写入数据库服务器IP地址和主机名的呼应关系。
           例如:   
           127.0.0.1       localhost
           192.168.0.35    oracledb    oracledb
           192.168.0.65    fengyu02    fengyu02
           202.84.10.193   bj_db       bj_db   
         或然在SQL Server客户端互连网实用工具里建立小名,例如:
      5、系统供给的扩大存款和储蓄进程是不是留存(如若不存在,供给还原):
         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’ 
    接下去就足以用SQL Server企业管理器里[复制]-> 右键选取
       
->[安排发布、订阅服务器和散发]的图形分界面来布署数据库复制了。
    上面是按顺种类出配置复制的步调:
    一、建立发表和散发服务器
        [迎接使用安顿发布和分发向导]->[分选分发服务器]
       ->[使”@servername”成为它和谐的散发服务器,SQL
Server将创立分发数据库和日志]
       ->[制订快速照相文件夹]-> [自定义配置] ->
[否,使用下列的暗中认可配置] -> [完成]
    上述手续达成后, 会在现阶段”@servername” SQL
Server数据Curry创立了三个distribion库和
           
一个distributor_admin管理员级其余用户(我们得以私下修改密码)
    服务器上新增了四个作业:
                [ 代理程序历史记录清除: distribution ]
                [ 分发清除: distribution ]
                [ 复制代理程序检查 ]
                [ 重新开首化存在数量表达退步的订阅 ]
    SQL Server企管器里多了1个复制监视器,
当前的那台机器就足以发布、分发、订阅了。
    大家重新在SQL Server企管器里[复制]-> 右键选取
        ->[配置发布、订阅服务器和散发],能够见见类似下图:
    大家能够在 [宣布服务器和分发服务器的习性] 窗口
        -> [公告服务器] -> [新增]        -> [确定]
        -> [透露数据库] -> [事务]/[合并] -> [确定]
        -> [订阅服务器] -> [新增]        ->
[确定]       
       把互连网上的别的SQL Server服务器增多成为揭橥依然订阅服务器.
       新扩张1台公布服务器的选项:   
   
作者那边新确立的JIN00一公布服务器是用管理员品级的数据库用户test连接的,      
    到发布服务器的管住链接要输入密码的可选框, 私下认可的是选中的,
   
在新建的JIN00一发表服务器上建立和散发服务器FENGYU/FENGYU的链接的时索要输入distributor_admin用户的密码
         到公布服务器的管理链接要输入密码的可选框,也足以不选,
        
也正是不必要密码来建立发表到分发服务器的链接(那自然欠缺安全,在测试环境下得以行使)
       新添一台订阅服务器的选项:

贰、新确立的互连网上另1台发表服务器(例如JIN00一)选拔分发服务器
    
    [迎接使用布署公布和散发向导]->[选用分发服务器]
    
     -> 使用下列服务器(选定的服务器必须已安插为散发服务器) ->
[选定服务器](例如FENGYU/FENGYU)
     -> [下一步] ->
[输入分发服务器(例如FENGYU/FENGYU)的distributor_admin用户的密码一遍]   
     -> [下一步] -> [自定义配置] ->
[否,使用下列的暗中认可配置]    
     -> [下一步] -> [完成] -> [确定]
   
     建立贰个数据库复制发表的进度:
     
     [复制] -> [发布内容] -> 右键选拔 -> [新建公布] 
     -> [下一步] -> [分选发布数据库] ->
[当选三个待发表的数据库]        
     -> [下一步] -> [选拔发布项目] ->
[事情发表]/[联合宣布]
     -> [下一步] -> [内定订阅服务器的品类] -> [运营SQL
Server 3000的服务器]     
     -> [下一步] -> [指定项目] ->
[在事情发表中只可以够公布带主键的表] ->
[当选2个有主键的待公布的表] 
         ->[在联合公布中会给表扩张唯一性索引和 ROWGUIDCOL
属性的唯一标记符字段[rowguid],默许值是newid()]         
               (增添新列将: 导致不带列列表的 INSERT
语句失利,扩大表的轻重,增加浮动第2个快速照相所需要的岁月)        
         ->[入选八个待宣布的表]
     -> [下一步] -> [挑选发布名称和描述] -> 
     -> [下一步] -> [自定义公布的性质] ->
[否,依照钦赐方式创造发表]
     -> [下一步] -> [完成] -> [关闭]
     
     公布属性里有成都百货上千管用的选项:设定订阅到期(例如二四小时)
      
         设定发表表的品种性质:
     常规窗口能够内定公布目标表的名目,能够跟原来的表名称不雷同。
     下图是命令和快速照相窗口的栏目  

    ( SQL Server
数据库复制本领实际上是用insert,update,delete操作在订阅服务器上海重机厂做透露服务器上的业务操作
     
      看文书档案资料供给把发布数据库设成完全复苏形式,事务才不会丢掉
      
     
但自个儿本人在测试中窥见公布数据库是粗略苏醒情势下,每拾秒生成一些大事务,拾分钟后再收缩数据库日志,
         
那时期发布和订阅服务器上的课业都中断,暂停复苏后并不曾丢失任何事情改变)
     
     公布表能够做多少筛选,例如只选用表里面包车型大巴片段列:
     
    例如只选取表里某个符合条件的笔录, 大家得以手工业编写制定筛选的SQL语句:
     
    揭橥表的订阅选项,并得以创设强制订阅:    
        
    成功建立了宣布之后,发布服务器上新扩张了四个功课: [ 失效订阅清除
]
    
    分发服务器上新增了多个作业: 
                [ JIN001-dack-dack-5 ] 类型[ REPL快照 ]
                [ JIN001-dack-3 ]      类型[ REPL日志读取器 ]

        
下面青蓝字的称呼会基于透露服务器名,发表名及第三次披露而采用分裂的号码
            
REPL快照作业是SQL
Server复制的前提条件,它会先把发布的表结构,数据,索引,约束等转移到公布服务器的OS目录下文件
    (当有订阅的时候才会扭转, 当订阅请求开首化只怕依据某些时间表调度生成)

REPL日志读取器在事情复制的时候是直接处在运行情况。(在集合复制的时候能够根据调度的时间表来运转)

      建立二个数据库复制订阅的进度: 
      
     [复制] -> [订阅] -> 右键选拔 -> [新建请求订阅] 
     -> [下一步] -> [找出发表] ->
[翻看已注册服务器所做的发表]    
     -> [下一步] -> [分选揭橥] ->
[当选已经济建设立宣布服务器上的数据库揭橥名]      
     -> [下一步] -> [点名同步代理程序登入] ->
[今世理程序连接到代理服务器时:使用SQL Server身份验证]
                                              
(输入公布服务器上distributor_admin用户名和密码)                   
     -> [下一步] -> [分选目的数据库] ->
[选料在里边创设订阅的多少库名]/[也得以新建1个库名]   
     -> [下一步] -> [同意匿名订阅] ->
[是,生成匿名订阅]      
     -> [下一步] -> [开始化订阅] ->
[是,伊始化架构和数据]      
     -> [下一步] -> [快速照相传送] ->
[使用该公告的暗中认可快照文件夹中的快照文件]
                   
(订阅服务器要能访问发表服务器的REPLDATA文件夹,假若有失常态,能够手工业安装互连网共享及共享权限)   
     -> [下一步] -> [快速照相传送] ->
[应用该公告的私下认可快速照相文件夹中的快速照相文件]      
     -> [下一步] -> [设置分发代理程序调度] ->
[接纳下列调度] -> [更改] -> [诸如每伍分钟调度壹回]997755.com澳门葡京,      
     -> [下一步] -> [启航须求的劳务] ->
[该订阅须求在公布服务器上运转SQLServerAgent服务]      
     -> [下一步] -> [完成] -> [确定]      
     
   
成功建立了订阅后,订阅服务器上新扩张了一个门类是[REPL-分发]学业(合并复制的时候体系是[REPL-合并])
    它会根据我们给的时刻调度表运转数据库同步复制的功课
    
    查看它的历史记录运市价况,例图:

   
在散发服务器的[复制监视器]->[布告服务器]->[颁发名称]->[日志读取器]->右键采纳->[代理程序历史记录],
例图:

    
    三、SQL Server复制配置好后, 大概出现相当情况的实验日志:

    一.发布服务器断网,sql
server服务关闭,重运维,关机的时候,对曾经设置好的复制未有多大影响

        中断时期,分发和订阅都接受到未有复制的事务新闻

    贰.散发服务器断网,sql
server服务关闭,重启动,关机的时候,对曾经设置好的复制有壹对影响

        中断时期,公布服务器的政工排队堆积起来
           (若是设置了较长期才删除过期订阅的选项,
繁忙发表数据库的事情日志大概会较便捷膨胀),
        
        订阅服务器会因为访问不到宣布服务器,反复重试
            大家能够安装重试次数和重试的时日间隔(最大的重试次数是999九,
假设每分钟重试叁回,能够支撑约陆.玖天不不可信赖)

        分发服务器sql
server服务运维,网络连接今后,公布服务器上的堆积作业将定时间种种成效到订阅机器上:

       
会供给三个相比长的大运(实际上是变化全部工作的insert,update,delete语句,在订阅服务器上去实践)
        大家在日常的PC机上尝试的陆十二个事情十0230个指令推行花了七分28秒.

    三.订阅服务器断网,sql
server服务关闭,重运营,关机的时候,对已经设置好的复制影响比十分大,也许要求重新初试化

        大家尝试环境(订阅服务器)从1捌:四四分意外停机以,
第②天捌:40分重运转后, 
            已经设好的复制在八:3捌分之后又起来平常运行了,
揭橥服务器上的堆积作业将定时间各类作用到订阅机器上
            但复制管理器里冒出快照的失实指示,
快照大概要求再行初试化,复制也许需求再行运维.
           
(我们尝试环境的机器并不曾开展快速照相初试化,复制仍旧是马到功成运营的)
    
    肆、删除已经济建设好的昭示和定阅能够一向用delete删除按键
    
    大家最佳总是按先删定阅,再删发表,最后禁用发布的依次来操作。 
    假设要根本去除SQL Server上边的复制设置, 能够那样操作:

    [复制] -> 右键选用 [剥夺宣布] ->
[迎接使用禁止使用发表和分发向导]
     -> [下一步] -> [剥夺揭橥] ->
[要在”@servername”上禁止使用发布]      
     -> [下一步] -> [做到禁止使用公布和分发向导] -> [完成]
     
   大家也得以用T-SQL命令来成功复制中发布及订阅的创始和删除,
选中曾经设好的发表和订阅, 按属标右键
   可以[生成SQL脚本]。(那里就不详细讲了,
后边推荐的网址内有比较详细的始末)
   
   当您打算删除或然转移叁个table时,出现以下错误
   Server: Msg 3724, Level 16, State 2, Line 1
   Cannot drop the table ‘object_name’ because it is being used for
replication.

   比较典型的境况是该table曾经用于复制,可是后来又删除了复制

   处理办法:
   select * from sysobjects where replinfo >’0′

   sp_configure ‘allow updates’, 1
   go
   reconfigure with override
   go
   begin transaction
   update sysobjects set replinfo = ‘0’ where replinfo >’0′
   commit transaction
   go
   rollback transaction
   go
   sp_configure ‘allow updates’, 0
   go
   reconfigure with override
   go

疑问:
在统一复制配置完全后,假如同步代理甘休了。作者要在程序中去重新开动合并复制的一块代理。请问使用什么命令或存款和储蓄进程吧


化解办法:
sp_start_job
指令 SQL Server 代理程序及时实施作业。

示例
下例运维名字为 Nightly Backup 的作业。

USE msdb
EXEC sp_start_job @job_name = ‘Nightly Backup’

相关文章

发表评论

电子邮件地址不会被公开。 必填项已用*标注

*
*
Website