【PostgreSQL】Postgres数据库安装、配置、使用DBLink详解

目录

      • 一、技术背景
        • 1.1 背景
        • 1.2 什么是 DBLink
      • 二、安装配置 DBLink
        • 2.1 安装 DBLink
        • 2.2 配置 DBLink
          • 1. 修改 `postgresql.conf`
          • 2. 修改 `pg_hba.conf`
      • 三、DBLink 使用
        • 3.1 数据准备
        • 3.2 DBLink 使用
          • 1. 创建 DBLink 连接
          • 2. 使用 DBLink 进行查询
          • 3. 使用 DBLink 进行增删改
          • 4. 使用 DBLink 进行异步查询
          • 5. 关闭DBLink 连接
      • 四、DBLink 可能存在的问题

一、技术背景

1.1 背景

随着业务复杂程度的提高、数据规模的增长,越来越多的公司选择对其在线业务数据库进行垂直或水平拆分,甚至根据业务场景选择不同的数据库类型以满足其业务需求。与此同时,业务的数据被“散落”在各个数据库实例中。如何方便地对这些数据进行汇总查询,已经成为困扰使用者的一大问题。

针对这类问题,我们可以使用基于DBLink的解决方案,使用者通过在一个数据库实例中就可以查询到多个数据库实例中的数据。

1.2 什么是 DBLink

DBLink技术源于Oracle,我们可以登录上一个Oracle数据库实例,建立一个DBLink指向另一个远程的网络联通的Oracle数据库实例。

现在,基本上主流的数据库都支持DBLink 操作。

  • DBLink和数据库实例一一对应,对于PostgreSQL来说,对应的就是PostgreSQL数据库所在的ip+port+database
  • DBLink可以指向PostgreSQL、SQLServer、MySQL、Oracle等;
  • 使用者可通过创建dblink时获取到的连接名,对远端的数据库实例进行操作;

二、安装配置 DBLink

我在本地的一台 Windows 电脑上装了postgres14数据库,另一个数据库实例在一台Linux服务器的Docker容器中,使用这2个PG 数据库实例进行下面所有的演示。

2.1 安装 DBLink

一般我们在安装 PostgreSQL 数据库的时候,不管是二进制包还是源码包,都已经有了DBLink插件,只是这个插件没有嵌入到PostgreSQL数据库中,我们通过以下命令查看PostgreSQL数据库中可用的插件:

select * from pg_available_extensions;

执行后发现可用的插件非常多,需要分页显示。

在这里插入图片描述
通过 SQL select * from pg_available_extensions where name like '%dblink%'; 发现 PostgreSQL数据库中提供了 DBLink 可供安装:

在这里插入图片描述

也可通过以下 SQL 查询已安装的PG 插件:

select * from pg_extension;

在这里插入图片描述
我们可以通过以下 SQL 在 PG 数据库中安装 DBLink 插件:

 create extension dblink;

我们再查询PG 数据库中已经安装的插件,就已经有了:

在这里插入图片描述

2.2 配置 DBLink

找到 PG 数据库的 postgresql.confpg_hba.conf 这2个配置文件,对他们进行如下更改,否则创建的 DBLink 可能无法访问远端数据库。

1. 修改 postgresql.conf

找到 listen_address 配置项,修改成如下效果,保持对所有的 IP 进行监听。

在这里插入图片描述

2. 修改 pg_hba.conf

修改 IPv4 local connections 处的配置项,修改成如下效果。

在这里插入图片描述

配置项修改完成后,需要重启 PG 数据库,否者修改的配置不生效。

三、DBLink 使用

3.1 数据准备

首先,我在远端的Linux服务器上的PG数据库中创建一个名为 tsdb 的数据库,并登入该数据库:

在这里插入图片描述

在该数据库中创建一个名为project的表,该表中包含id, name 这2个字段,字段id 为主键。

在这里插入图片描述

在这张数据表中插入3条数据:

在这里插入图片描述

3.2 DBLink 使用
1. 创建 DBLink 连接

在本地的postgres数据库执行如下命令,创建一个 dblink 连接:

SELECT dblink_connect('dblink_test', 'dbname=tsdb host=10.xxx.xxx.xxx port=5433 user=postgres password=xxxxxx');

在这里插入图片描述

PG 数据库中的 dblink_connect() 函数的功能就是用来创建 DBLink 连接的。

