局域网内服务器之间数据的同步
局域网内两个数据库表之间数据联动:
    当两个数据库不在同一台服务器(在局域网内),怎样使一个数据库中表的数据发生变化另一个库中的数据跟着一起变化,用存储过程或者触发器
SQL code
--定时同步服务器上的数据
--例子:
--测试环境,SQL Server2000,远程服务器名: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服务
--p_cmdshell 'isql /S"xz" /U"sa" /P"" /q"p_cmdshell ''net start msdtc'',no_output"',no_output
--启动本机的MSDTC服务
--p_cmdshell 'net start msdtc',no_output
--进行分布事务处理,如果表用标识列做主键,用下面的方法
--BEGIN DISTRIBUTED TRANSACTION
    --同步删除的数据
    delete from st.dbo.[user]
        where id not in(select id from [user])
    --同步新增的数据
    insert into st.dbo.[user]
    select id,number,name from [user] where state is null
   
    --同步修改的数据
    update st.dbo.[user] set
        number=b.number,name=b.name
    from st.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
-------------------------------------------------------------------------------
上面是手工同步的方法,优点是方便自己控制数据同步.
下面是SQL自身的同步:发布/订阅
利用数据库复制技术 实现数据同步更新
复制的概念
复制是将一组数据从一个数据源拷贝到多个数据源的技术,是将一份数据发布到多个存储站点上的有效方式。使用复制技术,用户可以将一份数据发布到多台服务器上,从而使不同的服务器用户都可以在权限的许可的范围内共享这份数据。复制技术可以确保分布在不同地点的数据自动同步更新,从而保证数据的一致性。
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 Files\Microsoft SQL Server\MSSQL\REPLDATA\unc\XIAOWANGZI_database_database下面
看是不是有一些以时间做为文件名的文件夹差不多一分中就产生一个。
要是你还不信的话就打开你的数据库看在订阅的服务器的指定订阅数据库下看是不是看到了你刚才所发布的表
/***************** 常见问题:权限问题 
启动代理的域用户账号必须具有读取发布-分发服务器目录的权限
你用的账号没有读取\\ServerA\D$\Program Files\Microsoft SQL    Server\MSSQL\repldata\unc\这个目录下的文件的权限。
    启动代理的域用户账号必须具有读取发布-分发服务器目录的权限
----^^^^^^^^^^^^^^^在控制面板-->管理-->服务-->sqlagent-->属性里的那个启动用户
对我有用[0]
丢个板砖[0]
引用
举报
管理
TOP
精华推荐:Ajax学习资料集锦!
Vafox
(♫火狐狸♫)
等 级:
#4楼 得分:0回复于:2010-10-16 23:44:47
SQL code
(1)建立发布分发服务器:
======================================
第一步
分发的数据库服务器的代理服务SQL Server Agent必须使用本地帐户启动而不能使用默认的LocalSystem启动.操作步骤:开始->控制面板->管理工具->服务,在服务中到SQLSERVERAGENT服务,右击->属性->登录,选择”此帐户”,并且输入本地用户名密码,或者点击浏览按钮选择本地帐户。
第二步
打开企业管理器:开始->程序->Microsoft SQL Server->企业管理器
可以看到如下的SQLServer组
需要注意的关键问题SQLServer组中注册的SQLServer服务器必须使用数据库服务器的机器名,不可以使用IP地址或者local做为SQLServer组的注册名,不然会出现无法共享的问题.导致发布不成功.
如果已经存在的使用IP地址或者local做为SQLServer组的注册名,就删除该注册,然后按照以下步骤添加使用机器名作为注册的SQLServer.
步骤:
右击”SQLServer组”,选择”新建SQLServer注册”
再弹出的向导界面点下一步,进入选择服务器界面,在:可用的服务器”中选择服务器,如果列表没有列出服务器则在上面手工输入服务器的机器名,然后点击”添加”之后点击下一步.
在选择身份验证模式中选择SQLServer身份验证,如下图
提示输入输入用户名密码,输入正确的数据库管理员密码后点击下一步
一直下一步到完成就可以了.
就会看到服务器已经注册到SQLServer组中,现在可以对注册的服务器进行复制分发订阅操作.
选中服务器,选择工具->复制->配置发布、订阅服务器和分发…
在弹出的向导界面一直点击下一步到”选择快照文件夹”界面,SQLServer会默认选择安装路径作为快照位置,这个不用管它,直接默认就可以
点击下一步会提示,不用管点”是”
如果是提示路径无效,就把地址直接换成“\\服务器机器名\”格式就可以了。到最后我们是使用FTP,这里的快照路径可以不使用,所以不重要,只要能配置成功就可以了。
一路下一步,在“自定义配置”界面选择“是,让我设置分发数据库属性、启用发布服务器或者发布设置”
继续下一步,一直到“启用发布服务器”设置,查看列表中需要启用的发布数据库服务器是否启用,没有的话就勾选上,并把多余的去掉。
下一步,“启用发布数据库”设置,选择需要发布的数据库,注意选择“事务”发布,不要选择“合并”
再下一步,“启用订阅服务器”不选择任何服务器订阅。直接下一步,点击完成,系统开始自动配置,知道提示完成。
注意:在这一步中出现错误大部分是因为SQLSERVERAGENT的服务没有用本地用户启动和SQL注册使用的不是机器名。
-------------------
提示错误18483:未能连接到服务器“DB1”,因为“distributor_admin”未在该服务器上定义为远程登录。 
--出现这种问题,应该是你曾经更改过计算机名
--执行下面的语句进行修复,完成后重新启动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 
----------------------------------
====================
(2)建立发布内容
====================
展开数据库Server注册节点的复制下面右击“发布内容”选择“新建发布”,进入向导界面,下一步选择数据库。
下一步选择“事物发布”
下一步选择如图
下一步指定项目
在左边的的项目中选择要发布的项目,右边选择项目子项,比如选择了表项目,右边需要选择要发布的表。
下一步选择发布名称和描述
下一步自定义发布属性,选择如图
下一步筛选数据,选择如图
下一步筛选行,不作改动,直接下一步
为了数据安全性,需要署名订阅
下一步设置调度
点击“更改”按钮更改调度时间
下一步点击完成开始自动配置。
成功之后会在数据库服务器节点下的复制->发布内容中看到刚才新建的发布。
==================
(3)FTP服务器建立:
==================
德鲁纳酒店评价
右击新建的发布->属性->快照位置.开始配置通过FTP广域网传输数据。
在使用FTP的时候我们必须在本地架设一个FTP服务器以便中心数据库服务器(订阅服务器)通过FTP来接受发布服务器的发布的数据.
FTP的服务器可以使用任何一种FTPServer软件,推荐Server-U,IIS.关于如何假设FTP请参看ZC另一部经典巨作《三步搞定FTP服务器架设》。
取消“在常用快照文件夹中生成快照”选项
勾选“在下列位置中生成快照”
在数据库发布服务器的磁盘中创建一个文件夹用来存放临时快照,如下图
按照图示设置
FTP服务器名填写架设好的LAN内的FTP服务器IP地址,端口21,指定“从FTP根到该文件夹的客户机路径”是前面我们新建的用来存放快照的文件夹。这个可以在FTP服务器中设置。这里填写用户的根目录(目录名是根据FTP服务器设置的虚拟文件夹填写的)
==================
(4)订阅服务器配置:
==================
按照注册本地SQLServer服务器的方法注册中心数据库服务器,这里需要使用IP地址,因为要通过WAN,所以使用机器名是无效的,只有通过IP来注册和订阅本地发布数据库的数据,还有就是要在中心数据库服务器上新建一个与发布数据库相同名称的空数据库。否则会导致订阅不成功。由于中心数据库服务器在远程,不能直接访问本地文件夹,所以需要通过FTP传输。
在本地需要强制中心服务器来订阅发布的数据库,这样就不用中心数据库服务器通过WAN来查发布数据库了。
操作步骤如下:
选择已经建好的发布,右击,选择“强制新订阅”
出现强制订阅向导,点击下一步选择订阅服务器
点击下一步选择目的数据库
填写在订阅服务器上存在的数据库,就是前面我们需要在中心数据库上创建的同名空库,如果没有创建,可以点击右边的“浏览或者创建”来创建同名空库。
点击新建
输入数据库名称点击确定就可以了
下一步设置分发代理程序调度
点击“更改”按钮来更改调度
点击下一步初始化订阅,如图选择
一路下一步到完成就可以。
在完成成功之后选择我们创建的发布,会在右边的窗口中出现刚才的强制订阅
至此通过FTP广域网数据库复制分发订阅就全部完成了。
对我有用[0]
丢个板砖[0]
引用
举报
管理
TOP
精华推荐:javascript魔力的经典代码
haproxy
(haproxy)
等 级:
#5楼 得分:0回复于:2010-10-16 23:46:49
SQL code
SQL Server 2000订阅与发布的具体操作
人物性格描述同步过程
  一、准备工作,如果完成则可跳过。
  1、内网DB服务器作为发布服务器,外网DB服务器作为订阅服务器。
  发布服务器和订阅服务器上分别创建Windows用户jl,密码jl,隶属于administrators,注意要保持一致。
  2、发布服务器上创建一个共享目录,作为发布快照文件的存放目录。例如:在D盘根目录下建文件夹名为SqlCopy,设置用户jl,权限为完全控制。
  3、确定发布服务器和订阅服务器的数据库autoweb保持一致。
  4、在发布服务器和订阅服务器的SQL Server中创建用户登陆名jl,作为发布数据库autoweb的拥有者(设置为dbo_owner和public)。用户名和密码都一致。
  5、打开服务(控制面板---管理工具---服务)
  ---右击SQLSERVER AGENT---属性---登录---选择“此帐户”
  ---输入或选择第一步中创建的WINDOWS 用户jl,
  ---“密码“中输入该用户密码jl
  6、开启SQL Server 2000的网络协议TCP/IP和管道命名协议并重启网络服务。
  7、设置SQL SERVER 身份验证,解决连接时的权限问题(发布、订阅服务器均设置)
  步骤为:对象资源管理器----右击SQL实例-----属性----安全性----服务器身份验证------选“SQL Server和WINDOWS“,然后点确定。
  8、发布服务器和订阅服务器互相注册
  步骤如下:视图----单击以注册服务器----右键数据库引擎----新建服务器注册-----填写要注册的远程服务器名称------身份验证选“SQL Server验证“-----用户名(sa) 密码------创建组(也可不建)-----完成。对于只能用IP,不能用计算机名的,为其注册服务器别名
  二、发布和订阅
  如下工作都在发布服务器上配置,包括发布和订阅。
  快照发布和订阅
  1、 选择 复制 节点,右键本地发布 ----下一步---------系统弹出对话框看提示----直到“指定快照文件夹”----在“快照文件夹“中输入准备工作中创建的目录(指向步骤3所建的共享文件夹)------选择发布数据库-------选择发布类型
  下一步―――选择要发布的数据库autoweb中的表,将b(B)开头的表去掉,V开头的表去掉,c_开头的表去掉,t_开头的表去掉,剩下的表作为快照发布到订阅服务器上(单向传输)
  根据情况决定执行发布的间隔时间,如图每天每20分钟执行一次。
  下一步快照代理安全性,设置如图,连接到发布服务器用户jl,密码jl.
  -------填写发布名称。
  2、 选择 复制 节点,右键本地订阅,选择发布服务器-------选择订阅方式(选择推送订阅))-------填加订阅服务器--------选择代理计划(一般选择连续运行)---------其余选择默认项。
  至此完成快照发布和订阅。
  合并发布和订阅
  1、选择如下三个表作为合并发布的对象,用于双向通讯
  根据情况决定执行发布的间隔时间,如图每天每20分钟执行一次。
  2、 选择 复制 节点,右键本地订阅,选择发布服务器-------选择订阅方式(选择推送订阅))-------填加订阅服务器--------选择代理计划(一般选择连续运行)---------其余选择默认项。
  至此完成合并发布和订阅
  -------------------------------------------------------------------
  主要是要注意权限的问题,一般做发布/订阅,建议你做如下准备工作:
  1.发布服务器,订阅服务器都创建一个同名的windows用户,并设置相同的密码,做为发布快照文件夹的有效访问用户
  我的电脑
  --控制面板
  --管理工具
  --计算机管理
  --用户和组
  --右键用户
  --新建用户
  --建立一个隶属于administrator组的登陆windows的用户
  2.在发布服务器上,新建一个共享目录,做为发布的快照文件的存放目录,操作:
  我的电脑--D: 新建一个目录,名为: PUB
  --右键这个新建的目录
  --属性--共享
  --选择"共享该文件夹"
  --通过"权限"按纽来设置具体的用户权限,保证第一步中创建的用户具有对该文件夹的所有权限考健身教练资格证
  --确定
  3.设置SQL代理(SQLSERVERAGENT)服务的启动用户(发布/订阅服务器均做此设置)
  开始--程序--管理工具--服务
  --右键SQLSERVERAGENT
  --属性--登陆--选择"此账户"
  --输入或者选择第一步中创建的windows登录用户名
  --"密码"中输入该用户的密码
  4.设置SQL Server身份验证模式,解决连接时的权限问题(发布/订阅服务器均做此设置)
  企业管理器
  --右键SQL实例--属性
  --安全性--身份验证汽车磨合期
  --选择"SQL Server 和 Windows"
  --确定
  5.在发布服务器和订阅服务器上互相注册
  企业管理器
  --右键SQL Server组
  --新建SQL Server注册...
  --下一步--可用的服务器中,输入你要注册的远程服务器名--添加
  --下一步--连接使用,选择第二个"SQL Server身份验证"
  --下一步--输入用户名和密码
  --下一步--选择SQL Server组,也可以创建一个新组
  --下一步--完成
  6.对于只能用IP,不能用计算机名的,为其注册服务器别名
  (在连接端配置,比如,在订阅服务器上配置的话,服务器名称中输入的是发布服务器的IP)
  开始--程序--Microsoft SQL Server--客户端网络实用工具
  --别名--添加
  --网络库选择"tcp/ip"--服务器别名输入SQL服务器名
  --连接参数--服务器名称中输入SQL服务器ip地址
  --如果你修改了SQL的端口,取消选择"动态决定端口",并输入对应的端口号
对我有用[0]
丢个板砖[0]
引用
举报
管理
TOP
精华推荐:类似gmail添加附件
haproxy
(haproxy)
等 级:
#6楼 得分:0回复于:2010-10-16 23:47:23
SQL code
SQLServer2000同步复制技术实现步骤
作者:gaojier 日期:2007-06-25
字体大小: 小 中 大
一、 预备工作
1.发布服务器,订阅服务器都创建一个同名的windows用户,并设置相同的密码,做为发布快照文件夹的有效访问用户
--管理工具
--计算机管理
--用户和组
--右键用户
--新建用户
--建立一个隶属于administrator组的登陆windows的用户(SynUser)
2.在发布服务器上,新建一个共享目录,做为发布的快照文件的存放目录,操作:
我的电脑--D:\ 新建一个目录,名为: PUB
--右键这个新建的目录
--属性--共享
--选择"共享该文件夹"
--通过"权限"按纽来设置具体的用户权限,保证第一步中创建的用户(SynUser) 具有对该文件夹的所有权限
--确定
3.设置SQL代理(SQLSERVERAGENT)服务的启动用户(发布/订阅服务器均做此设置)
开始--程序--管理工具--服务
--右键SQLSERVERAGENT
--属性--登陆--选择"此账户"
--输入或者选择第一步中创建的windows登录用户名(SynUser)
--"密码"中输入该用户的密码
4.设置SQL Server身份验证模式,解决连接时的权限问题(发布/订阅服务器均做此设置)
企业管理器
--右键SQL实例--属性
--安全性--身份验证
--选择"SQL Server 和 Windows"
--确定
5.在发布服务器和订阅服务器上互相注册
企业管理器
--右键SQL Server组
--新建SQL Server注册...
--下一步--可用的服务器中,输入你要注册的远程服务器名 --添加
--下一步--连接使用,选择第二个"SQL Server身份验证"
--下一步--输入用户名和密码(SynUser)
--下一步--选择SQL Server组,也可以创建一个新组
--下一步--完成
6.对于只能用IP,不能用计算机名的,为其注册服务器别名(此步在实施中没用到)
  (在连接端配置,比如,在订阅服务器上配置的话,服务器名称中输入的是发布服务器的IP)
开始--程序--Microsoft SQL Server--客户端网络实用工具
--别名--添加
--网络库选择"tcp/ip"--服务器别名输入SQL服务器名
--连接参数--服务器名称中输入SQL服务器ip地址
--如果你修改了SQL的端口,取消选择"动态决定端口",并输入对应的端口号
二、 正式配置
1、配置发布服务器
打开企业管理器,在发布服务器(B、C、D)上执行以下步骤:
(1) 从[工具]下拉菜单的[复制]子菜单中选择[配置发布、订阅服务器和分发]出现配置发布和分发向导
(2) [下一步] 选择分发服务器 可以选择把发布服务器自己作为分发服务器或者其他sql的服务器(选择自己)
(3) [下一步] 设置快照文件夹
采用默认\\servername\Pub
(4) [下一步] 自定义配置
可以选择:是,让我设置分发数据库属性启用发布服务器或设置发布设置
否,使用下列默认设置(推荐)
(5) [下一步] 设置分发数据库名称和位置 采用默认值
(6) [下一步] 启用发布服务器 选择作为发布的服务器
(7) [下一步] 选择需要发布的数据库和发布类型
(8) [下一步] 选择注册订阅服务器
(9) [下一步] 完成配置
2、创建出版物
发布服务器B、C、D上
(1)从[工具]菜单的[复制]子菜单中选择[创建和管理发布]命令
(2)选择要创建出版物的数据库,然后单击[创建发布]
(3)在[创建发布向导]的提示对话框中单击[下一步]系统就会弹出一个对话框。对话框上的内容是复制的三个类型。我们现在选第一个也就是默认的快照发布(其他两个大家可以去看看帮助)
(4)单击[下一步]系统要求指定可以订阅该发布的数据库服务器类型,
SQLSERVER允许在不同的数据库如 orACLE或ACCESS之间进行数据复制。
但是在这里我们选择运行"SQL SERVER 2000"的数据库服务器
(5)单击[下一步]系统就弹出一个定义文章的对话框也就是选择要出版的表
注意: 如果前面选择了事务发布 则再这一步中只能选择带有主键的表
(6)选择发布名称和描述
(7)自定义发布属性 向导提供的选择:
是 我将自定义数据筛选,启用匿名订阅和或其他自定义属性
否 根据指定方式创建发布 (建议采用自定义的方式)
(8)[下一步] 选择筛选发布的方式
(9)[下一步] 可以选择是否允许匿名订阅
1)如果选择署名订阅,则需要在发布服务器上添加订阅服务器
方法: [工具]->[复制]->[配置发布、订阅服务器和分发的属性]->[订阅服务器] 中添加
否则在订阅服务器上请求订阅时会出现的提示:改发布不允许匿名订阅
如果仍然需要匿名订阅则用以下解决办法
[企业管理器]->[复制]->[发布内容]->[属性]->[订阅选项] 选择允许匿名请求订阅
2)如果选择匿名订阅,则配置订阅服务器时不会出现以上提示
(10)[下一步] 设置快照 代理程序调度
(11)[下一步] 完成配置
当完成出版物的创建后创建出版物的数据库也就变成了一个共享数据库。
----------------------------
--参考:
/*
作者:邹建
*/
/*--同步两个数据库的示例
有数据
srv1.库名..author有字段:id,name,phone,
srv2.库名..author有字段:id,name,telphone,adress
要求:
srv1.库名..author增加记录则srv1.库名..author记录增加
srv1.库名..author的phone字段更新,则srv1.库名..author对应字段telphone更新
--*/
--大致的处理步骤
--1.在  srv1  上创建连接服务器,以便在  srv1  中操作  srv2,实现同步
exec  sp_addlinkedserver    'srv2','','SQLOLEDB','srv2的sql实例名或ip'
exec  sp_addlinkedsrvlogin  'srv2','false',null,'用户名','密码'
go
--2.在  srv1  和  srv2  这两台电脑中,启动  msdtc(分布式事务处理服务),并且设置为自动启动
我的电脑--控制面板--管理工具--服务--右键  Distributed  Transaction  Coordinator--属性--启动--并将启动类型设置为自动启动
go
--然后创建一个作业定时调用上面的同步处理存储过程就行了
企业管理器
--管理
--SQL  Server代理
--右键作业
--新建作业
--"常规"项中输入作业名称
--"步骤"项
--新建
--"步骤名"中输入步骤名
--"类型"中选择"Transact-SQL  脚本(TSQL)"
--"数据库"选择执行命令的数据库
--"命令"中输入要执行的语句:  exec  p_process 
--确定
--"调度"项
--新建调度
--"名称"中输入调度名称
--"调度类型"中选择你的作业执行安排
--如果选择"反复出现"
--点"更改"来设置你的时间安排
然后将SQL  Agent服务启动,并设置为自动启动,否则你的作业不会被执行
设置方法:
我的电脑--控制面板--管理工具--服务--右键  SQLSERVERAGENT--属性--启动类型--选择"自动启动"--确定.
--3.实现同步处理的方法2,定时同步
--在srv1中创建如下的同步处理存储过程
create  proc  p_process 
as
--更新修改过的数据
update  b  set  name=i.name,telphone=i.telphone
from  srv2.库名.dbo.author  b,author  i
where  b.id=i.id  and
(b.name <> i.name  or  b.telphone <> i.telphone)
--插入新增的数据
insert  srv2.库名.dbo.author(id,name,telphone)
select  id,name,telphone  from  author  i
where  not  exists(
select  *  from  srv2.库名.dbo.author  where  id=i.id)
--删除已经删除的数据(如果需要的话)
delete  b 
from  srv2.库名.dbo.author  b
where  not  exists(
select  *  from  author  where  id=b.id)
go
0
MySql 两地数据库同步5
数据库用的mysql 5.0,均跑在windows 平台下。有两个数据库。数据库 A 是内网的数据库。数据库 B 是在外网。两边的库同时都在运行操作。
要把各自的本地更新数据更新到另外一个库内。做到数据库同步。两边数据库只有外网数据库B是有固定IP。内网的没有固定的IP。
上网了好久。有关数据库更新的方案大致有三种。我打算都实验一下。看效果能不能达到要求。
1. 设置 mysql 来做到更新。
2. 用工具软件同步更新。
3. 编程实现。
以后我会一一把实验结果放出来。如果有做过类似工作的朋友们能一起讨论讨论。小弟我实在是没搞过这样的东西。一点都不会啊。没办法,只能硬着头皮做了。

