SQLServer数据实时同步PostgreSQL
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——用操作界面添加
- 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的更多相关文章
- 实战:sqlserver 数据实时同步到mysql
1.安装安装mysqlconnector 2.配置mysqlconnector ODBC数据管理器->系统DSN->加入->mysql ODBC 5.3 ANSI driver-&g ...
- MySQL 到 ES 数据实时同步技术架构
MySQL 到 ES 数据实时同步技术架构 我们已经讨论了数据去规范化的几种实现方式.MySQL 到 ES 数据同步本质上是数据去规范化多种实现方式中的一种,即通过"数据迁移同步" ...
- Linux下Rsync+sersync实现数据实时同步
inotify 的同步备份机制有着缺点,于是看了sersync同步,弥补了rsync的缺点.以下转自:http://www.osyunwei.com/archives/7447.html 前言: 一. ...
- sersync实现数据实时同步
1.1 第一个里程碑:安装sersync软件 1.1.1 将软件上传到服务器当中并解压 1.上传软件到服务器上 rz -E 为了便于管理上传位置统一设置为 /server/tools 中 2.解压软件 ...
- 基于netcore实现mongodb和ElasticSearch之间的数据实时同步的工具(Mongo2Es)
基于netcore实现mongodb和ElasticSearch之间的数据实时同步的工具 支持一对一,一对多,多对一和多对多的数据传输方式. 一对一 - 一个mongodb的collection对应一 ...
- Mysql数据实时同步
企业运维的数据库最常见的是 mysql;但是 mysql 有个缺陷:当数据量达到千万条的时候,mysql 的相关操作会变的非常迟缓; 如果这个时候有需求需要实时展示数据;对于 mysql 来说是一种灾 ...
- CentOS 6.5 rsync+inotify实现数据实时同步备份
CentOS 6.5 rsync+inotify实现数据实时同步备份 rsync remote sync 远程同步,同步是把数据从缓冲区同步到磁盘上去的.数据在内存缓存区完成之后还没有写入到磁盘 ...
- sersync基于rsync+inotify实现数据实时同步
一.环境描述 需求:服务器A与服务器B为主备服务模式,需要保持文件一致性,现采用sersync基于rsync+inotify实现数据实时同步 主服务器A:192.168.1.23 从服务器B:192. ...
- Rsync+sersync实现数据实时同步
前言: 一.为什么要用Rsync+sersync架构? 1.sersync是基于Inotify开发的,类似于Inotify-tools的工具 2.sersync可以记录下被监听目录中发生变化的(包括增 ...
随机推荐
- php 几个算法
/** * 返回当前运行文件名 * @acces private * @return string */ private function run_filename() { $tmparr = exp ...
- etcd raft 处理流程图系列2-wal的读写
本文仅介绍wal的基本处理,如create.open.close.read等操作.鉴于篇幅原因,下面介绍replayWAL(启动raft节点时执行)函数涉及的读文件操作:从wal目录中加载snapsh ...
- i春秋“百度杯”CTF比赛 十月场-Vld(单引号逃逸+报错注入)
题目源代码给出了提示index.php.txt,打开拿到了一段看不太懂得东西. 图片标注的有flag1,flag2,flag3,同时还有三段字符,然后还出现了_GET,脑洞一一点想到访问 ?flag1 ...
- Oracle数据泵导入的时候创建索引是否会使用并行?
一.疑问,Oracle数据泵导入的时候创建索引是否会使用并行? 某客户需要使用数据泵进行迁移,客户咨询导入的时间能不能加快一点. 那么如何加快导入的速度呢? 多加一些并行,那么创建索引内部的索引并行度 ...
- Flutter集成高德定位和地图功能
定位集成 配置高德定位依赖库 新建 Flutter 项目,使用 Android Studio 打开项目里的 android 工程,或者右键 android 目录-> flutter -> ...
- 你的ES数据备份了吗?
前言: 无论使用哪种存储软件,定期的备份数据都是重中之重,在使用ElasticSearch的时候,随着数据日益积累,存放es数据的磁盘空间也捉襟见肘, 此时对于业务功能使用不到的索引数据,又不能直接删 ...
- Linux 开机关机在线求助与指令输入
由于那本书版本稍稍有点早,我就跳过学习第二章第三章了(分别是主机规划和虚拟机安装)下图为在自己电脑上安装好的redhat7 4.1 我们来登入 其中第一行是Linux发行商和发行版本(欸,我的这个怎么 ...
- SpringBoot开发十七-事务管理
需求介绍 熟悉事务管理. 什么是事务 事务是由N步数据库操作序列组成的逻辑执行单元,这系列操作要么全执行,要么全放弃执行. 事务的特性(ACID) 原子性(Atomicity):事务是应用中不可再分的 ...
- [源码解析] 机器学习参数服务器Paracel (3)------数据处理
[源码解析] 机器学习参数服务器Paracel (3)------数据处理 目录 [源码解析] 机器学习参数服务器Paracel (3)------数据处理 0x00 摘要 0x01 切分需要 1.1 ...
- 利用Nginx实现反向代理web服务器
一.Nginx简介 Nginx是一个很强大的高性能Web服务器和反向代理服务器,它具有很多非常优越的特性: 可以高并发连接 内存消耗少 成本低廉 配置文件非常简单 支持Rewrite重写 内置的健康检 ...