上面SQL 的用法中 dblink_connect() 函数有2个参数:

  • 第一个参数:用于指定所创建的 DBLink 的名称。该参数可忽略,如果忽略的话,将创建一个未命名的 DBLink 连接。因为一个session 中只能有一个未命名的数据库连接,如果原来已经存在其它的未命名DBLink连接,新创建的将会挤掉老的。
  • 第二个参数:是创建 DBLink的连接参数串。在该连接串中,你需要指定要进行远程连接的数据库所在节点的IP,数据库端口号port,所用的数据库库名dbname,登陆该数据库所需的账号和密码。

我们可以使用如下 SQL 查询当前该数据库有哪些已经创建好的 DBLink 连接:

 select dblink_get_connections();

在这里插入图片描述

2. 使用 DBLink 进行查询

在上一步操作中,我已经在本地的Windows电脑的 PG 数据库上已经创建了一个与指定IP的Linux服务器PG数据库(以下简称为远端)的一个DBLink连接,接下来,我在 Windows电脑的PG数据库(以下简称为本地)操作窗口中,通过DBLink连接对远端数据库进行查询。

select * from dblink('dblink_test', 'select * from project') as t(id int, name varchar(32));

在这里插入图片描述

可以看到,在我本地的PG 数据库中是可以查到远端PG 数据库中的数据的。

除此之外,使用DBLink也可以进行一些较为复杂的查询操作,例如表连接。

我先在本地创建了一个表,并插入3条数据,本地表结构和数据如下:

在这里插入图片描述

然后演示下通过 DBLink 远端PG数据库与本地PG数据库进行表连接的操作:

SQL: select t.*, e.name from dblink('dblink_test', 'select * from project') as t(id int, name varchar(32)) left join employee e on t.id=e.id;

在这里插入图片描述

3. 使用 DBLink 进行增删改

在本地执行如下 SQL 在远端的PG 数据库中插入数据:

select dblink_exec('dblink_test', 'insert into project (id, name) values (4, ''China Mobile'')');

在这里插入图片描述

此时,我们到远端PG数据库上查看数据验证下,发现确实新增了一条数据。

在这里插入图片描述

在本地执行如下SQL,利用DBLink删除远端PG 数据库数据:

select dblink_exec('dblink_test', 'delete from project where id=4');

在这里插入图片描述

这是我们再去远端PG数据库确认下,相应的数据确实没了。

在这里插入图片描述

更新数据同样是使用 dblink_exec() 函数,SQL如下:

select dblink_exec('dblink_test', 'update project set name=''China Mobile''where id=3');

在这里插入图片描述

远端的PG 数据库也已经更新。

在这里插入图片描述

4. 使用 DBLink 进行异步查询

如果要进行操作的远端PG 数据库为生产数据库,读写的压力较大,我们可以使用DBLink提供的异步查询功能,一定程度上可以缓解远端数据库的查询压力。

在使用DBLink进行一个异步查询之前,我们可以通过如下SQL 判断当前DBLink 连接是否正在忙于一个还未结束的异步查询:

select dblink_is_busy('dblink_test');

在这里插入图片描述

可以看到返回的值为0,表示当前没有异步查询任务正在进行。

运行如下SQL,使用DBLink在远端数据库执行一个异步查询:

select dblink_send_query('dblink_test', 'select * from project;');

在这里插入图片描述

执行完该SQL后并不会直接返回结果,异步查询会在系统压力不大时才开始执行。

我们可以通过 dblink_get_result() 函数获取异步查询的结果,示例SQL 如下:

select * from dblink_get_result('dblink_test') as t(id int, name varchar(32));

在这里插入图片描述

5. 关闭DBLink 连接

使用如下SQL 关闭一个有命名的打开的DBLink连接:

select dblink_disconnect(<dblink_name>);

例如,我们来关闭上面创建的连接,执行如下SQL:

 select dblink_disconnect('dblink_test');

在这里插入图片描述

可以看到,此处我们再执行 SQL select dblink_get_connections(); ,可用的DBLink 连接已经为空了。但是,下面仍然显示有一行记录,感觉应该是PG的BUG,因为我下面再次执行断开dblink_test 这个连接时报错了。

在这里插入图片描述

四、DBLink 可能存在的问题

