SQLServer数据实时同步至PostgreSQL


前言:

为迎合工作需求有时候传送的数据保存在SQLServer中但由于工作需要需要保存到PostgreSQL中进行处理,本文主要通过在SQLServer中设置触发器和存储过程的方式完成数据的同步

系统环境说明

软件 版本 说明
SQLServer 2008R2_X64 X64位
PostgreSQL 9.5_X64
odbc 9.5_X64

postgre_odbc下载安装

odbc主要是让PostgreSQL与SQLServer之间建立桥梁利于数据传输下载地址

PostgreSQL_odbc选择要下载的版本

演示环境下载的9.5版本随本机安装Postgre数据库

下载完成解压得到Psqlodbc_x64.msi,双击运行安装默认即可

安装完成后通过系统自带的ODBC数据源配置系统DNS

点击添加打开需要添加的数据源,这里选择PostgreSQL ANSIx64

添加PostgreSQL连接

DataSource:连接名称 ,后续在SQLServer中会用到

Database: 要连接的数据库

Server: Posgresql服务地址,也可以是IP

Port: 服务端口号

User Name:用户登录名

Password:登录密码

输入连接参数后点击Test 测试是否成功 成功后点击Save 保存即可

添加链接服务器方法1——用操作界面添加

  1. SQLServer中添加服务器对象

    打开SQLServer数据库连接,找到服务器对象->链接服务器->鼠标右键选择新建链接服务器

常规

1.设置连接对象名称

2.选择访问接口,这里先连接本地所以选择如图,当添加ODBC时会有所不同

3.输入产品名称,这里随意填写(不能为null),测试单词中有空格添加失败

4.数据源名称,这里为SQL Server服务器连接IP,本地连接故以“.”代替

安全性

当切换到安全性选项卡时,默认

  • [x] 不使用安全上下文连接(N)

这里切换到 使用此安全上下文建立连接 使用SQLServer登录用户名登陆即可

服务器选项

将RPC 设置为 True 默认为False

将RPC Out 设置为 True 默认为False

将为RPC 启动针对分布式事务升级 设置为 false 默认为 true

设置完成后单击确定即可完成设置

添加PostgreSQL 连接服务器

添加PostgreSQL 链接服务器与 SQLServer 步骤类似

区别在于:

访问接口-> Microsoft OLE DB Provider for ODBC Drivers

数据源 -> 为ODBC链接对象DataSource 名称

安全性输入填写 PostgreSQL 的登陆账号、密码即可

服务器选项相同

添加链接服务器方法2————用T-SQL命令添加

use master
go
/****** Object: LinkedServer [LOCALHOSTSQL]
判断是否存在 LOCALHOSTSQL 名称的LinkedServer 如果有则删除
******/
IF EXISTS (SELECT srv.name FROM sys.servers srv WHERE srv.server_id != 0 AND srv.name = N'LOCALHOSTSQL')EXEC master.dbo.sp_dropserver @server=N'LOCALHOSTSQL', @droplogins='droplogins'
GO
/****** Object: LinkedServer [LOCALHOSTSQL]
添加本地链接 调用存储过程 master.dbo.sp_addlinkedserver
******/
EXEC master.dbo.sp_addlinkedserver
@server = N'LOCALHOSTSQL', --链接服务器
@srvproduct=N'SQlServer', --产品名称
@provider=N'SQLNCLI', --访问接口
@datasrc=N'.\SQL08R2' --数据源
/*
安全性添加 调用存储过程 master.dbo.sp_addlinkedsrvlogin
*/
EXEC master.dbo.sp_addlinkedsrvlogin
@rmtsrvname=N'LOCALHOSTSQL', --链接服务器
@useself=N'False', --
@locallogin=NULL, --本地登陆
@rmtuser=N'sa', --远程登陆用户
@rmtpassword='########' --远程登陆密码 改成实际用户名密码
GO
/*
服务器选项 调用存储过程 master.dbo.sp_serveroption 这里服务器选项操作很多,这里只选择需要的配置,其他为默认选项
*/
EXEC master.dbo.sp_serveroption
@server=N'LOCALHOSTSQL', --链接服务器
@optname=N'rpc out', --操作 rpc out选项
@optvalue=N'true' --选项值
GO
EXEC master.dbo.sp_serveroption
@server=N'LOCALHOSTSQL', --链接服务器
@optname=N'rpc', --操作rpc选项
@optvalue=N'true' --选项值
GO
EXEC master.dbo.sp_serveroption
@server=N'LOCALHOSTSQL',
@optname=N'remote proc transaction promotion', --rpc 事务选项
@optvalue=N'false' GO
/*
判断是否有 名称为 POSTGRESQL 的链接服务器 如果有则删除
*/
IF EXISTS (SELECT srv.name FROM sys.servers srv WHERE srv.server_id != 0 AND srv.name = N'POSTGRESQL')EXEC master.dbo.sp_dropserver @server=N'POSTGRESQL', @droplogins='droplogins'
GO
/****** 常规 ******/
EXEC master.dbo.sp_addlinkedserver
@server = N'POSTGRESQL', --链接服务器
@srvproduct=N'PostgreSQL', --产品名称
@provider=N'MSDASQL', --驱动
@datasrc=N'PostgreSQL95' --数据源
/* POSTGRESQL 安全性配置 */
EXEC master.dbo.sp_addlinkedsrvlogin
@rmtsrvname=N'POSTGRESQL', --链接服务器
@useself=N'False', --
@locallogin=NULL, --本地登陆
@rmtuser=N'postgres', --登陆账号
@rmtpassword='########' --登陆密码 改为实际密码 GO
/*服务器选项*/
EXEC master.dbo.sp_serveroption
@server=N'POSTGRESQL', --链接服务器
@optname=N'rpc out', --操作选项
@optvalue=N'true' --选项值
GO
EXEC master.dbo.sp_serveroption
@server=N'POSTGRESQL', --链接服务器
@optname=N'rpc', --操作选项
@optvalue=N'true' --选项值
GO
EXEC master.dbo.sp_serveroption
@server=N'POSTGRESQL',
@optname=N'remote proc transaction promotion',
@optvalue=N'false'
GO

