PostgreSQL的扩展 dblink

PostgreSQL的扩展 dblink

dblink 是 PostgreSQL 的一个核心扩展,允许在当前数据库中访问其他 PostgreSQL 数据库的数据,实现跨数据库查询功能。

一、dblink 扩展安装与启用

1. 安装扩展

-- 使用超级用户安装
CREATE EXTENSION dblink;

2. 验证安装

-- 查看已安装扩展
SELECT * FROM pg_extension WHERE extname = 'dblink';-- 查看扩展函数
SELECT proname FROM pg_proc WHERE proname LIKE 'dblink%';

二、dblink 基本使用

1. 建立数据库连接

-- 创建持久连接(需超级用户权限)
SELECT dblink_connect('myconn', 'host=192.168.1.100 dbname=remote_db user=user password=pass');-- 创建一次性连接
SELECT dblink_connect('host=192.168.1.100 dbname=remote_db user=user password=pass');

2. 执行远程查询

-- 基本查询
SELECT * FROM dblink('myconn', 'SELECT id, name FROM users') AS t(id int, name text);-- 带参数查询
SELECT * FROM dblink('myconn', 'SELECT * FROM accounts WHERE balance > $1', ARRAY[1000]) 
AS t(account_id int, balance numeric);

3. 关闭连接

-- 关闭指定连接
SELECT dblink_disconnect('myconn');-- 关闭所有连接
SELECT dblink_disconnect_all();

三、高级用法

1. 事务控制

-- 开始事务
SELECT dblink_exec('myconn', 'BEGIN');-- 执行更新
SELECT dblink_exec('myconn', 'UPDATE accounts SET balance = balance - 100 WHERE id = 1');-- 提交或回滚
SELECT dblink_exec('myconn', 'COMMIT');
-- 或
SELECT dblink_exec('myconn', 'ROLLBACK');

2. 批量操作

-- 批量插入
SELECT dblink_send_query('myconn', 'INSERT INTO log_entries VALUES (1, ''message1''), (2, ''message2'')');-- 检查结果
SELECT dblink_get_result('myconn');

3. 获取连接信息

-- 查看当前连接
SELECT * FROM dblink_get_connections();-- 获取连接状态
SELECT dblink_get_pkey('myconn');

四、安全实践

1. 使用连接信息隐藏

-- 使用外部文件存储凭据
SELECT dblink_connect('myconn', 'host=192.168.1.100 dbname=remote_db user=user password=' || pg_read_file('/secure/path/password.txt'));

2. 使用视图封装

-- 创建安全视图
CREATE VIEW remote_users AS
SELECT * FROM dblink('myconn', 'SELECT id, name FROM public.users') 
AS t(id int, name text);-- 限制访问权限
REVOKE ALL ON remote_users FROM PUBLIC;
GRANT SELECT ON remote_users TO reporting_role;

3. 使用SSL加密

-- 强制SSL连接
SELECT dblink_connect('myconn', 'host=192.168.1.100 dbname=remote_db user=user password=pass sslmode=require');

五、性能优化

1. 连接池管理

-- 保持持久连接
SELECT dblink_connect('myconn', '...');-- 在应用中复用连接
-- 而不是每次查询都新建连接

2. 批量数据获取

-- 使用游标获取大数据集
SELECT dblink_open('myconn', 'mycursor', 'SELECT * FROM large_table');
SELECT * FROM dblink_fetch('myconn', 'mycursor', 1000) AS t(...); -- 每次获取1000行
SELECT dblink_close('myconn', 'mycursor');

3. 异步查询

-- 发送异步查询
SELECT dblink_send_query('myconn', 'SELECT * FROM large_table');-- 稍后获取结果
SELECT * FROM dblink_get_result('myconn') AS t(...);

六、常见问题解决

1. 连接错误

错误

ERROR: could not establish connection

解决方案

-- 检查网络连通性
-- 验证凭据是否正确
-- 检查pg_hba.conf是否允许连接-- 使用完整连接字符串
SELECT dblink_connect('hostaddr=192.168.1.100 port=5432 dbname=remote_db user=user password=pass');

2. 数据类型不匹配

