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

news2025/1/16 7:46:27

目录

      • 一、技术背景
        • 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 可供安装:

在这里插入图片描述

如果你的PG数据库是通过源码编译安装的,那么可能通过这个SQL查到的结果发现并没有DBLink,这时你需要切换到PG的源码包目录,执行如下命令:

cd contrib/dblink
make
make install

这时再通过上面的SQL就可以查询到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 过低问题;

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

鲁棒控制理论学习:静态状态反馈H∞控制器

鲁棒性&#xff0c;即系统的健壮性&#xff0c;是指在异常和危险情况下系统能够维持其功能和性能的能力。在控制系统中&#xff0c;鲁棒性表现为系统在参数摄动下维持某些性能的特性。例如&#xff0c;当控制系统面临输入错误、磁盘故障、网络过载或有意攻击等挑战时&#xff0…

视频质量评价PSNR的两种计算方法

PSNR&#xff08;峰值信噪比&#xff09; 峰值信号的能量与噪声的平均能量之比&#xff0c;本质的是比较两张图像像素值差异&#xff0c;用途较广&#xff0c;目前仍作为对照其他指标的基线。PSNR的单位是dB&#xff0c;数值越大表示失真越小。 mn单色图像 I 和K&#xff0c; …

SpringCloud系列(17)--将服务消费者Consumer注册进Zookeeper

前言&#xff1a;在上一章节中我们把服务提供者Provider注册进了Zookeeper&#xff0c;而本章节则是关于如何将服务消费者Consumer注册进Zookeeper 1、再次创建一个服务提供者模块&#xff0c;命名为consumerzk-order80 (1)在父工程下新建模块 (2)选择模块的项目类型为Maven并…

WIFI加密方式对无线速率的影响

文章目录 无线加密三种选择&#xff1a;WEP、WPA和WPA2测试平台和测试方法非加密和WEP加密测试 结果差别巨大非加密条件下 300M无线路由实测WEP加密条件下 300M无线路由实测 TKIP加密算法&#xff1a;WPA与WPA2成绩低迷WPA加密&#xff08;TKIP加密算法&#xff09;条件下 300M…

TypeScript入门第一天,所有类型+基础用法+接口使用

表示逻辑值&#xff1a;true 和 false。在JavaScript和TypeScript里叫做boolean | | 数组类型 | 无 | 声明变量为数组。 // 在元素类型后面加上[] let arr: number[] [1, 2]; // 或者使用数组泛型&#xff0c;Array<元素类型> let arr: Array [1, 2]; | | 元组…

大数据—数据采集DataX

一、DataX介绍 官网&#xff1a; DataX/introduction.md at master alibaba/DataX GitHub DataX 是阿里云 DataWorks数据集成 的开源版本&#xff0c;在阿里巴巴集团内被广泛使用的离线数据同步工具/平台。 DataX 实现了包括 MySQL、Oracle、OceanBase、SqlServer、Postgre、…

翻译《The Old New Thing》 - Why .shared sections are a security hole

Why .shared sections are a security hole - The Old New Thing (microsoft.com)https://devblogs.microsoft.com/oldnewthing/20040804-00/?p38253 Raymond Chen 2004年08月04日 许多人会推荐使用共享数据节作为在应用程序的多个实例之间共享数据的一种方式。这听起来是个好…

立即刷新导致请求的response没有来得及加载造成的this request has no response data available