不可否认用 DBLINK 在某些方面能带来很多方便,如跨库查询、临时迁移数据、少部分基础表的数据同步等,但是还存在以下2方面的问题:

  • 不支持断点续传功能,如果源端数据库出问题(UNDO 不足、TEMP 不足等)、网络问题,需要重新同步数据,牵扯到效率问题;
  • 不支持 DDL,如果通过大量的自定义触发器来实现,在效率和准确性方面需要长时间验证,得不偿失;
  • 几年前爆发过 dblink 导致 SCN Headroom 过低问题;

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

第G8周:ACGAN任务

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 | 接辅导、项目定制&#x1f680; 文章来源&#xff1a;K同学的学习圈子 参考论文 这周主要任务就是根据之前GAN&#xff0c;CGAN&#xff0c;SGAN网络架构搭建…

照片相似性搜索引擎Embed-Photos;赋予大型语言模型(LLMs)视频和音频理解能力;OOTDiffusion的基础上可控制的服装驱动图像合成

✨ 1: Magic Clothing Magic Clothing是一个以可控制的服装驱动图像合成为核心的技术项目&#xff0c;建立在OOTDiffusion的基础上 Magic Clothing是一个以可控制的服装驱动图像合成为核心的技术项目&#xff0c;建立在OOTDiffusion的基础上。通过使用Magic Clothing&#xf…

CountDownLatch倒计时器源码解读与使用

&#x1f3f7;️个人主页&#xff1a;牵着猫散步的鼠鼠 &#x1f3f7;️系列专栏&#xff1a;Java全栈-专栏 &#x1f3f7;️个人学习笔记&#xff0c;若有缺误&#xff0c;欢迎评论区指正 目录 1. 前言 2. CountDownLatch有什么用 3. CountDownLatch底层原理 3.1. count…

软考高项(已通过,E类人才)-学习笔记材料梳理汇总

软考高项&#xff0c;即软考高级信息系统项目管理师&#xff0c;全国计算机技术与软件专业技术资格&#xff08;水平&#xff09;考试中的高级水平测试。适用于从事计算机应用技术、软件、网络、信息系统和信息服务等领域的专业人员&#xff0c;以及各级企业管理人员和从事项目…

51单片机使用两个按钮控制LED灯不同频率的闪烁

#include <reg52.h>sbit button1 P1^1; // 间隔2秒的按钮 sbit button2 P1^5; // 间隔0.6秒的按钮sbit led P1^3;unsigned int cnt1 0; // 设置LED1灯的定时器溢出次数 unsigned int cnt2 0; // 设置LED2灯的定时器溢出次数 unsigned int flg1 0; // 模式1的标识值…

互联网扭蛋机小程序:打破传统扭蛋机的局限,提高销量

扭蛋机作为一种适合全年龄层的娱乐消费方式&#xff0c;深受人们的喜欢&#xff0c;通过一个具有神秘性的商品给大家带来欢乐。近几年&#xff0c;扭蛋机在我国的发展非常迅速&#xff0c;市场规模在不断上升。 经过市场的发展&#xff0c;淘宝线上扭蛋机小程序开始流行起来。…

个人网站的SEO优化系列——如何实现搜索引擎的收录

如果你自己做了一个网站&#xff0c;并且想让更多的人知道你的网站&#xff0c;那么无非就是两种途径 一、自己进行宣传&#xff0c;或者花钱宣传 二、使用搜索引擎的自然流量 而如果搜索引擎都没有收录你的站点&#xff0c;别说是自然流量&#xff0c;就算是使用特定语句【sit…

递归的详细讲解

概述 简介 程序调用自身的编程技巧称为递归&#xff0c;递归解决问题通常名为暴力搜索 三要素 明确递归终止条件 给出递归终止时的处理办法 可以提取重复逻辑&#xff0c;缩小问题规模 优点 递归策略只需少量的程序就可描述出解题过程所需要的多次重复计算&#xff0c;大大地减…

windows SDK编程 --- 消息(3)

前置知识 一、消息的分类 1. 鼠标消息 处理与鼠标交互相关的事件&#xff0c;比如移动、点击和滚动等。例如&#xff1a; WM_MOUSEMOVE: 当鼠标在窗口客户区内移动时发送。WM_LBUTTONDOWN: 当用户按下鼠标左键时发送。WM_LBUTTONUP: 当用户释放鼠标左键时发送。WM_RBUTTOND…

[2024更新]如何从Android恢复已删除的相机照片?

