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 数耗尽风险。
对不起,这篇文章暂时关闭评论。