Oracle 서버 설치, 추가적으로 클라이언트까지 설치하고, DB를 Import 하기 위해서 SQLPLUS를 접속하였으나, ORA-12560: TNS:프로토콜 어댑터 오류가 났다. 열심히 구글링을 하였으나, 리스너를 재시작하라는 말뿐, 리스너는 정상적으로 잘 작동되고 있었다. 이럴 경우, 확인해야 할 사항이 있는데 지금부터 알아보도록 하자.
■ Listener가 정상적으로 작동하고 있을 때 확인해야 할 사항
1. 명령 프롬프트를 실행하여, sqlplus를 접속한다.
C:\Users> sqlplus / as sysdba
2. ORA-12560: TNS:프로토콜 어댑터 오류
- 원래 이 오류는 Listener가 정상적으로 작동하고 있지 않을 때 나온다고 한다.
3. 오라클 서버, 클라이언트를 모두 설치하였기 때문에, sqlplus가 서버 sqlplus로 실행되는지, 클라이언트 것으로 실행되는지 확인해야 한다.
파일을 검색해 보면 아래와 같이 2개가 있는 것을 확인할 수 있다. (위의 것이 클라이언트, 아래의 것은 서버)
4. sqlplus로 실행해 보면, 서버는 정상적으로 접속이 되고, 클라이언트는 처음 이미지와 같이 오류가 발생하는 것을 확인할 수 있다.
5. 그럼 이제 명령 프롬프트로 실행했을 때, 서버 sqlplus로 접속되게 하는 방법은 환경변수를 수정하는 것이다.
시작에서 시스템 환경 변수 편집 메뉴로 들어간다.
6. 시스템 속성 - 고급 - 환경변수 버튼을 클릭한다.
7. 시스템 변수에서 편집 버튼을 클릭한다.
8. 환경변수 순서를 보면 클라이언트가 서버보다 위에 위치한 것을 볼 수 있다.
서버를 클라이언트 위로 이동한다.
9. 저장 후, 다시 명령프롬프트로 sqlplus를 실행해 보면, 접속이 되는 것을 확인할 수 있다.
Oracle 서버를 설치 후, 쿼리툴(DBeaver, PL/SQL Developer 등)을 이용하여 접속까지 되는 것을 확인하였다. 이후 C#에서 DB를 접속하였으나, [ORA-01017: 사용자명/비밀번호가 부적합, 로그온 할 수 없습니다.] 라는 메시지가 나오면서 접속이 되지 않았다. 해결책을 찾아보도록 하자.
어느 날 잘 되고 있던 Oracle Database가 갑자기 접속이 안 되는 현상이 발생하였다. Error Code는 ORA-01034, ORA-27101 구글링을 하여도 거의 서비스를 재시작하라는 거밖에 없었다. 모든 게 정상적으로 서비스가 올라와 있었는데 접속이 되지 않는 경우, 어떻게 해결하는지 알아보도록 하자.
■ ORA-01034, ORA-27101 에러 해결책
1. 잘 사용하고 있던 Database가 갑자기 아래 이미지와 같이 ORA-01034, ORA-27101 에러코드가 발생하면서 접속이 되지 않았다.
2. 명령 프롬프트 - sqlplus를 실행하여 sysdba로 접속한다.
>> sqlplus / as sysdba
-- 정상적으로 접속되는 경우 아래 이미지와 같이 SQL로 진입한다.
-- 접속이 되지 않는 경우 아래 이미지와 같이 ORA-12560 에러코드가 발생
3. SQL로 진입하지 못했을 경우, 명령 프롬프트에서 아래와 같이 먼저 Database를 직접 지정한다.
>> set oracle_sid=test -- test는 접속할 Database로 알맞게 변경한다.
4. 그리고 다시 명령 프롬프트에서 sqlplus / as sysdba로 다시 접속하면 SQL로 진입된다.
단, Connected to an idle instance.라는 메시지가 나온다. (휴지 인스턴스(idle instance)는 데이터베이스가 셧다운 된 상태)
5. 아래의 쿼리를 실행하면, 아래 이미지와 같이 에러가 발생한다.
SQL> SELECT INSTANCE_NAME, STATUS FROM V$INSTANCE; -- 현재 접속해 있는 Database와 상태를 확인할 수 있는 쿼리
6. startup을 실행한다. 이미 실행 중이라는 메시지가 나오면, shtdown immediate를 하고 다시 startup 한다.
아래와 같이 에러가 발생한다. (정상적인 서버도 아래 경로에 xxx.ORA파일은 없음)
SQL> startup;
7. [C:\app\aa\virtual\admin\bb\pfile]의 경로로 들어가면 [init.ora. 숫자]로 된 파일이 있는데, 이 파일을 복사하여
[C:\app\aa\virtual\product\12.2.0\dbhome_1\database] 경로 안으로 붙여 넣고 파일 이름을 [initbb.ora]로 변경한다.
(주의 : 빨간색 글씨는 Database명으로, 해당 Database를 선택하면 된다. 경로는 사용자 PC에 따라 달라진다.)
오라클 설치 후, 데이터 Import까지 하여 잘 사용하고 있었으나, 문자열을 아스키코드로 변환하는 과정에서, 과거 오라클을 설치했을 때와 다른 아스키코드 값이 나와 확인해 보니, Characterset이 다르게 설정되었다는 것을 알게 되었다. Characterset을 변경하는 방법 및 변경 과정에서 ORA-12721 에러가 발생하였는데, 이 모든 것들의 해결법을 알아보도록 하자. 이 작업을 하기 전에 데이터 Backup을 받아 놓도록 하자. (Characterset을 바꾸면 이미 저장되어 있는 한글 데이터는 깨질 수 있다.)
■ 쿼리를 통하여 아스키 값 확인
-- 아래 쿼리 실행을 통하여, 과거 설치된 버전과 현재 설치된 버전 아스키 값 확인
select ascii('가나다')
from dual
■ 아스키 값이 다르게 나오는 경우 먼저 Characterset을 확인
-- 아래 쿼리를 실행
select *
from sys.props$
where name in ('NLS_NCHAR_CHARACTERSET', 'NLS_CHARACTERSET')
-- 실행 결과
-- 이전에 설치했던 Characterset 확인
-- NLS_CHARACTERSET이 다르다.
■ Characterset 변경
1. 명령 프롬프트(cmd) 창 실행하여 아래 구문을 차례대로 실행한다.
2. sqlplus / as sysdba
3. update props$ set value$='KO16MSWIN949' where name='NLS_CHARACTERSET';
4. commit;
5. Characterset을 다시 확인하면, 아래 이미지와 바뀐 것을 볼 수 있다.
6. 아스키 값을 확인했던 쿼리를 다시 실행해 보면 아직 바뀌지 않은 것을 볼 수 있다. 서비스로 들어가서 아래 표시된 부분을 재시작한다.
(sqlplus에서 shutdown immediate; startup;으로도 가능)
그러면 아스키 값이 변경된 것을 확인할 수 있다.
7. 이후, 문제는 SQL편집 툴에서 테이블 목록을 열면 아래와 같은 메시지가 발생한다.
ORA-06552: PL/SQL: Compilation unit analysis terminated
1. DBeaver 설치 후 오라클 서버에 접속을 하려고 하니 다음과 같은 에러가 발생하였다.
Network unavailable due to a certificate issue.
Try changing the setting `Use Windows trust store` in Preferences->Connections and restart DBeaver. It might help if you haven't overridden the trust store.
javax.net.ssl.SSLHandshakeException:PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
2. 번역내용
인증서 문제로 인해 네트워크를 사용할 수 없습니다.
환경설정->연결에서 'Windows trust store 사용' 설정을 변경하고 DBeaver를 다시 시작해 보십시오. 신뢰 store를 무시하지 않았다면 도움이 될 수 있습니다.
javax.net .ssl.SSLHandshakeException:PKIX 경로 빌드 실패: sun.security.provider.certpath.SunCertPathBuilderException:요청한 대상에 대한 유효한 인증 경로를 찾을 수 없음
■ 해결책
1. 위의 에러 내용을 자세히 보면 해결책이 나와 있다.
2. [윈도우 - 설정 - 연결]로 들어가서 Security의 Use Windows trust store 체크를 해제한다.
3. 적용 후 DBeaver를 재실행한다. 그러면 오라클 서버에 잘 접속되는 것을 확인할 수 있다.
select ymd, nvl(총무과, 0) as 총무과, nvl(인사과, 0) as 인사과, nvl(전산실, 0) as 전산실 from (select a.ymd, a.dept, count(1) as cnt from (select '20230901' as ymd, '총무과' as dept from dual union all select '20230901' as ymd, '인사과' as dept from dual union all select '20230902' as ymd, '전산실' as dept from dual union all select '20230902' as ymd, '총무과' as dept from dual union all select '20230903' as ymd, '인사과' as dept from dual) a group by a.ymd, a.dept) a pivot (sum(cnt) for dept in ('총무과' as 총무과, '인사과' as 인사과, '전산실' as 전산실)) order by ymd
■ UnPivot
# Sample Query - 복사, 붙여 넣기로 테스트
select *
from (select 11 as apple, 2 as lemon, 17 as grape from dual union all
select 5 as apple, 7 as lemon, 12 as grape from dual
union all
select 8 as apple, 6 as lemon, 7 as grape from dual
union all
select 9 as apple, 2 as lemon, 9 as grape from dual
union all
select 3 as apple, 1 as lemon, 1 as grape from dual) unpivot (count for fruit in (apple, lemon, grape))