错误

ERROR: return type mismatch in column 1

解决方案

-- 明确指定返回类型
SELECT * FROM dblink('myconn', 'SELECT id FROM users') AS t(id int);

3. 大对象支持

-- 需要特殊处理大对象
SELECT lo_import(dblink('myconn', 'SELECT lo_get(oid) FROM large_objects WHERE id=1'));

七、替代方案比较

特性dblinkpostgres_fdw逻辑复制
实时性实时实时近实时
性能中等较高
使用复杂度中等
事务支持有限有限完整
适用场景点查询频繁查询数据同步

dblink 最适合需要灵活执行远程查询的场景,而 postgres_fdw 更适合频繁访问远程表的场景。

八、最佳实践建议

  1. 连接管理:避免频繁创建/销毁连接,使用持久连接
  2. 错误处理:添加异常处理捕获连接问题
  3. 权限控制:使用最小权限原则
  4. 性能监控:记录查询执行时间
  5. 替代方案评估:大数据量考虑使用postgres_fdw
  6. 连接字符串安全:避免在代码中硬编码凭据

通过合理使用dblink扩展,可以实现PostgreSQL数据库之间的灵活数据交互,满足复杂的跨数据库查询需求。

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

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

相关文章

ADB推送文件到指定路径解析

您执行的命令 adb push ota.zip /sdcard/Download 中,目标路径 /sdcard/Download 是您显式指定的,因此 ADB 会直接将文件推送到此位置。具体过程如下: 1. 命令结构解析 adb push:ADB 的推送指令。ota.zip:本地计算机上…

Linux 内核中 skb_orphan 的深度解析:从版本差异到核心机制

引言 在 Linux 内核网络子系统中,struct sk_buff(简称 skb)是管理网络数据包的核心数据结构。skb_orphan 作为其生命周期管理的关键函数,负责切断 skb 与所属 socket 的关联,确保数据包在复杂处理流程中的独立性。本文将从代码实现、版本差异、使用场景等多个维度,深入解…

03.MySQL表的操作详解

MySQL表的操作详解 MySQL 表的操作概述创建表 2.1 创建表的基本语法查看表结构修改表 4.1 新增列 4.2 修改列属性 4.3 修改列名 4.4 修改表名 4.5 删除列删除表 1. MySQL表的操作概述 MySQL表的操作是数据库开发和管理中的核心内容,主要涉及**数据定义语言&#…

Flink系列文章列表

把写的文章做一个汇总,会陆续更新的。 Flink流处理原理与实践:状态管理、窗口操作与容错机制-CSDN博客

【目标检测】【AAAI-2022】Anchor DETR

Anchor DETR: Query Design for Transformer-Based Object Detection 锚点DETR:基于Transformer的目标检测查询设计 论文链接 代码链接 摘要 在本文中,我们提出了一种基于Transformer的目标检测新型查询设计。此前的Transformer检测器中&am…

apptrace 的优势以及对 App 的价值

官网地址:AppTrace - 专业的移动应用推广追踪平台 apptrace 的优势以及对 App 的价值​ App 拉起作为移动端深度链接技术的关键应用,能实现从 H5 网页到 App 的无缝跳转,并精准定位到 App 内指定页面。apptrace 凭借专业的技术与丰富的经验…

16-前端Web实战(Tlias案例-部门管理)

在前面的课程中,我们学习了Vue工程化的基础内容、TS、ElementPlus,那接下来呢,我们要通过一个案例,加强大家对于Vue项目的理解,并掌握Vue项目的开发。 这个案例呢,就是我们之前所做的Tlias智能学习辅助系统…

Python爬虫实战:研究Goutte库相关技术

1. 引言 1.1 研究背景与意义 随着互联网信息的爆炸式增长,如何高效、准确地获取和分析 Web 数据成为重要研究课题。网络爬虫作为自动获取网页内容的关键技术,在搜索引擎优化、舆情分析、市场调研等领域具有广泛应用。然而,现代网站越来越多地采用 JavaScript 动态渲染技术…

Python----目标检测(《基于区域提议网络的实时目标检测方法》和Faster R-CNN)

