建设资讯网站,正规网络教育培训机构,网站建设前台和后台,招远做网站哪家好两台服务器分别架在两个不同的机房#xff0c;要实现所有表中数据的同步#xff0c;延时一两分钟没关系#xff0c;数据库数据量很大#xff0c;表大概有不到一百个吧#xff0c;怎么实现同步#xff1f;不同服务器数据库之间的数据操作--创建链接服务器
execsp_addlink…两台服务器分别架在两个不同的机房要实现所有表中数据的同步延时一两分钟没关系数据库数据量很大表大概有不到一百个吧怎么实现同步不同服务器数据库之间的数据操作--创建链接服务器
execsp_addlinkedserver ITSV , , SQLOLEDB , 远程服务器名或ip地址
execsp_addlinkedsrvlogin ITSV , false ,null, 用户名 , 密码 --查询示例
select*fromITSV.数据库名.dbo.表名 --导入示例
select*into表 fromITSV.数据库名.dbo.表名 --以后不再使用时删除链接服务器
execsp_dropserver ITSV , droplogins --连接远程/局域网数据(openrowset/openquery/opendatasource)
--1、openrowset --查询示例
select*fromopenrowset( SQLOLEDB , sql服务器名 ; 用户名 ; 密码 ,数据库名.dbo.表名) --生成本地表
select*into表 fromopenrowset( SQLOLEDB , sql服务器名 ; 用户名 ; 密码 ,数据库名.dbo.表名) --把本地表导入远程表
insertopenrowset( SQLOLEDB , sql服务器名 ; 用户名 ; 密码 ,数据库名.dbo.表名)
select*from本地表 --更新本地表
updateb
setb.列Aa.列A
fromopenrowset( SQLOLEDB , sql服务器名 ; 用户名 ; 密码 ,数据库名.dbo.表名)asa innerjoin本地表 b
ona.column1b.column1 --openquery用法需要创建一个连接 --首先创建一个连接创建链接服务器
execsp_addlinkedserver ITSV , , SQLOLEDB , 远程服务器名或ip地址
--查询
select*
FROMopenquery(ITSV, SELECT * FROM 数据库.dbo.表名 )
--把本地表导入远程表
insertopenquery(ITSV, SELECT * FROM 数据库.dbo.表名 )
select*from本地表
--更新本地表
updateb
setb.列Ba.列B
FROMopenquery(ITSV, SELECT * FROM 数据库.dbo.表名 ) asa
innerjoin本地表 b ona.列Ab.列A --3、opendatasource/openrowset
SELECT *
FROM opendatasource( SQLOLEDB , Data Sourceip/ServerName;User ID登陆名;Password密码 ).test.dbo.roy_ta
--把本地表导入远程表
insertopendatasource( SQLOLEDB , Data Sourceip/ServerName;User ID登陆名;Password密码 ).数据库.dbo.表名
select*from用强制订阅实现数据库同步操作
大量和批量的数据可以用数据库的同步机制处理:
//
说明
为方便操作,所有操作均在发布服务器(分发服务器)上操作,并使用推模式
在客户机器使用强制订阅方式。有疑问联系作者zlp321001hotmail.com测试通过//
--1:环境
服务器环境:
机器名称 ZehuaDb
操作系统Windows 2000Server
数据库版本SQL 2000Server 个人版客户端
机器名称Zlp
操作系统Windows 2000Server
数据库版本SQL 2000Server 个人版--2:建用户帐号
在服务器端建立域用户帐号
我的电脑管理-本地用户和组-用户-建立
UserName:zlp
UserPwd:zlp--3:重新启动服务器MSSQLServer
我的电脑-控制面版-管理工具-服务-MSSQLServer 服务
(更改为域用户帐号,我们新建的zlp用户 ./zlp,密码:zlp) --4:安装分发服务器
A:配置分发服务器
工具-复制-配置发布、订阅服务器和分发-下一步-下一步(所有的均采用默认配置)
B:配置发布服务器
工具-复制-创建和管理发布-选择要发布的数据库(SZ)-下一步-快照发布-下一步-
选择要发布的内容-下一步-下一步-下一步-完成
C:强制配置订阅服务器(推模式,拉模式与此雷同)
工具-复制-配置发布、订阅服务器和分发-订阅服务器-新建-SQL Server数据库-输入客户端服务器名称(ZLP)-使用SQL Server 身份验证(sa,空密码)-确定-应用-确定
D:初始化订阅
复制监视器-发布服务器(ZEHUADB)-双击订阅-强制新建-下一步-选择启用的订阅服务器-ZLP-
下一步-下一步-下一步-下一步-完成--5:测试配置是否成功
复制监视器-发布服务器(ZEHUADB)-双击SZ:SZ-点状态-点立即运行代理程序
查看
复制监视器-发布服务器(ZEHUADB)-SZ:SZ-选择ZLP:SZ(类型强制)-鼠标右键-启动同步处理
如果没有错误标志(红色叉)恭喜您配置成功--6:测试数据
--在服务器执行:
选择一个表执行如下SQL
insertintoWQ_NEWSGROUP_S select测试成功,5复制监视器-发布服务器(ZEHUADB)-SZ:SZ-快照-启动代理程序-ZLP:SZ(强制)-启动同步处理去查看同步的 WQ_NEWSGROUP_S 是否插入了一条新的记录测试完毕通过。--7修改数据库的同步时间,一般选择夜晚执行数据库同步处理
(具体操作略) :D/*
注意说明
服务器一端不能以(local)进行数据的发布与分发,需要先删除注册然后新建注册本地计算机名称卸载方式工具-复制-禁止发布-是在ZehuaDb上静止发布,卸载所有的数据库同步配置服务器注意发布服务器、分发服务器中的SQLServerAgent服务必须启动采用推模式: D:/Microsoft SQL Server/MSSQL/REPLDATA/unc 目录文件可以不设置共享拉模式:则需要共享~!*/少量数据库同步可以采用触发器实现,同步单表即可配置过程中可能出现的问题,总结如下:(感谢作者: 余枫 提供的帮助) 在SQL Server 2000里设置和使用数据库复制之前应先检查相关的几台SQL Server服务器下面几点是否满足1、MSSQLserver和Sqlserveragent服务是否是以域用户身份启动并运行的./administrator用户也是可以的如果登录用的是本地系统帐户local将不具备网络功能会产生以下错误:进程未能连接到Distributor Server name2、检查相关的几台SQL Server服务器是否改过名称(需要srvid0的本地机器上srvname和datasource一样)在查询分析器里执行:usemasterselectsrvid,srvname,datasource fromsysservers 如果没有srvid0或者srvid0也就是本机器但srvname和datasource不一样, 需要按如下方法修改:USEmasterGO--设置两个变量DECLAREserverproperty_servername varchar(100), servername varchar(100)--取得Windows NT 服务器和与指定的 SQL Server 实例关联的实例信息SELECTserverproperty_servernameCONVERT(varchar(100), SERVERPROPERTY(ServerName))--返回运行 Microsoft SQL Server 的本地服务器名称SELECTservernameCONVERT(varchar(100), SERVERNAME)--显示获取的这两个参数selectserverproperty_servername,servername--如果serverproperty_servername和servername不同(因为你改过计算机名字),再运行下面的--删除错误的服务器名EXECsp_dropserver serverservername--添加正确的服务器名EXECsp_addserver serverserverproperty_servername, locallocal修改这项参数需要重新启动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主机名不通的时候需要在 winnt/system32/drivers/etc/hosts (WIN2000)windows/system32/drivers/etc/hosts (WIN2003)文件里写入数据库服务器IP地址和主机名的对应关系。例如 127.0.0.1 localhost192.168.0.35 oracledb oracledb192.168.0.65 fengyu02 fengyu02202.84.10.193 bj_db bj_db 或者在SQL Server客户端网络实用工具里建立别名例如:5、系统需要的扩展存储过程是否存在(如果不存在需要恢复):sp_addextendedproc xp_regenumvalues,dllnamexpstar.dllgosp_addextendedproc xp_regdeletevalue,dllnamexpstar.dllgosp_addextendedproc xp_regdeletekey,dllnamexpstar.dllgo sp_addextendedproc xp_cmdshell ,dllnamexplog70.dll
接下来就可以用SQL Server企业管理器里[复制]-右键选择 -[配置发布、订阅服务器和分发]的图形界面来配置数据库复制了。下面是按顺序列出配置复制的步骤:一、建立发布和分发服务器[欢迎使用配置发布和分发向导]-[选择分发服务器]-[使servername成为它自己的分发服务器,SQL Server将创建分发数据库和日志]-[制定快照文件夹]-[自定义配置]-[否,使用下列的默认配置]-[完成]上述步骤完成后, 会在当前servername SQL Server数据库里建立了一个distribion库和一个distributor_admin管理员级别的用户(我们可以任意修改密码)服务器上新增加了四个作业:[代理程序历史记录清除: distribution ][分发清除: distribution ][复制代理程序检查 ][重新初始化存在数据验证失败的订阅 ]SQL Server企业管理器里多了一个复制监视器, 当前的这台机器就可以发布、分发、订阅了。我们再次在SQL Server企业管理器里[复制]-右键选择 -[配置发布、订阅服务器和分发],可以看到类似下图:我们可以在 [发布服务器和分发服务器的属性]窗口-[发布服务器]-[新增] -[确定]-[发布数据库]-[事务]/[合并]-[确定]-[订阅服务器]-[新增] -[确定] 把网络上的其它SQL Server服务器添加成为发布或者订阅服务器.新增一台发布服务器的选项 我这里新建立的JIN001发布服务器是用管理员级别的数据库用户test连接的 到发布服务器的管理链接要输入密码的可选框, 默认的是选中的在新建的JIN001发布服务器上建立和分发服务器FENGYU/FENGYU的链接的时需要输入distributor_admin用户的密码到发布服务器的管理链接要输入密码的可选框也可以不选也就是不需要密码来建立发布到分发服务器的链接(这当然欠缺安全在测试环境下可以使用)新增一台订阅服务器的选项二、新建立的网络上另一台发布服务器(例如JIN001)选择分发服务器[欢迎使用配置发布和分发向导]-[选择分发服务器]-使用下列服务器(选定的服务器必须已配置为分发服务器) -[选定服务器](例如FENGYU/FENGYU)-[下一步]-[输入分发服务器例如FENGYU/FENGYU的distributor_admin用户的密码两次]-[下一步]-[自定义配置]-[否使用下列的默认配置]-[下一步]-[完成]-[确定]建立一个数据库复制发布的过程:[复制]-[发布内容]-右键选择 -[新建发布]-[下一步]-[选择发布数据库]-[选中一个待发布的数据库]-[下一步]-[选择发布类型]-[事务发布]/[合并发布]-[下一步]-[指定订阅服务器的类型]-[运行SQL Server 2000的服务器]-[下一步]-[指定项目]-[在事务发布中只可以发布带主键的表]-[选中一个有主键的待发布的表]-[在合并发布中会给表增加唯一性索引和 ROWGUIDCOL 属性的唯一标识符字段[rowguid],默认值是newid()] (添加新列将: 导致不带列列表的 INSERT语句失败,增加表的大小,增加生成第一个快照所要求的时间)-[选中一个待发布的表]-[下一步]-[选择发布名称和描述]--[下一步]-[自定义发布的属性]-[否根据指定方式创建发布]-[下一步]-[完成]-[关闭]发布属性里有很多有用的选项设定订阅到期(例如24小时)设定发布表的项目属性:常规窗口可以指定发布目的表的名称可以跟原来的表名称不一样。下图是命令和快照窗口的栏目 ( SQL Server 数据库复制技术实际上是用insert,update,delete操作在订阅服务器上重做发布服务器上的事务操作看文档资料需要把发布数据库设成完全恢复模式事务才不会丢失但我自己在测试中发现发布数据库是简单恢复模式下每10秒生成一些大事务10分钟后再收缩数据库日志这期间发布和订阅服务器上的作业都暂停暂停恢复后并没有丢失任何事务更改 )发布表可以做数据筛选例如只选择表里面的部分列:例如只选择表里某些符合条件的记录, 我们可以手工编写筛选的SQL语句:发布表的订阅选项并可以建立强制订阅:成功建立了发布以后,发布服务器上新增加了一个作业: [失效订阅清除 ]分发服务器上新增加了两个作业: [JIN001-dack-dack-5 ]类型[REPL快照 ][JIN001-dack-3 ] 类型[REPL日志读取器 ]上面蓝色字的名称会根据发布服务器名,发布名及第几次发布而使用不同的编号REPL快照作业是SQL Server复制的前提条件,它会先把发布的表结构,数据,索引,约束等生成到发布服务器的OS目录下文件(当有订阅的时候才会生成, 当订阅请求初始化或者按照某个时间表调度生成)
REPL日志读取器在事务复制的时候是一直处于运行状态。(在合并复制的时候可以根据调度的时间表来运行) 建立一个数据库复制订阅的过程: [复制]-[订阅]-右键选择 -[新建请求订阅]-[下一步]-[查找发布]-[查看已注册服务器所做的发布]-[下一步]-[选择发布]-[选中已经建立发布服务器上的数据库发布名] -[下一步]-[指定同步代理程序登录]-[当代理程序连接到代理服务器时:使用SQL Server身份验证](输入发布服务器上distributor_admin用户名和密码) -[下一步]-[选择目的数据库]-[选择在其中创建订阅的数据库名]/[也可以新建一个库名] -[下一步]-[允许匿名订阅]-[是生成匿名订阅] -[下一步]-[初始化订阅]-[是初始化架构和数据] -[下一步]-[快照传送]-[使用该发布的默认快照文件夹中的快照文件](订阅服务器要能访问发布服务器的REPLDATA文件夹如果有问题可以手工设置网络共享及共享权限) -[下一步]-[快照传送]-[使用该发布的默认快照文件夹中的快照文件] -[下一步]-[设置分发代理程序调度]-[使用下列调度]-[更改]-[例如每五分钟调度一次] -[下一步]-[启动要求的服务]-[该订阅要求在发布服务器上运行SQLServerAgent服务] -[下一步]-[完成]-[确定] 成功建立了订阅后订阅服务器上新增加了一个类别是[REPL-分发]作业(合并复制的时候类别是[REPL-合并])它会按照我们给的时间调度表运行数据库同步复制的作业查看它的历史记录运行情况例图 在分发服务器的[复制监视器]-[发布服务器]-[发布名称]-[日志读取器]-右键选择-[代理程序历史记录], 例图(如果您的服务器已经用了SQL Server全文检索服务, 请不要修改MSSQLserver和Sqlserveragent服务的local启动。 会照成全文检索服务不能用。请换另外一台机器来做SQL Server 2000里复制中的分发服务器。) 修改服务启动的登录用户需要重新启动MSSQLserver和Sqlserveragent服务才能生效。四、删除已经建好的发布和定阅可以直接用delete删除按钮我们最好总是按先删定阅再删发布最后禁用发布的顺序来操作。如果要彻底删去SQL Server上面的复制设置, 可以这样操作:[复制]-右键选择 [禁用发布]-[欢迎使用禁用发布和分发向导]-[下一步]-[禁用发布]-[要在servername上禁用发布]-[下一步]-[完成禁用发布和分发向导]-[完成]我们也可以用T-SQL命令来完成复制中发布及订阅的创建和删除, 选中已经设好的发布和订阅, 按属标右键可以[生成SQL脚本]。(这里就不详细讲了, 后面推荐的网站内有比较详细的内容)当你试图删除或者变更一个table时出现以下错误Server: Msg 3724, Level16, State 2, Line 1Cannot dropthe tableobject_namebecause it isbeing used forreplication.比较典型的情况是该table曾经用于复制但是后来又删除了复制处理办法select*fromsysobjects wherereplinfo 0sp_configure allow updates, 1goreconfigurewithoverridegobegintransactionupdatesysobjects setreplinfo 0wherereplinfo 0committransactiongorollbacktransactiongosp_configure allow updates, 0goreconfigurewithoverridego疑问:
在合并复制配置完全后如果同步代理停止了。我要在程序中去重新启动合并复制的同步代理。请问使用什么命令或存储过程呢
解决办法:(朱二)
sp_start_job
指示 SQL Server 代理程序立即执行作业。示例
下例启动名为 Nightly Backup的作业。USEmsdb
EXECsp_start_job job_nameNightly Backup