触发器实现两台服务器数据同步
2013-04-28 11:49
381 查看
说明:server 2008系统 SQL SERVER 2008环境, 这个触发器运行了半个多月一直没有问题,前段时间突然触发不过去。MSDTC,SQL 服务均已启动, 135端口开了,防火墙都关掉了。
错误情况:
链接服务器"(null)"的 OLE DB 访问接口 "SQLNCLI10" 返回了消息 "没有活动事务。"。
消息 7391,级别 16,状态 2,过程 Trigger_ToYuTuWaterWaterInputDayData,第 33 行
无法执行该操作,因为链接服务器 "(null)" 的 OLE DB 访问接口 "SQLNCLI10" 无法启动分布式事务。
触发器:
ALTER TRIGGER [MonitorOperationData].[Trigger_ToYuTuWaterWaterInputDayData]
ON [MonitorOperationData].[WaterInputDayData]
AFTER insert
AS
BEGIN
SET NOCOUNT ON;
declare @result int
exec @result=master..xp_cmdshell'osql -S10.41.3.10 -Usa -Psa',no_output
if @result=0
begin
declare @PSCode varchar(20),@OutPut varchar(20),@inspecttime datetime,@infectantcode varchar(20),@datagathercode varchar(20),@MinFlux numeric(18, 3),@AvgFlux numeric(18, 3),@MaxFlux numeric(18, 3)
declare mycursor cursor for select PSCode,INputCode,MonitorTime,MinFlow,AvgFlow,MaxFlow from inserted
open mycursor
fetch next from mycursor into @PSCode,@OutPut,@inspecttime,@MinFlux,@AvgFlux,@MaxFlux
while @@fetch_status=0
begin
select @infectantcode=convert(varchar(20),@PSCode)+'_'+convert(varchar(20),@OutPut)
SET ANSI_NULL_DFLT_ON ON
SET ANSI_WARNINGS ON
set xact_abort on
begin distributed transaction
insert into openrowset('sqloledb','10.41.3.10';'sa';'sa','select DataGatherCode,InspectTime,MinFlux,AvgFlux,MaxFlux from db_omgis_ly_null.dbo.T_Bas_DAYOutportData') values(@infectantcode,@inspecttime,@MinFlux,@AvgFlux,@MaxFlux)
commit tran
fetch next from mycursor into @PSCode,@OutPut,@inspecttime,@MinFlux,@AvgFlux,@MaxFlux
end
close mycursor
deallocate mycursor
end
END
有两张表数据要做实时同步,于是做了个触发器进行同步。但是出现: 链接服务器"192.168.99.66"的 OLE DB 访问接口 "SQLNCLI" 返回了消息 "没有活动事务。"。无法执行该操作,因为链接服务器 "192.168.99.66" 的 OLE DB 访问接口 "SQLNCLI" 无法启动分布式事务。
由于是两个表在不同的数据库,并且数据库在不同的网段。
排查:
1、发现由于防火墙限制,无法访问对方135端口。开放后还是不行。
2、修改host文件,将对方机器名和IP加入。问题解决。
触发器如下
ALTER TRIGGER [syncuser]
ON [dbo].[User]
AFTER INSERT
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
set xact_abort on
begin distributed tran
insert into openrowset('SQLOLEDB' , '192.168.0.86' ; 'sa' ; 'sa' , tr55_bk.dbo.user)
select * from tr55.dbo.trafaxuser
commit tran
END;
谢谢大家 问题已经解决 ap0405140 之外的提供解决方案的朋友 说的都有道理,但是 这个问题的根本原因是 DTC 服务 需要安全配置。配置完成最初的语句就可以使用。 谢谢大家
错误情况:
链接服务器"(null)"的 OLE DB 访问接口 "SQLNCLI10" 返回了消息 "没有活动事务。"。
消息 7391,级别 16,状态 2,过程 Trigger_ToYuTuWaterWaterInputDayData,第 33 行
无法执行该操作,因为链接服务器 "(null)" 的 OLE DB 访问接口 "SQLNCLI10" 无法启动分布式事务。
触发器:
ALTER TRIGGER [MonitorOperationData].[Trigger_ToYuTuWaterWaterInputDayData]
ON [MonitorOperationData].[WaterInputDayData]
AFTER insert
AS
BEGIN
SET NOCOUNT ON;
declare @result int
exec @result=master..xp_cmdshell'osql -S10.41.3.10 -Usa -Psa',no_output
if @result=0
begin
declare @PSCode varchar(20),@OutPut varchar(20),@inspecttime datetime,@infectantcode varchar(20),@datagathercode varchar(20),@MinFlux numeric(18, 3),@AvgFlux numeric(18, 3),@MaxFlux numeric(18, 3)
declare mycursor cursor for select PSCode,INputCode,MonitorTime,MinFlow,AvgFlow,MaxFlow from inserted
open mycursor
fetch next from mycursor into @PSCode,@OutPut,@inspecttime,@MinFlux,@AvgFlux,@MaxFlux
while @@fetch_status=0
begin
select @infectantcode=convert(varchar(20),@PSCode)+'_'+convert(varchar(20),@OutPut)
SET ANSI_NULL_DFLT_ON ON
SET ANSI_WARNINGS ON
set xact_abort on
begin distributed transaction
insert into openrowset('sqloledb','10.41.3.10';'sa';'sa','select DataGatherCode,InspectTime,MinFlux,AvgFlux,MaxFlux from db_omgis_ly_null.dbo.T_Bas_DAYOutportData') values(@infectantcode,@inspecttime,@MinFlux,@AvgFlux,@MaxFlux)
commit tran
fetch next from mycursor into @PSCode,@OutPut,@inspecttime,@MinFlux,@AvgFlux,@MaxFlux
end
close mycursor
deallocate mycursor
end
END
有两张表数据要做实时同步,于是做了个触发器进行同步。但是出现: 链接服务器"192.168.99.66"的 OLE DB 访问接口 "SQLNCLI" 返回了消息 "没有活动事务。"。无法执行该操作,因为链接服务器 "192.168.99.66" 的 OLE DB 访问接口 "SQLNCLI" 无法启动分布式事务。
由于是两个表在不同的数据库,并且数据库在不同的网段。
排查:
1、发现由于防火墙限制,无法访问对方135端口。开放后还是不行。
2、修改host文件,将对方机器名和IP加入。问题解决。
触发器如下
ALTER TRIGGER [syncuser]
ON [dbo].[User]
AFTER INSERT
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
set xact_abort on
begin distributed tran
insert into openrowset('SQLOLEDB' , '192.168.0.86' ; 'sa' ; 'sa' , tr55_bk.dbo.user)
select * from tr55.dbo.trafaxuser
commit tran
END;
谢谢大家 问题已经解决 ap0405140 之外的提供解决方案的朋友 说的都有道理,但是 这个问题的根本原因是 DTC 服务 需要安全配置。配置完成最初的语句就可以使用。 谢谢大家
相关文章推荐
- 巧用dblink结合oracle快照实现两台服务器的数据同步
- 利用触发器让两台服务器上的数据库的两张表进行数据同步更新
- 巧用dblink结合oracle快照实现两台服务器的数据同步
- rsync 实现文件同步 (重要数据通过rsyncr把数据同步到不同的两台服务器上,这样可以防止服务器的硬盘故障导致数据丢失) 客户端同步时如果要排某个目录
- 用mysql的federated数据引擎和触发器实现跨服务器表数据同步
- 用mysql的federated数据引擎和触发器实现远程服务器表数据同步
- 巧用dblink结合oracle快照实现两台服务器的数据同步
- Android开发如何实现和服务器的数据同步
- Rsync服务配置详解,实现服务器间数据同步!
- Oracle 快照及 dblink使用 (两台服务器数据同步)
- Rsync实现服务器间文件数据同步配置详解!
- [Android开发] 在Android开发时,如何实现和服务器的数据同步?
- 完整利用Rsync实现服务器/网站数据增量同步备份
- 两台CentOS利用Rsync实现数据同步
- mysql 触发器实现两个表的数据同步
- kettle利用触发器实现数据同步
- 如何实现两台服务器间无密码的传输数据和操作
- 如何实现两台服务器间无密码的传输数据和操作
- Linux下两台服务器文件实时同步方案设计和实现
- redis作为mysql的缓存服务器(读写分离,通过mysql触发器实现数据同步)