[align=left][/align]

编程以前就有同事做这个事情实现了。但是后来他走了,现在就是我来接手这件事情了。以前实现的效果有很多不理想的地方,所以我要到更好的方法来做。
思想是这样的。在两边的库内各自设置2个表,一个是用来发送到远端的本地更新数据包,叫send表。一个是用来接收远端发送过来的更新数据包的表,叫receive表。
通过触发器TR来获取对各表的 upd , insert , delete 操作。把更新的数据包放到send表中。当然,会过滤掉从receive表中的数据。
然后在各个端安装2个webservice 。一个用于把打包的更新数据包发送到远端。另一个用于解析数据包,并插入到本地库内。


缺点就是:
1. mysql 对触发器的管理不便,库比较大,有百来张表,写触发器很麻烦。
2. 如在批量更新的操作中,upd的触发器使用频繁。影响效率。
所以没法子,只能摒弃或改进触发器的方法。不过webservice的设计还是不错的。

问题补充:
问题我已经有个一个解决方案了。用mysqlproxy去获得本地的更新语句。在每台机器上都安装一个webservice 里面就两个方法。一个是getDate方法。一个是setDate方法。getDate得到本地的更新数据包,setDate方法把数据写入到自己本地的库中。比如两台机器A,B;

对于A:

将本地数据跟新到远程B库中:Date();  B.setDate(date);