1、前端递归调用后端接口 const startProgress () > {timer.value setInterval(() > {if (progress.value < 100) {time.value--;progress.value Math.ceil(100 / wait_time.value);} else {clearInterval(timer.value);progress.value 0;timer.value null;time.…

pytest-asyncio:协程异步测试案例

简介&#xff1a;pytest-asyncio是一个pytest插件。它便于测试使用异步库的代码。具体来说&#xff0c;pytest-asyncio提供了对作为测试函数的协同程序的支持。这允许用户在测试中等待代码。 历史攻略&#xff1a; asyncio并发访问websocket Python&#xff1a;协程 - 快速创…

vscode安装中文插件不生效

在 escode 中&#xff0c;安装了上面的插件&#xff0c;但是界面依然显示的是英文。 解决方案 使用组合键 ctrshiftp&#xff0c;输入 Configure Display Language&#xff0c; 选中 zh-cn&#xff0c;重启

机器视觉3D视觉检测系统的优势

随着科技的飞速发展&#xff0c;机器视觉技术已经成为现代工业生产中不可或缺的一部分。特别是3D视觉检测系统&#xff0c;其优势日益凸显&#xff0c;为各行业的质量控制和生产自动化提供了强大的支持。本文将探讨机器视觉3D视觉检测系统的优势&#xff0c;并分析其在实际应用…

C语言入门课程学习笔记-6

C语言入门课程学习笔记-6 第27课 - 字符数组与字符串&#xff08;上&#xff09;第28课 - 字符数组与字符串&#xff08;下&#xff09;第29课 - 数组专题练习&#xff08;上&#xff09;第30课 - 数组专题练习&#xff08;下&#xff09; 本文学习自狄泰软件学院 唐佐林老师的…

【图像压缩算法】霍夫曼编码

1. 研究背景 霍夫曼在1952年提出一种构造最佳码的方法&#xff0c;称之为霍夫曼编码&#xff08;Huffman)。霍夫曼编码是一种无损的统计编码方法&#xff0c;利用信息符号概率分布特性的改变字长进行编码。霍夫曼编码适用于多元独立信源&#xff0c;对于多元独立信源来说它是最…

淘宝API接口大全:淘宝app商品详情数据接口

淘宝APP商品详情数据接口是用于获取商品详情信息的专用API&#xff0c;适用于移动应用开发者使用。 要使用这个接口&#xff0c;你需要遵循以下步骤&#xff1a; 了解和申请API权限&#xff1a;在使用淘宝API接口之前&#xff0c;需要先前往淘宝开放平台了解相关的API文档&am…

Git泄露和hg泄露原理理解和题目实操

一.Git泄露 1.简介 Git是一个开源的分布式版本控制系统&#xff0c;它可以实现有效控制应用版本&#xff0c;但是在一旦在代码发布的时候&#xff0c;存在不规范的操作及配置&#xff0c;就很可能将源代码泄露出去。那么&#xff0c;一旦攻击者发现这个问题之后&#xff0c;就…

速卖通自养号测评:如何规避安全风险?

对于初涉电商领域的新卖家而言&#xff0c;进行销量测评显得尤为关键。由于速卖通新店铺往往难以获得平台活动的支持&#xff0c;流量也相对匮乏&#xff0c;因此&#xff0c;开店的首要任务便是进行测评&#xff0c;通过积累一定的评论和销售数据。 测评的益处颇多&#xff0…

Java web应用性能分析之【sysbench基准测试】

Java web应用性能分析之【CPU飙高分析之MySQL】-CSDN博客 Java web应用性能分析之【Linux服务器性能监控分析概叙】-CSDN博客 Java web应用性能分析概叙-CSDN博客 Java web应用性能分析之【基准测试】-CSDN博客 上面基本科普了一下基准测试&#xff0c;这里我们将从sysbench…

leetCode60. 排列序列

leetCode60. 排列序列 方法一:语法版&#xff0c;面试官不认可的方法&#xff1a;next_permutation函数 // 方法一&#xff1a;使用next_permutation函数&#xff0c;将某容器设置为当前按照字典序 // 的下一个全排列的内容 class Solution { public:string getPermutation(in…

将游戏界面与注册/登录界面连接到一起

一、 导包 在注册页面中导入一个import subprocess包 二、 使用代码将其连接到一起 在循环中加入下面这一行代码&#xff0c;用来实现效果 subprocess.run(["python", "game代码.py"]

RocketMQ 部署

RocketMQ 部署 1、安装依赖&#xff08;Java&#xff09; [rootMicroservices ~]# mkdir -p /data/businessServer/ [rootMicroservices ~]# cd /data/businessServer/# 获取安装包&#xff08;下载较慢&#xff09; [rootMicroservices businessServer]# wget https://githu…