AWS 기술 블로그

Amazon RDS Custom for Oracle에서 데이터베이스 재생성 하기

업데이트 : 2022년 12월부터 서울리전에서도 RDS Custom for Oracle을 사용할 수 있게 되었습니다.

Amazon RDS Custom for Oracle는 데이터베이스 관리자가 데이터베이스 서버와 운영 체제에 직접 접근하여 특정 데이터베이스 패치를 적용하거나 데이터베이스 서버의 환경 설정을 변경할 수 있습니다. 또한 Amazon RDS의 자동화된 백업 및 복구를 통해 데이터베이스 관리 작업을 단순화합니다.

이 블로그를 포스팅하는 시점까지 RDS Custom for Oracle DB 인스턴스를 생성할 때, 파라미터 그룹, 옵션 그룹, 그리고 Character Set을 사용자가 지정할 수 없습니다. 그러나, 경우에 따라서는 특정 Character Set이 요구되기도 합니다. 예를 들면, Oracle XTTS(Cross Platform Transportable Tablespace)를 이용한 마이그레이션을 할 때는 타겟 데이터베이스의 Character Set은 소스 데이터베이스의 Character Set과 동일해야 하는 제약조건이 있습니다. 이 경우, 우리는 RDS Custom에서 생성되는 기본 데이터베이스를 삭제한 후, 오라클 데이터베이스를 재생성 해야 할 필요가 있습니다.

이 블로그 포스트에서는 기본 RDS Custom for Oracle DB를 생성한 이후, RDS Custom의 지원경계(Support Perimeter) 내에서Oracle Database를 재생성하는 방법을 소개합니다. 그리고, 다음 블로그에서는 Oracle XTTS를 이용하여 RDS Custom for Oracle DB로 마이그레이션하는 방법을 다룰 예정입니다.

솔루션 개요

이 블로그 포스트에서는 RDS Custom for Oracle에서 기본적으로 생성되는 데이터베이스를 삭제하고, 여러분이 원하는 Character Set을 지정하여 새로운 데이터베이스를 생성하는 방법을 살펴보겠습니다. RDS Custom for Oracle DB의 기본 Character Set은 US7ASCII입니다.

사전 준비사항

이 블로그 포스트에서는 사전에 아래와 같은 사항이 준비되어야 합니다.

Amazon RDS Custom for Oracle DB 인스턴스 생성

이 단계는 Amazon RDS Custom for Oracle DB 인스턴스를 생성하는 단계입니다. RDS Custom을 생성하기 위해서는 먼저 Custom Engine Version(CEV)을  등록해야 합니다.

Amazon RDS Custom for Oracle 인스턴스를 생성하는 방법은 여기를 참조하세요.

Amazon RDS Custom for Oracle DB 재생성하기

이 블로그 포스트는 Oracle XTTS를 이용한 데이터베이스 마이그레이션 사전 설정 단계로 가정하고 기술합니다.

Oracle XTTS 마이그레이션 방법은 소스 데이터베이스와 타겟 데이터베이스 간에 동일한 Timezone Patch와 동일한 Character Set(National Character Set 포함)을 요구합니다. 따라서, 마이그레이션을 진행하기 전에, 타겟 데이터베이스는 소스 데이터베이스와 동일한 Character Set과 Timezone Patch를 가지도록 재생성 해야 합니다.

RDS Custom for Oracle에 SSH로 접속하여 Character Set과 Timezone Patch를 확인합니다.
RDS Custom DB 인스턴스에 SSH로 접속하는 방법은 여기를 참조합니다.

sudo su - rdsdb 
sqlplus / as sysdba 
SQL> col parameter for a30 
SQL> col value for a15 
SQL> select parameter, value from nls_database_parameters where parameter like '%CHARACTERSET'; 
SQL> select version from v$timezone_file;

1. RDS Custom automation mode를 “Paused(중지)”로 변경합니다.

RDS Custom DB 인스턴스를 변경하기 전에 반드시, RDS Custom Automation Mode를 Paused로 변경해야 합니다. 그렇지 않은 경우, RDS Custom의 상태가 Unsupported configuration 상태로 변경될 수 있습니다.

Automation을 중지할 수 있는 시간은 최대 24시간입니다. 만약, 더 오랜 데이터베이스 유지보수 시간이 필요한 경우, Automation 중지 기간을 계속 연장해야 합니다.

2. 기존 데이터베이스의 초기화 파라미터 파일을 복사합니다.

RDS Custom DB 인스턴스 생성시 만들어진 데이터베이스의 초기화 파라미터를 백업합니다.

sudo su - rdsdb
sqlplus / as sysdba
SQL> create pfile from spfile;
Comment out the *.spfile line in init<SID>.ora

