Oracle 12c는 Cloud Computing을 지향하는 Oracle의 첫 버전이다.
지금은 19c 버전까지 나와 있지만 (12c -> 18c -> 19c) 사실… 아직도 11g 버전, 심지어 9i 버전을 사용하는 기업이나 기관도 있다.
Oracle 12c가 갖는 이전 버전과의 가장 큰 차이점은 바로 멀티테넌시(multi-tenancy) 환경을 지원한다는 점이다. 오라클 에서 이야기하는 멀티테넌시란 여러개의 테넌트(tennant) 즉 여러개의 독립된 DB환경을 하나의 오라클 인스턴스에서 지원한다는 의미다.
즉 DB를 이용하는 사용자는 자기만이 오라클 DBMS를 독점하여 사용하는 것 처럼 느끼지만 실제로 하나의 오라클 인스턴스에 여러 사용자가 각기 자신만의 DB를 구축하여 개발하거나 서비스를 제공할 수 있는 것이다. 이는 물리적으로 성능좋은 서버 한대를 도입해 여러 서비스를 하나의 인스턴스에서 제공할 수 있는 장점이 있다. 게다가 하나의 인스턴스에서 여러 DB가 SGA를 비롯한 시스템 카탈로그(오라클 매뉴얼에서는 데이터딕셔너리라고 부른다.)를 공유하므로 자원을 효과적으로 활용할 수 있기도 하다.
또한 보안관점에서도 각각의 여러 DB를 관리하는 별도의 DBA 계정을 두지 않아도 되는 장점이 있다고 볼 수 있다.
CDB(Container DataBase)와 PDB(Pluggable DataBase)
Oracle 12c에서 멀티테넌시 환경을 지원하기 위해 데이터베이스 구조의 개념이 바뀌었다. 먼저 최상위에 CDB(Container DataBase)가 존재한다. 파일시스템에서 최상위 루트(/ , root) 파일시스템과 같은 위치에 있으면서 하위에 여러개의 데이터베이스를 플러거블(pluggable) 할 수 있는 데이터베이스다.
CDB는 여러 PDB의 관리를 위한 시스템카탈로그들이 위치하는 곳이기도 하며 이는 cdb$root 라는 명칭으로 불리는 컨테이너DB다. 그리고 CDB에는 pdb$seed 라는 DB도 있는데 이는 플러그인 가능한 PDB를 생성하는데 쓰이는 비어 있는 템플릿 PDB다.
물리적인 파일 관점에서의 아키텍처를 가장 잘 설명한 그림이다.
먼저 오라클 DBMS의 인스턴스를 이루는 바이너리 파일들이 존재한다. 그리고 cdb$root 로 대변되는 CDB 컨테이너 데이터베이스가 있다. CDB를 구성하는 파일들이 표시되어 있음을 알 수 있다. 여기에는 전체 오라클 인스턴스를 유지하고 관리하는데 필요한 데이터딕셔너리가 포함되어 있다.
그리고 그 아래에 실제 사용자들이 사용하는 PDB들이 플러그인 형태로 생성되거나 다른 인스턴스에서 가져와 추가될 수 있다.
다음은 메모리-프로세스 관점에서의 아키텍처 구성도다.
여러개의 PDB와 이 PDB를 포함하는 CDB가 SGA와 관련 인스턴스를 공유함을 알 수 있다. 그리고 CDB와 PDB의 구분을 CON_ID라는 식별자를 통해 구분하는 것도 알 수 있다.
PDB 활성화
이번 포스트에서는 지난번 포스트 즉 Oracle 12c 설치하기 에서 Oracle 12c 설치 시 생성한 ORAPDB라는 PDB를 이용하여 테스트 하기로 한다.
Oracle 12c 설치하기 포스트의 중간에 “DB생성 및 DB초기구성” 설정에서 ORAPDB라는 PDB를 생성하도록 하였고 PDB의 Admin 비밀번호를 PASSWORD로 설정하였다.
따라서 이미 1개의 PDB는 만들어져 있는 것이다. 만약 PDB가 없거나 새로운 PDB를 생성하려 한다면 create pluggable database ~ 문으로 생성한 뒤 진행하면 된다.
먼저 sqlplus 명령을 이용해 sysdba 권한으로 접속한다.
show pdbs; 명령을 실행하면 현재 존재하는 PDB를 보여준다. 상단의 PDB$SEED는 앞에서 설명했듯 PDB를 생성할 때 사용되어지는 비어있는 템플릿 PDB다. 그리고 CON_ID가 3인 ORAPDB가 보인다. 설치 단계에서 만든 PDB다.
ORAPDB의 OPEN MODE는 MOUNTED다. 즉 마운트만 되어 있는 상태고 OPEN이 되지 않은 상태다. 이 데이터베이스의 상태를 이해하려면 DB ADMIN 교육과정을 들으면 친절하게 가르쳐 준다.
일단 alter 명령으로 ORAPDB를 Open 한다. 그리고 나서 show pdbs 명령을 수행하면 OPEN MODE가 읽고 쓰기 가능한 상태로 변경되었음을 알 수 있다.
PDB의 Admin 계정을 찾는다. 이 계정은 설치 중 “DB생성 및 DB초기구성” 단계에서 생성해준다. 아마도 PDB$SEED 템플릿DB에 기본 설정되어 있지 않나 싶다.
PDBADMIN 이라는 USERNAME으로 PDB Admin 계정이 생성되어 있음을 알 수 있다. 참고로 오라클은 사용자 계정명 등에서는 대소문자를 구분하지 않는다.
초기 비밀번호를 PASSWORD로 했는데 변경하고자 한다면 다음과 같이 변경한다.
변경할 때 비밀번호를 ” “(큰따옴표)로 묶어주면 특수기호 등을 입력해도 오류가 나지 않는다.
dba_role_privs 테이블에서 PDBADMIN을 찾으면 다음과 같이 PDBADMIN 롤과 PDB_DBA 롤이 부여되어 있음을 알 수 있다.
여기서 조회하는 dba_users나 dba_role_privs 등 시스템카타로그는 모두 CDB$ROOT에 있음을 알아두자.
이 상태에서 다음과 같이 SQL Developer와 같이 DB직접 접속 및 조회도구에서 설정하면 원격에서 접속이 가능하다.
단, Oracle 리스너는 당연히 구동중이어야 한다. 그리고 “세부정보”에서 SID로 접속하는 것이 아니라 “서비스 이름”에 orapdb라고 입력한 뒤 “테스트(T)” 버튼을 눌렀을 때 왼쪽 하단부의 “상태 :” 에 “성공”이라는 메시지가 표시되면 정상적으로 접속이 되는 것이다.
만약 원격에서 SQL Developer로 접속이 처음이고 네트워크 관련 오류가 발생한다면 리눅스 서버나 Windows 서버의 방화벽(IPTABLE 또는 Windows Firewall) 설정을 확인해보기 바란다.
하지만 원격에서는 잘 접속이 되지만 서버의 sqlplus 명령을 통해 접속할 때는 아래 화면과 같이 아직 오류가 발생한다. 이는 Oracle 서버에 설치된 클라이언트 명령행 도구인 sqlplus가 접속할 PDB를 찾지 못하기 때문인데…
이는 sqlplus가 접속할 PDB 서비스를 식별하지 못하기 때문이다. (내가 항상 엔지니어들에게 이야기하듯 대부분의 에러 원인은 에러메시지에 답이 있다.)
즉 tnsnames.ora 에 PDB의 서비스를 등록시켜주어야 한다. 아래 화면의 주황색 박스의 내용이다.
tnsnames.ora 파일을 수정하였으므로 오라클 리스너를 중지하고 재기동 한다.
일단 중지…
다시 시작하면 이전과는 뭔가 다르다.
이제 pdbadmin 으로 접속하기 위해 sqlplus를 실행한다. 아래 화면에서는 /nolog 옵션으로 로그인하지 않고 먼저 sqlplus를 실행하고 connect 명령으로 pdb에 접속하겠다.
정상적으로 접속된다. 물론 sqlplus에서 한번에 접속도 가능하다.
show con_name 명령으로 현재 DB가 PDB임을 확인할 수 있다.
앞에서 DBA_ROLE_PRIVS를 조회하여 pdbadmin의 권한을 확인했을 때 PDB_ADMIN과 PDB_DBA 롤이 부여된 것을 알 수 있었다. 이 두개의 롤이 어느정도의 권한을 갖고 있는가를 확인하기 위해 다음과 같은 SQL들을 조회해봤다.
먼저 PDB와 CDB가 함께 사용하는 dba_users를 조회해봤다. 테이블이나 뷰가 존재하지 않는다는 메시지가 보인다. 즉 권한이 없기 때문에 “너 따위에게는 안보여줄래…”라는 의미다.
그리고 현재 접속한 PDB에서 CDB로 세션을 스위치하는 alter 명령을 실행해봤다. 권한이 불충분하다는 메시지가 나오며 전환이 되지 않는다.
CDB의 SYS 권한으로 접속했을 때(sqlplus / as sysdba 명령으로 접속한 것이 CDB에 SYS계정으로 접속한 것이다)는 PDB로 전환이 잘 된다. 이는 PDB_ADMIN과 PDB_DBA 롤을 부여받아 PDB내에서만 왕노릇을 할 수 있다는 의미다.
테스트삼아 다시 CDB에 SYS로 접속하여 pdbadmin 계정에게 grant 문으로 sysdba 권한을 부여해봤다. pdbadmin에게 sysdba 권한을 부여하니 dba_users와 같은 CDB와 PDB가 공유하는 시스템카다로그에 접근은 가능했다. (매뉴얼에서는 PDB와 공유하는 서브셋을 조회만 가능하다고 되어 있음)
[oracle@centos7 ~]$ sqlplus / as sysdba
SQL*Plus: Release 12.2.0.1.0 Production on 일 7월 12 18:23:29 2020
Copyright (c) 1982, 2016, Oracle. All rights reserved.
다음에 접속됨:
Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 – 64bit Production
SQL>
SQL> alter session set container=mypdb;
세션이 변경되었습니다.
SQL>
SQL> grant sysdba to pdba;
권한이 부여되었습니다.
SQL>
하지만 역시나 alter 명령으로 CDB로의 전환은 되지 않았다. (엄격하게는 CDB의 cdb$root 로의 전환은 불가)
이쯤 테스트를 하니 CDB와 PDB의 개념은 어렴풋이 이해가 되기 시작한다.
#oracle #pdb #cdb