Recommanded Free YOUTUBE Lecture: <% selectedImage[1] %>

Contents

데이터베이스를 복원하기전에

데이터베이스를 복원하는 것은 쉬운일이 아니다. 복원하는 방법을 찾기전에, (가능한)복원할 일이 없도록 시스템과 운영정책을 만드는게 우선이다.
  • 애플리케이션 권한을 분리한다. : 애플리케이션에는 최소한의 권한만 부여한다. DROP, CREATE 같은 권한은 아예 실행하지 못하게한다. DELETE도 넣지 말고 그냥 flag 표시만한다. DELETE나 UPDATE를 할 경우 조건절을 명확히 검사한다.
  • 프러덕트 영역의 데이터베이스로의 접근을 엄격히 제한한다. 접근이 필요한 경우 필요한 권한만 준다. 상태를 모니터링하러 접속하는데 DELETE, UPDATE 권한을 모두 줄 필요는 없다. SELECT 권한으로도 충분하다.
  • PoryxSQL 같은 솔류션을 이용해서 DELETE나 UPDATE 등에서 WHERE 절을 빼먹는 치명적인 실수를 막도록 하자.
위의 조치들을 먼저 수행하고나서 백업&복원 정책을 수립한다.

Aurora 서버리스 RDS 백업

RDS Aurora 서버리스를 기준으로 한다. 클래식 RDS, RDS Aurora 모두 큰 차이는 없다.

자동백업

Aurora는 클러스터 볼륨을 자동으로 백업을 한다. 백업한 데이터는 백업 보유 기간(Backet retion period)동안 보존한다. 보존기간은 1일에서 35일까지 설정할 수 있다. 사용자는 백업데이터로 부터, 신속하게 데이터베이스를 복원할 수 있다. 백업데이터가 기록될때 성능저하나 데이터베이스 중단을 걱정하지 않아도 된다.

보존기간을 넘겨서 백업을 보존하고 싶다면 메뉴얼하게 클러스터 볼륨의 스냅샷을 만드는 방법도 있다.

스냅샷 만들기

데이터베이스 관리자는 원하는 시점에 데이터베이스에 대한 스냅샷을 만들 수 있다.

데이터베이스를 선택한 다음 Action > Take snapshot를 선택한다.

스냅샷 이름을 입력하고 Take Snapshot 버튼을 클릭하면 스냅샷이 만들어진다.

RDS > Snapshots 에서 스냅샷 목록을 확인 할 수 있다. AWS cli 툴로 확인해보자.

# aws rds describe-db-cluster-snapshots
{
    "DBClusterSnapshots": [
        {
            "Engine": "aurora", 
            "SnapshotCreateTime": "2019-04-02T15:45:18.806Z", 
            "VpcId": "vpc-0700d43bd5ba9b0a4", 
            "DBClusterIdentifier": "joinc-test2", 
            "DBClusterSnapshotArn": "arn:aws:rds:ap-northeast-2:522373083963:cluster-snapshot:joinc-snampshot-01", 
            "MasterUsername": "yundream", 
            "LicenseModel": "aurora", 
            "Status": "available", 
            "PercentProgress": 100, 
            "DBClusterSnapshotIdentifier": "joinc-snampshot-01", 
            "KmsKeyId": "arn:aws:kms:ap-northeast-2:522373083963:key/37f608e7-81e3-4a92-8759-b619b303a9bb", 
            "ClusterCreateTime": "2019-04-02T15:38:17.623Z", 
            "StorageEncrypted": true, 
            "AllocatedStorage": 0, 
            "EngineVersion": "5.6.serverless_10a", 
            "SnapshotType": "manual", 
            "AvailabilityZones": [
                "ap-northeast-2a", 
                "ap-northeast-2c"
            ], 
            "IAMDatabaseAuthenticationEnabled": false, 
            "Port": 0
        }
    ]
}

복원

Snapshot로 복원

AWS는 개별 데이터베이스가 아닌 전체 DB 클러스터를 백업하여, 스토리지 볼륨 스냅샷을 만든다. 사용자는 이 스냅샷으로 부터 새로운 데이터베이스 클러스터를 만들 수 있다.

데이터베이스 클러스터를 선택 하고 Take Snapshot을 클릭한다.

