博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
通过备份初始化合并复制时的报错的解决
阅读量:5862 次
发布时间:2019-06-19

本文共 1145 字,大约阅读时间需要 3 分钟。

    由于关系数据库的机制要求合并复制数据同步时需要有良好的自治性,SQL Server的合并复制的应用场景相对比较少。一些典型的应用场景比如异地数据同步,跨洋的数据同步等。由于网络延时以及该种业务有相对比较大的数据独立性,因此在合并复制在某些场景会比较合适。

    在一些情况下,合并复制如果由于某些原因坏掉,需要重新初始化,而由于网络带宽的限制,用快照重新初始化稍微大一点的库基本不现实,因此需要考虑使用通过备份初始化,在初始化过程中,我遇到了如下错误:

 

{call sp_MSsetconflicttable (N'__UserSyncOptions', N'MSmerge_conflict_Main___UserSyncOptions', N'DB\MAIN', N'DB1', N'Main')}

Incorrect syntax near 'Id'.

 

    后来通过排查发现,疏忽了关键步骤,因此在此写下从备份初始化合并复制的正确姿势:

1.为需要合并复制的表添加唯一的RowGuid列,该列是合并复制用于确认行的唯一依据,因此该列有如下要求:

  • 有唯一约束
  • 有唯一索引
  • 有GUID的默认值Newid()或newsequentialid()
  • 该列Not Null

该列的添加脚本为:

BEGIN TRANSACTION
 
SET QUOTED_IDENTIFIER ON
 
SET ARITHABORT ON
 
SET NUMERIC_ROUNDABORT OFF
 
SET CONCAT_NULL_YIELDS_NULL ON
 
SET ANSI_NULLS ON
 
SET ANSI_PADDING ON
 
SET ANSI_WARNINGS ON
 
COMMIT
 
BEGIN TRANSACTION
 
GO
 
ALTER TABLE 表名称 ADD
 
ROWGUID uniqueidentifier NOT NULL ROWGUIDCOL CONSTRAINT MSmerge_df_rowguid_ DEFAULT (newid())
 
GO
 
ALTER TABLE 表名称 SET (LOCK_ESCALATION = TABLE)
 
GO
 
COMMIT

2. 备份需要初始化的数据库。 (在此期间,请不要备份日志,以防日志链断裂!)

3.  创建发布,并手动生成发布的快照。该步骤十分重要,虽然订阅服务器不需要快照初始化订阅,但是需要快照的元数据!
 
4.  在订阅端还原数据库备份。注意,不能指定KEEP_REPLICATION选项。
 
5.  创建订阅,选项请指定不立即初始化,如果是脚本创建订阅,请指定:@sync_type = N'None'
 
6.  手动启动合并代理,以便从发布端同步元数据。至此整个过程完成。

转载地址:http://lzrjx.baihongyu.com/

你可能感兴趣的文章
可见面判别算法---线框图可见算法
查看>>
根据特定的值划分链表 Partition List
查看>>
【原创】MySQL Proxy - query注入动作中的脚本序列
查看>>
MongoDB小技巧-用ObjectID查询某一时间范围内的数据
查看>>
java多线程详解一线程的内存模型和线程特性
查看>>
修改数据
查看>>
Hibernate_01
查看>>
网络互联参考模型(详解)
查看>>
Mathtype与LaTeX相互转换
查看>>
通用社区登陆组件技术分享(开源)上篇:OAuth 授权登陆介绍
查看>>
SpringMVC学习系列(9) 之 实现注解式权限验证
查看>>
hadoop学习笔记-HDFS原理
查看>>
GC日志分析工具GCViewer
查看>>
Kubernetes的四种用户部署场景,你知吗?
查看>>
eclipse中使用maven创建项目
查看>>
JFinal框架操作oracle数据库
查看>>
Android设置通知Notification
查看>>
postgresql centos安装
查看>>
RegularEnumSet存储原理
查看>>
windows对linux的文件传输(上传、下载)
查看>>