首页 » PostgreSQL/GaussDB » Oracle国产化改造迁移openGauss时的问题: Error “remote table ‘xxx’ does not exist” 当使用Postgres_fdw时

Oracle国产化改造迁移openGauss时的问题: Error “remote table ‘xxx’ does not exist” 当使用Postgres_fdw时

在oracle中A库直接远程访问B库常见的有dblink, 在postgresql中有postgres_fdw和外部表,在opengauss系中同样有postgres_fdw、oracle_fdw(for Oracle)、mysql_fdw(for MySQL), 在EDB中postgres_fdw、oci_dblink(for Oracle)。但是发现对于opengauss到远程 opengauss的使用dblink访问时(有oracle应用迁移而来), 在oracle中常用的select * from t1@dblink1访问时,提示 remote table ‘t1’ does not exist, 即使创建user mapping时使用的t1表schema用户。如果应用中存在原oracle语法需要调整,影响postgresql和opengauss, 简单记录opengauss中的问题。

openGauss to openGauss(postgres_fdw)

测试步骤.

  • 安装和创建对应插件(create extension)
create extension postgres_fdw;
  • 创建远程数据库链接(create server),指定对端数据库的物理信息
anbob=> create server testDBlink_mogdb1 FOREIGN DATA WRAPPER POSTGRESQL_FDW OPTIONS(host '10.0.0.xx',port '26000, dbname 'testdb'); 
CREATE SERVER
  • 创建用户映射关系(create user mapping),指定对端数据库的认证信息
anbob=> create user mapping for public server testDBlink_mogdb1 options(user 'testdblink',password 'anbob@1234');
CREATE USER MAPPING

远程访问

anbob=> select * from testdata@testDBLink_mogdb1.
ERROR :
remote table "testdata" does not exist
anbob=>
anbob=> select *from testdblink.testdata@testDBLink_mogdb1;
id
--
1

Note:
这与oracle 的dblink形为不同,需要在dblink前的对象指定owner, 即使访问对象为dblink的访问用户schema中。因为postgresql_fdw问题默认访问的search_path只有pg_catalog.
Postgresql DOC Remote Query Execution Environment

     In the remote sessions opened by postgres_fdw, the search_path parameter is set to just pg_catalog, so that only built-in objects are visible without schema qualification. This is not an issue for queries generated by postgres_fdw itself, because it always supplies such qualification. However, this can pose a hazard for functions that are executed on the remote server via triggers or rules on remote tables.

解决方法是修改SQL代码前增加”schema.”,或对象创建在pg_catalog、public下。

Opengauss to oracle (oracle_fdw)

create extension oracle_fdw;

anbob=> CREATE SERVER dl_to_pdb_15_2 FOREIGN DATA WRAPPER oracle_fdw OPTIONS(dbserver '121.*.*.1:55446/pdb_test');
CREATE SERVER
-- or --
配置tnsname.ora alias 

anbob=> CREATE SERVER dl_to_pdb_15_2  FOREIGN DATA WRAPPER oracle_fdw
          OPTIONS (dbserver '[alias name]',isolation_level 'read_committed');

anbob=> create user mapping for myanbob50 server dl_to_pdb_15_2 options(user 'scott',password 'xxx123');
CREATE USER MAPPING

select * from t1@dl_to_pdb_15_2 ;

Note:
在远程 访问oracle时可以不用指定schema.(如果dblink user是current schema), 在Postgresql分支中EDB 远程访问oracle还是pg都是该形为。

Postgresql to Postgresql (postgres_fdw)

CREATE EXTENSION "postgres_fdw";

CREATE SERVER "foreign_a"
  FOREIGN DATA WRAPPER "postgres_fdw"
  OPTIONS (host '192.*.*.1', port '5432', dbname 'a');

CREATE USER MAPPING FOR "postgres"
  SERVER "foreign_a"
  OPTIONS (user 'postgres', password 'postgres');

CREATE FOREIGN TABLE "emp" (
  "id" UUID,
  "name" VARCHAR(254) DEFAULT ''
)
SERVER "foreign_a"
OPTIONS (schema_name 'public', table_name 'emp');

访问
select * from "emp";

Note:
在postgresql中通常是创建外部表,可以指定schema。对于function 在postgresql一种security definer function 可以set search_path.

小结:
如果使用opengauss 访问远程的opengauss db时,使用postgres_fdw时,访问的对象前需要明确schema, 默认只有pg_catalog. 如果在数据库中对象如view, function,procedure还可行,但是应用程序中写入的代码,注意变动就需要应用厂家的配合。同时在oracle中也是不建议在应用会话中调用dblink,因为并发不可控,可能会因为长链接导致dblink 的session 数耗尽风险。

打赏

,

对不起,这篇文章暂时关闭评论。