云数据库 PostgreSQL 跨库访问

跨库访问是指对本实例中其他库中的数据,或其他实例中的数据进行数据读取、写入、联合操作的过程。跨库访问的目标对象统称为外部数据源。云数据库 PostgreSQL 提供用于访问外部数据源的插件,用于实现、增强跨库访问能力。外部访问插件包括两种。

相关产品
云数据库 PostgreSQL 产品页,含版本规格、价格与购买入口。
种类 插件
同构跨库访问插件 dblink、postgresql_fdw
异构跨库访问插件 mysql_fdw、starrocks_fdw、cos_fdw、tds_fdw

跨库访问操作步骤如下:

1. 使用 “CREATE EXTENSION 插件名;” 语句安装插件。

2. 为每个需要连接的远程数据库创建一个外部服务器对象并创建链接映射。

3. 使用对应的命令访问外部表以获取数据。

另外,跨库访问插件强大的访问能力如果不加以约束,可能会带来一定的安全隐患。因此,云数据库 PostgreSQL 进行了权限控制优化,根据目标实例所在环境进行分类管理。在开源版本基础上增加了额外辅助参数,来验证用户身份和调整网络策略。具体请参考下文 插件辅助参数。

注意:说明:

注意:大版本10及以上的云数据库 PostgreSQL 内核才支持 dblink 插件,请知悉。

一、插件辅助参数

·host

进行跨实例访问的必填项。目标实例的 IP 地址。

·port

进行跨实例访问的必填项。目标实例的端口号。

·instanceid
实例 ID

·进行云数据库 PostgreSQL 间跨实例访问的必填项。格式类似 postgres-xxxxxx、pgro-xxxxxx,可在 控制台 的实例列表中查看。

·如果目标实例在腾讯云 CVM 上,则填写为 CVM 机器的实例 ID,格式类似 ins-xxxxx。

·dbname

·database 名,填写需要访问的远端 PostgreSQL 服务的数据库名称。若不跨实例访问,仅在同实例中进行跨库访问,则只需要配置此参数即可,其他参数都可为空。

·access_type
非必须项。目标实例所属类型如下:

·取值为1时,目标实例为 TencentDB 实例,包括云数据库 PostgreSQL、云数据库 MySQL 等,如果不显式指定,则默认该项。

·取值为2时,目标实例在腾讯云 CVM 机器上。

·取值为3时,目标实例为腾讯云外网自建。

·取值为4时,目标实例为云 VPN 接入的实例。

·取值为5时,目标实例为自建 VPN 接入的实例。

·取值为6时,目标实例为专线接入的实例。

·uin

必须项。实例所属的账号 ID,通过该信息鉴定用户权限,可参见 查询 uin。

·own_uin
非必须项。实例所属的主账号 ID,同样需要该信息鉴定用户权限。

·vpcid
非必须项。私有网络 ID,目标实例如果在腾讯云 CVM 的 VPC 网络中,则需要提供该参数,可在 VPC 控制台 中查看。

·subnetid
非必须项。私有网络子网 ID,目标实例如果在腾讯云 CVM 的 VPC 网络中,则需要提供该参数,可在 VPC 控制台 的子网中查看。

·dcgid
非必须项。专线 ID,目标实例如果需要通过专线网络连接,则需要提供该参数值。

·vpngwid
非必须项。VPN 网关 ID,目标实例如果需要通过 VPN 进行网络连接,则需要提供该参数值。

·region
非必须项。目标实例所在地域,如 “ap-guangzhou” 表示广州。如果需要跨地域访问数据,则需要提供该参数值。

二、使用 postgres_fdw 示例

使用 postgres_fdw 插件可以访问本实例其他库或者其他 postgres 实例的数据。

三、步骤1:前置条件

1. 在本实例中创建测试数据库。

postgres=>create role user1 with LOGIN CREATEDB tencentdb_superuser PASSWORD 'password1';CREATE ROLEpostgres=>create database testdb1;CREATE DATABASE

注意:若创建插件报错,请 提交工单 联系腾讯云售后协助处理。

2. 在目标实例中创建测试数据。