将远程B数据跟新到本地A库中:Date();  A.setDate(date);

对于B 来说同理
MySQL数据同步的方法 
2009-10-07 00:18:04|  分类: computer |  标签: |字号大中小 订阅
MySQL

MySQL数据同步主要有三种方式:
1.利用MySQL自身的数据库同步功能
2.利用MySQL数据库的特性(数据库存在固顶目录,并且以文件形式存储),进行数据库目录同步以达到数据同步目的
3.利用专用的MySQL数据库同步软件

1.利用MySQL自身的数据库同步功能(下面参考自网上的文章,写的非常详细了)
MySQL从3.23.15版本以后提供数据库复制功能。利用该功能可以实现两个数据库同步,主从模式,互相备份模式的功能.

数据库同步复制功能的设置都在mysql的设置文件中体现。mysql的配置文件(一般是myf),在unix环境下在/etc/mysql/myf或者在mysql用户的home目录下的myf。

windows环境中,如果c:根目录下有myf文件则取该配置文件。当运行mysql的工具时候,该工具会把c:根目录下的myf命名为mycnf.bak。并在winnt目录下创建my.ini。mysql服务器启动时候会读该配置文件。所以可以把myf中的内容拷贝到my.ini文件中,用my.ini文件作为mysql服务器的配置文件。

