postgres9.5.1外部表FDW-postgres_fdw

2024-02-22 22:58

本文主要是介绍postgres9.5.1外部表FDW-postgres_fdw,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

postgresql 9提供可远程可读可写数据库的功能,fdw(Foreign Data Wrappers),即可以在本地数据库操作远程数据库。这和dblink有相似之处,但是fdw提供更多透明和标准的语法,而且性能也比dblink好。

9.5版本新增了操作简化的新特性。

1实验目的

在服务器192.168.204.143的数据库中远程增,删,改,查192.168.204.144服务器中test数据库中示例表。

2准备环境

虚拟机2台:

主机名

ip

postgres1

192.168.204.143(安装好postgres9.5.1+初始用户postgres+测试数据库testbak)

Postgres2

192.168.204.144(安装好postgres9.5.1+初始用户postgres+测试数据库test)

服务器中安装数据库:具体安装步骤见:http://blog.csdn.net/sunziyue/article/details/49122721

3postgres_fdw 编译安装

PostgreSQL 9.5.1包含postgres_fdw模块, 已经整合在源码包中,手工编译

$ cd  /pgsolf/postgresql-9.5.1/contrib/postgres_fdw

$USE_PGX=1  make install

结果会在$PGHOME/share/postgresql/extension下生成2个文件

postgres_fdw.control

postgres_fdw--1.0.sql

$PGHOME/lib/postgresql/目录下生成postgres_fdw.so

或者直接拷贝已经编译好的包

postgres_fdw.so到$PGHOME/lib/postgresql/目录下

postgres_fdw.control 与postgres_fdw--1.0.sql 到$PGHOME/share/postgresql/extension目录下

4pg数据库中操作

4.1源库中创建库,模式,表(192.168.204.144服务器数据库操作)

create database test;

create schema test;

create table test.testtb1(id int,name text);

insert into test.testtb1 values(1, 'test1');

insert into test.testtb1 values(2, 'test2');

create table test.testtb2(id int,name text);

insert into test.testtb2 values(1, 'test1');

以下为192.168.204.143服务器数据库操作

4.2创建库,模式

create database testbak;

create schema testbak;

4.3安装postgres_fdw扩展与授权

testbak=#create extension postgres_fdw;

testbak=#grant usage on foreign data wrapper postgres_fdw to postgres;

4.4创建远程数据库服务器

createserver pg_pg foreign data wrapper postgres_fdw options (host '192.168.204.144',dbname 'test',port '5432');

//其中 pg_pg自定义服务名称,host 远程数据库IP,dbname远程库名称,port 远程库端口。

CREATE SERVER server_name [ TYPE 'server_type' ] [ VERSION 'server_version' ] FOREIGN DATA WRAPPER fdw_name [ OPTIONS ( option 'value' [, ... ] ) ]

server_name:远程数据库的名称。

server_type、server_version:可选,可能对一些外部数据封装有用。

fdw_name:外部数据分装名字,这里我们是postgres_fdw。

options:其他可选参数,包括数据库地址,数据库名称和端口等。

4.5创建映射用户

CREATE USER MAPPING指定连接远程数据库的用户,这些数据和创建的foreign server远程服务器一起被封装起来。拥有foreign server权限的用户可以创建映射用户。

create user mapping FOR PUBLIC server pg_pg options(user 'postgres',password 'postgres');--192.168.182.144中数据库用户名密码

create user mapping命令语法:

CREATE USER MAPPING FOR { user_name | USER | CURRENT_USER | PUBLIC }

SERVER server_name [OPTIONS ( option 'value' [ , ... ] ) ]

user_name:现有的用户映射到远程server。

server_name:当前需要用户映射到的远程数据库服务器名。

options:其他可选,包括用户名、密码等。

4.6创建远程表

create foreign table testbak.testtb1bak(id int,name text) server pg_pg options (schema_name 'test',table_name 'testtb1');(其中表中字段与远程库中表字段需要对应)

4.7查看效果

在本地操作testbak.testtb1bak表可增删改查远程192.168.182.144中test. testtb1中对应数据。

testbak=#show search_path;

testbak=#set search_path to testbak,"$user",public;

testbak=#\dE

testbak=#select *  from  testbak.testtb1bak;

 id | name 

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

  1 | test1

  2 | test2

(2rows)

testbak=#insert into testbak.testtb1bak values (3,'test3');

INSERT0 1

testbak=#select *  from  testbak.testtb1bak;

 id | name 

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

  1 | test1

  2 | test2

  3 | test3

(3rows)

testbak=#delete from  testbak.testtb1bak whereid=3;

DELETE1

testbak=#select *  from  testbak.testtb1bak;

 id | name 

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

  1 | test1

  2 | test2

(2rows)

5其他

在本地函数中fdw可以正常使用。

查询数据库安装插件:\dx   或者select extname,extversion from pg_extension;

查询本地外部表:\dE或者select * from pg_foreign_table;

修改定义的外部表: alter foreign table testtb1bak RENAME  to testtb1bak1;

删除数据库安装插件:postgres=# drop extension postgres_fdw cascade;

语法具体参考: 

http://www.postgresql.org/docs/current/static/sql-dropextension.html

6 9.5.1新特性IMPORT FOREIGN SCHEMA 

新特性:在本地数据库可以自动创建所有映射表

IMPORT FOREIGN SCHEMA remote_schema

[ {LIMIT TO | EXCEPT } ( table_name [, ...] ) ]

FROM SERVER server_name

INTO local_schema

[OPTIONS ( option 'value' [, ... ] ) ]

语法示例:

IMPORT FOREIGN SCHEMA  xxx  FROM SERVER pgsql_srv INTO yyy;