利用T-SQL添加数据源 链接服务器名称可小写 大小写混合,利用窗口添加 链接服务器名称默认大写。未找到更好兼容解决方案 ,看个人习惯选择即可

检查链接服务器是否正常显示数据源,展开刚添加的数据源对象,查看目录下是否有链接数据库名称

准备测试数据结构

在SQLServer Books数据库中新建书单信息表、并添加测试数据

use Books
go
--判断是否有存在表
if OBJECT_ID('dbo.books','U') is not null drop table dbo.books
go
--创建表存储
create table books(
id int identity(1,1) primary key,
name varchar(150) not null,
price float not null,
stock int not null
)
go
--添加数据
insert into books(name,price,stock)values
('Access入门实战',49.5,999),
('T-SQL性能调优秘笈',49.0,999),
('.NET MVC5 高级变成',79.8,999),
('Python 入门实战',89.00,999);
--检查添加数据
select * from books;

postgreSQL中添加同结构数据表

编写存储过程

use Books
GO
if OBJECT_ID('Insert_Books','P') is not null drop procedure dbo.Insert_Books
go
--添加插入存储过程
CREATE PROCEDURE Insert_Books
@name varchar(100),@price float,@stock int
AS
BEGIN
SET NOCOUNT ON;
insert openquery(POSTGRESQL,'select name,price,stock from books where 1=0')(name,price,stock) values
(@name,@price,@stock);
SET NOCOUNT ON;
END
GO
if OBJECT_ID('update_Books','P') is not null drop procedure dbo.update_Books
go

添加触发器

--创建添加触发器
CREATE TRIGGER insert_trigger
ON Books.dbo.books
AFTER INSERT
AS
BEGIN
declare @name varchar(150),@price float,@stock int
select @name=name,@price=price,@stock=stock from inserted
SET NOCOUNT ON; exec LOCALHOSTSQL.[books].[dbo].[Insert_Books] @name,@price,@stock
-- Insert statements for trigger here END

测试效果

同步SQLServer 数据库中的 数据至PostgreSQL

insert openquery(POSTGRESQL,'select name,price,stock from books where 1=0')
select name,price,stock from books

postgresql数据中

测试添加数据

insert into books(name,price,stock) values('代码整洁之道',56.3,623)
select * from books

可以看到当在SQLServer中数据后,PostgreSQL数据库中的数据也随之增加了,证明此方法测试运行成功

遇到的问题:

1.无法执行该操作,因为链接服务器 "XXX" 的 OLE DB 访问接口 "SQLNCLI10" 无法启动分布式事务。

在组件服务中->本地DTC->属性->安全 配置

重启msdtc 服务 net start msdtc net stop msdtc

2.Microsoft 分布式事务处理协调器(MS DTC)已停止此事务。

检查连接服务器配置 ,rpc、rpc out 、rpc 分布式事务连接

