我如何解决 Amazon RDS Oracle 数据库实例的 ORA-00018 或 ORA-00020 错误?

上次更新时间:2020 年 2 月 4 日

我尝试以 Amazon Relational Database Service(Amazon RDS)Oracle 数据库实例上的主用户或 DBA 用户身份连接,但我收到以下错误之一:

  • ORA-00018 超出最大会话
  • ORA-00020 超出最大流程

如何解决这些错误?

简短描述

这些错误可以由计划的扩展练习或导致大量数据库连接的计划外事件引起。在这些情况下,很多客户端会话针对数据库实例而启动,并且达到了以下数据库限制之一:

  • PROCESSES – 允许的用户进程最大数量。
  • SESSIONS – 允许的用户会话最大数量。

如果由于计划扩展练习达到最大连接数量,您可能需要增加 SESSIONS 或 PROCESSES 或此两者,以适应您的应用程序新规模。由于这两个参数不是动态的,因此,请修改参数重启实例

如果由于意外事件而达到最大连接数,请确定事件的原因并执行适当的操作。例如,当响应时间由于锁定或块争用而增加时,应用程序可能会使数据库不堪重负。在这种情况下,增加 SESSIONS 或 PROCESSES 只会在再次达到极限之前增加连接数量,这可能会加剧争用造成的问题。这可能会阻止 Amazon RDS 监控系统登录,执行运行状况检查,或采取重启之类的纠正错误。

解决方法

使用 LICENSE_MAX_SESSIONS

LICENSE_MAX_SESSIONS 参数用于指定允许的并发用户会话最大数。这不适用于 Oracle 后台进程或有 RESTRICTED SESSION 权限的用户,例如有 DBA 角色(主用户或 RDSADMIN)的用户。通过将 LICENSE_MAX_SESSIONS 限制设置为低于 SESSIONS 和 PROCESSES 的值,您可以强制客户端连接接收 ORA-00019 错误(超过许可证的最大数量),而不是 ORA-18 或 ORA-20 错误。由于 ORA-00019 错误不适用于有 RESTRICTED SESSION 权限的用户,MASTER 用户和 RDSADMIN 用户可以登录数据库实例并执行管理故障排除和纠正措施。此外,Amazon RDS 监控可以继续连接到数据库(通过使用 RDSADMIN)来执行运行状况检查。

值得注意的是,LICENSE_MAX_SESSIONS 的最初目的是基于并发会话的数量限制使用量。Oracle 不再基于并发会话的数量提供许可,LICENSE_MAX_SESSIONS 初始化参数被弃用。然而,如果您使用最高为 19c 的 Oracle 版本,您仍可以使用该参数。此外,不应向应用程序用户授予 DBA 角色或 RESTRICTED SESSION 权限。有关更多信息,请参阅适用于 LICENSE_MAX_SESSIONS 的 Oracle 文档。

LICENSE_MAX_SESSIONS 是一个动态参数,因此,无需重新启动 RDS 实例即可设置该参数。有关更多信息,请参阅使用数据库参数组。根据您使用的是 SHARED 还是 DEDICATED 会话参阅以下步骤。

使用 DEDICATED 会话

如果您使用 DEDICATED 会话,您的客户端连接可能会超出 PROCESSES 参数的限制 (ORA-20)。如果您的客户端连接数超出限制,请将 LICENSE_MAX_SESSIONS 的值设置为小于 PROCESSES 的值,如下所示:

  • LICENSE_MAX_SESSIONS = 仅最大客户端连接数。
  • PROCESSES = LICENSE_MAX_SESSIONS + 后台进程总数,包括并行查询、数据库管理员用户(包括主用户)和缓冲区。缓冲区允许稍后可能发生的意外后台进程。要查看您现在拥有的后台进程数,请运行一个类似于以下内容的查询:
SQL> select count(*) from v$session where type= 'BACKGROUND';

注意:会话(默认值为 (1.5 * PROCESSES) + 22)应已足够。有关更多信息,请参阅适用于会话的 Oracle 文档。

要手动连接到您的实例以验证 SESSIONS,请运行与以下内容类似的命令:

SQL> select name, value from v$parameter where upper(name) in ('SESSIONS','PROCESSES','LICENSE_MAX_SESSIONS');
NAME   VALUE
------------------------------ ------------------------------
processes   84
sessions   148
license_max_sessions   0

使用 SHARED 会话

如果您使用 SHARED 会话,您的客户端连接可能会超出 SESSIONS 参数的限制 (ORA-0018)。如果您的客户端连接数超出限制,请将 PROCESSES 参数设置为更大的值。

  • LICENSE_MAX_SESSIONS = 仅最大客户端连接数。
  • PROCESSES = 后台进程总数,包括并行查询、数据库管理员用户(包括主用户)和缓冲区。请确保包含 SHARED_SERVERS 和 DISPATCHERS 的设置与后台进程数。
  • SESSIONS = (1.5 * PROCESSES) + 22

如果您使用 SHARED 服务器并收到最大进程数 (ORA-20) 错误而非最大会话数 (ORA-18) 错误,则您的调度程序可能已不堪重负。在调度程序不堪重负时,连接将被迫作为 DEDICATED 进入。在这种情况下,增加 DISPATCHERS 的数量以允许更多会话连接共享。也可能需要增大 SHARED_SERVERS 参数。有关更多信息,请参阅 Oracle 文档。

如果您不知道自己是否使用 SHARED 或 DEDICATED 服务器,则可通过运行与以下内容类似的查询来确认您所使用的服务器:

SQL> select decode(server, 'NONE', 'SHARED', server) as SERVER, count(*)
from v$session group by decode(server, 'NONE', 'SHARED',server)

这篇文章对您有帮助吗?


您是否需要账单或技术支持?