把远程数据库模式xxx中的表全部创建对应得映射表在本地数据库模式yyy中

 IMPORT FOREIGN SCHEMA xxx EXCEPT (X, Y) ---排除某些表

FROM SERVER servername INTO yyy;

 IMPORT FOREIGN SCHEMA xxx LIMIT TO (X, Y) --指定某些表

FROM SERVER servername INTO yyy;

以下为192.168.204.143服务器数据库操作

接上示例

testbak=# drop foreign table testbak.testtb1bak;

testbak=# IMPORT FOREIGN SCHEMA  test FROM SERVER pg_pg INTO testbak;

IMPORT FOREIGN SCHEMA

testbak=# \dE

             List of relations

 Schema  |  Name   |     Type      | Owner

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

 testbak | testtb1 | foreign table | dba

 testbak | testtb2 | foreign table | dba

(2 rows)

testbak=# select *   from  testbak.testtb1;

 id | name 

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

  1 | test1

  2 | test2

  3 | test3

(3 rows)

 


这篇关于postgres9.5.1外部表FDW-postgres_fdw的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/736758

相关文章

postgres数据库中如何看查询是否走索引,以及在什么情况下走索引

在 PostgreSQL 中,可以通过 EXPLAIN 或 EXPLAIN ANALYZE 查看查询计划,以判断查询是否使用了索引。除此之外,了解索引的使用条件对于优化查询性能也很重要。 1. 如何查看查询是否使用索引 使用 EXPLAIN 查看查询计划 EXPLAIN 显示 PostgreSQL 如何执行查询,包括是否使用索引。 EXPLAIN SELECT * FROM users WH

【AI大模型应用开发】2.1 Function Calling连接外部世界 - 入门与实战(1)

Function Calling是大模型连接外部世界的通道,目前出现的插件(Plugins )、OpenAI的Actions、各个大模型平台中出现的tools工具集,其实都是Function Calling的范畴。时下大火的OpenAI的GPTs,原理就是使用了Function Calling,例如联网检索、code interpreter。 本文带大家了解下Function calling,看

外部中断的边缘触发和电平触发

MCS-51单片机中的边缘触发是指当输入引脚电平由高到低发生跳变时,才引起中断。而电平触发是指只要外部引脚为低电平就引起中断。         在电平触发方式下,当外部引脚的低电平在中断服务返回前没有被拉高时(即撤除中断请求状态),会引起反复的不需要的中断,造成程序执行的错误。这类中断方式下,需要在中断服务程序中设置指令,清除外部中断的低电平状态,使之变为高电平。

【0324】Postgres内核 Shared Buffer Access Rules (共享缓冲区访问规则)说明

0. 章节内容 1. 共享磁盘缓冲区访问机制 (shared disk buffers) 共享磁盘缓冲区有两套独立的访问控制机制:引用计数(a/k/a pin 计数)和缓冲区内容锁。(实际上,还有第三级访问控制:在访问任何属于某个关系表的页面之前,必须持有该关系表的适当类型的锁。这里不讨论关系级锁。) Pins 在对缓冲区做任何操作之前,必须“对缓冲区pin”(即增加其引用计数, re

从应用内跳转至外部浏览器 - 鸿蒙 HarmonyOS Next

从应用内跳转至外部浏览器,基于 Want 来实现,同时也可以通过其方式尝试跳转至其它系统模块,具体可参考如下 code : 方法调用 // 调用pushOutsideWeb(controller, url) 方法实现 import { common, contextConstant, Want } from '@kit.AbilityKit';import { HintMessage

【0323】Postgres内核之 hash table sequentially search(seq_scan_tables、num_seq_scans)

0. seq scan tracking 我们在这里跟踪活跃的 hash_seq_search() 扫描。 需要这种机制是因为如果扫描正在进行时发生桶分裂(bucket split),它可能会访问两次相同的条目,甚至完全错过某些条目(如果它正在访问同一个分裂的桶中的条目)。因此,如果正在向表中插入数据,我们希望抑制桶分裂。 在当前的使用中,这种情况非常罕见,因此只需将分裂推迟到下一次插入即可。

江协科技STM32学习- P11 中断系统,EXTI外部中断

🚀write in front🚀   🔎大家好,我是黄桃罐头,希望你看完之后,能对你有所帮助,不足请指正!共同学习交流 🎁欢迎各位→点赞👍 + 收藏⭐️ + 留言📝​  💬本系列哔哩哔哩江科大STM32的视频为主以及自己的总结梳理📚  🚀Projeet source code🚀    💾工程代码放在了本人的Gitee仓库:iPickCan (iPickCan

Java在windows和linux上调用外部程序

在用java开发时,有时候会遇到需要调用系统命令或者外部脚本,当前文章给出调用方法。代码如下: /*** 转换脚本路径为在win、linux中可执行的命令* * @param scriptPath* 脚本路径* @return 在linux或window中可执行的命令*/public static String[] convertExecuteCommand(Str

C++ 在外部访问对象的protected成员的方法

起因 起因在于,今天在写UE4插件时,有一个对象的protected成员我想要访问。这个类没有提供接口来访问那个成员,并且这个类是定义在引擎代码中的而我不想“污染”引擎代码。 不过,我想到这么做或许可以在不改变原有类的定义下访问其中的protected成员: 定义一个原有类的子类,在其中定义可以访问protected成员的接口。想要访问对象的成员时,将原有类类型的指针转变为子类类型的指针,然

一种在C++中外部强行访问私有成员的方法

问题 C++在设计上,是不允许类的私有成员在外部被访问读写的。 然而,有时是想要在外部访问私有成员的。我目前常见的情况是:想要访问UE引擎代码中的类的私有成员,但又不想“污染”其源代码将其private改为public。 方法 一种方法是,再建立一个完全相同结构的类,只不过将成员改为public: class MyClassA_MirrorPublic{public:int dat