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可以记录下被监听目录中发生变化的(包括增 ...
随机推荐
- 【小工具系列】Python + OpenCV 图片序列转换成视频
图片序列转换成视频 最近一直在找一个工具,能够将一堆图片转化成视频.网上找了一些小软件,还有 win10 的照片自带的视频制作功能,都不是很满意. 又不想下载那些专业的视频剪辑软件大材小用. 然后找到 ...
- jquery 对HTML标签的克隆、删除
<table width="100%" class="table_form"> <tr> <td>奖励深度(<a hr ...
- Feign远程调用
有关微服务中,服务与服务如何通信,我已经给大家介绍了Ribbon远程调用的相关知识,不知道大家有没有发现Ribbon的问题呢? Ribbon的问题 在Ribbon中,如果我们想要发起一个调用,是这样的 ...
- Oracle中使用虚拟表DUAL或XMLTABLE返回顺序数列
在Oracle中使用虚拟表DUAL或XMLTABLE返回顺序数列 使用DUAL表和CONNECT BY LEVEL的特殊用法,返回一个1-10的顺序数列,示例代码如下: SELECT LEVEL FR ...
- Bugku-域名解析
做题之前了解一下域名解析,域名是为了方便记忆而专门建立的一套地址转换系统,要访问一台互联网上的服务器,最终还必须通过IP地址来实现,域名解析就是将域名重新转换为IP地址的过程.一个域名对应一个IP地址 ...
- OpenGL学习笔记(六)坐标系统
目录 一.衔接 二.概述 三.各个坐标系统 局部空间 世界空间 观察空间 裁剪空间 四.两种投影矩阵 正射投影 透视投影 五.把它们都组合到一起 六.编码实现 1. 实现卡片旋转 2. 实现正方体旋转 ...
- Cookie和Session得使用理解
Cookie 饼干 什么是Cokkie? 1.Cookie 翻译过来是饼干的意思. 2.Cookie 是服务器通知客户端保存键值对的一种技术. 3.客户端有了 Cookie 后,每次请求都发送给服务器 ...
- Python 应用爬虫下载QQ音乐
Python应用爬虫下载QQ音乐 目录: 1.简介怎样实现下载QQ音乐的过程: 2.代码 1.下载QQ音乐的过程 首先我们先来到QQ音乐的官网: https://y.qq.com/,在搜索栏上输入一首 ...
- 关于phpmyadmin getshell
思考一个问题:如何在获得一个PHP MySQL 搭建网站的phpmyadmin界面后(无论用什么办法,进到phpmyadmin里),进行一个getshell的操作? ...... 0x01山重水复 当 ...
- 内存吞金兽(Elasticsearch)的那些事儿 -- 认识一下
背景及常见术语 背景 Elasticsearch 是一个开源的搜索引擎,建立在一个全文搜索引擎库 Apache Lucene 基础之上. Lucene 可以说是当下最先进.高性能.全功能的搜索引擎库- ...