设置方法:
设置范例环境:
操作系统:window2000professional
mysql:4.0.4-beta-max-nt-log
Aip:10.10.10.22
Bip:10.10.10.53
A:设置
1.增加一个用户最为同步的用户帐号:
GRANTFILEON*.*TObackup@'10.10.10.53'IDENTIFIEDBY‘1234’
2.增加一个数据库作为同步数据库:
createdatabasebackup
B:设置
1.增加一个用户最为同步的用户帐号:
GRANTFILEON*.*TObackup@'10.10.10.22'IDENTIFIEDBY‘1234’
2.增加一个数据库作为同步数据库:
createdatabasebackup
主从模式:A->B
A为master
修改Amysql的my.ini文件。在mysqld配置项中加入下面配置:
server-id=1
log-bin
#设置需要记录log可以设置log-bin=c:mysqlbakmysqllog设置日志文件的目录,
#其中mysqllog是日志文件的名称,mysql将建立不同扩展名,文件名为mysqllog的几个日志文件。
binlog-do-db=backup#指定需要日志的数据库
重起数据库服务。
用showmasterstatus命令看日志情况。
B为slave
修改Bmysql的my.ini文件。在mysqld配置项中加入下面配置:
server-id=2
master-host=10.10.10.22
master-user=backup#同步用户帐号
master-password=1234
master-port=3306
master-connect-retry=60预设重试间隔60秒
replicate-do-db=backup告诉slave只做backup数据库的更新
重起数据库
用showslavestatus看同步配置情况。
注意:由于设置了slave的配置信息,mysql在数据库目录下生成master.info
所以如有要修改相关slave的配置要先删除该文件。否则修改的配置不能生效。
双机互备模式。
如果在A加入slave设置,在B加入master设置,则可以做B->A的同步。
在A的配置文件中mysqld配置项加入以下设置:
master-host=10.10.10.53
master-user=backup
master-password=1234
replicate-do-db=backup
master-connect-retry=10
在B的配置文件中mysqld配置项加入以下设置:
log-bin=c:mysqllogmysqllog
binlog-do-db=backup
注意:当有错误产生时*.err日志文件。同步的线程退出,当纠正错误后要让同步机制进行工作,运行slavestart
重起AB机器,则可以实现双向的热备。
测试:
向B批量插入大数据量表AA(1872000)条
A数据库每秒钟可以更新2500条数据。


