OCI ADB 인스턴스로 새로운 ADB 데이터베이스 복제
OCI Autonomous Database 서비스(이하 OCI ADB)는 데이터베이스 데이터를 그대로 복제하여 새로운 데이터베이스를 생성하는 데이터베이스 복제(Clone) 기능을 제공합니다. 데이터베이스를 운영하다 보면 다양한 이유로 복제 데이터베이스를 만들 필요가 있습니다. 원본 데이터베이스를 일회성 복제하는 것으로 끝날 수도 있지만, 때로는 복제한 데이터베이스가 계속 원본 데이터베이스와 동기화돼야 하는 경우도 있습니다. OCI ADB는 전체 데이터베이스를 복제하는 “Full Clone“과 지속해서 원본 데이터베이스의 변경분을 동기화하는 “Refreshable Clone“을 모두 지원합니다.
이 문서는 작성일(2020.11.15)을 기준으로 OCI Autonomous Database의 데이터베이스 복제 기능을 소개합니다. 시점에 따라서 해당 기능은 변경되거나 업그레이드 될 수 있습니다. 문서를 확인하실 때 기준일을 고려해 주시기 바랍니다. 해당 기능에 대한 정확한 최신 정보는 “참고문서” 링크를 참조하시기 바랍니다.
OCI Autonomous Database
우선 OCI ADB에 대해서 간단히 소개하겠습니다. OCI의 Autonomous Database 서비스(ADB)는 자율 운영을 표방하는 데이터베이스 서비스입니다. 시스템 및 데이터베이스 관리자의 Oracle DB 운영 부담을 최소화하면서 기존 Oracle Database 활용 경험을 클라우드에서 그대로 활용하는 것을 목표로 합니다. On-Prem의 Exadata 기술 스택을 클라우드화하고 운영/관리 부담을 줄이는 진보적인 Oracle Database 클라우드 PaaS입니다.
OCI ADB는 데이터베이스 사용 형태(Workload)에 따라 3가지 유형으로 구분됩니다. 각 유형 ADB 인스턴스를 생성할 때 공용 인프라와 전용 인프라를 지정할 수 있습니다.
ADB Workload 유형
ADB는 사용 방식에 따라서 3가지 Workload를 제공합니다.
Workload 유형 | ADB 운영 | 설명 |
---|---|---|
DW | ADW(Autonomous Data Warehuse) | 분석 및 데이터 웨어하우스 작업용으로 DB 생성. 대용량 데이터에 대한 빠른 질의를 제공. |
OLPT | ATP(Autonomous Transaction Processing) | 트랜잭션 작업용으로 DB 생성, 단기 실행 질의 및 트랜잭션에 대한 높은 동시성을 제공. |
JSON Document | Autonomous JSON Database | JSON 중심 애플리케이션 개발용으로 구축. 개발자에게 친숙한 문서 API 및 JSON 스토리지를 제공 |
ADB 인스턴스 생성에는 3-4분 정도가 걸립니다. ADB는 다음과 같은 특징을 갖습니다.
- 인프라 용량
- CPU: 1 ~ 128개 설정 가능
- 스토리지: 1 ~ 128TB 지정 가능(압축적용)
- 온라인 상태 Scale-In/Scale-Out 지원
- CPU, 스토리지 개별적인 확장/축소 지원
- Scale-In/Scale-Out 중 DB는 정상적인 운영 상태로 유지
- 필요하지 않으면 Database 셧다운 지원
- 셧다운 중 CPU 과음 중지
- 스토리지 과금만 적용됨
- 과금은 초 단위 자원 사용량 과금
- 데이터베이스 패치 및 업그레이드 자동적용
ADB는 Exadata Stack을 기반으로 만들어졌습니다. Exadata Stack은 Exadata를 OCI에 통합한 인프라입니다. On-Prem에서 검증된 Exadata 스택을 기반으로 데이터 운영 유형에 따라서 ADW, ATP, JSON 3가지 데이터베이스 유형을 사전 정의한 형태로 제공합니다.
ADB 데모 인스턴스
아래는 데모로 사용할 ADW 인스턴스입니다. 다음 이미지는 OCI Console에서 ADW 인스턴스로 이동하고, 생성한 ADW 인스턴스(SourceDB)의 상제 정보를 확인하는 과정을 설명합니다.
위 이미지에서 SourceDB는 Oracle 19c 버전으로 읽기/쓰기 상태이며, 공용 인프라 위에 생성된 인스턴스임을 확인할 수 있습니다.
OCI ADB 인스턴스 클론 유형
OCI ADB 인스턴스는 3가지 형태의 Clone을 지원합니다.
복제 유형 | 설명 |
---|---|
Full Clone | 소스 데이터베이스의 전체 메타데이터와 데이터를 복제 |
Refreshable Clone | Source DB를 복제, 지속적인 동기화 가능한 Read-only DB 생성, 7일 이상 복제하지 않으면 Source Database와 연결 끊김 |
Metadata Clone | Source 데이터베이스의 스키마 정보를 복제, 데이터를 복제하지는 않음 |
OCI ADB 클론: Full Clone
ADB를 “Full Clone” 옵션으로 복제 할 경우, 전체 스키마와 데이터가 모두 복제됩니다. OCI Console에서 Full Clone을 선택할 경우 두 개 복제 방식을 지정할 수 있습니다.
“Clone from Database Instane“를 지정하면 소스 ADB 인스턴스의 현재 시점을 그대로 복제합니다. “Clone from a backup“을 지정할 경우 복구 시간을 지정할 수도 있고 복제 대상 백업을 지정할 수도 있습니다.
ADB 인스턴스를 복제하는 동안에도 원본 데이터베이스는 정상적으로 동작합니다.
ADB 복제 인스턴스는 다음과 같이 읽기/쓰기 모드로 만들어집니다.
OCI ADB 클론: Refreshable Clone
ADB를 Refreshable Clone으로 복제할 경우 소스 인스턴스의 전체 스키마와 데이터가 현재 시점을 기준으로 복제됩니다. 우선 Refreshable Clone를 만드는 과정을 소개합니다.
Refreshable Clone 생성 절차
다음 이미지는 복제 대상이 되는 “SourceDB“의 인스턴스 정보입니다. SourceDB의 상세 페이지에서 “More Action” >> “Create Clone“을 실행합니다.
“Create Autonomous Database Clone” 페이지에서 클론 타입으로 “Refreshable Clone“을 선택하고 데이터베이스 이름을 “Refreshable Clone of SourceDB“라고 설정합니다. 나머지는 기본값을 그대로 유지하면서 “Create Autonomous Database Clone” 버튼을 클릭합니다.
다음 이미지는 앞에서 생성한 ADB 인스턴스의 상세 페이지입니다. ADB 인스턴스 상세 페이지에서 다음과 같은 정보를 확인할 수 있습니다.
- 데이터베이스 이름: Refreshable DB for SourceDB
- 데이터베이스 모드: Read Only
- 소스 데이터베이스: SourceDB
Refreshable Clone에 테이블 생성
Refreshable Clone 데이터베이스에 테이블을 생성해 보겠습니다. ADB 서비스 콘솔에서 제공하는 “SQL Developer Web“을 실행합니다.
소스 데이터베이스의 Admin 계정 패스워드를 입력합니다. 소스 데이터베이스를 모두 복제하기에 사용자 계정 및 인증 정보가 동일하게 적용됩니다.
“SQL Developer Web“에서 Create Table 문을 실행하면 다음 이미지와 같이 에러가 출력됩니다. 현재 데이터베이스는 Read Only 모드 생태입니다.
소스 데이터베이스 변경
소스 데이터베이스(SourceDB)에 변경 만들기 위해서, DEMO 테이블을 생성하고 데이터를 1건 입력하겠습니다. “SQL Developer Web“을 실행하고 다음 쿼리를 실행합니다.
create table demo (message varcahr(255));
insert into demo values('앞으로 refreshable db에 반영될 데이터입니다.')
위 스크립트를 실행하면 다음과 같이 DEMO 테이블을 쿼리할 수 있습니다.
Refreshable DB 동기화(From SourceDB)
소스 데이터베이스의 변경 내용을 Refreshable Clone 인스턴스에 반영하기 위햐서 ADB 인스턴스 상세페이지에서 “More Action” >> “Create Clone“을 실행합니다.
동기화 기준 시간을 UTC(협정세계시)로 설정합니다. 설정한 시간까지 소스 데이터베이스의 변경 사항을 복제 데이터베이스에 동기화합니다. 설정 가능한 시간 범위는 최소 현재 시간 1분 전이고 최대 7일(168시간)까지 설정 가능합니다. 최대 7일 전 소스 데이터베이스 상태를 Refreshable DB에 반영시킬 수 있습니다. “Refresh Clone” 버튼을 클릭하면 동기화 작업이 수행됩니다.
위 이미지와 같이 “Refresh Clone” 버튼을 클릭하면, 복제 데이터베이스 상태는 “Updating” 상태로 전환됩니다.
복제 데이터베이스 상태가 “Updating” 상태에서도 데이터베이스는 정상적으로 동작합니다. 쿼리를 수행할 수 있습니다.
복제 데이터베이스에 동기화 작업이 완료되면, 상태는 “Updating”에서 “Available”로 전환됩니다. 그리고 소스의 변경 사항이 복제 데이터베이스에 동기화되었다는 사실은 클론 데이터베이스에서 DEMO 테이블 쿼리가 수행되는 것으로 확인할 수 있습니다.
Refreshable DB 주기적 동기화
Refreshable DB 인스턴스를 소스 데이터베이스와 동기화시키기 위해서는 수작업이 필요합니다. OCI Console을 사용한다면 다음 이미지와 같이 ADB 상세 페이지에서 다음 메뉴 링크를 실행해야 합니다.
이 작업을 주기적으로 자동화하려면, OCI CLI 명령을 실행하거나 OCI SDK로 코드를 작성하면 됩니다. OCI CLI를 사용할 경우 다음 명령을 실행하면 Refreshable DB 인스턴스를 소스 데이터베이스와 동기화하는 작업이 실행됩니다.
oci db autonomous-database manual-refresh \
> --autonomous-database-id [[ADB-OCID]] \
> --time-refresh-cutoff '2020-11-15 12:13'
위 이미지는 Refreshable DB 인스턴스 동기화 작업을 실행하는 OCI CLI 명령을 OCI Shell에서 실행한 모습입니다. 위 명령이 실행되면 ADB 인스턴스가 Updating 상태로 변환되는 것을 확인할 수 있습니다. 다음은 위 명령을 실행한 전체 결과입니다.
taewan_kim@cloudshell:~ (ap-seoul-1)$ oci db autonomous-database manual-refresh \
> --autonomous-database-id ocid1.autonomousdatabase.oc1.ap-seoul-1.abuwgljr4eha4zktjqayrjxabjgnlxskf5qlapfcmu5i4cvfvswfni5yi5qq \
> --time-refresh-cutoff '2020-11-15 12:13'
{
"data": {
"autonomous-container-database-id": null,
"available-upgrade-versions": [],
"compartment-id": "ocid1.compartment.oc1..aaaaaaaaihv5qjkvzwovuc6bwm32ikrjjtz3syuevn47b44ssikueho2umxq",
"connection-strings": {
"all-connection-strings": {
"HIGH": "adb.ap-seoul-1.oraclecloud.com:1522/yh0olybn5pqce4n_db202011141820_high.adb.oraclecloud.com",
"LOW": "adb.ap-seoul-1.oraclecloud.com:1522/yh0olybn5pqce4n_db202011141820_low.adb.oraclecloud.com",
"MEDIUM": "adb.ap-seoul-1.oraclecloud.com:1522/yh0olybn5pqce4n_db202011141820_medium.adb.oraclecloud.com"
},
"dedicated": null,
"high": "adb.ap-seoul-1.oraclecloud.com:1522/yh0olybn5pqce4n_db202011141820_high.adb.oraclecloud.com",
"low": "adb.ap-seoul-1.oraclecloud.com:1522/yh0olybn5pqce4n_db202011141820_low.adb.oraclecloud.com",
"medium": "adb.ap-seoul-1.oraclecloud.com:1522/yh0olybn5pqce4n_db202011141820_medium.adb.oraclecloud.com"
},
"connection-urls": {
"apex-url": null,
"machine-learning-user-management-url": null,
"sql-dev-web-url": "https://YH0OLYBN5PQCE4N-DB202011141820.adb.ap-seoul-1.oraclecloudapps.com/ords/admin/_sdw/?nav=worksheet"
},
"cpu-core-count": 1,
"data-safe-status": "NOT_REGISTERED",
"data-storage-size-in-tbs": 1,
"db-name": "DB202011141820",
"db-version": "19c",
"db-workload": "DW",
"defined-tags": {
"CostTracking": {
"CostCenter": "Cloud-Specialist"
},
"Oracle-Tags": {
"CreatedBy": "oracleidentitycloudservice/taewan.kim@oracle.com"
}
},
"display-name": "Refreshable Clone of SourceDB`",
"failed-data-recovery-in-seconds": null,
"freeform-tags": {},
"id": "ocid1.autonomousdatabase.oc1.ap-seoul-1.abuwgljr4eha4zktjqayrjxabjgnlxskf5qlapfcmu5i4cvfvswfni5yi5qq",
"infrastructure-type": null,
"is-auto-scaling-enabled": true,
"is-data-guard-enabled": false,
"is-dedicated": false,
"is-free-tier": false,
"is-preview": false,
"is-refreshable-clone": true,
"key-store-id": null,
"key-store-wallet-name": null,
"license-model": "BRING_YOUR_OWN_LICENSE",
"lifecycle-details": null,
"lifecycle-state": "UPDATING",
"nsg-ids": null,
"open-mode": "READ_ONLY",
"operations-insights-status": "NOT_ENABLED",
"permission-level": "UNRESTRICTED",
"private-endpoint": null,
"private-endpoint-ip": null,
"private-endpoint-label": null,
"refreshable-mode": "MANUAL",
"refreshable-status": "REFRESHING",
"role": null,
"service-console-url": "https://adb.ap-seoul-1.oraclecloud.com/console/index.html?tenant_name=OCID1.TENANCY.OC1..AAAAAAAA6MA7KQ3BSIF76UZQIDV22CAJS3FPESGPQMMSGXIHLBCEMKKLRSQA&database_name=DB202011141820&service_type=ADW",
"source-id": "ocid1.autonomousdatabase.oc1.ap-seoul-1.abuwgljrvwuaglnw4kzkfynzuginjnojvzmjvo45nwagkimgze7nwqzs4bdq",
"standby-db": null,
"subnet-id": null,
"system-tags": {},
"time-created": "2020-11-14T09:21:43.091000+00:00",
"time-deletion-of-free-autonomous-database": null,
"time-maintenance-begin": "2020-11-21T07:00:00+00:00",
"time-maintenance-end": "2020-11-21T11:00:00+00:00",
"time-of-last-failover": null,
"time-of-last-refresh": "2020-11-15T12:23:11.628000+00:00",
"time-of-last-refresh-point": "2020-11-15T02:38:01+00:00",
"time-of-last-switchover": null,
"time-of-next-refresh": null,
"time-reclamation-of-free-autonomous-database": null,
"used-data-storage-size-in-tbs": 1,
"whitelisted-ips": null
},
"etag": "708184d8",
"opc-work-request-id": "ocid1.coreservicesworkrequest.oc1.ap-seoul-1.abuwgljrczt7lq4c6quxvifmuzn5zydgai4ai72ha5n733at5btgymrlr3fq"
}
taewan_kim@cloudshell:~ (ap-seoul-1)$
Refreshable DB 원본과 단절
앞에서 설명한 것처럼 Refreshable DB는 소스 데이터베이스와 동기화되는 방법을 제공하는 ADB 인스턴스입니다. 다음과 같은 두 가지 상황에서 Refreshable DB와 원본 데이터베이스의 동기화 연결은 끊어집니다.
- 7일 이상 Refresh Clone을 수행하지 않을 경우
- “Disconnect Clone from Source Database” 실행
Refreshable DB 동기화는 Source DB의 백업 파일과 리두로그(redo log) 파일로 수행됩니다. Source DB가 “Refresh Clone“을 위하여 유지하는 백업 데이터 유지 기간은 7일입니다. 따라서 7일간 “Refresh Clone“을 수행하지 않으면 소스와 Refreshable 복제 데이터베이스의 연결은 끊어집니다. 이 경우에 Refreshable 복제 데이터베이스는 Read only 모드에서 Read/Write 모드로 전환됩니다.
다음 이미지와 같이 “More Action” >> “Disconnect Clone from Source Database“을 실행하면, Refreshable 복제 데이터베이스의 연결을 끊을 수 있습니다.
“More Action” >> “Disconnect Clone from Source Database“를 실행하면, 두 데이터베이스의 동기화 연결을 끊은 작업에 대한 재확인을 요구하는 팝업이 출력됩니다. 이 팝업은 현재 작업의 의미를 설명/확인하고, 소스 데이터베이스 명을 입력을 요청합니다.
소스 데이터베이스 명을 입력하고, “Disconect Refreshable Clone” 버튼을 클릭하면, ADB 인스턴스는 다음과 같이 “Updating” 상태로 전환됩니다. 물론 이 상태에서도 데이터베이스는 정상적으로 운영됩니다.
“Updating” 상태에서 “Available” 상태로 전환되면, 복제 데이터베이스 모드가 “Read/Write”모드로 전환됩니다. 이제 복제 데이터베이스에서 테이블 생성 및 데이터 변환 작업을 수행할 수 있습니다.
Refreshable DB가 소스 데이터베이스와 동기화 연결이 끊어지면, 다시는 소스 데이터베이스와 동기화 연결을 복구할 수 없습니다.
요약
Autonomous DB는 데이터베이스를 복제하는 편리한 방법을 제공합니다. Full Clone과 Refreshable Clone을 통해서 소스 데이터베이스의 특정 시점 상태를 복제할 수 있습니다.
이 중에서 Refreshable Clone은 일회성 복제가 아닌, 지속적인 동기화 방법을 제공합니다. Refreshable Clone은 다음과 같은 특징을 갖습니다.
- 복제한 데이터베이스는 Read Only 상태로 오픈됨
- 원하는 시점에 소스 데이터베이스의 변경 상태 동기호 지원
- 동기화 기준 시점
- 최소: 현재 시간으로 부터 1분전 (UTC 설정)
- 최대: 현재 시간으로 부터 168시간 (7일)
- 소스 데이터베이스 동기화 중에서 복제 데이터베이스 사용(Query) 가능
- 동기화는 OCI Console, OCI CLI, OCI SDK로 수행할 수 있음
- 최대 7일간 소스 데이터베이스와 동기화하지 않으면 소스와 복제 데이터베이스 동기화 설정은 해제 됨
- 동기화 설정은 해제된 소스 데이터베이스와 복제 데이터베이스를 다시 연결 할 수 없음
참고 문서
- https://docs.cloud.oracle.com/en-us/iaas/Content/Database/Tasks/adbcloning.htm
- https://docs.cloud.oracle.com/en-us/iaas/adbrefreshableclone/autonomous-refreshable-clone.html
- https://docs.cloud.oracle.com/en-us/iaas/adbrefreshableclone/refreshable-clone-about.html
- https://docs.cloud.oracle.com/en-us/iaas/adbrefreshableclone/refreshable-clone-create.html
- https://docs.cloud.oracle.com/en-us/iaas/adbrefreshableclone/refreshable-clone-view.html
- https://docs.cloud.oracle.com/en-us/iaas/adbrefreshableclone/refreshable-clone-disconnect.html