我如何解决 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 + 所有后台进程,包括并行查询、包括主用户在内的 DBA 用户和缓冲区。缓冲区允许以后可能发生的意外后台进程。要查看您现在拥有的后台进程数量,请运行类似以下内容的查询:SQL> select count(*) from v$session where type= 'BACKGROUND';
注意:默认值为 (1.5 * PROCESSES) + 22 的 SESSIONS 应当足够。有关更多信息,请参阅适用于 SESSIONS 的 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 = 所有后台进程,包括并行查询、包括主用户在内的 DBA 用户,及缓冲区。请务必包含 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)