3. 기존 데이터베이스 인스턴스를 삭제합니다.

sudo su - rdsdb
sqlplus / as sysdba
SQL> shutdown immediate
SQL> startup mount exclusive restrict
SQL> drop database;

기존 데이터베이스를 삭제하면, RDS Custom이 일시적으로 “Unsupported Configuration“상태로 변경될 수 있지만, RDSADMIN과 Master User가 재생성 된 후에는 정상적인 상태로 돌아옵니다.

4. RDS Custom for Oracle DB인스턴스를 재생성하는 스크립트를 저장합니다.

DB생성 스크립트(crdb.sql)를 여기에서 다운로드한 후, CHARACTER SET, NATIONAL CHARACTER SET의 값을 변경하고, ORCL은 RDS Custom for Oracle을 생성했을 때 지정했던 SID와 동일한 값으로 변경합니다.

수정된 crdb.sql 파일을RDS Custom for Oracle 인스턴스에 복사합니다.

5. RDS Custom for Oracle에 필요한 디렉토리를 생성합니다.

<SID>는 RDS Custom for Oracle을 생성했을 때 지정했던 SID와 동일한 값으로 변경합니다.

sudo su - rdsdb
mkdir -p /rdsdbdata/db/<SID>_A/{datafile,onlinelog,controlfile}

6. 환경변수 ORA_TZFILE 을 설정합니다.(선택사항)

만약 마이그레이션을 위한 타겟 데이터베이스로서 RDS Custom을 구성하는 중이라면, 소스 데이터베이스와 동일한 Timezone version으로 타겟 데이터베이스를 만들기 위해 DB 재생성 전에 ORA_TZFILE 환경변수를 설정합니다.

sudo su - rdsdb
export ORA_TZFILE=$ORACLE_HOME/oracore/zoneinfo/timezlrg_<source timezone version>.dat

7. RDS Custom for Oracle DB 인스턴스를 재생성합니다.

sqlplus / as sysdba
SQL> startup nomount pfile=/rdsdbbin/oracle/dbs/init<SID>.ora
SQL> @crdb.sql
SQL> create spfile from pfile
SQL> shutdown immediate
SQL> startup

8. Default Profile을 변경합니다.

sqlplus / as sysdba
set echo on feedback on serverout on
@?/rdbms/admin/utlpwdmg.sql

ALTER PROFILE DEFAULT
LIMIT
FAILED_LOGIN_ATTEMPTS UNLIMITED
PASSWORD_LIFE_TIME UNLIMITED
PASSWORD_VERIFY_FUNCTION NULL;

9. RDSADMIN과 Master User를 생성하고, 권한을 부여합니다.

RDSADMIN User의 패스워드는 Secrets Manager Console에서 Secret name, do-not-delete-rds-custom-db-*에서 확인할 수 있습니다.

Master User의 패스워드는 RDS Custom 인스턴스를 생성할 때 사용했던 것과 동일한 것이어야 합니다.

sudo su - rdsdb
sqlplus / as sysdba

CREATE OR REPLACE DIRECTORY "OPATCH_INST_DIR" AS '/rdsdbbin/oracle.19.0.spiderman.r1.EE.1/OPatch';
CREATE OR REPLACE DIRECTORY "OPATCH_LOG_DIR" AS '/rdsdbbin/oracle.19.0.spiderman.r1.EE.1/QOpatch';
CREATE OR REPLACE DIRECTORY "OPATCH_SCRIPT_DIR" AS '/rdsdbbin/oracle.19.0.spiderman.r1.EE.1/QOpatch';

CREATE PROFILE "RDSADMIN"
LIMIT
   COMPOSITE_LIMIT UNLIMITED
   SESSIONS_PER_USER UNLIMITED
   CPU_PER_SESSION UNLIMITED
   CPU_PER_CALL UNLIMITED
   LOGICAL_READS_PER_SESSION UNLIMITED
   LOGICAL_READS_PER_CALL UNLIMITED
   IDLE_TIME UNLIMITED
   CONNECT_TIME UNLIMITED
   PRIVATE_SGA UNLIMITED
   FAILED_LOGIN_ATTEMPTS 10
   PASSWORD_LIFE_TIME UNLIMITED
   PASSWORD_REUSE_TIME UNLIMITED
   PASSWORD_REUSE_MAX UNLIMITED
   PASSWORD_VERIFY_FUNCTION NULL
   PASSWORD_LOCK_TIME 86400/86400
   PASSWORD_GRACE_TIME 604800/86400
   INACTIVE_ACCOUNT_TIME DEFAULT ;

