

# 连接到 Oracle 数据库实例
<a name="USER_ConnectToOracleInstance"></a>

在 Amazon RDS 预调配 Oracle 数据库实例后，您可以使用任何标准 SQL 客户端应用程序登录到数据库实例。由于 RDS 是一项托管式服务，因此您无法以 SYS 或 SYSTEM 身份登录。有关更多信息，请参阅 [RDS for Oracle 用户和权限](Oracle.Concepts.Privileges.md)。

在本主题中，您将学习如何使用 Oracle SQL Developer 或 SQL\$1Plus 连接到 RDS for Oracle 数据库实例。有关指导您完成创建和连接到示例数据库实例的示例，请参阅 [创建并连接到 Oracle 数据库实例](CHAP_GettingStarted.CreatingConnecting.Oracle.md)。

**Topics**
+ [查找 RDS for Oracle 数据库实例的端点](USER_Endpoint.md)
+ [使用 Oracle SQL Developer 连接到数据库实例](USER_ConnectToOracleInstance.SQLDeveloper.md)
+ [使用 SQL\$1Plus 连接到数据库实例](USER_ConnectToOracleInstance.SQLPlus.md)
+ [安全组注意事项](USER_ConnectToOracleInstance.Security.md)
+ [进程架构注意事项](USER_ConnectToOracleInstance.SharedServer.md)
+ [排除与 Oracle 数据库实例的连接故障](USER_ConnectToOracleInstance.Troubleshooting.md)
+ [使用 sqlnet.ora 参数修改连接属性](USER_ModifyInstance.Oracle.sqlnet.md)

# 查找 RDS for Oracle 数据库实例的端点
<a name="USER_Endpoint"></a>

每个 Amazon RDS 数据库实例都有一个终端节点，每个终端节点都包含数据库实例的 DNS 名称和端口号。要使用 SQL 客户端应用程序连接到数据库实例，您需要该数据库实例的 DNS 名称和端口号。

您可使用 Amazon RDS 控制台或 AWS CLI 查找数据库实例的终端节点。

**注意**  
如果您使用的是 Kerberos 身份验证，请参阅[使用 Kerberos 身份验证连接到 Oracle](oracle-kerberos-connecting.md)。

## 控制台
<a name="USER_Endpoint.Console"></a>

**使用控制台查找终端节点**

