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. php 随机生成字符串

    private function createNonceStr($length = 16) { $chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJK ...

  2. ;~ 小部分AutoHotkey脚本源代码测试模板样板.ahk

    ; ;~ 小部分AutoHotkey脚本源代码测试模板样板.ahk ;~ 请把一行或几行少量代码放到此文件中实际测试一下,;~ 看看测试结果如何,等到能够实现代码功能时再复制到自己的脚本代码文件中;~ ...

  3. 手写Pascal解释器(二)

    目录 一.part4 补充理论知识 二.part5 设计生成式 三.part6 一.part4 承接上次的内容,我们继续编写part4,这个部分我们的任务是完成输入一个仅带乘除运算符的表达式,然后返回 ...

  4. CSS实现隐藏滚动条并可以滚动内容

    方法一: 计算滚动条宽度并隐藏起来,其实我只是把滚动条通过定位把它隐藏了起来,下面给一个简化版的代码: <div class="outer-container"> &l ...

  5. MySQL 事务、日志、锁、索引学习总结,

    MySQL架构 MySQL可分为Server和存储引擎两部分,如图1所示. Server层:包括客户端连接器.查询缓存.解析/预处理器.优化器.执行器等,以及MySQL内置函数和所有跨引擎的功能都在这 ...

  6. Vue+SpringBoot前后端分离中的跨域问题

    在前后端分离开发中,需要前端调用后端api并进行内容显示,如果前后端开发都在一台主机上,则会由于浏览器的同源策略限制,出现跨域问题(协议.域名.端口号不同等),导致不能正常调用api接口,给开发带来不 ...

  7. TCP 才不傻!

    大家好,我是小林. 之前收到个读者的问题,对于 TCP 三次握手和四次挥手的一些疑问: 第一次握手,如果客户端发送的SYN一直都传不到被服务器,那么客户端是一直重发SYN到永久吗?客户端停止重发SYN ...

  8. 冲击BATZ!GitHub近8.3K+的Android进阶指南,面试再也不愁了

    过去十年是移动互联网蓬勃发展的黄金期,相信每个人也都享受到了移动互联网红利,在此期间,移动互联网经历了曙光期.成长期.成熟期.现在来说已经进入饱和期. 依然记得在 2010-2013 年期间,从事移动 ...

  9. Elasticsearch BM25相关度算法超详细解释

    Photo by Pixabay from Pexels 前言:日常在使用Elasticsearch的搜索业务中多少会出现几次 "为什么这个Doc分数要比那个要稍微低一点?".&q ...

  10. sentinel使用(结合gateway)

    前 如果你想在Spring Cloud Gateway中使用Sentinel Starter,你需要添加Spring - Cloud -alibaba- Sentinel - Gateway依赖,并添 ...