스냅샷 이름을 입력하고 Take Snapshot버튼을 클릭하면 스냅샷이 만들어진다. 웹 콘솔에서 데이터베이스 클러스터를 선택한 다음 Maintenace & backups을 클릭하면 스냅샷 정보를 확인 할 수 있다.

  • Automated backups : Enabled 상태다.
  • Earliest restorable time : 복구 가능한 마지막 시간
  • Latest restore time : 복구 가능한 가장 최근 시간 (보통 5분 전까지 복구가능하다.)
  • Snapshots : 스냅샷 파일들을 확인 할 수 있다. Automated backups가 enabled 상태라서 주기적으로 자동 백업된다. 자동으로 생성된 스냅샷은 automated가 붙고, 유저가 만든 스냅샷은 manual이 붙는다.

Point-in-time 복원

AWS Aurora 데이터베이스는 5분마다 5분동안 있었던 모든 트랜젹션을 저장한다. 이 데이터를 이용해서 원하는 시간대의 데이터베이스를 복원 할 수 있다. 이 복원타입을 Point-in-time 복원이라고 한다. 데이터베이스 클러스터 정보를 확인해보자.
 aws rds describe-db-clusters
{
    "DBClusters": [
        {
            "Capacity": 2, 
            "MasterUsername": "yundream", 
            "HttpEndpointEnabled": false, 
            "ReadReplicaIdentifiers": [], 
            "VpcSecurityGroups": [
                {
                    "Status": "active", 
                    "VpcSecurityGroupId": "sg-0f42012a784275f33"
                }, 
                {
                    "Status": "active", 
                    "VpcSecurityGroupId": "sg-0337a80bb0854e483"
                }
            ], 
            "CopyTagsToSnapshot": false, 
            "HostedZoneId": "ZLA2NUCOLGUUR", 
            "EngineMode": "serverless", 
            "Status": "available", 
            "MultiAZ": false, 
            "LatestRestorableTime": "2019-04-03T13:10:01.394Z", 
            "PreferredBackupWindow": "15:03-15:33", 
            "DBSubnetGroup": "awsstudy-subnet", 
            "AllocatedStorage": 1, 
            "BackupRetentionPeriod": 5, 
            "PreferredMaintenanceWindow": "mon:19:33-mon:20:03", 
            "Engine": "aurora", 
            "Endpoint": "joinc-test2.cluster-c985nvk9gmsh.ap-northeast-2.rds.amazonaws.com", 
            "EarliestRestorableTime": "2019-04-02T15:39:05.451Z", 
            "IAMDatabaseAuthenticationEnabled": false, 
            "ClusterCreateTime": "2019-04-02T15:38:17.623Z", 
            "EngineVersion": "5.6.10a", 
            "DeletionProtection": true, 
            "ScalingConfigurationInfo": {
                "MinCapacity": 2, 
                "AutoPause": true, 
                "MaxCapacity": 4, 
                "SecondsUntilAutoPause": 72300
            }, 
            "DBClusterIdentifier": "joinc-test2", 
            "DbClusterResourceId": "cluster-YB77Y7FMCUGRZNROBPRAWEPQK4", 
            "DBClusterMembers": [], 
            "DBClusterArn": "arn:aws:rds:ap-northeast-2:522373083963:cluster:joinc-test2", 
            "KmsKeyId": "arn:aws:kms:ap-northeast-2:522373083963:key/37f608e7-81e3-4a92-8759-b619b303a9bb", 
            "StorageEncrypted": true, 
            "AssociatedRoles": [], 
            "DBClusterParameterGroup": "default.aurora5.6", 
            "AvailabilityZones": [
                "ap-northeast-2a", 
                "ap-northeast-2c"
            ], 
            "Port": 3306
        }
    ]
}
LatestRestorableTime이 있는데, 가장 최근 저장한 트랜잭션의 시간이다. 데이터베이스 관리자는 백업 보존 주기(backup retention period)에서 LatestRestorableTime 사이의 어떤 시간대든지 자유롭게 데이터베이스를 관리 할 수 있다. 백업 보존 주기를 15일로 설정했다면, 최대 과거 15일 까지의 데이터베이스 복원이 가능하다.
  • EarliestRestorableTime : 복원 가능한 가장 멀리 있는 시간
  • LatestRestorableTime : 가장 최근 복원 시점.
즉 복원 가능한 시간은 RT는 이 된다.

# aws rds restore-db-cluster-to-point-in-time --source-db-cluster-identifier joinc-test2 --db-cluster-identifier mynewdb --restore-to-time 2019-04-03T10:43:53.615Z
  • restore-db-cluster-to-point-in-time : point-in-time 방식으로 데이터베이스 클러스터를 복원한다.
  • --source-db-cluster-identifier : 복원하려는 데이터베이스 클러스터 이름
  • --db-cluster-identifier : 새로만들 클러스터 이름
  • --restore-to-time : 복원할 시간
