오라클 EOS 대응으로 버전을 12c 에서 19c로 업그레이드 하는 일을 수행했다.
이 과정에서 알게된 내용을 정리한다.
1. Oracle EOS 대응 내용
◾요구사항 : 데이터베이스 서버의 버전을 19c로 업그레이드 하며, 그외 테이블 및 설정의 변경은 없다.
◾버전 업그레이드 전
- 클라이언트 : Oracle 12c
- 데이터베이스 : Oracle 12c
◾버전 업그레이드 후
- 클라이언트 : Oracle 12c
- 데이터베이스 : Oracle 19c
2. 에러 발생
DBA 팀에서 데이터베이스 서버를 업그레이드 구축후 그 정보를 전달해왔다. 요구사항에서 버전을 업그레이드 하는 것 외에 모든 설정은 변경이 없기 때문에, 변경된 호스트 만 재설정후 테스트를 시행했다.
그런데, DB 연결이 되지 않았다. 이유는 패스워드 때문이었다. 기존의 DB는 패스워드의 대소문자를 구분하지 않았지만, 업그레이드 된 새로운 DB 는 패스워드의 대소문자를 구분하고 있었다.
왜 구별하지 않는가에 대한 답으로 꽤 오래전부터 사용해오는 시스템이기 때문에 대소문자를 구별하지 않았던 ORACLE 버전(10g) 때부터 사용되고 있기 때문이다.
◾ORACLE DB 의 패스워드 대소문자 구분 확인
오라클 DB 가 패스워드를 대소문자 구분하는지는 SEC_CASE_SENSITIVE_LOGON 의 값을 확인하면된다.
true 면 대소문자를 구분하며, false 이면 구분하지 않는다.
SHOW PARAMETER SEC_CASE_SENSITIVE_LOGON;
NAME TYPE VALUE
------------------------------- ----------- ------------------------------
sec_case_sensitive_logon boolean FALSE
-- true : 대소문자를 구분한다.
-- false : 대소문자를 구분하지 않는다.
● 값을 수정하는 방법
-- TRUE : 대소문자 구별 O
ALTER SYSTEM SET SEC_CASE_SENSITIVE_LOGON = TRUE;
-- FALSE : 대소문자 구별 X
ALTER SYSTEM SET SEC_CASE_SENSITIVE_LOGON = FALSE;
업무특성상 DBA 팀에 업그레이드 전 12c DB에서는 대소문자를 구별하지 않았으나, 19c에서는 대소문자를 구별하고 있으니 확인 후 "대소문자 구별하지 않게 해주세요"하는 요청만하면 끝나는 일이지만, 공부한 내용을 정리해둔다.
3. 이 과정에서 알게된 에러와 해결방법
오라클은 기본으로 SEC_CASE_SENSITIVE_LOGON 값을 TRUE 로 설정하여 대소문자를 구분하도록 되어 있다. 그러나, 이 시스템에서는 대소문자를 구별하지 않는다. 왜 그럴까? 쉽게 말하면 오래되었기 때문이다. EOS 대응이 이번이 처음이 아니지만 오래전 셋팅값을 변경하지 않고 그대로 사용하고 있기 때문이다.
◾유저의 암호버전 확인
SELECT USERNAME,ACCOUNT_STATUS,PASSWORD_VERSIONS FROM DBA_USERS;
-- 19c DB의 설정값
USERNAME ACCOUNT_STATUS PASSWORD_VERSIONS
------------------------ ----------------------- -----------------------
JONES OPEN 11G 12C
-- 12c DB의 설정값
USERNAME ACCOUNT_STATUS PASSWORD_VERSIONS
------------------------ ----------------------- -----------------------
JONES OPEN 10G 11G 12C
12c 의 값을 보면 10G 버전부터 설정되어 있었고, 19c 의 값은 12c만 되어 있었다. 이로써 새로운 버전 19C의 설정값에도 10G의 설정이 누락되어 있는 것을 알게되었다. 확인 결과 10G 의 설정도 필요했다. 이를 설정하지 않으면 10G 이하의 버전에서 접속을 시도하면, 「ORA-28040: No matching authentication protocol」 에러가 발생한다.
◾에러코드와 메세지
ORA-28040: No matching authentication protocol
ORA-28040: 일치하는 인증 프로토콜 없음
ORA-28040: 一致する認証プロトコルがありません
ORA-01017: invalid username/password
ORA-01017: 사용자명/비밀번호가 부적합, 로그온 할 수 없습니다.
ORA-01017: ユーザー名/パスワードが無効です。ログオンは拒否されました。
◾에러원인
● ORA-28040
서버가 접속하는 클라이언트의 버전을 지원하지 않을때 발생한다.
구체적으로 예를 들면, Oracle Client 10G 에서 Oracle Sever 19C 의 sqlnet.ora 파일에 SQLNET.ALLOWED_LOGON_VERSION_SERVER=10 가 설정되어 있지 않은 상태에서 접속하는 경우 발생한다.
● ORA-01017
ORA-28040 의 해결 방안으로 서버의 sqlnet.ora 파일에 SQLNET.ALLOWED_LOGON_VERSION_SERVER 값을 설정한 후 클라이언트에서 접속하면 발생한다. 단순히 sqlnet.ora 파일에 값을 추가하는 것만으로 해결된 것이 아니다.
ALTER 문으로 패스워드를 재설정 해주어야 한다.
ALTER USER JONES identified by tiger account unlock;
ALTER USER 유저명 identified by 패스워드 account unlock;
-- 변경 후 확인
SELECT USERNAME,ACCOUNT_STATUS,PASSWORD_VERSIONS FROM DBA_USERS;
-- 19c DB의 변경된 설정값
USERNAME ACCOUNT_STATUS PASSWORD_VERSIONS
------------------------ ---------------------- ---------------------
JONES OPEN 10G 11G 12C