2.数据库目录同步,方法和文件同步一样,设置好需要同步的两个数据库目录就可以了!
缺点很明显,数据同步只能单向进行,可以作为备份方案

3.用专用的MySQL同步软件进行同步
这方面的软件有SQLBalance和MyReplicator,优点是方便直观,还有很多争强功能!
缺点和2一样,只能单项同步!
当然你也可以修改镜像网站的程序为提交数据到母数据库,读取则在当前镜像下的数据,不过,修改起来麻烦!普通用户修改也非常难!呵呵,大家了解一下就可以!给大家一个思路!有能力的朋友可以试试阿!

4.关于MySQL论坛的数据同步
由于数据来源的不可控制(不好表达),论坛数据是实时的,而且还要考虑来自镜像论坛的数据,如何实现镜像论坛与母论坛数据同步呢?
用1中介绍的MySQL自带的数据库同步功能互相备份模式就可以实现的!
不过,具体的应用我没有测试!稳定性不敢保证!
有能力的朋友推荐用下面这种思路来同步,相对来说减少点效率,但能减少发生的错误!
比如镜像论坛数据同步:
1.母论坛和镜像论坛的数据全写在母论坛数据库里,主从模式,读取只在本地读取,这个需要修改程序!

2.每次写数据,都同时提交到两个数据库中,安全,但是效率很差,也得修改程序!


