OCI 콘솔을 통한 PDB 복제

장수윤·2025년 2월 13일

1. OCI 콘솔을 통한 PDB 복제

OCI 콘솔에서는 PDB 복제 기능을 제공하여 손쉽게 PDB를 복제할 수 있습니다.

복제 절차:

  1. OCI 콘솔 접속:
  • OCI 콘솔에 로그인합니다.
  1. 데이터베이스 선택:
  • 복제하려는 PDB가 포함된 CDB를 선택합니다.
  1. PDB 관리:
  • 해당 CDB의 세부 정보 페이지에서 "Pluggable Databases" 또는 "PDBs" 섹션을 찾습니다.
  1. PDB 복제:
  • 복제하려는 PDB를 선택하고, "Clone" 또는 "복제" 옵션을 선택합니다.
  • 복제할 PDB의 이름과 기타 필요한 설정을 입력한 후, 복제 작업을 시작합니다.

복제 작업이 완료되면, 새로운 PDB가 생성됩니다.

2. tnsnames.ora 파일에 새로운 PDB 등록

복제된 PDB에 접근하기 위해서는 클라이언트 측의 tnsnames.ora 파일에 새로운 PDB에 대한 연결 정보를 추가해야 합니다.

설정 방법:

  1. tnsnames.ora 파일 위치:
    일반적으로 $ORACLE_HOME/network/admin/ 디렉토리에 위치합니다.
  2. 새로운 PDB에 대한 TNS 설정 추가:
    다음과 같은 형식으로 새로운 PDB에 대한 엔트리를 추가합니다:
NEW_PDB =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = your_host)(PORT = your_port))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = new_pdb_service_name)
    )
  )
  • your_host와 your_port는 데이터베이스 서버의 호스트명과 포트 번호를, new_pdb_service_name은 복제된 PDB의 서비스 이름을 입력합니다.
  1. 설정 적용:
    tnsnames.ora 파일을 저장한 후, 클라이언트 애플리케이션에서 새로운 PDB에 접속할 수 있습니다.

3. 복제된 PDB 확인 및 검증

복제 작업이 완료되면, 다음의 뷰를 통해 새로운 PDB가 정상적으로 생성되었는지 확인할 수 있습니다:

  1. DBA_PDBS 뷰 확인:
    CDB에 접속하여 다음 쿼리를 실행합니다:
SELECT pdb_id, pdb_name, status FROM dba_pdbs;

여기서 새로운 PDB의 이름과 상태를 확인할 수 있습니다.

  1. DBA_SERVICES 뷰 확인:
    새로운 PDB에 대한 서비스가 등록되었는지 확인하기 위해 다음 쿼리를 실행합니다:
SELECT name, pdb FROM dba_services WHERE pdb = 'NEW_PDB';

해당 PDB에 연결된 서비스 이름을 확인할 수 있습니다.

  1. PDB_PLUG_IN_VIOLATIONS 뷰 확인:
    PDB 복제 시 발생한 호환성 문제나 경고를 확인하기 위해 다음 쿼리를 실행합니다:
SELECT time, name, cause, type, status, message FROM pdb_plug_in_violations WHERE name = 'NEW_PDB';

여기서 status가 'PENDING'인 항목은 아직 해결되지 않은 문제를 나타내며, 'RESOLVED'는 해결된 문제를 의미합니다.
만약 'PENDING' 상태의 항목이 있다면, 해당 문제를 해결한 후 다음과 같이 상태를 'RESOLVED'로 변경할 수 있습니다:

BEGIN
  DBMS_PDB.MARK_PLUG_IN_VIOLATIONS('NEW_PDB');
END;
/

이 작업을 통해 PDB_PLUG_IN_VIOLATIONS 뷰의 상태를 업데이트할 수 있습니다.

4. PDB 복제 시 나타났던 문제

복제를 하는데 문제가 있다면 PDB가 Restricted Mode로 열립니다. Restricted mode로는 SYS 계정만 접속이 가능합니다.

4.1 Service name conflict

아래와 같은 PDB_PLUG_IN_VIOLATIONS에 뜨면서 restricted mode로 DB가 올라왔다.

Service name or network name of service PUSHDBT_PUSHDBT.PDB1.pass.oracle.com in the PDB is invalid or conflicts with an existing service name or network name in the CDB.

