【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 可供安装:

在这里插入图片描述

如果你的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.mzph.cn/news/830151.shtml

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

相关文章

python代码实现kmeans对鸢尾花聚类

导入第三方库和模型 from sklearn import datasets import numpy as np import matplotlib.pyplot as plt from sklearn.cluster import KMeans2、创建画图函数 def draw_result(train_x, labels, cents, title):n_clusters np.unique(labels).shape[0]#获取类别个数color …

用vue3实现留言板功能

效果图&#xff1a; 代码&#xff1a; <script setup lang"ts"> import { ref } from vue;interface Message {name: string;phone: string;message: string; }const name ref<string>(); const phone ref<string>(); const message ref<st…

Llama 3 安装使用方法

Llama3简介&#xff1a; llama3是一种自回归语言模型&#xff0c;采用了transformer架构&#xff0c;目前开源了8b和70b参数的预训练和指令微调模型&#xff0c;400b正在训练中&#xff0c;性能非常强悍&#xff0c;并且在15万亿个标记的公开数据进行了预训练&#xff0c;比ll…

python——井字棋游戏——登入注册界面

本篇文章只讲解登入和注册页面&#xff0c;在后面的文章中会讲解井字棋游戏&#xff0c;然后把井字棋和登入界面进行连接&#xff0c;整合成一个完整的游戏。 登入注册界面在本篇文章的末尾。 1.实现登入界面 &#xff08;1&#xff09;导入图片 把这张图片存储在与代码路径…

Rundeck(四)安全配置

自动化运维工具rundeck GitHub - rundeck 是java开发的开源自动化服务&#xff0c;具有 Web 控制台、命令行工具和 WebAPI。它使您可以轻松地跨一组节点运行自动化任务&#xff0c;适合运维自动化管理、自动发布管理、运维数据分析等 网站&#xff1a;https://www.rundeck.co…

人人开源框架运行

Getting started renrenio/renren-fast-vue Wiki GitHub 人人开源 1.启动navicat&#xff1a;新建一个数据库renren-fast&#xff0c;字符集为utf-8,utf-8mb3或者utf-8mb4&#xff0c;排序规则不选 2.数据库操作在renren-fast数据库中选择表&#xff0c;运行renren-fast-ma…

LeetCode 每日一题 ---- 【1017.负二进制转换】

LeetCode 每日一题 ---- 【1017.负二进制转换】 1017.负二进制转换方法一&#xff1a;模拟进制转换推广&#xff1a;任意进制转换 1017.负二进制转换 方法一&#xff1a;模拟进制转换 我们平常做进制转换最常用的方法就是辗转相除法&#xff0c;下面的图示分别给出了普通的10…

web自动化测试详细流程和步骤

一、什么是web自动化测试 自动化&#xff08;Automation&#xff09;是指机器设备、系统或过程&#xff08;生产、管理过程&#xff09;在没有人或较少人的直接参与下&#xff0c;按照人的要求&#xff0c;经过自动检测、信息处理、分析判断、操纵控制&#xff0c;实现预期的目…

卷积注意力模块 CBAM | CBAM: Convolutional Block Attention Module

论文名称&#xff1a;《CBAM: Convolutional Block Attention Module》 论文地址&#xff1a;https://arxiv.org/pdf/1807.06521.pdf 我们提出了卷积块注意力模块&#xff08;CBAM&#xff09;&#xff0c;这是一种简单但有效的前馈卷积神经网络注意力模块。给定一个中间特征图…

transformer上手(10)—— 文本摘要任务

文本摘要是一个 Seq2Seq 任务&#xff0c;尽可能保留文本语义的情况下将长文本压缩为短文本。 文本摘要可以看作是将长文本“翻译”为捕获关键信息的短文本&#xff0c;因此大部分文本摘要模型同样采用 Encoder-Decoder 框架。当然&#xff0c;也有一些非 Encoder-Decoder 框架…

prompt提示词:AI英语词典,让AI教你学英语,通过AI实现一个网易有道英语词典

