
# CREATE SERVER
#### 功能描述
创建一个外部服务器。
外部服务器是存储HDFS集群信息、OBS服务器信息、DLI连接信息或其他同构集群信息的载体。
#### 注意事项
默认只有系统管理员才可以创建外部服务器，否则需要对所使用的FOREIGN DATA WRAPPER授权，授权语法为：
```
GRANT USAGE ON FOREIGN DATA WRAPPER fdw_name TO username;
```
其中fdw_name为FOREIGN DATA WRAPPER的名字，username为创建SERVER的用户名。
#### 语法格式
```
CREATE SERVER server_name 
    FOREIGN DATA WRAPPER fdw_name
    OPTIONS ( { option_name ' value ' } [, ...] ) ;
```
#### 参数说明
表1CREATE SERVER参数说明 
| 参数                            | 描述                           | 取值范围                                                                                                                                                                                                                                                                                                                                                                                                                                           |
|:---|:---|:---|
| server_name                   | 要创建的外部服务器的名称。服务器名称在数据库中必须唯一。 | 字符串，长度必须小于等于63。需符合[标识符命名规范](https://support.huaweicloud.com/sqlreference-dws/dws_06_0007.html#ZH-CN_TOPIC_0000001811634529__section1475018612353)。                                                                                                                                                                                                                                                                                             |
| FOREIGN DATA WRAPPER fdw_name | 指定外部数据封装器的名字。                | fdw_name是数据库初始化时系统创建的数据封装器。 - 对于HDFS集群，fdw_name的名字可以是hdfs_fdw或者dfs_fdw。  - 对于其他同构集群，fdw_name为gc_fdw。对于数据导入导出场景，GDS外表使用gsmpp_server，fdw_name为dist_fdw。   |
| OPTIONS                       | 用于指定外部服务器的各类参数。              | 支持的各类参数参见[表2]。                                                                                                                                                                                                                                                                                                                                                                                |
   
 表2OPTIONS参数说明 
| 参数                    | 描述                                                                                                                                                                                                                                                                                                   | 取值范围                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 |
|:---|:---|:---|
| address               | 指定的OBS服务终端节点或HDFS集群的IP地址。                                                                                                                                                                                                                                                                            | OBS：OBS服务的终端节点（Endpoint）。 HDFS：HDFS集群的元数据节点（NameNode）所在的IP地址以及端口，或者同构其他集群的CN的IP地址以及端口。 为保证HA（High Availability），HDFS NameNode经常采用主备模式。主备NameNode的地址都需要加入到address值中。DWS访问HDFS服务时，会动态查找当前处于active状态的主NameNode。 若HDFS为联邦模式时，可将Router的地址都加入到address值中，DWS访问HDFS服务时，会随机选择router进行访问。 说明： - address option必须存在，若用于跨集群互联互通场景则只允许设置1个。  - 当server类型为DLI时，address为DLI服务上数据所存储的OBS address。  - 若HDFS为联邦模式时，即fed 'rbf'，address可设置为多组IP、port，对应为HDFS Router的address。   |
| hdfscfgpath           | 该参数仅支持type为HDFS时设置。 用户通过配置hdfscfgpath参数来指定HDFS配置文件路径。DWS会根据配置文件路径下的HDFS配置文件指定的连接配置方式，以及安全模式，来访问HDFS集群。非安全模式连接HDFS集群时，不支持数据传输加密。 如果没有指定address选项，默认采用hdfscfgpath指定的配置文件中指定的address。 | -                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    |
| fed                   | 表示dfs_fdw连接的是HDFS为联邦模式。                                                                                                                                                                                                                                                                              | 取值rbf，表示HDFS为联邦rbf方式。 说明： 该参数8.1.2及以上版本支持。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            |
| encrypt               | 是否对数据进行加密，该参数仅支持type为OBS时设置。默认值为off。                                                                                                                                                                                                                                                                 | - on表示对数据进行加密。  - off表示不对数据进行加密。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               |
| access_key            | OBS访问协议对应的AK值（OBS云服务界面由用户获取），创建外表时AK值会保存到数据库的元数据表中。                                                                                                                                                                                                                                                  | - FOREIGN DATA WRAPPER为dfs_fdw时，仅支持type为OBS时设置。  - 8.2.0及以上版本集群，支持FOREIGN DATA WRAPPER为dist_fdw时指定该参数。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                              |
| secret_access_key     | OBS访问协议对应的SK值（OBS云服务界面由用户获取），创建外表时SK值会加密保存到数据库的元数据表中。                                                                                                                                                                                                                                                | - FOREIGN DATA WRAPPER为dfs_fdw时，仅支持type为OBS时设置。  - 8.2.0及以上集群版本，支持FOREIGN DATA WRAPPER为dist_fdw时指定该参数。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       |
| security_token        | 对应统一身份认证服务IAM中临时安全凭证的SecurityToken的值，与临时AK、SK共同组成临时安全凭证，临时安全凭证有效期不超过24小时。该参数仅8.2.0及以上集群版本支持。                                                                                                                                                                                                         | - FOREIGN DATA WRAPPER为dfs_fdw时，仅支持type为OBS时设置。  - 8.2.0及以上集群版本，支持FOREIGN DATA WRAPPER为dist_fdw时指定该参数。  - 使用该参数时，access_key和secret_access_key参数分别对应临时AK、SK。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   |
| type                  | 表示dfs_fdw连接的类型。                                                                                                                                                                                                                                                                                      | - OBS表示连接的是OBS。  - HDFS表示连接的是HDFS。  - DLI表示连接的是DLI。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         |
| dli_address           | DLI服务的终端节点，即endpoint。该参数仅支持type为DLI时设置。                                                                                                                                                                                                                                                              | -                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    |
| dli_access_key        | DLI访问协议对应的AK值（DLI云服务界面由用户获取），创建外表时AK值会保存到数据库的元数据表中。该参数仅支持type为DLI时设置。                                                                                                                                                                                                                                | -                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    |
| dli_secret_access_key | DLI访问协议对应的SK值（DLI云服务界面由用户获取），创建外表时SK值会加密保存到数据库的元数据表中。该参数仅支持type为DLI时设置。                                                                                                                                                                                                                              | -                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    |
| dbname                | 用于协同分析、跨集群互联互通，表示将要连接的远端集群的数据库名字。                                                                                                                                                                                                                                                                    | -                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    |
| username              | 用于协同分析、跨集群互联互通，表示将要连接的远端集群的用户名。                                                                                                                                                                                                                                                                      | -                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    |
| password              | 用于协同分析、跨集群互联互通，表示将要连接的远端集群的用户密码。 说明： 对于云下集群迁移到云上的场景，从云下集群导出的server配置中密码为密文，由于云上和云下集群加解密的密钥不同，如果直接在云上集群执行导出时的CREATE SERVER，会执行失败，报解密失败的错误。这种场景下需要将CREATE SERVER中的password手动修改成明文密码进行配置。                 | -                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    |
| syncsrv               | 仅用于跨集群互联互通，表示数据同步过程中使用到的GDS服务，设置方式与GDS外表的location属性相同。                                                                                                                                                                                                                                               | -                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    |
   
#### 示例
建立一个hdfs_server，其中hdfs_fdw为数据库中存在的foreign data wrapper。（address、hdfscfgpath的值仅供参考，请根据实际配置情况进行修改。）
```
DROP SERVER IF EXISTS hdfs_server;
CREATE SERVER hdfs_server FOREIGN DATA WRAPPER HDFS_FDW OPTIONS 
   (address '10.10.0.100:25000,10.10.0.101:25000',
    hdfscfgpath '/opt/hadoop_client/HDFS/hadoop/etc/hadoop', 
    type 'HDFS'
) ;
```
建立一个obs_server，其中dfs_fdw为数据库中存在的foreign data wrapper。
```
DROP SERVER IF EXISTS obs_server;
CREATE SERVER obs_server FOREIGN DATA WRAPPER DFS_FDW OPTIONS ( 
  address 'obs.cn-north-1.myhuaweicloud.com', 
   access_key 'xxxxxxxxx', 
  secret_access_key 'yyyyyyyyyyyyy', 
  type 'obs'
);
```
建立一个dli_server，其中dfs_fdw为数据库中存在的foreign data wrapper。
```
DROP SERVER IF EXISTS dli_server;
CREATE SERVER dli_server FOREIGN DATA WRAPPER DFS_FDW OPTIONS ( 
  address 'obs.cn-north-1.myhuaweicloud.com', 
  access_key 'xxxxxxxxx', 
  secret_access_key 'yyyyyyyyyyyyy', 
  type 'dli',
  dli_address 'dli.example.com',
  dli_access_key 'xxxxxxxxx',
  dli_secret_access_key 'yyyyyyyyyyyyy'
);
```
建立另外一个同构集群的server，其中gc_fdw为数据库中存在的foreign data wrapper。
```
DROP SERVER IF EXISTS server_remote;
CREATE SERVER server_remote FOREIGN DATA WRAPPER GC_FDW OPTIONS 
   (address '10.10.0.100:25000,10.10.0.101:25000',
  dbname 'test', 
  username 'test', 
  password 'xxxxxxxx'
);
```
建立一个FOREIGN DATA WRAPPER为dist_fdw的server，用于obs上文本数据的导入导出。
```
DROP SERVER IF EXISTS import_server;
CREATE SERVER import_server FOREIGN DATA WRAPPER DIST_FDW OPTIONS 
(
  access_key 'ak_string',
  secret_access_key 'sk_string'
);
```
#### 相关链接
[ALTER SERVER](https://support.huaweicloud.com/sqlreference-dws/dws_06_0138.html)，[DROP SERVER](https://support.huaweicloud.com/sqlreference-dws/dws_06_0206.html)