CREATE USER <Master username> IDENTIFIED BY <Master user's password>
DEFAULT TABLESPACE "USERS"
TEMPORARY TABLESPACE "TEMP";

CREATE USER RDSADMIN IDENTIFIED BY <RDSADMIN's password>
DEFAULT TABLESPACE "RDSADMIN"
TEMPORARY TABLESPACE "TEMP"
PROFILE "RDSADMIN";

GRANT "CONNECT" TO "RDSADMIN" WITH ADMIN OPTION;
GRANT "RESOURCE" TO "RDSADMIN" WITH ADMIN OPTION;
GRANT "DBA" TO "RDSADMIN";
GRANT "SELECT_CATALOG_ROLE" TO "RDSADMIN" WITH ADMIN OPTION;

GRANT "DBA" TO <Master username>;
GRANT UNLIMITED TABLESPACE TO <Master username>;

GRANT ALTER SYSTEM TO "RDSADMIN";
GRANT UNLIMITED TABLESPACE TO "RDSADMIN";
GRANT SELECT ANY TABLE TO "RDSADMIN";
GRANT ALTER DATABASE TO "RDSADMIN";
GRANT ADMINISTER DATABASE TRIGGER TO "RDSADMIN";
GRANT GRANT ANY OBJECT PRIVILEGE TO "RDSADMIN" WITH ADMIN OPTION;
GRANT INHERIT ANY PRIVILEGES TO "RDSADMIN";

ALTER USER <Master username> DEFAULT ROLE ALL;
ALTER USER "RDSADMIN" DEFAULT ROLE ALL;

10. Data Dictionary와 System Package를 생성합니다.

sudo su - rdsdb
sqlplus / as sysdba
set echo on feedback on serverout on
@?/rdbms/admin/catalog.sql
@?/rdbms/admin/catproc.sql
@?/rdbms/admin/caths.sql
@?/rdbms/admin/catexp7.sql
@?/rdbms/admin/catparr.sql
@?/rdbms/admin/catoctk.sql
@?/rdbms/admin/dbmspool.sql
@?/rdbms/admin/userlock.sql
@?/rdbms/admin/catblock.sql
@?/rdbms/admin/catobtk.sql
@?/rdbms/admin/utlrp
alter user SYS profile RDSADMIN;
alter user SYSTEM profile RDSADMIN;
alter user DBSNMP profile RDSADMIN;
exit;
sqlplus system/<system password>
@?/sqlplus/admin/pupbld.sql
@?/sqlplus/admin/help/hlpbld.sql helpus.sql

11. datapatch를 실행합니다.

$ORACLE_HOME/OPatch/datapatch -verbose

12. RDS Custom for Oracle DB에서 Character Set과 Timezone file을 확인합니다.

만약 마이그레이션을 위한 타겟 데이터베이스로서 RDS Custom을 구성하는 중이라면, 소스 데이터베이스와 동일한 Character Set과 Timezone version으로 설정되었는지 확인합니다.

sqlplus / as sysdba
SQL> col parameter for a30
SQL> col value for a15
SQL> select parameter, value from nls_database_parameters where parameter like '%CHARACTERSET';
SQL> select version from v$timezone_file;

13. DB Registry를 확인합니다.

select COMP_NAME,VERSION,STATUS from dba_registry;

RDS Custom Automation 모드로 변경하기

모든 변경 작업이 완료된 이후에는 RDS Custom Automation 모드를  Full Automation으로 변경합니다.

리소스 정리하기

이 블로그 포스트에서 사용했던 아래 리소스는 향후 불필요한 과금을 방지하기 위해 삭제해야 합니다.

결론

이 블로그 포스트에서는 RDS Custom for Oracle DB의 기본 Character Set과 Timezone을 변경하고자 할 때, 기존 RDS Custom for Oracle DB를 삭제한 후, 재생성하는 방법에 대해 살펴 보았습니다. 이 방법은 Oracle XTTS를 이용한 오라클 데이터베이스 마이그레이션시에 사전 셋업 단계로도 활용될 수 있습니다.

다음 블로그에서는 “Oracle XTTS를 사용하여 최소 다운타임으로 RDS Custom for Oracle로 마이그레이션 하기” 를 다룰 예정입니다.

Incheol Roh

Incheol Roh

Incheol Roh is a Solutions Architect based in Seoul. With database and data analytics experience in various industries, he has been working with his customers to build efficient architectures to help them achieve data-driven business outcomes. 노인철 솔루션즈 아키텍트는 다양한 산업 군에서 데이터베이스와 데이터 분석 경험을 바탕으로 고객이 데이터 기반의 비즈니스 성과를 달성할 수 있도록 고객과 함께 효율적인 아키텍처를 구성하는 역할을 수행하고 있습니다.