postgres=>create role user2 with LOGIN CREATEDB PASSWORD 'password2';postgres=> create database testdb2;CREATE DATABASEpostgres=# grant all on database testdb2 to user2;GRANTpostgres=> \\c testdb2 user2You are now connected to database "testdb2" as user "user2".testdb2=> create schema test_schema;CREATE SCHEMAtestdb2=> create table test_schema.test_table2(id integer);CREATE TABLEtestdb2=> insert into test_schema.test_table2 values (1);INSERT 0 1

四、步骤2:创建 postgres_fdw 插件

#创建postgres=> \\c testdb1You are now connected to database "testdb1" as user "user1".testdb1=> create extension postgres_fdw;CREATE EXTENSION#查看testdb1=> \\dx List of installed extensions Name | Version | Schema | Description————–+———+————+—————————————————- plpgsql | 1.0 | pg_catalog | PL/pgSQL procedural language postgres_fdw | 1.1 | public | foreign-data wrapper for remote PostgreSQL servers(2 rows)

五、步骤3:创建 SERVER

注意:仅 v10.17_r1.2、v11.12_r1.2、v12.7_r1.2、v13.3_r1.2、v14.2_r1.0 及之后的内核版本支持跨实例访问。

·跨实例访问。

#从本实例的 testdb1 访问目标实例 testdb2 的数据testdb1=>create server srv_test1 foreign data wrapper postgres_fdw options (host 'xxx.xxx.xxx.xxx',dbname 'testdb2', port '5432', instanceid 'postgres-xxxxx', uin '10000xxxx001');CREATE SERVER

·不跨实例,仅跨数据库访问,仅需要填写 dbname 参数即可。

#从本实例的 testdb1 访问本实例 testdb2 的数据create server srv_test1 foreign data wrapper postgres_fdw options (dbname 'testdb2');

·目标实例在腾讯云 CVM 上,且网络类型为基础网络。

testdb1=>create server srv_test foreign data wrapper postgres_fdw options (host 'xxx.xxx.xxx.xxx', dbname 'testdb2', port '5432', instanceid 'ins-xxxxx', access_type '2', region 'ap-guangzhou', uin 'xxxxxx', own_uin 'xxxxxx'); CREATE SERVER

·目标实例在腾讯云 CVM 上,且网络类型为私有网络。

testdb1=>create server srv_test1 foreign data wrapper postgres_fdw options (host 'xxx.xxx.xxx.xxx',dbname 'testdb2', port '5432', instanceid 'ins-xxxxx', access_type '2', region 'ap-guangzhou', uin 'xxxxxx', own_uin 'xxxxxx', vpcid 'vpc-xxxxxx', subnetid 'subnet-xxxxx'); CREATE SERVER

·目标实例在腾讯云外网自建。

testdb1=>create server srv_test1 foreign data wrapper postgres_fdw options (host 'xxx.xxx.xxx.xxx',dbname 'testdb2', port '5432', access_type '3', region 'ap-guangzhou', uin 'xxxxxx', own_uin 'xxxxxx'); CREATE SERVER

·目标实例在腾讯云 VPN 接入的实例。

testdb1=>create server srv_test1 foreign data wrapper postgres_fdw options (host 'xxx.xxx.xxx.xxx',dbname 'testdb2', port '5432', access_type '4', region 'ap-guangzhou', uin 'xxxxxx', own_uin 'xxxxxx', vpngwid 'xxxxxx');

·目标实例在自建 VPN 接入的实例。

testdb1=>create server srv_test1 foreign data wrapper postgres_fdw options (host 'xxx.xxx.xxx.xxx',dbname 'testdb2', port '5432', access_type '5', region 'ap-guangzhou', uin 'xxxxxx', own_uin 'xxxxxx', vpngwid 'xxxxxx');

·目标实例在腾讯云专线接入的实例。

testdb1=>create server srv_test1 foreign data wrapper postgres_fdw options (host 'xxx.xxx.xxx.xxx',dbname 'testdb2', port '5432', access_type '6', region 'ap-guangzhou', uin 'xxxxxx', own_uin 'xxxxxx', dcgid 'xxxxxx'); CREATE SERVER

六、步骤4:创建用户映射

testdb1=> create user mapping for user1 server srv_test1 options (user 'user2', password 'password2');CREATE USER MAPPING