성공적으로 복원하면 아래와 같이 새로운 데이터베이스 클러스터 정보를 확인 할 수 있다.
{
    "DBCluster": {
        "MasterUsername": "yundream", 
        "ReaderEndpoint": "mynewdb.cluster-ro-c985nvk9gmsh.ap-northeast-2.rds.amazonaws.com", 
        "HttpEndpointEnabled": false, 
        "ReadReplicaIdentifiers": [], 
        "VpcSecurityGroups": [
            {
                "Status": "active", 
                "VpcSecurityGroupId": "sg-4cdf6421"
            }
        ], 
        "CopyTagsToSnapshot": false, 
        "HostedZoneId": "ZLA2NUCOLGUUR", 
        "EngineMode": "serverless", 
        "Status": "creating", 
        "MultiAZ": false, 
        "PreferredBackupWindow": "15:03-15:33", 
        "DBSubnetGroup": "default", 
        "AllocatedStorage": 1, 
        "BackupRetentionPeriod": 5, 
        "PreferredMaintenanceWindow": "mon:19:33-mon:20:03", 
        "Engine": "aurora", 
        "Endpoint": "mynewdb.cluster-c985nvk9gmsh.ap-northeast-2.rds.amazonaws.com", 
        "IAMDatabaseAuthenticationEnabled": false, 
        "ClusterCreateTime": "2019-04-03T12:47:48.833Z", 
        "EngineVersion": "5.6.10a", 
        "DeletionProtection": false, 
        "DBClusterIdentifier": "mynewdb", 
        "DbClusterResourceId": "cluster-T64JPIANDTADAVA44EQOALXIGQ", 
        "DBClusterMembers": [], 
        "DBClusterArn": "arn:aws:rds:ap-northeast-2:522373083963:cluster:mynewdb", 
        "KmsKeyId": "arn:aws:kms:ap-northeast-2:522373083963:key/37f608e7-81e3-4a92-8759-b619b303a9bb", 
        "StorageEncrypted": true, 
        "AssociatedRoles": [], 
        "DBClusterParameterGroup": "default.aurora5.6", 
        "AvailabilityZones": [
            "ap-northeast-2a", 
            "ap-northeast-2c"
        ], 
        "Port": 3306
    }
}
mynewdb라는 이름의 데이터베이스가 실행된 걸 확인 할 수 있다.

FAQ

자동백업과 스냅샷과의 차이점

RDS의 DB 인스턴스와 백업에는 두 가지 방법이 있다.
  1. 자동 백업
  2. 데이터베이스 스냅샷
데이터베이스 자동 백업을 활성화 하면 RDS는 매일 자동으로 데이터베이스에 대한 스냅샷을 만들고, 트랜잭션 로그를 캡처한다. Point-in-time 복구를 시작하면, 사용자가 요청한 특정 시점으로 북구하기 위해서 저장된 일일 백업과 트랜잭션로그를 이용해서 데이터베이스를 복구한다. 데이터베이스 복구기간은 최대 35일이다.

데이터베이스 스냅샷은 사용자가 원할 때 만들어서 복구 할 수 있다. 복구는 create-db-snapshot 명령을 사용한다.

백업보존기간

백업보존기간동안 DB 인스턴스의 자동백업로그가 저장된다. 백업이 진행중일 때는 스토리지 I/O가 몇 초 가량 중지되며, 이에 따른 애플리케이션 지연시간이 증가 할 수 있다. 다중 AZ 배포를 사용하면 예비 복제본에 대해서 백업이 수행되기 때문에 I/O가 중단되지 않는다.

자동 백업과 DB 스냅샷의 저장 위치

S3에 저장된다. 하지만 계정 S3 버킷에서는 확인 할 수 없다. DescribeDBSnapshot API 혹은 describe-db-snapshots 명령으로 DB 스냅샷 목록을 확인 할 수 있다.

DB 인스턴스를 삭제하면 백업과 스냅샷은 어떻게 되는가

DB 인스턴스를 삭제 할 때, 최종 DB 스냅샷을 생성 할 수 있다. 이 DB 스냅샷을 이용해서 나중에 데이터베이스를 복구 할 수 있다. 자동백업은 DB 인스턴스가 삭제될때 함께 삭제된다. 유저가 수동으로 생성한 DB 스냅샷만 인스턴스 삭제후에도 보관된다.