SQLServer数据实时同步PostgreSQL的更多相关文章

  1. 实战:sqlserver 数据实时同步到mysql

    1.安装安装mysqlconnector 2.配置mysqlconnector ODBC数据管理器->系统DSN->加入->mysql ODBC 5.3 ANSI driver-&g ...

  2. MySQL 到 ES 数据实时同步技术架构

    MySQL 到 ES 数据实时同步技术架构 我们已经讨论了数据去规范化的几种实现方式.MySQL 到 ES 数据同步本质上是数据去规范化多种实现方式中的一种,即通过"数据迁移同步" ...

  3. Linux下Rsync+sersync实现数据实时同步

    inotify 的同步备份机制有着缺点,于是看了sersync同步,弥补了rsync的缺点.以下转自:http://www.osyunwei.com/archives/7447.html 前言: 一. ...

  4. sersync实现数据实时同步

    1.1 第一个里程碑:安装sersync软件 1.1.1 将软件上传到服务器当中并解压 1.上传软件到服务器上 rz -E 为了便于管理上传位置统一设置为 /server/tools 中 2.解压软件 ...

  5. 基于netcore实现mongodb和ElasticSearch之间的数据实时同步的工具(Mongo2Es)

    基于netcore实现mongodb和ElasticSearch之间的数据实时同步的工具 支持一对一,一对多,多对一和多对多的数据传输方式. 一对一 - 一个mongodb的collection对应一 ...

  6. Mysql数据实时同步

    企业运维的数据库最常见的是 mysql;但是 mysql 有个缺陷:当数据量达到千万条的时候,mysql 的相关操作会变的非常迟缓; 如果这个时候有需求需要实时展示数据;对于 mysql 来说是一种灾 ...

  7. CentOS 6.5 rsync+inotify实现数据实时同步备份

    CentOS 6.5 rsync+inotify实现数据实时同步备份 rsync    remote sync 远程同步,同步是把数据从缓冲区同步到磁盘上去的.数据在内存缓存区完成之后还没有写入到磁盘 ...

  8. sersync基于rsync+inotify实现数据实时同步

    一.环境描述 需求:服务器A与服务器B为主备服务模式,需要保持文件一致性,现采用sersync基于rsync+inotify实现数据实时同步 主服务器A:192.168.1.23 从服务器B:192. ...

  9. Rsync+sersync实现数据实时同步

    前言: 一.为什么要用Rsync+sersync架构? 1.sersync是基于Inotify开发的,类似于Inotify-tools的工具 2.sersync可以记录下被监听目录中发生变化的(包括增 ...

随机推荐

  1. xmind8-update9 安装破解激活教程

    xmind8是一款原型图设计流行的软件,相比于xmind2020功能更为丰富,比如画甘特图等.本教程来教大家如何对xmind8 update9进行安装激活,使用全部功能,无限期使用! 只看本文一篇即可 ...

  2. jquery 阻止表单提交方法

    <form name="message_form" action="?m=mobilecenter&c=index&a=service" ...

  3. 阿里云RocketMQ定时/延迟消息队列实现

    新的阅读体验:http://www.zhouhong.icu/post/157 一.业务需求 需要实现一个提前二十分钟通知用户去做某件事的一个业务,拿到这个业务首先想到的最简单得方法就是使用Redis ...

  4. P6855「EZEC-4.5」走方格 TJ

    目录 前言 题意简述 法一:时间复杂度 $Θ(m2n2)$ (TLE) $Code$ 法二:正解,时间复杂度 $Θ(mn)$ $Code$ 写在最后 洛谷 前言 题目传送门 正解:动态规划 挺 dul ...

  5. CF201C Fragile Bridges TJ

    本题解依旧发布于洛谷,如果您能点个赞的话--(逃 前言 题目链接 正解:动态规划 思路不是很好想,想出来了应该就没有多大问题了,但是需要处理的细节较多,再加上水水的样例,难度应该是偏难的.个人感觉应该 ...

  6. expect命令和here document免交互

    目录 一.Here Document免交互 1.1 概述 1.2 语法格式 1.3 简单案例 1.4 支持变量替换 1.5 多行注释 1.6 完成自动划分磁盘免交互 二.Expect进行免交互 2.1 ...

  7. TypeScript学习笔记(四)装饰器

    目录 一.装饰器的作用 二.类装饰器 1. 普通装饰器 为类扩展属性和方法 使用装饰器修改属性和重写方法 2. 装饰器工厂 三.属性装饰器 四.方法装饰器 使用方法装饰器对方法进行扩展 五.方法参数装 ...

  8. 剑指 Offer 39. 数组中出现次数超过一半的数字

    剑指 Offer 39. 数组中出现次数超过一半的数字 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字. 你可以假设数组是非空的,并且给定的数组总是存在多数元素. 示例 1: 输入: [ ...

  9. css文件编码

    当css文件的编码

  10. BUUCTF-[极客大挑战 2019]BabySQL(联合注入绕过waf)+[极客大挑战 2019]LoveSQL(联合注入)

    BUUCTF-[极客大挑战 2019]BabySQL(联合注入绕过waf) 记一道联合注入的题,这道题存在过滤. 经过手工的测试,网站会检验用户名和密码是否都存在,如果在用户名处插入注入语句,语句后面 ...