相信大家都经历过Android手机误删相机图片的经历。您是否正在寻找一种可行的方法来挽救这些丢失的照片&#xff1f;如果这是你迫切想解决的问题&#xff0c;那么这篇文章绝对可以帮助你。然而&#xff0c;与其考虑如何从Android恢复已删除的相机照片&#xff0c;我们更愿意建议…

激光雷达(LiDAR)面临的主要问题与挑战

本文讨论目前激光雷达在汽车、机器人以及无人机等场景应用时面临的一些问题和挑战,包括成本、尺寸、系统复杂性、杂散反射、续航,以及安全性等方面。 成本 一直以来,激光雷达的成本都是影响其广泛应用的关键因素。从最早的上万美元一颗,经过近十年的发展,激光雷达的价格…

20240331-1-基于深度学习的模型

基于深度学习的模型 知识体系 主要包括深度学习相关的特征抽取模型&#xff0c;包括卷积网络、循环网络、注意力机制、预训练模型等。 CNN TextCNN 是 CNN 的 NLP 版本&#xff0c;来自 Kim 的 [1408.5882] Convolutional Neural Networks for Sentence Classification 结…

网络安全数字孪生:一种新颖的汽车软件解决方案

摘要 随着汽车行业转变为数据驱动的业务&#xff0c;软件在车辆的开发和维护中发挥了核心作用。随着软件数量的增加&#xff0c;相应的网络安全风险、责任和监管也随之增加&#xff0c;传统方法变得不再适用于这类任务。相应的结果是整车厂和供应商都在努力应对汽车软件日益增加…

C++及QT的线程学习

目录 一. 线程学习 二. 学习线程当中&#xff0c;得到的未知。 1. 了解以下MainWindow和main的关系 2. []()匿名函数 有函数体&#xff0c;没有函数名. 3. join和detach都是用来管理线程的生命周期的&#xff0c;它们的区别在于线程结束和资源的回收。 4. operator()() 仿…

论文略读:OpenGraph: Towards Open Graph Foundation Models

arxiv 2023 1 intro Graph大模型希望OpenGraph能够捕捉通用的拓扑结构模式&#xff0c;对测试数据进行Zero-shot预测 仅通过前向传播过程&#xff0c;就可以对测试图数据进行高效的特征提取和准确预测模型的训练过程在完全不同的图数据上进行&#xff0c;在训练阶段不接触测试…

CSS3新增特性(一)

目录 一、CSS3 新增选择器 1. 子级选择器 2. 兄弟选择器 相邻兄弟选择器 其他兄弟选择器 3. 结构伪类选择器 ① E:first-child ② E:last-child ③ nth-child&#xff08;n&#xff09; n为数字&#xff1a; n为关键字&#xff1a; n为公式&#xff1a; ④ E: firs…

visionTransformer window平台下报错

错误&#xff1a; KeyError: Transformer/encoderblock_0/MlpBlock_3/Dense_0kernel is not a file in the archive解决方法&#xff1a; 修改这个函数即可&#xff0c;主要原因是Linux系统与window系统路径分隔符不一样导致 def load_from(self, weights, n_block):ROOT f&…

【RT-Thread应用笔记】FRDM-MCXN947上的RW007实践——WiFi延迟和带宽测试

【RT-Thread应用笔记】FRDM-MCXN947上的RW007实践——WiFi延迟和带宽测试 一、背景介绍1.1 RW007模组简介1.2 Arduino接口简介1.3 RW007软件包简介1.4 RT-Thread env工具简介 二、创建工程2.1 新建工程2.2 添加rw007软件包2.3 打开RW007配置项2.4 启用pin驱动2.5 禁用rw007的ST…

Cloud微服务:Ribbon负载均衡

个人简介&#xff1a;Java领域新星创作者&#xff1b;阿里云技术博主、星级博主、专家博主&#xff1b;正在Java学习的路上摸爬滚打&#xff0c;记录学习的过程~ 个人主页&#xff1a;.29.的博客 学习社区&#xff1a;进去逛一逛~ Ribbon负载均衡 一、Ribbon - 负载均衡原理、流…

探索 虚拟化技术+Docker部署与操作

目录 一、你知道哪些云 1.1国内云 1.2国外云 二、Iaas、 Paas、SaaS三种云服务区别 2.1第一层叫做IaaS 2.2第二层就是所谓的PaaS 2.3第三层也就是所谓SaaS 三、虚拟化架构 3.1寄居架构 3.2源生架构 3.3操作系统虚拟化架构 3.4混合虚拟化架构 四、虚拟化特点及优势…