Amazon RDS for Oracle DB 인스턴스의 ORA-00018 또는 ORA-00020 오류를 해결하려면 어떻게 해야 하나요?

5분 분량
0

Amazon Relational Database Service(RDS) for Oracle DB 인스턴스에서 기본 사용자 또는 DBA 사용자로 연결하려고 합니다. 하지만 다음과 같은 오류 중 하나가 발생합니다.

ORA-00018 최대 세션 초과 ORA-00020 최대 프로세스 초과

이러한 오류를 해결하려면 어떻게 해야 하나요?

간략한 설명

이러한 오류는 예정된 크기 조정 작업 또는 많은 DB 연결을 야기하는 예정되지 않은 이벤트로 인해 발생할 수 있습니다. 이 경우 DB 인스턴스에 대해 많은 클라이언트 세션이 시작되고 다음 데이터베이스 제한 중 하나에 도달합니다.

  • PROCESSES – 허용되는 최대 사용자 프로세스 수입니다.
  • SESSIONS – 허용되는 최대 사용자 세션 수입니다.

예정된 크기 조정 작업으로 인해 최대 연결 수에 도달한 경우 SESSIONS나 PROCESSES, 또는 둘 다를 늘리세요. 이 작업을 통해 애플리케이션의 새로운 규모를 수용할 수 있습니다. 이러한 두 파라미터는 동적이지 않으므로 파라미터를 수정한 다음 인스턴스를 재부팅하세요.

예정되지 않은 이벤트로 인해 최대 연결 수에 도달한 경우 이벤트 원인을 파악하여 조치를 취하세요.

예를 들어, 잠금 또는 차단 경합으로 인해 응답 시간이 증가할 때 애플리케이션이 데이터베이스에 과도할 수 있습니다. 이 경우 SESSIONS 또는 PROCESSES를 늘리면 최댓값이 다시 초과되기 전에 연결 수만 증가합니다. 그 결과 경합으로 인한 문제가 악화될 수 있습니다. 이로 인해 Amazon RDS 모니터링 시스템이 로그인하지 못하거나, 상태 확인을 수행하지 못하거나, 재부팅과 같은 시정 조치를 취하지 못할 수 있습니다.

해결 방법

Oracle 사용자 PROFILE

ORA-18 및 ORA-20가 발생하는 가장 일반적인 원인 중 하나는 유휴 연결이 많기 때문입니다. 유휴 연결은 애플리케이션이나 데이터베이스 관리자에 의해 제대로 종료되지 않고 데이터베이스에 남아 있습니다. IDLE 연결이 증가하면 데이터베이스가 SESSIONS/PROCESSES 파라미터의 최대 제한에 도달할 수 있습니다. 따라서 새 연결이 허용되지 않습니다. 제한된 IDLE_TIME 값을 사용하여 애플리케이션 연결에 대해 PROFILE을 설정하는 것이 가장 좋습니다.

Oracle 데이터베이스에서 각 사용자는 PROFILE에 할당됩니다. Oracle PROFILE은 이 PROFILE에 연결된 각 사용자에게 할당되는 리소스 집합입니다. 이러한 리소스 중 하나는 IDLE_TIME입니다. IDLE_TIME은 데이터베이스에 의해 쿼리가 종료되기 전에, 세션 중 허용되는 연속 비활성 상태의 양을 분 단위로 구체화합니다. 장기 실행 쿼리 및 기타 작업에는 이 제한이 적용되지 않습니다.

이 예제에서는 최대 IDLE_TIME이 30분인 프로파일을 생성하여 애플리케이션 사용자에게 할당하는 방법을 보여줍니다. 30분을 초과하는 모든 IDLE 연결은 데이터베이스에 의해 자동으로 종료됩니다.

제한된 IDLE_TIME 파라미터를 사용하여 PROFILE을 생성하세요.

SQL> select count(*) from v$session where type= 'BACKGROUND';

이 PROFILE을 특정 사용자에게 할당하세요.

  SQL> ALTER USER <username> PROFILE <profile_name>;

RDS 인스턴스 크기 조정

애플리케이션 사용자로부터 들어오는 워크로드가 증가하기 때문에 최대 SESSIONS/PROCESSES 수에 도달할 수 있습니다. 기본적으로 RDS for Oracle에서는 두 파라미터 제한 모두 DB 인스턴스 클래스 메모리에 따라 사전 정의된 공식을 기반으로 계산됩니다. 이 경우 SESSIONS/PROCESSES 파라미터를 수동으로 수정하는 것은 바람직하지 않습니다. 대신 워크로드에 따라 인스턴스를 스케일 업/스케일 다운하세요.

