OCI 콘솔에서는 PDB 복제 기능을 제공하여 손쉽게 PDB를 복제할 수 있습니다.
복제 작업이 완료되면, 새로운 PDB가 생성됩니다.
복제된 PDB에 접근하기 위해서는 클라이언트 측의 tnsnames.ora 파일에 새로운 PDB에 대한 연결 정보를 추가해야 합니다.
설정 방법:
tnsnames.ora 파일 위치:NEW_PDB =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = your_host)(PORT = your_port))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = new_pdb_service_name)
)
)
복제 작업이 완료되면, 다음의 뷰를 통해 새로운 PDB가 정상적으로 생성되었는지 확인할 수 있습니다:
DBA_PDBS 뷰 확인:SELECT pdb_id, pdb_name, status FROM dba_pdbs;
여기서 새로운 PDB의 이름과 상태를 확인할 수 있습니다.
DBA_SERVICES 뷰 확인:SELECT name, pdb FROM dba_services WHERE pdb = 'NEW_PDB';
해당 PDB에 연결된 서비스 이름을 확인할 수 있습니다.
PDB_PLUG_IN_VIOLATIONS 뷰 확인: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 뷰의 상태를 업데이트할 수 있습니다.
복제를 하는데 문제가 있다면 PDB가 Restricted Mode로 열립니다. Restricted mode로는 SYS 계정만 접속이 가능합니다.
아래와 같은 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');
Sync PDB failed with ORA-65177 during 'alter user ** identified by '
PDB와 CDB 간 동기화(Sync) 실패로 인해 발생.
동기화 실패의 주요 원인:
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;
PDB 복제 작업을 수행할 때, 원본 PDB도 재기동될 수 있습니다. 이는 복제 과정에서 원본 PDB의 상태에 영향을 미칠 수 있으므로, 작업 전에 이를 고려하여 계획을 수립해야 합니다.
주의사항:
작업 시간대 선택:
원본 PDB의 재기동으로 인한 서비스 중단을 최소화하기 위해, 시스템 사용량이 적은 시간대를 선택하여 복제 작업을 수행하는 것이 좋습니다.