从dblink谈起,我们在postgresql中跨库更新数据

dblink(Database Link)数据库链接顾名思义就是数据库的链接,就像电话线一样,是一个通道,当我们要跨本地数据库,访问另外一个数据库表中的数据时,本地数据库中就必须要创建远程数据库的dblink,通过dblink本地数据库可以像访问本地数据库一样访问远程数据库表中的数据。

1. 在postgresql中创建dblink

1.1. 在什么业务场景下需要创建一个dblink?

       往往随着系统的不断演进,系统往往会根据需要对系统以及数据库做拆分,在数据库层面单体数据库往往在应对“三高”(高并发、高可用、高效率)问题上捉襟见肘,而这个时候往往会对数据进行拆分,而在拆分数据库的过程中,虽然遵循一定的方法论但是最后呈现出来的剖分方式上可以说天马行空,而在这种天马行空的设计后,当需求发生变化或升级中总会有数据库中的交互,比如子库需要在发生变化时,将子库的一些信息推送到主库中。

       而笔者在面临的业务场景时分布式平台中,往往分布式节点(下文中均称呼为NodeDB)中的数据库会发生数据变化,而在数据发生变化对于分布式主库(下文中均称呼为XXLJobDB)需要实时更新统计信息。所以笔者对于此种业务场景的解决方法为在NodeDB中创建一个XXLJobDB的数据连接DBlink。每当NodeDB中数据信息发生变化时,我们将变化信息通过数据连接DBlink推送到XXLJobDB数据库中。

1.2. 在postgresql中创建一个dblink实操。

  1. 创建一个dblink
  • 创建dblink
SELECT dblink_connect('xxljobDB','hostaddr=200.200.200.200 port=5432 dbname=xxljob user=postgres password=postgres');  

但是直接创建时会发生错误。

在这里插入图片描述

这个需要开启postgresql数据库的扩展。

create extension dblink;--查看pgsql数据库已安装的扩展
select * from pg_extension;

开启扩展之后,再创建dblink既可在当前会话中直接使用。

SELECT dblink_connect('xxljobDB','hostaddr=200.200.200.200 port=5432 dbname=xxljob user=postgres password=postgres');  

在这里插入图片描述

  1. 使用dblink操作远端数据库
  • 查询远程数据库中的数据表
select * from dblink('xxljobDB','select id from tbtest;') as t1(id int);select * from dblink('xxljobDB','select id,name from tbtest;') as t1(id int,name varchar);
  • 将远程数据库上的数据插入本地数据库
insert into test1 select * from dblink('test','select id tbtest;') as t1(id int);
  • 断开连接
select dblink_disconnect('test');
  • 创建一个跨库dblink视图,避免每一次都要创建dblink
CREATE VIEW view_remote_tb1 AS   
select * from 
dblink('hostaddr=200.200.200.200 port=5432 dbname=xxljob user=postgres password=postgres'::text,'select * from tbtest'::text)t 
(id integer,name character varying));
  • dblink中的事务管理
SELECT dblink_exec('mycoon', 'BEGIN');
SELECT dblink_exec('mycoon', 'COMMIT');
SELECT dblink_exec('mycoon', 'ROLLBACK');
  • 执行数据操作命令
SELECT dblink_exec('mycoon', 'insert into tb1 select generate_series(10,20),''hello''');
  • 在存储过程中创建dblink然后"为所欲为"