원인 :

Pluggable database PDB return ORA-65149 error message if the name already exists in dba_services.

-> tobe PDB에 asis PDB의 서비스 네임이 함께 공존하고 있어서 충돌이 있는것 같습니다. asis PDB 서비스 네임을 삭제하고 다시 재기동하여 올렸습니다.

select name,network_name from DBA_SERVIECES;

해결 :

begin
DBMS_SERVICE.DELETE_SERVICE('PUSHDBT_PUSHDBT_PDB1.pass.oracle.com');

4.2 Sync failure

Sync PDB failed with ORA-65177 during 'alter user ** identified by '

원인 :

PDB와 CDB 간 동기화(Sync) 실패로 인해 발생.

동기화 실패의 주요 원인:

  • 공통 사용자(Common User) 삭제
    CDB에서 존재하는 공통 사용자가 PDB에서 삭제됨.
  • 동일한 이름의 로컬 사용자 존재
    CDB와 PDB에 동일한 사용자 계정이 존재할 경우 충돌 발생.
  • PDB 생성 또는 복제(Duplicate PDB)
    새로운 PDB를 만들거나 복제하는 과정에서 발생.

해결 :

PDB의 동기화 문제를 해결하려면 CDB와 PDB의 PDB_SYNC$ 테이블에서 오류를 유발하는 SQL 문을 삭제해야 함.

1) CDB에서 PDB_SYNC$ 테이블 백업 및 수정

-- SYSDBA 권한으로 CDB$ROOT에 접속
sqlplus / as sysdba

-- PDB_SYNC$ 테이블에서 오류가 있는 SQL 문 확인
SQL> SELECT CTIME, SQLSTMT, NAME, FLAGS, OPCODE, REPLAY# FROM PDB_SYNC$;

-- 백업 테이블 생성
SQL> CREATE TABLE BKPPDB_SYNC$ AS SELECT * FROM PDB_SYNC$;

-- 오류를 유발하는 ALTER USER 문 삭제
SQL> DELETE FROM PDB_SYNC$ WHERE SQLSTMT LIKE ('%alter user "xxx"%');

-- 변경사항 반영
SQL> COMMIT;

2) PDB에서 PDB_SYNC$ 테이블 백업 및 수정

-- PDB로 컨테이너 변경
SQL> ALTER SESSION SET CONTAINER=PDB1;

-- PDB_SYNC$ 테이블에서 오류가 있는 SQL 문 확인
SQL> SELECT CTIME, SQLSTMT, NAME, FLAGS, OPCODE, REPLAY# FROM PDB_SYNC$;

-- 백업 테이블 생성
SQL> CREATE TABLE BKPPDB_SYNC$ AS SELECT * FROM PDB_SYNC$;

-- 오류를 유발하는 ALTER USER 문 삭제
SQL> DELETE FROM PDB_SYNC$ WHERE SQLSTMT LIKE ('%alter user "xxx"%');

-- 변경사항 반영
SQL> COMMIT;

3) PDB 재시작

-- CDB$ROOT로 돌아가기
SQL> ALTER SESSION SET CONTAINER=CDB$ROOT;

-- PDB 닫기
SQL> ALTER PLUGGABLE DATABASE PDB1 CLOSE;

-- PDB 열기
SQL> ALTER PLUGGABLE DATABASE PDB1 OPEN;

5. 주의사항: PDB 복제 시 원본 PDB 재기동

PDB 복제 작업을 수행할 때, 원본 PDB도 재기동될 수 있습니다. 이는 복제 과정에서 원본 PDB의 상태에 영향을 미칠 수 있으므로, 작업 전에 이를 고려하여 계획을 수립해야 합니다.

주의사항:

작업 시간대 선택:
원본 PDB의 재기동으로 인한 서비스 중단을 최소화하기 위해, 시스템 사용량이 적은 시간대를 선택하여 복제 작업을 수행하는 것이 좋습니다.

📌출처
https://support.oracle.com/epmos/faces/DocumentDisplay?_afrLoop=350674867904478&parent=EXTERNAL_SEARCH&sourceId=PROBLEM&id=2503982.1&_afrWindowMode=0&_adf.ctrl-state=132jjul9tw_4

profile
oracle db

0개의 댓글