关闭 x
IT技术网
    技 采 号
    ITJS.cn - 技术改变世界
    • 实用工具
    • 菜鸟教程
    IT采购网 中国存储网 科技号 CIO智库

    IT技术网

    IT采购网
    • 首页
    • 行业资讯
    • 系统运维
      • 操作系统
        • Windows
        • Linux
        • Mac OS
      • 数据库
        • MySQL
        • Oracle
        • SQL Server
      • 网站建设
    • 人工智能
    • 半导体芯片
    • 笔记本电脑
    • 智能手机
    • 智能汽车
    • 编程语言
    IT技术网 - ITJS.CN
    首页 » SQL Server »SQL Server 2000中的数据同步问题

    SQL Server 2000中的数据同步问题

    2015-10-16 00:00:00 出处:ITJS
    分享

    1.MS SQL Server和SQL Server agent服务是否是以域用户身份启动并运行的(.administrator用户也是可以的)假如登录用的是本地系统帐户local,将不具备网络功能,会产生以下错误: 进程未能连接到Distributor '@Server name' (假如您的服务器已经用了SQL Server全文检索服务, 请不要修改MSSQLserver和Sqlserveragent服务的local启动。会照成全文检索服务不能用。请换另外一台机器来做SQL Server 里复制中的分发服务器。)

    修改服务启动的登录用户,需要重新启动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不同(因为你改过计算机名字),再运行下面的
    --删除错误的服务器名
    EXEC sp_dropserver @server=@servername
    --添加正确的服务器名
    EXEC sp_addserver @server=@serverproperty_servername, @local='local'

    修改这项参数,需要重新启动MSSQLserver和Sqlserveragent服务才能生效。

    这样一来就不会在创建复制的过程中出现18482、18483错误了。

    3、检查SQL Server企业管理器里面相关的几台SQL Server注册名是否和上面第二点里介绍的srvname一样

    不能用IP地址的注册名。(我们可以删掉IP地址的注册,新建以SQL Server管理员级别的用户注册的服务器名)这样一来就不会在创建复制的过程中出现14010、20084、18456、18482、18483错误了。

    4、检查相关的几台SQL Server服务器网络是否能够正常访问

    假如ping主机IP地址可以,但ping主机名不通的时候,需要在

    winntsystem32driversetchosts (WIN2000) 
    windowssystem32driversetchosts (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数据库里建立了一个distribion库和一个distributor_admin管理员级别的用户(我们可以任意修改密码)

    服务器上新增加了四个作业:

    [ 代理程序历史记录清除: distribution ]

    [ 分发清除: distribution ]

    [ 复制代理程序检查 ]

    [ 重新初始化存在数据验证失败的订阅 ]

    SQL Server企业管理器里多了一个复制监视器, 当前的这台机器就可以发布、分发、订阅了。

    我们再次在SQL Server企业管理器里[复制]-> 右键选择 ->[配置发布、订阅服务器和分发]

    我们可以在 [发布服务器和分发服务器的属性] 窗口-> [发布服务器] -> [新增] -> [确定]-> [发布数据库] -> [事务]/[合并] -> [确定]-> [订阅服务器] -> [新增] -> [确定] 把网络上的其它SQL Server服务器添加成为发布或者订阅服务器.

    复制是将一组数据从一个数据源拷贝到多个数据源的技术,是将一份数据发布到多个存储站点上的有效方式。使用复制技术,用户可以将一份数据发布到多台服务器上,从而使不同的服务器用户都可以在权限的许可的范围内共享这份数据。复制技术可以确保分布在不同地点的数据自动同步更新,从而保证数据的一致性。

    SQL复制的基本元素包括

    出版服务器、订阅服务器、分发服务器、出版物、文章

    SQL复制的工作原理

    SQL SERVER 主要采用出版物、订阅的方式来处理复制。源数据所在的服务器是出版服务器,负责发表数据。出版服务器把要发表的数据的所有改变情况的拷贝复制到分发服务器,分发服务器包含有一个分发数据库,可接收数据的所有改变,并保存这些改变,再把这些改变分发给订阅服务器

    SQL SERVER复制技术类型

    SQL SERVER提供了三种复制技术,分别是:

    1、快照复制(呆会我们就使用这个)

    2、事务复制

    3、合并复制

    只要把上面这些概念弄清楚了那么对复制也就有了一定的理解。接下来我们就一步一步来实现复制的步骤。

    第一先来配置出版服务器

    (1)选中指定[服务器]节点

    (2)从[工具]下拉菜单的[复制]子菜单中选择[发布、订阅服务器和分发]命令

    (3)系统弹出一个对话框点[下一步]然后看着提示一直操作到完成。

    (4)当完成了出版服务器的设置以后系统会为该服务器的树形结构中添加一个复制监视器。同时也生成一个分发数据库(distribution)

    第二创建出版物

    (1)选中指定的服务器

    (2)从[工具]菜单的[复制]子菜单中选择[创建和管理发布]命令。此时系统会弹出一个对话框

    (3)选择要创建出版物的数据库,然后单击[创建发布]

    (4)在[创建发布向导]的提示对话框中单击[下一步]系统就会弹出一个对话框。对话框上的内容是复制的三个类型。我们现在选第一个也就是默认的快照发布(其他两个大家可以去看看帮助)

    (5)单击[下一步]系统要求指定可以订阅该发布的数据库服务器类型,SQLSERVER允许在不同的数据库如 ORACLE或ACCESS之间进行数据复制。但是在这里我们选择运行"SQL SERVER 2000"的数据库服务器

    (6)单击[下一步]系统就弹出一个定义文章的对话框也就是选择要出版的表

    (7)然后[下一步]直到操作完成。当完成出版物的创建后创建出版物的数据库也就变成了一个共享数据库。

    第三设计订阅

    (1)选中指定的订阅服务器

    (2)从[工具]下拉菜单中选择[复制]子菜单的[请求订阅]

    (3)按照单击[下一步]操作直到系统会提示检查SQL SERVER代理服务的运行状态,执行复制操作的前提条件是SQL SERVER代理服务必须已经启动。

    (4)单击[完成]。完成订阅操作。

    完成上面的步骤其实复制也就是成功了。但是如何来知道复制是否成功了呢?这里可以通过这种方法来快速看是否成功。展开出版服务器下面的复制——发布内容——右键发布内容——属性——击活——状态然后点立即运行代理程序接着点代理程序属性击活调度把调度设置为每一天发生,每一分钟,在0:00:00和23:59:59之间。接下来就是判断复制是否成功了打开C:Program FilesMicrosoft SQL ServerMSSQLREPLDATAuncXIAOWANGZI_database_database下面看是不是有一些以时间做为文件名的文件夹差不多一分中就产生一个。要是你还不信的话就打开你的数据库看在订阅的服务器的指定订阅数据库下看是不是看到了你刚才所发布的表— 一个手工

    同步的方案

    --定时同步服务器上的数据

    --例子:

    --测试环境,SQL Server,远程服务器名:xz,用户名为:sa,无密码,测试数据库:test

    --服务器上的表(查询分析器连接到服务器上创建)

    create table [user](id int primary key,number varchar(4),name varchar(10))
    go
    --以下在局域网(本机操作)
    --本机的表,state说明:null 表示新增记录,1 表示修改过的记录,0 表示无变化的记录
    if exists (select * from dbo.sysobjects where id = object_id(N'[user]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
    drop table [user]
    GO
    create table [user](id int identity(1,1),number varchar(4),name varchar(10),state bit)
    go
    --创建触发器,维护state字段的值
    create trigger t_state on [user]
    after update
    as
    update [user] set state=1
    from [user] a join inserted b on a.id=b.id
    where a.state is not null
    go
    --为了方便同步处理,创建链接服务器到要同步的服务器
    --这里的远程服务器名为:xz,用户名为:sa,无密码
    if exists(select 1 from master..sysservers where srvname='srv_lnk')
    exec sp_dropserver 'srv_lnk','droplogins'
    go
    exec sp_addlinkedserver 'srv_lnk','','SQLOLEDB','xz'
    exec sp_addlinkedsrvlogin 'srv_lnk','false',null,'sa'
    go
    --创建同步处理的存储过程
    if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[p_synchro]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
    drop procedure [dbo].[p_synchro]
    GO
    create proc p_synchro
    as
    --set XACT_ABORT on
    --启动远程服务器的MSDTC服务
    --exec master..xp_cmdshell 'isql /S"xz" /U"sa" /P"" /q"exec master..xp_cmdshell ''net start msdtc'',no_output"',no_output
    --启动本机的MSDTC服务
    --exec master..xp_cmdshell 'net start msdtc',no_output
    --进行分布事务处理,假如表用标识列做主键,用下面的方法
    --BEGIN DISTRIBUTED TRANSACTION
    --同步删除的数据
    delete from srv_lnk.test.dbo.[user]
    where id not in(select id from [user])
    --同步新增的数据
    insert into srv_lnk.test.dbo.[user]
    select id,number,name from [user] where state is null
    --同步修改的数据
    update srv_lnk.test.dbo.[user] set
    number=b.number,name=b.name
    from srv_lnk.test.dbo.[user] a
    join [user] b on a.id=b.id
    where b.state=1
    --同步后更新本机的标志
    update [user] set state=0 where isnull(state,1)=1
    --COMMIT TRAN
    go
    --创建作业,定时执行数据同步的存储过程
    if exists(SELECT 1 from msdb..sysjobs where name='数据处理')
    EXECUTE msdb.dbo.sp_delete_job @job_name='数据处理'
    exec msdb..sp_add_job @job_name='数据处理'
    --创建作业步骤
    declare @sql varchar(800),@dbname varchar(250)
    select @sql='exec p_synchro' --数据处理的命令
    ,@dbname=db_name() --执行数据处理的数据库名
    exec msdb..sp_add_jobstep @job_name='数据处理',
    @step_name = '数据同步',
    @subsystem = 'TSQL',
    @database_name=@dbname,
    @command = @sql,
    @retry_attempts = 5, --重试次数
    @retry_interval = 5 --重试间隔
    --创建调度
    EXEC msdb..sp_add_jobschedule @job_name = '数据处理',
    @name = '时间安排',
    @freq_type = 4, --每天
    @freq_interval = 1, --每天执行一次
    @active_start_time = 00000 --0点执行
    go

    上一篇返回首页 下一篇

    声明: 此文观点不代表本站立场;转载务必保留本文链接;版权疑问请联系我们。

    别人在看

    hiberfil.sys文件可以删除吗?了解该文件并手把手教你删除C盘的hiberfil.sys文件

    Window 10和 Windows 11哪个好?答案是:看你自己的需求

    盗版软件成公司里的“隐形炸弹”?老板们的“法务噩梦” 有救了!

    帝国CMS7.5编辑器上传图片取消宽高的三种方法

    帝国cms如何自动生成缩略图的实现方法

    Windows 12即将到来,将彻底改变人机交互

    帝国CMS 7.5忘记登陆账号密码怎么办?可以phpmyadmin中重置管理员密码

    帝国CMS 7.5 后台编辑器换行,修改回车键br换行为p标签

    Windows 11 版本与 Windows 10比较,新功能一览

    Windows 11激活产品密钥收集及专业版激活方法

    IT头条

    智能手机市场风云:iPhone领跑销量榜,华为缺席引争议

    15:43

    大数据算法和“老师傅”经验叠加 智慧化收储粮食尽显“科技范”

    15:17

    严重缩水!NVIDIA将推中国特供RTX 5090 DD:只剩24GB显存

    00:17

    无线路由大厂 TP-Link突然大裁员:补偿N+3

    02:39

    Meta 千万美金招募AI高级人才

    00:22

    技术热点

    微软已修复windows 7/windows 8.1媒体中心严重漏洞 用户可下载安

    卸载MySQL数据库,用rpm如何实现

    windows 7中使用网上银行或支付宝支付时总是打不开支付页面

    一致性哈希算法原理设计

    MySQL数字类型中的三种常用种类

    如何解决SQL Server中传入select语句in范围参数

      友情链接:
    • IT采购网
    • 科技号
    • 中国存储网
    • 存储网
    • 半导体联盟
    • 医疗软件网
    • 软件中国
    • ITbrand
    • 采购中国
    • CIO智库
    • 考研题库
    • 法务网
    • AI工具网
    • 电子芯片网
    • 安全库
    • 隐私保护
    • 版权申明
    • 联系我们
    IT技术网 版权所有 © 2020-2025,京ICP备14047533号-20,Power by OK设计网

    在上方输入关键词后,回车键 开始搜索。Esc键 取消该搜索窗口。