postgresql_fdw 跨数据库查询

--PostgreSQL的数据库逻辑上是相互独立的,和Oracle类似,如果要访问其他数据库,需要做跨库操作,

--Postgres本身提供了一些扩展,比如dblink,pgsql_fdw等,高版本的建议使用postgres_fdw,也就是pgsql_fdw的升级版。 

远端数据准备

postgres=# show search_path;

 search_path 

-------------

 schema_fdw

(1 row)

postgres=# create table tbl_kenyon (id int,remark text);

CREATE TABLE

postgres=# insert into tbl_kenyon select generate_series(1,100),'Kenyon Go!';

INSERT 0 100

二、安装使用 

 安装分4步走 

1.本地安装extension 

--安装的扩展名是来自于share/extension/*.control中的文件名*,比如postgres_fdw.control

postgres=# create extension postgres_fdw;

CREATE EXTENSION

postgres=# select * from pg_extension ;

 extname     | extowner | extnamespace | extrelocatable | extversion | extconfig | extcondition   -------------------+----------+--------------+----------------+------------+-----------+

 plpgsql            |       10 |           11 | f              | 1.0        |           | 

 pg_stat_statements |       10 |         2200 | t              | 1.1        |           | 

 postgres_fdw       |       10 |         2200 | t              | 1.0        |           | 

(3 rows)

postgres=# select * from pg_foreign_data_wrapper;

  fdwname    | fdwowner | fdwhandler | fdwvalidator | fdwacl | fdwoptions 

  ------------+----------+------------+--------------+--------+------------

 postgres_fdw |       10 |     154356 |       154357 |        | 

(1 row)

postgres=# \dx

                                     List of installed extensions

      Name        | Version |  Schema |                        Description                     -----------------+---------+------------+-----------------------------------------------------

 pg_stat_statements | 1.1     | public |track execution statistics of all SQL statements executed

 plpgsql            | 1.0     | pg_catalog | PL/pgSQL procedural language

 postgres_fdw       | 1.0     | public     | foreign-data wrapper for remote PostgreSQL servers

(3 rows)

2.本地创建server并查看 

该server作用是在本地配置一个连接远程的信息,下面的配置是要连接到远程DB名称是postgres数据库

postgres=# create server server_remote_rudy_01 foreign data wrapper postgres_fdw options(host 'rudy_01',port '5432',dbname 'postgres');

CREATE SERVER

postgres=# select * from pg_foreign_server ;

     srvname      | srvowner | srvfdw | srvtype | srvversion | srvacl |   srvoptions  

--------------+----------+--------+---------+------------+--------+--------------------------

server_remote_rudy_01 |       10 | 154358 |         |     |{host=10.1.11.71,port=5432,dbname=postgres}

(1 row)

或者

postgres=# \des

              List of foreign servers

       Name       |  Owner   | Foreign-data wrapper 

------------------+----------+----------------------

 server_remote_rudy_01 | postgres | postgres_fdw

(1 row)

3.创建用户匹配信息并查看,在本地

--for后面的postgres是本地登录执行的用户名,option里存储的是远程的用户密码

postgres=# create user mapping for postgres server server_remote_rudy_01 options(user 'postgres',password '123456');

CREATE USER MAPPING

postgres=# select * from pg_user_mappings;

  umid  | srvid  |     srvname      | umuser | usename  |             umoptions             

--------+--------+------------------+--------+----------+-----------------------------------

 154360 | 154359 | server_remote_rudy_01 |     10 | postgres | {user=usr_pg_fdw,password=123456}

(1 row)

postgres=# \deu+

                          List of user mappings

      Server      | User name |               FDW Options                

------------------+-----------+------------------------------------------

 server_remote_rudy_01 | postgres  | ("user" 'usr_pg_fdw', password '123456')

(1 row)

4.本地创建外部表,指定server

postgres=#  CREATE FOREIGN TABLE test1(id int,remark text) server server_remote_rudy_01 options (schema_name 'public',table_name 'tbl_kenyon');

CREATE FOREIGN TABLE

--导入整个schem下面的表

create schema test;

--视用户不同授予不同的权限

grant all on schema test to rudy_02;

grant all on foreign data wrapper postgres_fdw to rudy_02;                     

grant all on foreign server server_remote_rudy_01 to rudy_02;    

--导入指定的表,也可以不导入指定的表,也可以导入整个schema下面的表        

IMPORT FOREIGN SCHEMA public FROM SERVER server_remote_rudy_01 INTO test;

IMPORT FOREIGN SCHEMA public limit to(t1) FROM SERVER server_remote_rudy_01 INTO test;

--通过使用\d查看表,注意不通过使用\dt查看表,而且如果远端的表有drop或者create,在本地会察觉不到

\d test.

postgres=> select * from test.t1 ;          

ERROR:  relation "test.t1" does not exist

--查看系统中有哪些外部表,可查看如下的sql

select * from pg_foreign_table;

--注意如果要删除外部表,千万千万不要直接删除pg_foreign_table表中的数据

--delete from pg_foreign_table ;

--否则不能再导入IMPORT FOREIGN 删除的表,也不能执行 select froeign table 查询删除的表,也不能drop server,都会报如下的错

ERROR:  cache lookup failed for foreign table 49251

--再插入删除的数据

postgres=# \d+ pg_foreign_table;

                  Table "pg_catalog.pg_foreign_table"

  Column   |  Type  | Modifiers | Storage  | Stats target | Description 

-----------+--------+-----------+----------+--------------+-------------

 ftrelid   | oid    | not null  | plain    |              |  在本地pg_class表中对应的 relfilenode

 ftserver  | oid    | not null  | plain    |              |  在本的pg_foreign_server表的oid

 ftoptions | text[] |           | extended |              |  对应foreign server的schema和table名字

postgres=> insert into pg_foreign_table values(49251,49247,array['schema_name=public','table_name=postgres']); 

--而后再删除外部表

postgres=> drop foreign table test.postgres_log ;

DROP FOREIGN TABLE

-- postgres_fdw 为了性能其会把where查询发送到远端

postgres_fdw attempts to optimize remote queries to reduce the amount of data transferred from foreign servers

The query that is actually sent to the remote server for execution can be examined using EXPLAIN VERBOSE

时间: 2024-09-10 06:57:39

postgresql_fdw 跨数据库查询的相关文章

mysql-PHP 跨数据库查询效率问题求助

问题描述 PHP 跨数据库查询效率问题求助 直接上代码: $sql = "select mrn from A where type=2"; //mysql数据库 $result = $dbFin->query($sql); while ($row = $result->fetch_assoc()) { $sqlPid = "select name from TestDB.dbo.B where pid= '{$row['mrn']}'"; //sql s

帝国cms和discuz论坛系统跨数据库查询调用

现在大多数资讯类系统,一般站长都比较青睐php.mysql组合,这类cms系统中以dede和帝国更为普及,在帝国系统中调用论坛数据,这个应用需求比较常见,cms和论坛系统使用同一数据库时,这样调用时,使用帝国论坛上提供的方法,如果是dede网站系统,使用dede的后台向导就可以直接实现,但如果cms和论坛使用不同的数据库,前提是在同一服务器.同一mysql服务环境下,就不能直接调用了,这涉及到mysql用户的多数据库权限,以及mysql的跨数据库查询问题. 这个问题很久以前就曾经多次在帝国论坛咨

ACCESS:跨数据库查询的SQL语句

access|数据|数据库|语句 问题说明:有时需要在两个或三个数据库的表中,通过相关关键字,查询获取所需记录集,用一般的SQL查询语句是实现不了的,可通过ACCESS的跨库查询功能实现.解决方法:例如"装材类型"和"装材"两张表是在不同的数据库中的,具体查询方法,如下:@"Select * from 装材类型 as a INNER JOIN [;database=" + AppDomain.CurrentDomain.BaseDirectory

sql跨数据库查询方法

数据库教程1:AAA 数据库2:BBB 数据库名和表名之间放两个点   select * from [AAA]..TableA a inner join [BBB]..TableB b on a.AcountID = b.ClientID 注意:必须是单个Sql实例! 你要知道跨数据库访问的语法,如下: select * from openrowset('sqloledb','DRIVER={SQL Server};SERVER=服务器地址;UID=sa;PWD=密码', 数据库名.dbo.表名

解析MSSQL跨数据库查询的实现方法_Mysql

复制代码 代码如下: --创建链接服务器   exec   sp_addlinkedserver       '链接服务器名称',   '',   'SQLOLEDB',   '远程服务器名或ip地址'   exec   sp_addlinkedsrvlogin     '链接服务器名称',   'false' ,null,   '需要链接服务器用户名',   '密码'   sp_addlinkedserver[ @server= ] 'server'[ , [ @srvproduct= ] '

深入SQL Server 跨数据库查询的详解_MsSql

语句SELECT * FROM 数据库A.dbo.表A a, 数据库B.dbo.表B b WHERE a.field=b.field"DBO"可以省略 如SELECT * FROM 数据库A..表A a, 数据库B..表B b WHERE a.field=b.field SqlServer数据库:--这句是映射一个远程数据库EXEC sp_addlinkedserver '远程数据库的IP或主机名',N'SQL Server'--这句是登录远程数据库EXEC sp_addlinkeds

Access 跨数据库查询和插入数据

当前数据库为testA,要查询数据库testB中的某个表内容,我们就可以采用如下方法.   第一种:select * from 表名 in 'testB的路径';   例如: select * from qybm in 'd:\accessdb\testB.mdb';   第二种:select * from [;database=testB的路径;pwd=密码].表名   如果没密码,可省略   例如: select * from [;database=d:\accessdb\testB.mdb

深入SQL Server 跨数据库查询的详解

语句 SELECT * FROM 数据库A.dbo.表A a, 数据库B.dbo.表B b WHERE a.field=b.field "DBO"可以省略 如 SELECT * FROM 数据库A..表A a, 数据库B..表B b WHERE a.field=b.field SqlServer数据库: --这句是映射一个远程数据库 EXEC sp_addlinkedserver '远程数据库的IP或主机名',N'SQL Server' --这句是登录远程数据库 EXEC sp_add

Oracle跨数据库查询并插入实现原理及代码_oracle

工作中需要从一个数据库中的表GIS_WEICHAI_DATA_1S中的数据导入到另个一数据库的表GIS_WEICHAI_DATA_1S中,数据库服务器都是远程的<IP分别为: 221.131.228.256 211.161.192.46>!我的实现方法是在本地使用PL/SQL操作两个远程服务器,实现方式如下: 1. 为你需要操作的远程数据库服务器建立本地服务名: 在本地数据库安装文件中,找到$ORACLE_HOME/network/admin/tnsnames.ora文件, 末尾添加 复制代码