目录 英语词典提问技巧效果图&#xff1a;提示词&#xff1a; 英语词典提问技巧 随着AI工具的出现&#xff0c;学英语也可以变得很简单&#xff0c;大家可以直接通过AI 来帮助自己&#xff0c;提高记忆单词的效率&#xff0c;都可以不需要网易有道词典了&#xff0c;今天我教大…

分布式ID之雪花算法

1. Seata对雪花算法生成ID的改良 滑动验证页面 &#xff08;含代码&讲解&#xff09; Seata基于改良版雪花算法的分布式UUID生成器分析&#xff1a;时间戳和节点ID位置进行了调换。官网&#xff1a;Seata基于改良版雪花算法的分布式UUID生成器分析 | Apache Seata关于新版…

Asp .Net Core 系列:国际化多语言配置

文章目录 概述术语 本地化器IStringLocalizer在服务类中使用本地化 IStringLocalizerFactoryIHtmlLocalizerIViewLocalizer 资源文件区域性回退 配置 CultureProvider内置的 RequestCultureProvider实现自定义 RequestCultureProvider使用 Json 资源文件 设计原理IStringLocali…

第二证券|股息分红和送股哪个好?

在股票投资中&#xff0c;股息分红和分红送股是两种常见的股票分红方法。关于股息分红和送股哪个好&#xff0c;第二证券下面就为我们具体介绍一下。 股息分红和送股哪个好并没有一个绝对的答案&#xff0c;它们只是上市公司向股东分配利润的不同方法。股息分红的好处是投资者…

武汉星起航:挂牌上海股权中心,开启资本新篇章助力跨境电商飞跃

2023年10月30日&#xff0c;武汉星起航电子商务有限公司在上海股权托管交易中心成功挂牌展示&#xff0c;标志着这家在跨境电商领域拥有卓越声誉的企业正式迈入了资本市场的大门。对于武汉星起航来说&#xff0c;这不仅是其发展历程中的一个重要里程碑&#xff0c;更是对其业务…

STM32-TIM定时器与PWM输出

学习目标&#xff1a; 1. 熟练掌握 TIM 的参数配置。 2. 掌握通道的参数配置。 3. 深刻理解 PWM 与功率的关系。 4. 理解 PWM 的原理示意。 一 什么是 PWM 输出 PWM &#xff08; pulse width modulation &#xff09;一种脉冲宽度调节技术。 PWM 的效果是什么样子&#xf…

AOMEI Partition Assistant傲梅分区助手技术员版:专业级的硬盘分区利器

在数字化时代&#xff0c;数据存储和管理变得愈发重要。对于电脑技术员而言&#xff0c;一款功能强大、操作简便的分区工具无疑是提高工作效率的得力助手。而傲梅分区助手技术员版&#xff08;AOMEI Partition Assistant&#xff09;正是这样一款备受赞誉的专业级硬盘分区软件。…

Day23.一刷数据结构算法(C语言版) 39组合总和;40组合总和II;131分割回文串

一、39组合总和 本题是集合里元素可以用无数次&#xff0c;那么和组合问题的差别&#xff0c;其实仅在于对startIndex上的控制 题目链接&#xff1a;组合总和 文章讲解&#xff1a;代码随想录 视频讲解&#xff1a;带你学透回溯算法-组合总和 &#xff08;39.组合总和&#xff…

从零开始构建大语言模型(MEAP)

原文&#xff1a;annas-archive.org/md5/c19a4ef8ab1664a3c5a59d52651430e2 译者&#xff1a;飞龙 协议&#xff1a;CC BY-NC-SA 4.0 一、理解大型语言模型 本章包括 大型语言模型&#xff08;LLM&#xff09;背后的基本概念的高层次解释 探索 ChatGPT 类 LLM 源自的 Transfo…

workminer之dht通信部分

workminer是通过SSH爆破传播的挖矿木马&#xff0c;感染后会释放xmrig挖矿程序利用主机的CPU挖取北方门罗币。该样本能够执行特定的指令&#xff0c;指令保存在一个配置文件config中&#xff0c;config文件类似于xml文件&#xff0c;里面有要执行的指令和参数&#xff0c;样本中…