七、步骤5:创建外部表跨实例访问示例

testdb1=> create foreign table foreign_table1(id integer) server srv_test1 options (schema_name 'test_schema', table_name 'test_table2');CREATE FOREIGN TABLE

注意:说明:

注意:同实例的跨 database 访问,只需填写目标表的名称 table_name,无需填写 schema_name 参数。

八、步骤6:访问外部数据

testdb1=> select * from foreign_table1; id—- 1(1 row)

九、参考链接

·postgres_fdw 介绍

·9.3 版本 SERVER 创建

·9.5 版本 SERVER 创建

·10 版本 SERVER 创建

·11 版本 SERVER 创建

·12 版本 SERVER 创建

·13 版本 SERVER 创建

·14 版本 SERVER 创建

十一、步骤一:创建 dblink 插件

postgres=> create extension dblink;postgres=> \\dx List of installed extensions Name | Version | Schema | Description ——————–+———+————+——————————————————————- dblink | 1.2 | public | connect to other PostgreSQL databases from within a database pg_stat_log | 1.0 | public | track runtime execution statistics of all SQL statements executed pg_stat_statements | 1.6 | public | track execution statistics of all SQL statements executed plpgsql | 1.0 | pg_catalog | PL/pgSQL procedural language(4 rows)

十二、步骤二:建立 dblink 链接

select dblink_connect('yunpg1','host=10.10.10.11 port=5432 instanceid=postgres-2123455r dbname=postgres access_type=1 user=dbadmin password=P302!'); dblink_connect —————- OK(1 row)

十三、步骤三:访问外部数据

postgres=> select * from dblink('yunpg1','select catalog_name,schema_name,schema_owner from information_schema.schemata') as t(a varchar(50),b varchar(50),c varchar(50)); a | b | c ———-+——————–+——— postgres | pg_toast | user_00 postgres | pg_temp_1 | user_00 postgres | pg_toast_temp_1 | user_00 postgres | pg_catalog | user_00 postgres | public | user_00 postgres | information_schema | user_00(6 rows)

十四、参考链接

dblink 介绍

十六、步骤一:创建 mysql_fdw 插件

postgres=> create extension mysql_fdw;CREATE EXTENSIONpostgres=> \\dx; List of installed extensions Name | Version | Schema | Description ——————–+———+————+———————————————————————— dblink | 1.2 | public | connect to other PostgreSQL databases from within a database mysql_fdw | 1.1 | public | Foreign data wrapper for querying a MySQL server pg_stat_log | 1.0 | public | track runtime execution statistics of all SQL statements executed pg_stat_statements | 1.9 | public | track planning and execution statistics of all SQL statements executed plpgsql | 1.0 | pg_catalog | PL/pgSQL procedural language(5 rows)

十七、步骤二:创建 SERVER

postgres=> CREATE SERVER mysql_svr FOREIGN DATA WRAPPER mysql_fdw OPTIONS (host '171.16.10.13',port '3306',instanceid 'cdb-l1d95grp',uin '100026380431');CREATE SERVER

十八、步骤三:创建外部用户映射

postgres=> CREATE USER MAPPING FOR PUBLIC SERVER mysql_svr OPTIONS (username 'fdw_user',password 'Secret!123');CREATE USER MAPPING

十九、步骤四:访问外部数据

注意:说明:

注意:本实例所要连接的 MySQL 数据库中必须至少有一张表,才能通过 IMPORT FOREIGN SCHEMA 导入表结构。

postgres=> IMPORT FOREIGN SCHEMA hrdb FROM SERVER mysql_svr INTO public;

20、参考链接

mysql_fdw 介绍

21、使用 cos_fdw 示例

cos_fdw 使用示例请参考文档 通过 cos_fdw 插件支持分级存储能力。

22、使用注意

目标实例,需要注意以下几点:

1. 需要放开 PostgreSQL 的 hba 限制,允许创建的映射用户(如:user2)以 MD5 方式访问。hba 的修改可参考 PostgreSQL 说明。

2. 如果目标实例非 TencentDB 实例,且搭建有热备模式,当主备切换后,需要自行更新 server 连接地址或者重新创建 server。

赞 (0)
上一篇 4天前
下一篇 4天前