Postgresql - dblinks and foreign data wrappers(FDW)
PostgreSQL dblink
PostgreSQL provides a way to connect to other PostgreSQL databases using the dblink extension. This allows you to execute queries on remote databases and retrieve results as if they were local.
-
install contrib package to configure dblink and FDW
configure https://ftp.postgresql.org/pub/repos/yum/17/redhat/rhel-9-x86_64/ for rpms. [root@dbapage yum.repos.d]# cat postgre.repo [postgres-17] name=PostgreSQL common RPMs for RHEL / Rocky / AlmaLinux $releasever - $basearch baseurl=https://ftp.postgresql.org/pub/repos/yum/17/redhat/rhel-9-x86_64 enabled=0 gpgcheck=1 gpgkey=file:///etc/pki/rpm-gpg/PGDG-RPM-GPG-KEY-RHEL repo_gpgcheck = 1 [root@dbapage yum.repos.d]# [root@dbapage yum.repos.d]# yum install postgresql17-contrib Oracle Linux 9 UEK Release 7 (x86_64) 353 B/s | 3.5 kB 00:10 Oracle Linux 9 UEK Release 7 (x86_64) 4.5 MB/s | 71 MB 00:15 Last metadata expiration check: 0:00:15 ago on Mon 14 Jul 2025 07:51:06 PM IST. Dependencies resolved. ========================================================================================================================================= Package Architecture Version Repository Size ========================================================================================================================================= Installing: postgresql17-contrib x86_64 17.5-3PGDG.rhel9 pgdg17 730 k Transaction Summary ========================================================================================================================================= Install 1 Package Total download size: 730 k Installed size: 2.7 M Is this ok [y/N]: y Downloading Packages: postgresql17-contrib-17.5-3PGDG.rhel9.x86_64.rpm 1.4 MB/s | 730 kB 00:00 ----------------------------------------------------------------------------------------------------------------------------------------- Total 1.4 MB/s | 730 kB 00:00 Running transaction check Transaction check succeeded. Running transaction test Transaction test succeeded. Running transaction Preparing : 1/1 Installing : postgresql17-contrib-17.5-3PGDG.rhel9.x86_64 1/1 Running scriptlet: postgresql17-contrib-17.5-3PGDG.rhel9.x86_64 1/1 Verifying : postgresql17-contrib-17.5-3PGDG.rhel9.x86_64 1/1 Installed: postgresql17-contrib-17.5-3PGDG.rhel9.x86_64 Complete! [postgres@dbapage extension]$ pwd /usr/pgsql-17/share/extension [postgres@dbapage extension]$ ls -lrt *db* -rw-r--r--. 1 root root 170 May 28 13:30 dblink.control -rw-r--r--. 1 root root 6645 May 28 13:30 dblink--1.2.sql -rw-r--r--. 1 root root 2832 May 28 13:30 dblink--1.1--1.2.sql -rw-r--r--. 1 root root 419 May 28 13:30 dblink--1.0--1.1.sql [postgres@dbapage extension]$ ls -lrt *fdw* -rw-r--r--. 1 root root 172 May 28 13:30 postgres_fdw.control -rw-r--r--. 1 root root 507 May 28 13:30 postgres_fdw--1.0.sql -rw-r--r--. 1 root root 626 May 28 13:30 postgres_fdw--1.0--1.1.sql -rw-r--r--. 1 root root 155 May 28 13:30 file_fdw.control -rw-r--r--. 1 root root 475 May 28 13:30 file_fdw--1.0.sql✔ DBLINK
[postgres@dbapage ~]$ psql psql (17.5) Type "help" for help. postgres=# \dx List of installed extensions Name | Version | Schema | Description ---------+---------+------------+------------------------------ plpgsql | 1.0 | pg_catalog | PL/pgSQL procedural language (1 row) postgres=# create extension dblink; CREATE EXTENSION postgres=# \dx List of installed extensions Name | Version | Schema | Description ---------+---------+------------+-------------------------------------------------------------- dblink | 1.2 | public | connect to other PostgreSQL databases from within a database plpgsql | 1.0 | pg_catalog | PL/pgSQL procedural language (2 rows) db1=# create extension dblink; CREATE EXTENSION db1=# select dblink_connect('remote_db', 'host=192.168.1.121 port=5432 dbname=db2 user=postgres password=postgres'); dblink_connect ---------------- OK (1 row) db1=# select * from dblink('remote_db', 'select * from a') as t(id int); id ---- 1 2 3 4 5 6 7 8 9 10 (10 rows) db1=# select dblink_get_connections(); dblink_get_connections ------------------------ {remote_db} (1 row) postgres=# select dblink_disconnect('remote_db'); dblink_disconnect ------------------- Connection closed (1 row) DIRECT CONNECTIONS: db1=# SELECT * FROM dblink('dbname=db2','select * from a') AS t1(a name); a ---- 1 2 3 4 5 6 7 8 9 10 1 1 (12 rows) db1=# SELECT * FROM dblink_Exec('dbname=db2','insert into a values(1)'); dblink_exec ------------- INSERT 0 1 (1 row)✔ FOREIGN DATA WRAPPERS
create extension postgres_fdw; create server db2server foreign data wrapper postgres_fdw OPTIONS (host '192.168.1.121',dbname 'db1',port '5432'); create user mapping for postgres SERVER db2server OPTIONS (user 'postgres', password 'postgres'); create foreign table f1 (a int, b int) server db2server options (table_name 'a'); select * from pg_foreign_table; import foreign schema public from server db2server into public; select * from pg_user_mapping; select * from pg_foreign_server;