更新时间:2024-11-05 GMT+08:00

手动创建外部服务器

创建外表语法(CREATE FOREIGN TABLE (SQL on Hadoop or OBS))中,需指定一个与MRS数据源连接相关联的外部服务器。

当您通过GaussDB(DWS)管理控制台创建MRS数据源连接时,数据库管理员dbadmin会在默认数据库postgres中自动创建一个外部服务器。因此,如果您希望在默认数据库postgres中创建外表读取MRS数据,可以跳过本章节。

如果您希望使用普通用户在自定义数据库中创建外表读取MRS数据,必须先在自定义数据库中手动创建一个外部服务器。本章节将为您介绍,如何使用普通用户在自定义数据库中创建外部服务器。步骤如下:

  1. 请确保GaussDB(DWS)集群已创建MRS数据源连接。

    具体操作请参见《数据仓库服务管理指南》的创建MRS数据源连接

  2. 创建用户和数据库并授予外表权限
  3. 手动创建外部服务器

需要注意的是,当您不再需要从该MRS数据源读取数据时,通过GaussDB(DWS)管理控制台删除MRS数据源,仅会删除在默认数据库postgres中自动创建的外部服务器,手动创建的外部服务器需要您手动删除,具体操作请参见删除手动创建的外部服务器中的描述。

创建用户和数据库并授予外表权限

以下示例,是新建一个普通用户dbuser并创建一个数据库mydatabase,然后使用管理员用户授予dbuser外表权限。

  1. 使用数据库管理员通过GaussDB(DWS)提供的数据库客户端连接默认数据库gaussdb。

    例如,使用gsql客户端的用户通过如下语句连接数据库:

    1
    gsql -d gaussdb -h 192.168.2.30 -U dbadmin -p 8000 -W password -r
    

  2. 新建一个普通用户,并用它创建一个数据库。

    新建一个具有创建数据库权限的用户dbuser:

    1
    CREATE USER dbuser WITH CREATEDB PASSWORD 'password';
    
    切换为新建的用户:
    1
    SET ROLE dbuser PASSWORD 'password';
    
    执行以下命令创建数据库:
    1
    CREATE DATABASE mydatabase;
    

    查询数据库:

    1
    SELECT * FROM pg_database;
    

    返回结果中有mydatabase的信息表示创建成功:

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    datname   | datdba | encoding | datcollate | datctype | datistemplate | datallowconn | datconnlimit | datlastsysoid | datfrozenxid | dattablespace | datcompatibility |                       datacl
    
    ------------+--------+----------+------------+----------+---------------+--------------+--------------+---------------+--------------+---------------+------------------+--------------------------------------
    --------------
     template1  |     10 |        0 | C          | C        | t             | t            |           -1 |         14146 |         1351 |          1663 | ORA              | {=c/Ruby,Ruby=CTc/Ruby}
     template0  |     10 |        0 | C          | C        | t             | f            |           -1 |         14146 |         1350 |          1663 | ORA              | {=c/Ruby,Ruby=CTc/Ruby}
     gaussdb   |     10 |        0 | C          | C        | f             | t            |           -1 |         14146 |         1352 |          1663 | ORA              | {=Tc/Ruby,Ruby=CTc/Ruby,chaojun=C/Ruby,hu
    obinru=C/Ruby}
     mydatabase |  17000 |        0 | C          | C        | f             | t            |           -1 |         14146 |         1351 |          1663 | ORA              |
    (4 rows)
    

  3. 使用管理员用户给普通用户赋予创建外部服务器的权限和使用外表的权限。

    使用数据库管理员用户通过数据库客户端连接新建的数据库。

    例如,使用gsql客户端的用户可以直接使用如下语句切换为管理员用户去连接新建的数据库:
    1
    \c mydatabase dbadmin;
    

    根据提示输入用户密码。

    注意,必须先使用管理员用户连接到将要创建外部服务器和使用外表的数据库,再对普通用户进行授权。

    默认只有系统管理员才可以创建外部服务器,普通用户需要授权才可以创建,执行以下命令授权:
    1
    GRANT ALL ON FOREIGN DATA WRAPPER hdfs_fdw TO dbuser;
    

    其中FOREIGN DATA WRAPPER的名字只能是hdfs_fdw,dbuser为创建SERVER的用户名。

    执行以下命令赋予用户使用外表的权限:

    1
    ALTER USER dbuser USEFT;
    

    查看用户:

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    SELECT r.rolname, r.rolsuper, r.rolinherit,
      r.rolcreaterole, r.rolcreatedb, r.rolcanlogin,
      r.rolconnlimit, r.rolvalidbegin, r.rolvaliduntil,
      ARRAY(SELECT b.rolname
            FROM pg_catalog.pg_auth_members m
            JOIN pg_catalog.pg_roles b ON (m.roleid = b.oid)
            WHERE m.member = r.oid) as memberof
    , r.rolreplication
    , r.rolauditadmin
    , r.rolsystemadmin
    , r.roluseft
    FROM pg_catalog.pg_roles r
    ORDER BY 1;
    

    返回结果中,dbuser的信息中包含了UseFT权限,表示授权成功:

    1
    2
    3
    4
    5
     rolname  | rolsuper | rolinherit | rolcreaterole | rolcreatedb | rolcanlogin | rolconnlimit | rolvalidbegin | rolvaliduntil | memberof | rolreplication | rolauditadmin | rolsystemadmin | roluseft
    -----------+----------+------------+---------------+-------------+-------------+--------------+---------------+---------------+----------+----------------+---------------+----------------+----------
     dbuser    | f        | t          | f             | t           | t           |           -1 |               |               | {}       | f              | f             | f              | t
     lily      | f        | t          | f             | f           | t           |           -1 |               |               | {}       | f              | f             | f              | f
     Ruby       | t        | t          | t             | t           | t           |           -1 |               |               | {}       | t              | t             | t              | t
    

