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
繁體地址,請注明出處:http://hk.pswp.cn/diannao/85303.shtml
英文地址,請注明出處:http://en.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…