一、《基于区域提议网络的实时目标检测方法》 1.1、基本信息 标题:Faster R-CNN: Towards Real-Time Object Detection with Region Proposal Networks 作者:任少卿(中国科学技术大学、微软研究院)、何凯明(微软研究…

吴恩达讲解MCP基础概念

简介 MCP 是一个开放协议 标准化了您的语言模型应用如何获取工具和数据资源的上下文。基于客户端-服务器架构,它定义了您的语言模型应用中的MCP客户端与MCP服务器之间的通信方式,MCP服务器提供工具 数据资源和提示模板给您的应用,自Anthropic于2024年11月推出MCP以来,MCP生…

Git入门到精通:30分钟掌握核心技巧

目录 一、基础理论片 Git简介 Git安装 Git仓库 Git基本命令用法 仓库别名 二、实操命令篇 远程分支 分支的新建和合并 实操演示 1 本地新建仓库 2 gitee新建仓库 3 建立关系 4 新建分支 5 开发新功能 6 推送新分支 7 合并新分支到主分支 三、可视化工具篇 G…

零基础设计模式——结构型模式 - 代理模式

第三部分:结构型模式 - 代理模式 (Proxy Pattern) 在学习了享元模式如何通过共享对象来优化资源使用后,我们来探讨结构型模式的最后一个模式——代理模式。代理模式为另一个对象提供一个替身或占位符以控制对这个对象的访问。 核心思想:为其…

【OSS】 前端如何直接上传到OSS 上返回https链接,如果做到OSS图片资源加密访问

使用阿里云OSS(对象存储服务)进行前端直接上传并返回HTTPS链接,同时实现图片资源的加密访问,可以通过以下步骤实现: 前端直接上传到OSS并返回HTTPS链接 设置OSS Bucket: 确保你的OSS Bucket已创建&#xf…

TDenigne 集群可视化管理

可视化管理工具 为方便用户更高效地使用和管理 TDengine,TDengine 3.0 版本推出了一个全新的可视化组件 taosExplorer。这个组件旨在帮助用户在不熟悉 SQL 的情况下,也能轻松管理 TDengine 集群。通过 taosExplorer,用户可以轻松查看 TDengi…

Centos7安装gitlab

环境准备: 操作系统:Centos7 内存:2G以上 磁盘:50G 安全:关闭防火墙,selinux 1、安装GitLab所需依赖 yum -y install policycoreutils openssh-server openssh-clients postfix 2、设置postfix开机自启…

【前端面经】云智慧一面

写在前面:面经只是记录博主遇到的题目。每题的答案在编写文档的时候已经有问过deepseek,它只是一种比较普世的答案,要学得深入还是靠自己 Q:手撕代码,两个有序数组排序 A: function mysort(arr1, arr2) {…

Leetcode 3568. Minimum Moves to Clean the Classroom

Leetcode 3568. Minimum Moves to Clean the Classroom 1. 解题思路2. 代码实现 题目链接:3568. Minimum Moves to Clean the Classroom 1. 解题思路 这一题我的核心思路就是广度优先遍历遍历剪枝。 显然,我们可以给出一个广度优先遍历来给出所有可能…

Spring Boot,注解,@RestController

RestController 是 Spring MVC 中用于创建 RESTful Web 服务的核心注解。 RestController 核心知识点 REST 作用: RestController 是一个方便的组合注解,它结合了 Controller 和 ResponseBody 两个注解。 Controller: 将类标记为一个控制器,使其能够处理…

【计算机网络】Linux下简单的UDP服务器(超详细)

套接字接口 我们把服务器封装成一个类,当我们定义出一个服务器对象后需要马上初始化服务器,而初始化服务器需要做的第一件事就是创建套接字。 🌎socket函数 这是Linux中创建套接字的系统调用,函数原型如下: int socket(int domain, int typ…

Fashion-MNIST LeNet训练

前面使用线性神经网络softmax 和 多层感知机进行图像分类,本次我们使用LeNet 卷积神经网络进行 训练,期望能捕捉到图像中的图像结构信息,提高识别精度: import torch import torchvision from torchvision import transforms f…