手动创建外部服务器

  1. 使用数据库管理员通过GaussDB(DWS)提供的数据库客户端连接默认数据库postgres。

    例如:通过gsql客户端登录数据库的用户可以使用以下两种方法中的一种进行连接:

    可以通过以下两种方法中的一种进行连接:

    • 如果已经登录了gsql客户端,可以执行以下命令切换数据库和用户:
      1
      \c postgres dbadmin;
      

      根据提示输入密码。

    • 如果尚未登录gsql客户端,或者已经登录了gsql客户端执行\q退出gsql后,执行以下命令重新进行连接:
      1
      gsql -d postgres -h 192.168.2.30 -U dbadmin -p 8000 -W password -r
      

  2. 执行以下命令查询自动创建的外部服务器的信息:

    1
    SELECT * FROM pg_foreign_server;
    

    返回结果如下:

    1
    2
    3
    4
    5
    6
                         srvname                      | srvowner | srvfdw | srvtype | srvversion | srvacl |                                                     srvoptions
    --------------------------------------------------+----------+--------+---------+------------+--------+---------------------------------------------------------------------------------------------------------------------
     gsmpp_server                                     |       10 |  13673 |         |            |        |
     gsmpp_errorinfo_server                           |       10 |  13678 |         |            |        |
     hdfs_server_8f79ada0_d998_4026_9020_80d6de2692ca |    16476 |  13685 |         |            |        | {"address=192.168.1.245:25000,192.168.1.218:25000",hdfscfgpath=/MRS/8f79ada0-d998-4026-9020-80d6de2692ca,type=hdfs}
    (3 rows)
    

    查询结果中,每一行代表一个外部服务器的信息。与MRS数据源连接相关联的外部服务器包含以下信息:

    • srvname值包含“hdfs_server”字样以及MRS集群的ID,此ID与MRS管理控制台的集群列表MRS ID相同。
    • srvoptions字段中的address参数为MRS集群的主备节点的IP地址及端口。

    您可以根据上述信息找到您所要的外部服务器,并记录下它的srvname和srvoptions的值。

  3. 切换为即将创建外部服务器的用户去连接其对应的数据库。

    在本示例中,执行以下命令,使用创建用户和数据库并授予外表权限中创建的普通用户dbuser连接其创建的数据库mydatabase:
    1
    \c mydatabase dbuser;
    

  4. 创建外部服务器。

    创建外部服务器的详细语法,请参见CREATE SERVER。示例如下:

    1
    2
    3
    4
    5
    6
    7
    CREATE SERVER hdfs_server_8f79ada0_d998_4026_9020_80d6de2692cahdfs_server FOREIGN DATA WRAPPER HDFS_FDW 
    OPTIONS 
    (
    address '192.168.1.245:25000,192.168.1.218:25000', 
    hdfscfgpath '/MRS/8f79ada0-d998-4026-9020-80d6de2692ca',
    type 'hdfs'
    );
    

    以下为必选参数的说明:

    • 外部服务器名称

      允许用户自定义名字。

      在本例中,指定为前面的2中记录下来的srvname字段的值,如'hdfs_server_8f79ada0_d998_4026_9020_80d6de2692ca'。

      不同的数据库之间资源是隔离的,因此在不同的数据库中外部服务器名称可以相同。

    • FOREIGN DATA WRAPPER

      只能指定为HDFS_FDW,它在数据库中已经存在。

    • OPTIONS参数
      以下参数请分别指定为2中记录下来的srvoptions中的参数值。
      • address

        指定HDFS集群的主备节点所在的IP地址以及端口。

      • hdfscfgpath

        指定HDFS集群配置文件路径。该参数仅支持type为HDFS时设置。只能设置一个路径。

      • type

        取值为'hdfs',表示HDFS_FDW连接的是HDFS。

  5. 查看外部服务器:

    1
    SELECT * FROM pg_foreign_server WHERE srvname='hdfs_server_8f79ada0_d998_4026_9020_80d6de2692ca';
    

    返回结果如下所示,表示已经创建成功:

    1
    2
    3
    4
                         srvname                      | srvowner | srvfdw | srvtype | srvversion | srvacl |                                                     srvoptions
    --------------------------------------------------+----------+--------+---------+------------+--------+---------------------------------------------------------------------------------------------------------------------
     hdfs_server_8f79ada0_d998_4026_9020_80d6de2692ca |    16476 |  13685 |         |            |        | {"address=192.168.1.245:25000,192.168.1.218:25000",hdfscfgpath=/MRS/8f79ada0-d998-4026-9020-80d6de2692ca,type=hdfs}
    (1 row)