1. 登录AWS 管理控制台并通过以下网址打开 Amazon RDS 控制台：[https://console.aws.amazon.com/rds/](https://console.aws.amazon.com/rds/)。

1. 在控制台的右上角，选择数据库实例的 AWS 区域。

1. 找到数据库实例的 DNS 名称和端口号。

   1. 选择 **Databases (数据库)** 以显示您的数据库实例的列表。

   1. 选择 Oracle 数据库实例名称以显示实例详细信息。

   1. 在**连接和安全性**选项卡上，复制终端节点。另请注意端口号。您需要终端节点和端口号才能连接到数据库实例。  
![\[找到该数据库实例的终端节点和端口\]](http://docs.aws.amazon.com/zh_cn/AmazonRDS/latest/UserGuide/images/OracleConnect1.png)

## AWS CLI
<a name="USER_Endpoint.CLI"></a>

要使用 AWS CLI 查找 Oracle 数据库实例的终端节点，请调用 [describe-db-instances](https://docs.aws.amazon.com/cli/latest/reference/rds/describe-db-instances.html) 命令。

**Example 使用 AWS CLI 查找终端节点**  

```
1. aws rds describe-db-instances
```
在输出中搜索 `Endpoint` 以查找数据库实例的 DNS 名称和端口号。输出中的 `Address` 行包含 DNS 名称。下面是 JSON 终端节点输出的示例。  

```
"Endpoint": {
    "HostedZoneId": "Z1PVIF0B656C1W",
    "Port": 3306,
    "Address": "myinstance.123456789012.us-west-2.rds.amazonaws.com"
},
```

**注意**  
该输出可能包含多个数据库实例的信息。

# 使用 Oracle SQL Developer 连接到数据库实例
<a name="USER_ConnectToOracleInstance.SQLDeveloper"></a>

在此过程中，您将使用 Oracle SQL Developer 连接到数据库实例。要下载此实用工具的独立版本，请参阅 [Oracle SQL 开发人员下载页](https://www.oracle.com/tools/downloads/sqldev-downloads.html)。

要连接到数据库实例，您需要该实例的 DNS 名称和端口号。有关查找数据库实例的 DNS 名称和端口号的信息，请参阅[查找 RDS for Oracle 数据库实例的端点](USER_Endpoint.md)。

**使用 SQL Developer 连接到数据库实例**

1. 启动 Oracle SQL Developer。

1. 在 **Connections** 选项卡上，选择 **add (\$1)** 图标。  
![\[突出显示了“添加”图标的 Oracle SQL Developer\]](http://docs.aws.amazon.com/zh_cn/AmazonRDS/latest/UserGuide/images/oracle-sqldev-plus.png)

1. 在 **New/Select Database Connection** 对话框中，提供您的数据库实例的信息：
   + 对于 **Connection Name (连接名称)**，输入可描述连接的名称，如 `Oracle-RDS`。
   + 对于 **Username (用户名)**，输入数据库实例的数据库管理员的名称。
   + 对于 **Password (密码)**，输入数据库管理员的密码。
   + 对于 **Hostname (主机名)**，输入数据库实例的 DNS 名称。
   + 对于 **Port (端口)**，输入端口号。
   + 对于 **SID**，输入数据库名称。您可以在数据库详细信息页面的 **Configuration**（配置）选项卡上找到数据库名称。

   完成后的对话框应该与下面类似。  
![\[在 Oracle SQL Developer 中创建新连接\]](http://docs.aws.amazon.com/zh_cn/AmazonRDS/latest/UserGuide/images/oracle-sqldev-newcon.png)

1. 选择 **Connect**。

1. 您现在可以开始创建您自己的数据库并像往常一样对数据库实例和数据库运行查询。要对数据库实例运行测试查询，请执行以下操作：

   1. 在您的连接的 **Worksheet (工作表)** 选项卡中，输入以下 SQL 查询。

      ```
      SELECT NAME FROM V$DATABASE;
      ```

   1. 选择 **execute (执行)** 图标以运行查询。  
![\[使用“执行”图标在 Oracle SQL Developer 中运行查询\]](http://docs.aws.amazon.com/zh_cn/AmazonRDS/latest/UserGuide/images/oracle-sqldev-run.png)

      SQL Developer 将返回数据库名称。  
![\[Oracle SQL Developer 中的查询结果\]](http://docs.aws.amazon.com/zh_cn/AmazonRDS/latest/UserGuide/images/oracle-sqldev-results.png)

# 使用 SQL\$1Plus 连接到数据库实例
<a name="USER_ConnectToOracleInstance.SQLPlus"></a>

您可以使用实用程序 (如 SQL\$1Plus) 连接到运行 Oracle 的 Amazon RDS 数据库实例。要下载包含独立版本 SQL\$1Plus 的 Oracle 即时客户端，请参阅 [Oracle 即时客户端下载](https://www.oracle.com/database/technologies/instant-client/downloads.html)。

要连接到数据库实例，您需要该实例的 DNS 名称和端口号。有关查找数据库实例的 DNS 名称和端口号的信息，请参阅[查找 RDS for Oracle 数据库实例的端点](USER_Endpoint.md)。

**Example 使用 SQL\$1Plus 连接到 Oracle 数据库实例**  
在以下示例中，请将用户名替换为您的数据库实例管理员。另外，请将 DNS 名称替换为您的数据库实例，然后包含端口号和 Oracle SID。SID 值是您创建数据库实例时指定的数据库实例数据库的名称，而不是数据库实例的名称。  
对于 Linux、macOS 或 Unix：  

```
1. sqlplus 'user_name@(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=dns_name)(PORT=port))(CONNECT_DATA=(SID=database_name)))'
```
对于 Windows：  

```
1. sqlplus user_name@(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=dns_name)(PORT=port))(CONNECT_DATA=(SID=database_name)))
```
您应该可以看到类似于如下所示的输出内容。  

```
SQL*Plus: Release 12.1.0.2.0 Production on Mon Aug 21 09:42:20 2017
```
在您输入用户的密码之后，将出现 SQL 提示。  

```
SQL>
```

**注意**  
较短格式的连接字符串（EZ 连接）（例如 `sqlplus USER/PASSWORD@longer-than-63-chars-rds-endpoint-here:1521/database-identifier`）可能会遇到最大字符限制，因此建议您不要使用它进行连接。

# 安全组注意事项
<a name="USER_ConnectToOracleInstance.Security"></a>

要连接到数据库实例，它必须与包含必要的 IP 地址和网络配置的安全组关联。您的数据库实例可能使用默认安全组。如果在创建数据库实例时分配了一个默认的未配置安全组，则防火墙将阻止连接。有关创建新安全组的信息，请参阅 [使用安全组控制访问权限](Overview.RDSSecurityGroups.md)。

在创建新安全组后，您应修改数据库实例以使其与该安全组关联。有关更多信息，请参阅“[修改 Amazon RDS 数据库实例](Overview.DBInstance.Modifying.md)”。

可通过使用 SSL 加密与数据库实例的连接来增强安全性。有关更多信息，请参阅 [Oracle 安全套接字层](Appendix.Oracle.Options.SSL.md)。

# 进程架构注意事项
<a name="USER_ConnectToOracleInstance.SharedServer"></a>

服务器进程处理与 Oracle 数据库实例的用户连接。默认情况下，Oracle 数据库实例使用专用服务器进程。使用专用服务器进程，每个服务器进程仅服务一个用户进程。您可以选择配置共享服务器进程。使用共享服务器进程，每个服务器进程可服务多个用户进程。

当大量用户会话占用服务器上的太多内存时，您可以考虑使用共享服务器进程。当会话非常频繁时连接和断开连接，从而导致性能问题时，您也可以考虑使用共享服务器进程。使用共享服务器进程也有缺点。例如，它们可能会耗尽 CPU 资源，并且配置和管理起来更加复杂。

有关专用和共享服务器进程的更多信息，请参阅 Oracle 文档中的[关于专用和共享服务器进程](https://docs.oracle.com/database/121/ADMIN/manproc.htm#ADMIN11166)。有关在 RDS for Oracle 数据库实例上配置共享服务器进程的更多信息，请参阅知识中心中的[如何将 Amazon RDS for Oracle Database 配置为使用共享服务器？](https://aws.amazon.com/premiumsupport/knowledge-center/oracle-db-shared/)。

# 排除与 Oracle 数据库实例的连接故障
<a name="USER_ConnectToOracleInstance.Troubleshooting"></a>

下面是您在尝试连接到您的 Oracle 数据库实例时可能遇到的问题。


****  

| 问题 | 故障排除建议 | 
| --- | --- | 
|  无法连接到数据库实例。  |  对于新创建的数据库实例，数据库实例的状态为 **creating**，直到该数据库实例可供使用。当状态变为 **Available** 时，您可以连接到该数据库实例。根据数据库实例类和存储量，新数据库实例可能需要等待 20 分钟时间才可用。  | 
|  无法连接到数据库实例。  |  如果您不能通过在创建数据库实例时指定的端口收发消息，您就无法连接到数据库实例。请联系您的网络管理员，核对您为数据库实例指定的端口是否可以进行入站和出站通信。  | 
|  无法连接到数据库实例。  |  由本地防火墙强制执行的访问规则与您在数据库实例的安全组中授权用于访问数据库实例的 IP 地址可能不匹配。此问题很可能是由防火墙上的入站或出站规则所致。 您可以在安全组中添加或编辑入站规则。对于 **Source**，选择 **My IP**。这允许从浏览器中检测到的 IP 地址访问数据库实例。有关更多信息，请参阅“[Amazon VPC 和 Amazon RDS](USER_VPC.md)”。 有关安全组的更多信息，请参阅 [使用安全组控制访问权限](Overview.RDSSecurityGroups.md)。 要演练为您的安全组设置规则的过程，请参阅[教程：创建 VPC 以用于数据库实例（仅限 IPv4）](CHAP_Tutorials.WebServerDB.CreateVPC.md)。  | 
|  **Connect failed because target host or object does not exist – Oracle，错误：ORA-12545**   |  确保您指定了正确的服务器名称和端口号。对于 **Server name (服务器名称)**，输入来自控制台的 DNS 名称。 有关查找数据库实例的 DNS 名称和端口号的信息，请参阅[查找 RDS for Oracle 数据库实例的端点](USER_Endpoint.md)。  | 
|  **无效用户名称/密码；登录失败 – Oracle, 错误: ORA-01017**   |  您可以访问数据库实例，但连接已被拒绝。这通常是提供的用户名或密码不正确导致的。请验证用户名和密码，然后重试。  | 
|  **TNS:listener 目前不知道连接描述符中给出的 SID – 错误: ORA-12505**   |  确保输入了正确的 SID。SID 与您的数据库名称相同。在您实例的 **Databases**（数据库）页面的 **Configuration**（配置）选项卡中找到数据库名称。您还可以使用 AWS CLI 找到数据库名称： <pre>aws rds describe-db-instances --query 'DBInstances[*].[DBInstanceIdentifier,DBName]' --output text</pre>  | 

有关连接问题的更多信息，请参阅[无法连接到 Amazon RDS 数据库实例](CHAP_Troubleshooting.md#CHAP_Troubleshooting.Connecting)。

# 使用 sqlnet.ora 参数修改连接属性
<a name="USER_ModifyInstance.Oracle.sqlnet"></a>

sqlnet.ora 文件包括在 Oracle 数据库服务器和客户端上配置 Oracle Net 功能的参数。使用 sqlnet.ora 文件中的参数，您可以修改传入和传出数据库的连接的属性。

有关可能需要设置 sqlnet.ora 参数的原因的更多信息，请参阅 Oracle 文档中的[对配置文件参数进行配置](https://docs.oracle.com/database/121/NETAG/profile.htm#NETAG009)。

## 设置 sqlnet.ora 参数
<a name="USER_ModifyInstance.Oracle.sqlnet.Setting"></a>

Amazon RDS for Oracle 参数组包含一个 sqlnet.ora 参数子集。您可以使用与设置其他 Oracle 参数相同的方法来设置它们。`sqlnetora.` 前缀标识哪些参数是 sqlnet.ora 参数。例如，在 Amazon RDS 的 Oracle 参数组中，`default_sdu_size` sqlnet.ora 参数为 `sqlnetora.default_sdu_size`。

有关管理参数组和设置参数值的信息，请参阅 [Amazon RDS 的参数组](USER_WorkingWithParamGroups.md)。

## 支持的 sqlnet.ora 参数
<a name="USER_ModifyInstance.Oracle.sqlnet.Supported"></a>

Amazon RDS 支持以下 sqlnet.ora 参数。对动态 sqlnet.ora 参数的更改立即生效。


****  

| 参数 | 有效值 | 静态/动态 | 说明 | 
| --- | --- | --- | --- | 
|  `sqlnetora.default_sdu_size`  |  `512`到 `2097152`。  |  动态  |  会话数据单位 (SDU) 大小 (字节)。 SDU 是一次性放入缓冲区并通过网络发送的数据量。  | 
|  `sqlnetora.diag_adr_enabled`  |  `ON`, `OFF`   |  动态  |  一个值，用于启用或禁用自动诊断存储库 (ADR) 跟踪。 `ON` 指定使用 ADR 文件跟踪。 `OFF` 指定使用非 ADR 文件跟踪。  | 
|  `sqlnetora.recv_buf_size`  |  `8192`到 `268435456`。  |  动态  |  用于会话接收操作的缓冲区空间限制，支持 TCP/IP、使用 SSL 的 TCP/IP 以及 SDP 协议。  | 
|  `sqlnetora.send_buf_size`  |  `8192`到 `268435456`。  |  动态  |  用于会话发送操作的缓冲区空间限制，支持 TCP/IP、使用 SSL 的 TCP/IP 以及 SDP 协议。  | 
|  `sqlnetora.sqlnet.allowed_logon_version_client`  |  `8`, `10`, `11`, `12`   |  动态  |  客户端和充当客户端的服务器与 Oracle 数据库实例建立连接所允许的最低身份验证协议版本。  | 
|  `sqlnetora.sqlnet.allowed_logon_version_server`  |  `8`, `9`, `10`, `11`, `12`, `12a`   |  动态  |  与 Oracle 数据库实例建立连接所允许的最低身份验证协议版本。  | 
|  `sqlnetora.sqlnet.expire_time`  |  `0`到 `1440`。  |  动态  |  发送检查以验证客户端/服务器连接是否活动的时间间隔，以分钟为单位。  | 
|  `sqlnetora.sqlnet.inbound_connect_timeout`  |  `0` 或 `10` 到 `7200`   |  动态  |  客户端连接到数据库服务器并提供所需身份验证信息的时间，以秒为单位。  | 
|  `sqlnetora.sqlnet.outbound_connect_timeout`  |  `0` 或 `10` 到 `7200`   |  动态  |  客户端建立与数据库实例的 Oracle Net 连接的时间，以秒为单位。  | 
|  `sqlnetora.sqlnet.recv_timeout`  |  `0` 或 `10` 到 `7200`   |  动态  |  数据库服务器在建立连接之后等待客户端数据的时间，以秒为单位。  | 
|  `sqlnetora.sqlnet.send_timeout`  |  `0` 或 `10` 到 `7200`   |  动态  |  数据库服务器在建立连接之后，完成对客户端的发送操作的时间，以秒为单位。  | 
|  `sqlnetora.tcp.connect_timeout`  |  `0` 或 `10` 到 `7200`   |  动态  |  客户端建立与数据库服务器的 TCP 连接的时间，以秒为单位。  | 
|  `sqlnetora.trace_level_server`  |  `0`, `4`, `10`, `16`, `OFF`, `USER`, `ADMIN`, `SUPPORT`  |  动态  | 对于非 ADR 跟踪，在指定级别启用服务器跟踪或禁用服务器跟踪。 | 

每个支持的 sqlnet.ora 参数的默认值是该版本的 Oracle Database 默认值。

## 查看 sqlnet.ora 参数
<a name="USER_ModifyInstance.Oracle.sqlnet.Viewing"></a>

您可以使用 AWS 管理控制台、AWS CLI 或 SQL 客户端查看 sqlnet.ora 参数及其设置。

### 使用控制台查看 sqlnet.ora 参数
<a name="USER_ModifyInstance.Oracle.sqlnet.Viewing.Console"></a>

有关查看参数组中参数的信息，请参阅[Amazon RDS 的参数组](USER_WorkingWithParamGroups.md)。

在 Oracle 参数组中，`sqlnetora.` 前缀标识哪些参数是 sqlnet.ora 参数。

### 使用 AWS CLI 查看 sqlnet.ora 参数
<a name="USER_ModifyInstance.Oracle.sqlnet.Viewing.CLI"></a>

要查看在 Oracle 参数组中配置的 sqlnet.ora 参数，请使用 AWS CLI [describe-db-parameters](https://docs.aws.amazon.com/cli/latest/reference/rds/describe-db-parameters.html) 命令。

要查看 Oracle 数据库实例的所有 sqlnet.ora 参数，请调用 AWS CLI [download-db-log-file-portion](https://docs.aws.amazon.com/cli/latest/reference/rds/download-db-log-file-portion.html) 命令。指定数据库实例标识符、日志文件名和输出的类型。

**Example**  
以下代码列出 `mydbinstance` 的所有 sqlnet.ora 参数。  
对于 Linux、macOS 或 Unix：  

```
aws rds download-db-log-file-portion \
    --db-instance-identifier mydbinstance \
    --log-file-name trace/sqlnet-parameters \
    --output text
```
对于：Windows  

```
aws rds download-db-log-file-portion ^
    --db-instance-identifier mydbinstance ^
    --log-file-name trace/sqlnet-parameters ^
    --output text
```

### 使用 SQL 客户端查看 sqlnet.ora 参数
<a name="USER_ModifyInstance.Oracle.sqlnet.Viewing.SQL"></a>

在 SQL 客户端中连接到 Oracle 数据库实例之后，以下查询列出 sqlnet.ora 参数。

```
1. SELECT * FROM TABLE
2.    (rdsadmin.rds_file_util.read_text_file(
3.         p_directory => 'BDUMP',
4.         p_filename  => 'sqlnet-parameters'));
```

有关在 SQL 客户端中连接到 Oracle 数据库实例的信息，请参阅[连接到 Oracle 数据库实例](USER_ConnectToOracleInstance.md)。