MSSQL

MSSQL数据同步利用数据库复制技术实现数据同步更新(来自网络,也是非常完美的教程)
复制的概念
复制是将一组数据从一个数据源拷贝到多个数据源的技术,是将一份数据发布到多个存储站点上的有效方式。使用复制技术,用户可以将一份数据发布到多台服务器上,从而使不同的服务器用户都可以在权限的许可的范围内共享这份数据。复制技术可以确保分布在不同地点的数据自动同步更新,从而保证数据的一致性。
SQL复制的基本元素包括
出版服务器、订阅服务器、分发服务器、出版物、文章
SQL复制的工作原理
SQLSERVER主要采用出版物、订阅的方式来处理复制。源数据所在的服务器是出版服务器,负责发表数据。出版服务器把要发表的数据的所有改变情况的拷贝复制到分发服务器,分发服务器包含有一个分发数据库,可接收数据的所有改变,并保存这些改变,再把这些改变分发给订阅服务器
SQLSERVER复制技术类型
SQLSERVER提供了三种复制技术,分别是:
1、快照复制(呆会我们就使用这个)
2、事务复制
3、合并复制
只要把上面这些概念弄清楚了那么对复制也就有了一定的理解。接下来我们就一步一步来实现复制的步骤。
第一先来配置出版服务器
(1)选中指定[服务器]节点
(2)从[工具]下拉菜单的[复制]子菜单中选择[发布、订阅服务器和分发]命令
(3)系统弹出一个对话框点[下一步]然后看着提示一直操作到完成。
(4)当完成了出版服务器的设置以后系统会为该服务器的树形结构中添加一个复制监视器。同时也生成一个分发数据库(distribution)
第二创建出版物
(1)选中指定的服务器
(2)从[工具]菜单的[复制]子菜单中选择[创建和管理发布]命令。此时系统会弹出一个对话框
(3)选择要创建出版物的数据库,然后单击[创建发布]
(4)在[创建发布向导]的提示对话框中单击[下一步]系统就会弹出一个对话框。对话框上的内容是复制的三个类型。我们现在选第一个也就是默认的快照发布(其他两个大家可以去看看帮助)
(5)单击[下一步]系统要求指定可以订阅该发布的数据库服务器类型,SQLSERVER允许在不同的数据库如ORACLE或ACCESS之间进行数据复制。但是在这里我们选择运行"SQLSERVER2000"的数据库服务器
(6)单击[下一步]系统就弹出一个定义文章的对话框也就是选择要出版的表
(7)然后[下一步]直到操作完成。当完成出版物的创建后创建出版物的数据库也就变成了一个共享数据库。
第三设计订阅
(1)选中指定的订阅服务器
(2)从[工具]下拉菜单中选择[复制]子菜单的[请求订阅]
(3)按照单击[下一步]操作直到系统会提示检查SQLSERVER代理服务的运行状态,执行复制操作的前提条件是SQLSERVER代理服务必须已经启动。
(4)单击[完成]。完成订阅操作。
完成上面的步骤其实复制也就是成功了。但是如何来知道复制是否成功了呢?这里可以通过这种方法来快速看是否成功。展开出版服务器下面的复制——发布内容——右键发布内容——属性——击活——状态然后点立即运行代理程序接着点代理程序属性击活调度把调度设置为每一天发生,每一分钟,在0:00:00和23:59:59之间。接下来就是判断复制是否成功了打开C:/ProgramFiles/MicrosoftSQLServer/MSSQL/REPLDATA/unc/XIAOWANGZI_database_database下面看是不是有一些以时间做为文件名的文件夹差不多一分中就产生一个。要是你还不信的话就打开你的数据库看在订阅的服务器的指定订阅数据库下看是不是看到了你刚才所发布的表—
一个手工同步的方案
--定时同步服务器上的数据
--例子:
--测试环境,SQLServer2000,远程服务器名:xz,用户名为:sa,无密码,测试数据库:test
--服务器上的表(查询分析器连接到服务器上创建)
createtable[user](idintprimarykey,numbervarchar(4),namevarchar(10))
go
--以下在局域网(本机操作)
--本机的表,state说明:null表示新增记录,1表示修改过的记录,0表示无变化的记录
ifexists(select*fromdbo.sysobjectswhereid=object_id(N'[user]')andOBJECTPROPERTY(id,N'IsUserTable')=1)
droptable[user]
GO
createtable[user](idintidentity(1,1),numbervarchar(4),namevarchar(10),statebit)
go
--创建触发器,维护state字段的值
createtriggert_stateon[user]
afterupdate
as
update[user]setstate=1
from[user]ajoininsertedbona.id=b.id
wherea.stateisnotnull
go
--为了方便同步处理,创建链接服务器到要同步的服务器
--这里的远程服务器名为:xz,用户名为:sa,无密码
ifexists(select1frommaster..sysserverswheresrvname='srv_lnk')
execsp_dropserver'srv_lnk','droplogins'
go
execsp_addlinkedserver'srv_lnk','','SQLOLEDB','xz'
execsp_addlinkedsrvlogin'srv_lnk','false',null,'sa'
go
--创建同步处理的存储过程
ifexists(select*fromdbo.sysobjectswhereid=object_id(N'[dbo].[p_synchro]')andOBJECTPROPERTY(id,N'IsProcedure')=1)
dropprocedure[dbo].[p_synchro]
GO
createprocp_synchro
as
--setXACT_ABORTon
--启动远程服务器的MSDTC服务
--p_cmdshell'isql/S"xz"/U"sa"/P""/p_cmdshell''netstartmsdtc'',no_output"',no_output
--启动本机的MSDTC服务
--p_cmdshell'netstartmsdtc',no_output
--进行分布事务处理,如果表用标识列做主键,用下面的方法
--BEGINDISTRIBUTEDTRANSACTION
--同步删除的数据
st.dbo.[user]
whereidnotin(selectidfrom[user])
--同步新增的数据
st.dbo.[user]
selectid,number,namefrom[user]wherestateisnull
--同步修改的数据
st.dbo.[user]set
number=b.number,name=b.name
st.dbo.[user]a
join[user]bona.id=b.id
whereb.state=1
--同步后更新本机的标志
update[user]setstate=0whereisnull(state,1)=1
--COMMITTRAN
go
--创建作业,定时执行数据同步的存储过程
ifexists(SELECT1frommsdb..sysjobswherename='数据处理')
EXECUTEmsdb.dbo.sp_delete_job@job_name='数据处理'
execmsdb..sp_add_job@job_name='数据处理'
--创建作业步骤
declare@sqlvarchar(800),@dbnamevarchar(250)
select@sql='execp_synchro'--数据处理的命令
,@dbname=db_name()--执行数据处理的数据库名
execmsdb..sp_add_jobstep@job_name='数据处理',
@step_name='数据同步',
@subsystem='TSQL',
@database_name=@dbname,
@command=@sql,
@retry_attempts=5,--重试次数
@retry_interval=5--重试间隔
--创建调度
EXECmsdb..sp_add_jobschedule@job_name='数据处理',
@name='时间安排',
@freq_type=4,--每天
@freq_interval=1,--每天执行一次
@active_start_time=00000--0点执行
go

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。