create or replace function SyncStat2RemoteDB(out RunState bool )
AS 
$BODY$
declarev_task_info_rec record;xxljob_dblink_conn text;
beginRunState=True;for v_task_info_rec in EXECUTE 'select * from check_task_info' loopxxljob_dblink_conn:=v_task_info_rec.xxljob_dblink_conn;EXECUTE 'select dblink_connect(''xxljobDB'','''||xxljob_dblink_conn||''')';--在这里可以做一些为所欲为的事情...--在这里可以做一些为所欲为的事情...SELECT dblink_disconnect('xxljobDB');Return;end loop;exception when others then  SELECT dblink_disconnect('xxljobDB');raise exception 'error--(%)(%)',sqlerrm,insertSql;
end;
$BODY$
language plpgsql;

2. postgresql中dblink注意事项

  • postgresql官网地址:https://www.postgresql.org

  • postgresql推荐书籍:https://www.postgresql.org/docs/books/

在这里插入图片描述

  • pg中的dblink需要创建扩展“create extension dblink;”否则无法使用,当然创建扩展只需要一次即可。

  • pg中的dblink无法保存,只可以作为会话中的一种连接信息,无法作为像Oracle数据库中连接对象保存在数据库中,即每次使用都需要创建连接,无法直接使用。(笔者使用的pg版本为pg12.5)【如果有更新的版本或者什么方式可以保留下连接dblink对象,希望各位大佬能够不吝赐教】

  • 能否用dblink去连接oracle数据库呢?像oracle的dblink一样,连接SQL Server、MySQL、PostgreSQL?

      答案是不行的,源码里面可以看到PostgreSQL的dblink是使用的pg的c语言接口去创建连接的,而不是使用ODBC来创建:

dblink_connect(PG_FUNCTION_ARGS)
{char       *conname_or_str = NULL;char       *connstr = NULL;char       *connname = NULL;char       *msg;PGconn     *conn = NULL;remoteConn *rconn = NULL;dblink_init();if (PG_NARGS() == 2){conname_or_str = text_to_cstring(PG_GETARG_TEXT_PP(1));connname = text_to_cstring(PG_GETARG_TEXT_PP(0));}else if (PG_NARGS() == 1)conname_or_str = text_to_cstring(PG_GETARG_TEXT_PP(0));if (connname)rconn = (remoteConn *) MemoryContextAlloc(TopMemoryContext,sizeof(remoteConn));/* first check for valid foreign data server */connstr = get_connect_string(conname_or_str);if (connstr == NULL)connstr = conname_or_str;/* check password in connection string if not superuser */dblink_connstr_check(connstr);conn = PQconnectdb(connstr);if (PQstatus(conn) == CONNECTION_BAD){msg = pchomp(PQerrorMessage(conn));PQfinish(conn);if (rconn)pfree(rconn);ereport(ERROR,(errcode(ERRCODE_SQLCLIENT_UNABLE_TO_ESTABLISH_SQLCONNECTION),errmsg("could not establish connection"),errdetail_internal("%s", msg)));}/* check password actually used if not superuser */dblink_security_check(conn, rconn);/* attempt to set client encoding to match server encoding, if needed */if (PQclientEncoding(conn) != GetDatabaseEncoding())PQsetClientEncoding(conn, GetDatabaseEncodingName());if (connname){rconn->conn = conn;createNewConnection(connname, rconn);}else{if (pconn->conn)PQfinish(pconn->conn);pconn->conn = conn;}PG_RETURN_TEXT_P(cstring_to_text("OK"));
}

3. 借鉴资源

  • https://www.cnblogs.com/kuang17/p/10833458.html
  • https://blog.csdn.net/cliviabao/article/details/78398992
  • https://blog.csdn.net/luojinbai/article/details/45032683
  • https://www.zhihu.com/pub/reader/119564896/chapter/975097201710587904?mode=book_read_ordinary

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/11332.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

postgresql 数据库小版本更新

postgresql 数据库小版本更新 记录一次pg小版本更新 文章目录 postgresql 数据库小版本更新前言一.下载最新的pg版本 pg11(11.18)二 pg11.5 升级 pg11.18过程1. 查看当前数据库版本:2. 关闭pg11.5数据库3. 安装pg11.184.修改 配置文件5. 重新…

15、ChatGPT 会让嵌入式工程师失业吗?

ChatGPT 会让嵌入式工程师失业吗? 如果说陈**不怕失业,那么,你觉得ChatGPT 会让嵌入式工程师失业吗? 我们先来看下ChatGPT给出的答案: ChatGPT 作为一款人工智能聊天机器人,不一定会让嵌入式工程师失业。事…

ChatGPT 会让嵌入式工程师失业吗?

关注、星标公众号,直达精彩内容 作者 | strongerHuang 微信公众号 | strongerHuang 最近两天关于“CETC中电科的事件”闹得沸沸扬扬,为什么这个事能闹得如此之大? 原因很简单,作为打工人(新生代农民工)&…

gmail邮箱怎么收不到邮件

今天发现gmail能发送邮件但是收不到邮件,通过google知道解决通过网页打开GMAIL后台的设置选项,找到"设置POP\IMAP",把转发功能重新开通一下。 我的是如下图 把POP的对所有邮件启用POP,保存更改,就能收到了。

系统分享|教你如何注册Z-library全球最大的数字图书馆,并获取个人独立域名!

目录 什么是Z-Library? 导言 Z-library 的起源与背景 独特的Z-library 特点 Z-Library能做什么? 最新网址 注册教程 1、创建账户 ​编辑2、邮箱创建 3、接受验证码 4、注册成功 5、搜索书籍下载 6、下载资料 7、设置选择 8、设置Z-access 9、你…

复旦团队发布国内首个模型MOSS 类ChatGPT

复旦团队发布国内首个模型MOSS 类ChatGPT 首先看到这个标题,还有这个名字,我是正经(zhen jing)的 (bu shi 流浪地球?550W?不了解的可以把550W倒过来写,就懂了 看到新闻里的一些图…

语言模型 ChatGPT MOSS 使用体验分享

今早起床听闻复旦大学自然语言处理实验室团队发布了国内首个类ChatGPT对话语言模型MOSS。在好奇心的驱使下,我向贵实验室的小伙伴要来内测邀请码试玩了一番,顺便把MOSS与ChatGPT的试玩结果进行了对比,以下是部分对话历史记录: 目录…

textarea输入框监听和输入字数限制以及样式设置

html <p class"describe">分类描述</p><div class"desc"><textarea class"wishContent" placeholder"请输入分类描述&#xff0c;最多255字。" maxlength"255" ></textarea><div class&…

Android开发之EditText限制输入中文以及字数长度限制的标准姿势

老套路先上效果图&#xff1a; 设置输入框的两个筛选器&#xff1a; etGiftName.setFilters(new InputFilter[]{new ZsInputFilter(5,this), new LengthListener(5,this)}); 我们来看下筛选器如何实现的&#xff1a; 先看中文筛选器 package com.yhsh.mobile.giftcomponent;…

关于输入框限制字数输入问题

在输入框输入内容&#xff0c;当需要限制字数的时候&#xff0c;如果是Input或者textarea&#xff0c;可以直接用maxlength进行字数的限制。如果是用div(添加了contenteditable属性)&#xff0c;如果直接用input事件进行字数的限制&#xff0c;则会出现临界问题。 问题起源&…

thinkphp 模板截取中文(限制显示字数)

把如下代码粘贴到thinkphp核心包的/common/functions.php 的最后便可在html模型里直接使用 //函数解释&#xff1a; //msubstr($str, $start0, $length, $charset”utf-8″, $suffixtrue) //$str:要截取的字符串 // $start0&#xff1a;开始位置&#xff0c;默认从0开始 // $l…

人工智能能有多聪明,取决于这两个字

当代打工人&#xff0c;已经感受到人工智能带来的“寒气”。 今年以来&#xff0c;GPT-4 被陆续报道高分通过法律、医学、会计等领域的考试 [1]。不仅如此&#xff0c;GPT-4 还通过谷歌工程师面试拿到了年薪 18 万美元的 offer [2]&#xff0c;这让不少打工人开始担心被 AI 抢饭…

30岁+,帝都大厂夫妻+两娃的百万存款和家庭开销。。

周末闲来无事&#xff0c;心血来潮算了下家庭年开销。不算不知道&#xff0c;这一算花销还真是不小&#xff0c;好在我和老公都还能挣到钱。 先说明下家庭成员和职责分工&#xff1a; 老公&#xff1a;985本硕连读&#xff0c;工作10多年&#xff0c;待过了三家互联网大厂&…

面试题:Redis脑裂为何会导致数据丢失?

更多内容关注微信公众号&#xff1a;fullstack888 1 案例 主从集群有1个主库、5个从库和3个哨兵实例&#xff0c;突然发现客户端发送的一些数据丢了&#xff0c;直接影响业务层数据可靠性。 最终排查发现是主从集群中的脑裂问题导致&#xff1a;主从集群中&#xff0c;同时有两…

AI热潮中的黑马:曾经的显卡制造商是如何跻身AI巨头之列的?

导读&#xff1a;在芯片行业的风云变幻中,英伟达如何从一家显卡制造商翻身成为AI巨头?面对行业迭代速度极快、激烈竞争和显著的高成本特点,英伟达是如何构建属于自己的护城河,又是如何突破技术瓶颈,跑在前列的呢?他们是如何将"摩尔定律"推进到更高阶段创造出属于自…

低质量软件的最大“祸根”:虚构问题!

【编者按】软件质量的好坏与很多因素有关&#xff0c;例如开发者的投入水平&#xff0c;采取测试手段的标准&#xff0c;都有可能成为低质量的诱因。 原文链接&#xff1a;https://cerebralab.com/Imaginary_Problems_Are_the_Root_of_Bad_Software 未经允许&#xff0c;禁止转…

解决国产系统 Docker 拉取大镜像卡顿之谜

今天解决了客户 arm64 机器上 docker pull 大镜像卡住的问题。 由来 同事让我帮忙解决客户现场 Docker 镜像无法拉取的问题&#xff0c;故障如下会一直卡住&#xff1a; $ docker pull xxx:5000/xxxx xxx: Pulling from xxx/xxxxxx 7c0b344a74c2: Extracting [> …

中国版ChatGPT“狂飙”的机会在哪儿?

能否为百度止颓&#xff0c;不仅取决于技术能力&#xff0c;更取决于公司的经营策略和市场环境。目前&#xff0c;百度在人工智能领域已经取得了一些成果&#xff0c;比如语音识别、图像识别等方面&#xff0c;但在对话系统领域仍有待提高。如果百度能够利用自身的优势&#xf…

GPT-3.5还没研究明白,GPT-4又来了,chatGPT会进化成什么样?

基于GPT-3.5的chatGPT热度才稍稍减退没多久&#xff0c;GPT-4又来了&#xff0c;文新一言的发布会也槽点满满&#xff0c;差距似乎越来越大了。 chatGPT到底厉害在哪&#xff1f;为什么突然就爆火了呢&#xff1f; 它的爆火&#xff0c;一方面&#xff0c;和它的出现形态有关…

.IMA格式CT数据转成普通的.png或.jpg

在找医学图像去噪数据集的时候&#xff0c;发现2016 0mayo clinic 的数据格式是.IMA&#xff0c;我现在像把这些.IMA格式的数据都转成为常见的.png格式或者.jpg格式的图。方法如下&#xff1a; 因为这些数据都是以病例形式存在的&#xff0c;如下图&#xff0c;L067、L096...、…