PROCESSES/SESSIONS 파라미터에 대한 RDS 기본 설정은 다음 공식을 사용하여 계산됩니다.

  • PROCESSES= LEAST({DBInstanceClassMemory/9868951}, 20000)
  • SESSIONS = Oracle Default = (1.5 * PROCESSES) + 22

PROCESSES 또는 SESSIONS 파라미터를 기본 제한을 초과하여 수동으로 설정하면 메모리 사용량이 증가할 수 있습니다. 따라서 메모리 부족 문제로 인해 데이터베이스가 충돌할 수 있습니다. 또한 PROCESSES나 SESSIONS를 수동으로 설정하면 인스턴스를 확장/축소할 때 구성 불일치가 발생할 수 있습니다. PROCESSES 및 SESSIONS 파라미터가 할당된 인스턴스 메모리에 더 이상 의존하지 않기 때문입니다.

LICENSE_MAX_SESSIONS

LICENSE_MAX_SESSIONS 파라미터는 허용되는 최대 동시 사용자 세션 수를 지정합니다. 이는 Oracle 백그라운드 프로세스에 적용되지 않으며, DBA 역할의 사용자를 포함하여 RESTRICTED SESSION 권한을 가진 사용자에게도 적용되지 않습니다. LICENSE_MAX_SESSIONS를 SESSIONS 및 PROCESSES보다 낮은 값으로 설정합니다. 그러면 클라이언트 연결에 ORA-18 또는 ORA-20 오류 대신 ORA-00019 오류가 발생합니다. ORA-00019 오류는 RESTRICTED SESSION 권한이 있는 사용자에게는 적용되지 않습니다. 따라서 기본 사용자 및 RDSADMIN 사용자는 DB 인스턴스에 로그온하여 관리상의 문제 해결 및 수정 조치를 수행할 수 있습니다. 또한 Amazon RDS 모니터링은 RDSADMIN을 사용하여 데이터베이스에 계속 연결함으로써 상태 확인을 수행할 수 있습니다.

참고: LICENSE_MAX_SESSIONS는 원래 동시 세션 수를 기준으로 사용량을 제한하기 위한 것입니다. Oracle은 더 이상 동시 세션 수를 기준으로 라이선스를 제공하지 않으므로 LICENSE_MAX_SESSIONS는 더 이상 사용되지 않습니다. 하지만 최대 19c Oracle 버전까지는 파라미터를 계속 사용할 수 있습니다. 또한 애플리케이션 사용자에게 DBA 역할 또는 RESTRICTED SESSION 권한을 부여해서는 안 됩니다. 자세한 내용은 LICENSE_MAX_SESSIONS에 대한 Oracle 설명서를 참조하세요.

LICENSE_MAX_SESSIONS는 동적 파라미터이기 때문에 DB 인스턴스를 다시 시작하지 않고 설정할 수 있습니다. 자세한 내용은 파라미터 그룹 작업을 참조하세요.

LICENSE_MAX_SESSIONS 파타미터는 PROCESSES 파마리터와 유사하게 공식으로 설정할 수 있습니다. LICENSE_MAX_SESSIONS 파라미터는 정적 값이 아닌 공식을 기반으로 하도록 설정하는 것이 가장 좋습니다. 이렇게 하면 인스턴스 크기를 확장/축소할 때 잘못된 구성을 방지하는 데 도움이 됩니다. 예를 들면 다음과 같습니다.

  • PROCESSES 파라미터와 동일하게 설정하려면: LICENSE_MAX_SESSIONS= LEAST({DBInstanceClassMemory/9868951}, 20000)
  • PROCESSES 파라미터의 4/5로 설정하려면: LICENSE_MAX_SESSIONS= LEAST({DBInstanceClassMemory/12336188}, 20000)

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-18) 오류 대신 최대 프로세스(ORA-20) 오류가 표시될 경우 디스패처가 꽉 찼을 수 있습니다. 디스패처가 꽉 찼을 경우 연결이 DEDICATED로 설정됩니다. 공유에 더 많은 세션이 연결될 수 있도록 DISPATCHERS 수를 늘리세요. SHARED_SERVERS 파라미터도 늘려야 할 수도 있습니다.

SHARED 또는 DEDICATED 서버를 사용하고 있는지 확인하려면 다음과 같은 명령을 실행합니다.

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

관련 정보

Oracle 작업의 모범 사례

AWS 공식
AWS 공식업데이트됨 일 년 전