数据同步问题内详(有数据同步经验的朋友帮我分析一下)

cowboy_ls 2004-04-29 07:49:59
现在需要讲一个内网的数据库与一个外网的数据库进行同步。
内网一般情况下是不能上互联网的。
(注意)由于内网的数据处于安全考虑,客户不允许内网的服务器连上外网。
和内网连接的计算机有2个网线接口,一个可以访问内网,一个可以访问外网。
现在需要做的工作是把内网的数据和互联网的数据每天定时进行同步。这个需要做一个程序来完成,由于要同步的不只是一张表,而且表之间都有关系。
现在怎么才能让程序知道哪些数据发生了变化:(
不知道DTS有没有把整个数据库里面的表复制到本地,然后再把这些表放到互连网上的操作方法,如果有请大家教教我,能有段代码看最好,(客户先用内网数据线访问内网把这些操作的结果放入一个临时的文件)然后换成互连网的线访问互连网把这些文件覆盖原来数据库种的表数据。
还有就是,用SQL语句找到2个数据库的差异,把有差异的数据生成SQL语句,用上面的方法直接执行SQL语句?这样就会涉及一个表关系的问题……
大家有没有好的想法,或者经验~~帮帮我
...全文
103 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
zjcxc 元老 2004-04-29
  • 打赏
  • 举报
回复

到:
http://www.comexe.cn/

注册免费域名,安装它的动态域名解析软件.(当然,还有很多其他软件可供选择)
就可以了.


*************** 如果你的电脑是通过代理上网的.就要用端口映射. *****************
转帖:


由于公网IP地址有限,不少ISP都采用多个内网用户通过代理和网关路由共用一个公网IP上INTERNET的方法,
这样就限制了这些用户在自己计算机上架设个人网站,要实现在这些用户端架设网站,最关键的一点是,
怎样把多用户的内网IP和一个他们唯一共享上网的IP进行映射!就象在局域网或网吧内一样,
虽然你可以架设多台服务器和网站,但是对外网来说,你还是只有一个外部的IP地址,
怎么样把外网的IP映射成相应的内网IP地址,这应该是内网的那台代理服务器或网关路由器该做的事,
对我们用私有IP地址的用户也就是说这是我们的接入ISP服务商(中国电信、联通、网通、铁通等)应该提供的服务,
因为这种技术的实现对他们来说是举手之劳,而对我们来说是比较困难的,首先得得到系统管理员的支持才能够实现。
因为这一切的设置必须在代理服务器上做的。

要实现这一点,可以用Windows 2000 Server 的端口映射功能,除此之外Winroute Pro也具有这样的功能,还有各种企业级的防火墙。而对于我们这些普通用户,恐怕还是用Windows 2000 Server最为方便。

先来介绍一下NAT,NAT(网络地址转换)是一种将一个IP地址域映射到另一个IP地址域技术,从而为终端主机提供透明路由。NAT包括静态网络地址转换、动态网络地址转换、网络地址及端口转换、动态网络地址及端口转换、端口映射等。NAT常用于私有地址域与公用地址域的转换以解决IP地址匮乏问题。在防火墙上实现NAT后,可以隐藏受保护网络的内部拓扑结构,在一定程度上提高网络的安全性。如果反向NAT提供动态网络地址及端口转换功能,还可以实现负载均衡等功能
端口映射功能可以让内部网络中某台机器对外部提供WWW服务,这不是将真IP地址直接转到内部提供WWW服务的主机,如果这样的话,有二个蔽端,一是内部机器不安全,因为除了WWW之外,外部网络可以通过地址转换功能访问到这台机器的所有功能;二是当有多台机器需要提供这种服务时,必须有同样多的IP地址进行转换,从而达不到节省IP地址的目的。端口映射功能是将一台主机的假IP地址映射成一个真IP地址,当用户访问提供映射端口主机的某个端口时,服务器将请求转到内部一主机的提供这种特定服务的主机;利用端口映射功能还可以将一台真IP地址机器的多个端口映射成内部不同机器上的不同端口。 端口映射功能还可以完成一些特定代理功能,比如代理POP,SMTP,TELNET等协议。理论上可以提供六万多个端口的映射,恐怕我们永远都用不完的。

一、下面来介绍一下通过NAT共享上网和利用NAT来实现端口映射。

1、在Windows 2000 Server上,从管理工具中进入“路由和远程访问”(Routing and Remote Access)服务,在服务器上鼠标右击,-》“配置并启用路由和远程访问”
2、点“下一步”
3、选“Internet连接服务器”,让内网主机可以通过这台服务器访问Internet.(最好先配置好NAT共享,让内网主机可以正常上网,不然的话,配好端口映射后再来配置NAT共享就有点麻烦了,弄的不好NAT还共享不了。)
4、选“设置有网络地址转换(NAT)路由协议的路由器”,不要选“设置Internet连接共享(ICS)”.(ICS与NAT的区别在于使用的容易程度上,为了启用ICS,只需要选择一个复选框就可以了,而为了启用NAT,则需要更多的配置任务,此外,ICS用于小型网络上的原因还在于:针对内部主机,它需要有一个固定的IP地址范围;针对与外部网络的通信,它被限制在单个公共IP地址上;它只允许单个内部网络接口。)
5、先在此说一下我的网络情况:Internet连接192.200.200.3(也是个内部地址,没办法,铁通的网络不太好,网速不快,价钱又贵,我的命真苦啊)宿舍内连接192.168.0.1(宿舍里连有局域网,共4台电脑,其中一台上装了Sambar 5.1b5做的Web服务器,Web端口是80,待会就从外网(用192.200.200.55来替代)来访问这个192.168.0.2:80上的网页)这台NAT主机上开通了IIS5.0,端口是80,用端口映射的办法把8081端口映射到内部主机192.168.0.2的80端口上。
6、在“路由和远程访问服务器安装向导”中选“Internet连接”(就是连向Internet的那个连接),点“下一步”。
7、选“完成”

到此为止,NAT共享设置也就完成了,内部的主机也能上网了。内部主机的网络设置如下:
IP地址范围是912.168.0.2~192.168.0.254,子网掩码为255.255.255.0,网关为192.168.0.1,DNS为ISP给的地址,我们的是211.98.xxx.xxx

二、利用NAT来映射端口

1、添加NAT协议。右击“常规”,-》“新路由选择协议”
2、在“新路由选择协议”中选择“网络地址转换(NAT)”,点击“确定”
3、这样在“IP路由选择”中就多了一项“网络地址转换(NAT)”
4、右击“网络地址转换(NAT)”,添加“新接口”
5、在“网络地址转换(NAT)的新接口”中选择“Internet连接”(也就是连向Internet的那个连接,可不要选错咯)
6、在“网络地址转换-Internet连接属性”中选中“公用接口连接到Internet”,复选“转换TCP/UDP头(推荐)”
7、在"地址池"选项表里添加你需要提供端口重定向的起始地址与结束地址.(也就是你要拿出来搞端口映射的所有IP地址,一般情况下我们就一个IP地址,所以可以不用“地址池”不同之处后面再讲。
8、在"特殊端口"选项表里提供了你需要定向的数据连接协议(是TCP还是UDP协议,如Web和FTP就是TCP协议的),选准后“添加”
9、“添加特殊端口”,这里就是设置端口映射的核心了,把NAT主机的哪个端口映射到内网主机的哪个端口就在这里设置,由于设有“地址池”,所以可以在“公网地址”中添上“地址池”中的任一地址,这里添的是“192.200.200.3”,也就是我的地址,如果你在前面没有设置“地址池”,那么在这个选项页中“在此地址池项”为灰色不可选,你只能选“在此接口”,也就是你只有一个公网IP地址,这比较适合只有一个IP的朋友,可以不用“地址池”,何必做多余的设置呢?假如有问题的话,还不是自找麻烦。
“传入端口”就是别人从网外访问有公网IP的NAT服务器的端口,这里设的为8080。
“专用地址和传出地址”就是内部主机的IP地址和提供特殊服务的端口,这里是把192.200.200.3上的8080端口映射到192.168.0.2上的80端口。
这就是TCP协议端口的重定向,至于UDP的定向页差不多,下图就是添加端口映射后的情况。

四、测试结果
在192.200.200.55出测试了一下NAT主机上的Web服务器和内网中192.168.0.2上建的Web服务器,得出结果如下:(不好意思,中间改过一下端口号,192.200.200.3上的8081端口映射到192.168.0.2的80端口)
zjcxc 元老 2004-04-29
  • 打赏
  • 举报
回复
如何通过互联网联接到某个连上互联网的局域网中的一台计算机上的MSSQL上


*************** 能连接到SQL的几个要素. **************************

1.先保证ping通(有防火墙的先关闭防火墙)
2.在命令提示符下执行:telnet <服务器ip地址> 1433 不会报错
3.连接时使用用ip连接企业管理器
4.如果不行
SQL Server服务器--开始--程序--Microsoft SQL Server
--服务器网络实用工具
--启用 WinSock代理
--代理地址:(sqlserver服务器IP)
--代理端口--1433
---确定

5.如果还不行,在客户端装个SQL Server客户端配置一下:
开始--程序--Microsoft SQL Server--客户端网络实用工具
--别名--添加
--网络库选择"tcp/ip"--服务器别名输入SQL服务器名
--连接参数--服务器名称中输入SQL服务器ip地址
--如果你修改了SQL的端口,取消选择"动态决定端口",并输入对应的端口号




************* 连接实战 ************************************************]

--如果你的两台电脑都有固定的公网IP地址,那就真恭喜你.连接有普通的局域网一样.

--如果你的两台电脑只可以得到动态的公网的IP地址,用下面的方法:

到:
http://www.comexe.cn/

注册免费域名,安装它的动态域名解析软件.(当然,还有很多其他软件可供选择)
就可以了.
zjcxc 元老 2004-04-29
  • 打赏
  • 举报
回复
--定时同步服务器上的数据(服务器上的数据修改同步到本地)

--例子:
--测试环境,SQL Server2000,远程服务器名:rserver,用户名为:ruser,密码:rpwd,
测试数据库:test

--服务器上的表(查询分析器连接到服务器上创建)
--state字段为辅助更新而设置的附加字段,字段值说明:null 表示新增记录,1 表示修改过的记录,0 表示无变化的记录
if exists (select * from dbo.sysobjects where id = object_id(N'[luser]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
drop table [luser]
GO
create table [luser](id int identity(1,1) primary key,[user] varchar(4),pwd varchar(10),address varchar(50),state bit)
go

--创建触发器,维护state字段的值
create trigger t_state on [luser]
after update
as
update [luser] set state=1
from [luser] a join inserted b on a.id=b.id
where a.state is not null
go

----以下在局域网(本机操作)
if exists (select * from dbo.sysobjects where id = object_id(N'[luser]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
drop table [luser]
create table [luser](id int primary key,[user] varchar(4),pwd varchar(10),address varchar(50))
go

--为了方便同步处理,创建链接服务器到要同步的服务器
--这里的远程服务器名:rserver,用户名为:ruser,密码:rpwd
if exists(select 1 from master..sysservers where srvname='srv_lnk')
exec sp_dropserver 'srv_lnk','droplogins'
go
exec sp_addlinkedserver 'srv_lnk','','SQLOLEDB','rserver'
exec sp_addlinkedsrvlogin 'srv_lnk','false',null,'ruser','rpwd'
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
/*--因为MSDTC服务(分布式事务处理需要)工作不稳定,所以下面部分为选用内容
--set XACT_ABORT on
--启动远程服务器的MSDTC服务
--exec master..xp_cmdshell 'isql /S"rserver" /U"ruser" /P"rpwd" /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 [luser]
where id not in(select id from srv_lnk.test.dbo.[luser])

--同步新增的数据
insert into [luser]
select id,[user],pwd,address from srv_lnk.test.dbo.[luser]
where state is null

--同步修改的数据
update [luser] set
[user]=b.[user],pwd=b.pwd,address=b.address
from [luser] a
join srv_lnk.test.dbo.[user] b on a.id=b.id
where b.state=1

--同步后更新服务器上的标志
update srv_lnk.test.dbo.[luser] 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, --4 每天,8 每周,16 每月
@freq_interval=1, --作业执行的天数
@freq_subday_type=0, --是否重复执行,0x1 在指定的时间, 0x4 分钟, 0x8 小时
@freq_subday_interval=1, --重复周期
@freq_recurrence_factor=0, --重复执行,则设置为1,否则设置为0
@active_start_time = 00000 --0点开始执行

--添加目标服务器
EXEC msdb.dbo.sp_add_jobserver
@job_name = @jobname ,
@server_name = N'(local)'
go

zjcxc 元老 2004-04-29
  • 打赏
  • 举报
回复
--定时同步服务器上的数据(本地的数据修改同步到服务器)

--例子:
--测试环境,SQL Server2000,远程服务器名:xz,用户名为:sa,无密码,测试数据库:test
--服务器上的表(查询分析器连接到服务器上创建)
if exists (select * from dbo.sysobjects where id = object_id(N'[user]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
drop table [user]

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) primary key,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
/*--因为MSDTC服务(分布式事务处理需要)工作不稳定,所以下面部分为选用内容
--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, --4 每天,8 每周,16 每月
@freq_interval=1, --作业执行的天数
@freq_subday_type=0, --是否重复执行,0x1 在指定的时间, 0x4 分钟, 0x8 小时
@freq_subday_interval=1, --重复周期
@freq_recurrence_factor=0, --重复执行,则设置为1,否则设置为0
@active_start_time = 00000 --0点开始执行

--添加目标服务器
EXEC msdb.dbo.sp_add_jobserver
@job_name = @jobname ,
@server_name = N'(local)'
go

34,873

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