Compute Engine에서 point-in-time recovery에 Microsoft SQL Server 백업 사용

Last reviewed 2023-06-27 UTC

이 가이드에서 사용자는 Compute Engine SQL Server 인스턴스에서 백업을 수행합니다. 이 가이드에서는 이러한 백업을 관리하고 Cloud Storage에 저장하는 방법과 데이터베이스를 특정 시점으로 복원하는 방법을 설명합니다.

이 가이드는 SQL Server 데이터를 백업하려는 시스템 관리자, 개발자, 엔지니어, 데이터베이스 관리자 또는 개발 엔지니어에게 유용합니다.

본 가이드에서는 독자가 다음에 익숙하다고 가정합니다.

목표

  • SQL Server 인스턴스를 시작하고 데이터베이스를 만듭니다.
  • 전체, 차등, 트랜잭션 로그 백업을 수행합니다.
  • Cloud Storage에 백업을 업로드합니다.
  • Cloud Storage 백업에서 데이터베이스를 복원합니다.

비용

이 문서에서는 비용이 청구될 수 있는 다음과 같은 Google Cloud 구성요소를 사용합니다.

프로젝트 사용량을 기준으로 예상 비용을 산출하려면 가격 계산기를 사용하세요. Google Cloud를 처음 사용하는 사용자는 무료 체험판을 사용할 수 있습니다.

시작하기 전에

  1. Google Cloud 계정에 로그인합니다. Google Cloud를 처음 사용하는 경우 계정을 만들고 Google 제품의 실제 성능을 평가해 보세요. 신규 고객에게는 워크로드를 실행, 테스트, 배포하는 데 사용할 수 있는 $300의 무료 크레딧이 제공됩니다.
  2. Google Cloud Console의 프로젝트 선택기 페이지에서 Google Cloud 프로젝트를 선택하거나 만듭니다.

    프로젝트 선택기로 이동

  3. Google Cloud 프로젝트에 결제가 사용 설정되어 있는지 확인합니다.

  4. Compute Engine API 사용 설정

    API 사용 설정

  5. Google Cloud Console의 프로젝트 선택기 페이지에서 Google Cloud 프로젝트를 선택하거나 만듭니다.

    프로젝트 선택기로 이동

  6. Google Cloud 프로젝트에 결제가 사용 설정되어 있는지 확인합니다.

  7. Compute Engine API 사용 설정

    API 사용 설정

  8. 선택한 원격 데스크톱 프로토콜(RDP) 클라이언트를 설치합니다. 자세한 내용은 Microsoft 원격 데스크톱 클라이언트를 참조하세요. 이미 RDP 클라이언트가 설치되어 있으면 이 태스크를 건너뛰어도 됩니다.

이 문서에 설명된 태스크를 완료했으면 만든 리소스를 삭제하여 청구가 계속되는 것을 방지할 수 있습니다. 자세한 내용은 삭제를 참조하세요.

SQL Server 인스턴스 준비

이 섹션에서는 SQL Server 인스턴스를 시작하고, 데이터베이스를 준비하고, 암호화 키를 구성합니다.

SQL Server 인스턴스 시작

첫 번째 과제는 SQL Server 인스턴스를 시작하고 백업 폴더를 만드는 것입니다.

  1. Cloud Shell을 엽니다.

    Cloud Shell로 이동

  2. SQL Server 인스턴스를 시작합니다.

    gcloud compute instances create sqlserver \
        --zone=us-central1-c \
        --machine-type=n1-standard-1 \
        --image-family=sql-std-2019-win-2019 \
        --image-project=windows-sql-cloud \
        --boot-disk-size=50GB \
        --boot-disk-type=pd-standard \
        --tags=sqlserver \
        --scopes=https://www.googleapis.com/auth/cloud-platform
    
  3. Google Cloud 콘솔의 VM 인스턴스 페이지로 이동하여 연결하려는 Windows 인스턴스를 찾습니다.

    VM 인스턴스 페이지로 이동

  4. 인스턴스의 초기 비밀번호를 설정합니다. 안전한 장소에 비밀번호를 보관합니다.

  5. Google Cloud 콘솔의 Compute Engine 섹션에서 RDP 드롭다운을 클릭하고 RDP 파일 다운로드 옵션을 선택하여 인스턴스용 RDP 파일을 다운로드합니다. 이 파일을 사용하여 RDP 클라이언트를 사용하는 인스턴스에 연결합니다. 자세한 내용은 Microsoft 원격 데스크톱 클라이언트를 참조하세요.

SQL Server Management Studio 설치

다음을 수행하여 Microsoft SQL Server Management Studio(SSMS)를 설치합니다.

  1. RDP 세션에서 모든 창을 최소화하고 Windows PowerShell ISE 앱을 시작합니다.

  2. PowerShell 프롬프트에서 SSMS 설치 프로그램을 다운로드하고 실행합니다.

    Start-BitsTransfer `
        -Source "https://aka.ms/ssmsfullsetup" `
        -Destination "$env:Temp\ssms-setup.exe"
    & $env:Temp\ssms-setup.exe
    
  3. 프롬프트를 수락하면 변경사항이 적용됩니다.

  4. SSMS 설치 프로그램에서 설치를 클릭합니다.

  5. 설치가 완료되면 다시 시작을 클릭하여 원격 머신을 다시 시작합니다. 그러면 RDP 세션이 종료됩니다.

  6. 다시 연결하려면 RDP 창에서 연결을 클릭합니다. 원격 머신의 재시작이 완료되지 않으면 잠시 후에 다시 연결해 보세요.

  7. 이전에 저장한 사용자 이름과 비밀번호를 입력하고 도메인 필드를 비워 둔 상태로 확인을 클릭하여 다시 연결합니다.

백업 및 복원 폴더 준비

  1. RDP 세션에서 모든 창을 최소화한 후 Windows 바탕화면에서 Google Cloud SDK Shell(Cloud Shell과 다름)을 엽니다.

  2. 백업 폴더를 만듭니다.

    mkdir c:\backup
    
  3. 복원 폴더를 만듭니다.

    mkdir c:\restore
    

데이터베이스 준비

  1. Cloud Shell의 인스턴스에서 테스트 데이터베이스를 만듭니다.

    osql -E -Q "create database testdb"
    
  2. 테스트 테이블을 만듭니다.

    osql -E -Q "create table testdb.dbo.testtable(status varchar(255))"
    

암호화 키 구성

  1. Cloud Shell에서 기본 데이터베이스 키를 만듭니다.

    osql -E -Q "USE master;CREATE MASTER KEY ENCRYPTION BY PASSWORD = 'MyPassword!';"
    
  2. 백업 인증서를 만듭니다.

    osql -E -Q "USE master; CREATE CERTIFICATE testdbcert WITH SUBJECT = 'testdb certificate';"
    

백업 수행

SQL Server 2019 이하

이 섹션에서는 전체, 차등, 트랜잭션 로그 백업을 만들고 이들 간에 데이터베이스를 변경합니다.

  1. 테스트 테이블에 행을 추가합니다.

    osql -E -Q "insert into testdb.dbo.testtable ([status]) VALUES ('Initial')"
    
  2. Cloud Shell에서 전체 백업을 수행합니다.

    osql  -E -Q "BACKUP DATABASE testdb TO DISK='c:\backup\testdb.bak' WITH INIT,
        COMPRESSION,
        ENCRYPTION
        (
            ALGORITHM = AES_256,
            SERVER CERTIFICATE = testdbcert
        )  "
    
  3. 테스트 테이블에 행을 추가합니다.

    osql -E -Q "insert into testdb.dbo.testtable ([status]) VALUES ('After Full Backup')"
    
  4. 차등 백업을 수행합니다.

    osql  -E -Q "BACKUP DATABASE testdb TO DISK='c:\backup\testdb-diff.bak' WITH DIFFERENTIAL,
    COMPRESSION,
    ENCRYPTION
        (
        ALGORITHM = AES_256,
        SERVER CERTIFICATE = testdbcert
        ) "
    
  5. 테스트 테이블에 행을 추가합니다.

    osql -E -Q "insert into testdb.dbo.testtable ([status]) VALUES ('After Diff Backup')"
    
  6. 트랜잭션 로그 백업을 수행합니다.

    osql  -E -Q "BACKUP LOG testdb TO DISK='c:\backup\testdb-log.bak' WITH COMPRESSION,
    ENCRYPTION
        (
        ALGORITHM = AES_256,
        SERVER CERTIFICATE = testdbcert
        ) "
    
  7. 테스트 테이블에 행을 추가합니다.

    osql -E -Q "insert into testdb.dbo.testtable ([status]) VALUES ('Bad Row')"
    
  8. 테이블의 행을 확인합니다.

    osql -E -Q "select * from testdb.dbo.testtable"
    

    다음과 유사한 결과가 출력됩니다.

    Initial
    
    After Full Backup
    
    After Diff Backup
    
    Bad Row
    

SQL Server 2022

이 섹션에서는 전체, 차등, 트랜잭션 로그 백업을 만들고 이들 간에 데이터베이스를 변경합니다. 기본 제공되는 백업 및 복원 명령어는 Cloud Storage에서 사용합니다.

SQL Server 2022(16.x)는 REST API를 사용하여 S3 호환 객체 스토리지 공급업체에 연결하는 새 커넥터를 도입하여 확장된 객체 스토리지 통합을 지원합니다. S3 호환 스토리지 대상을 URL로 사용하는 SQL Server 2022에서 BACKUP TO URLRESTORE FROM URL 명령어를 사용할 수 있습니다.

SQL Server는 사용자 인증 정보를 사용하여 외부 리소스에 연결합니다. 사용자 인증 정보는 인증 정보를 포함하는 레코드입니다. Cloud Storage S3 인터페이스에 대한 액세스를 인증하고 승인하려면 액세스 키와 보안 비밀 키를 만들고 사용해야 합니다. 그런 다음 이 키를 SQL Server 사용자 인증 정보에 저장합니다.

  1. Cloud Storage 버킷에 대한 사용자 계정의 액세스 키와 보안 비밀 키를 만듭니다.

    1. Cloud Storage로 이동합니다.
    2. 설정으로 이동합니다.
    3. 상호 운용성으로 이동합니다.
    4. 사용자 계정의 액세스 키로 이동합니다.
    5. 아래로 스크롤하여 키 만들기를 클릭하여 새 액세스 키와 보안 비밀 키를 만듭니다.
  2. SQL Server 2022 인스턴스에서 사용자 인증 정보 만들기:

    다음 코드 샘플을 실행하여 사용자 인증 정보를 만듭니다. 사용자 인증 정보의 이름을 선택합니다. ACCESS_KEYSECRET 필드를 이전 단계에서 생성한 값으로 바꿉니다.

    osql -E -Q "
        CREATE CREDENTIAL [CREDENTIAL_NAME]
        WITH
            IDENTITY = 'S3 Access Key',
            SECRET = 'ACCESS_KEY:SECRET'
        "
    
  3. 테스트 테이블에 행을 추가합니다.

    osql -E -Q "insert into testdb.dbo.testtable ([status]) VALUES ('Initial')"
    
  4. Cloud Storage 버킷에 BACKUP 작업을 수행합니다.

    Cloud Storage 버킷 URI를 URL 매개변수로 설정하고 이전에 정의한 사용자 인증 정보 이름을 WITH CREDENTIAL 옵션 값으로 설정하여 백업 데이터베이스 명령어를 실행합니다. 이 명령어를 사용하면 SQL Server가 백업 파일을 만들고 동시에 Cloud Storage 버킷에 업로드할 수 있으므로 추가 로컬 디스크 공간이 필요 없습니다.

    osql -E -Q "
        BACKUP DATABASE testdb
        TO URL = 's3://storage.googleapis.com/BUCKET_NAME/FOLDER_NAME/testdb.bak'
        WITH
            CREDENTIAL = 'CREDENTIAL_NAME',
            FORMAT,
            STATS = 10,
            MAXTRANSFERSIZE = 10485760,
            BLOCKSIZE = 65536,
            COMPRESSION;
        "
    

다음 목록은 WITH 문의 매개변수를 설명합니다.

  • FORMAT: 기존 백업을 덮어쓰고 새 미디어 세트를 만듭니다.
  • STATS: 백업 진행 상황에 대한 정보를 제공하도록 SQL Server에 지시합니다.
  • COMPRESSION: SQL Server에 백업 파일을 압축하여 Cloud Storage에 더 작고 빠르게 업로드하도록 지시합니다.
  • MAXTRANSFERSIZE = 10485760, BLOCKSIZE = 65536 옵션은 더 큰 백업 파일의 I/O 기기 오류를 방지하는 데 도움이 됩니다.
  1. 테스트 테이블에 행을 추가합니다.

    osql -E -Q "insert into testdb.dbo.testtable ([status]) VALUES ('After Full Backup')"
    
  2. 차등 백업을 수행합니다.

    osql -E -Q "
        BACKUP DATABASE testdb
        TO URL = 's3://storage.googleapis.com/BUCKET_NAME/FOLDER_NAME/testdb-diff.bak'
        WITH
            DIFFERENTIAL,
            CREDENTIAL = 'CREDENTIAL_NAME',
            STATS = 10,
            MAXTRANSFERSIZE = 10485760,
            BLOCKSIZE = 65536,
            COMPRESSION;
        "
    
  3. 테스트 테이블에 행을 추가합니다.

    osql -E -Q "insert into testdb.dbo.testtable ([status]) VALUES ('After Diff Backup')"
    
  4. 트랜잭션 로그 백업을 수행합니다.

    osql -E -Q "
        BACKUP LOG testdb
        TO URL = 's3://storage.googleapis.com/BUCKET_NAME/FOLDER_NAME/testdb-log.bak'
        WITH
            CREDENTIAL = 'CREDENTIAL_NAME',
            STATS = 10,
            MAXTRANSFERSIZE = 10485760,
            BLOCKSIZE = 65536,
            COMPRESSION;
        "
    
  5. 테스트 테이블에 행을 추가합니다.

    osql -E -Q "insert into testdb.dbo.testtable ([status]) VALUES ('Bad Row')"
    
  6. 테이블의 행을 확인합니다.

    osql -E -Q "select * from testdb.dbo.testtable"
    

    출력 형식은 다음과 같습니다.

    Initial
    
    After Full Backup
    
    After Diff Backup
    
    Bad Row
    

백업 관리

이 섹션에서는 원격으로 Cloud Storage에 백업을 저장하고 Cloud Storage 버킷을 구성하여 오래된 백업을 자동으로 정리하고 백업을 예약합니다. 데이터베이스 서버 여러 개를 실행 중이면 Cloud Storage 버킷에 디렉터리 여러 개를 만들어 서로 다른 서버를 나타낼 수 있습니다.

Cloud Storage에 백업 업로드

SQL Server 2019 이하

이제 백업 파일을 몇 개 만들었으므로 백업을 Cloud Storage에 업로드할 수 있습니다.

  1. Cloud Shell에서 Cloud Storage 버킷을 만듭니다. 버킷 이름은 Google Cloud에서 전역으로 고유해야 합니다. 버킷 이름이 겹치지 않도록 하려면 여기에 표시된 것처럼 프로젝트 이름으로 네임스페이스를 지정하는 것이 좋습니다.

    gsutil mb "gs://${DEVSHELL_PROJECT_ID}-sql-backups"
    
  2. RDP 세션의 셸 창에서 파일을 Cloud Storage 버킷에 복사합니다. 다음 명령어에서 BUCKET_NAME을 방금 만든 버킷의 이름으로 바꿉니다.

    gsutil cp -n c:\backup\testdb*.bak gs://BUCKET_NAME
    

    gsutil cp 명령어를 사용하면 전체 디렉터리 구조를 만들고 한 번에 파일 여러 개를 업로드할 수 있습니다.

SQL Server 2022

SQL Server 2022에서 Cloud Storage에 대한 백업을 직접 지원하므로 백업 파일이 이미 버킷에 있습니다.

Cloud Storage에서 자동 파일 정리 설정

오래된 백업은 효용 가치를 잃어버리므로 삭제해야 합니다. 이 프로세스를 자동화하도록 Cloud Storage에는 수명 주기 관리 메커니즘이 있으며 이를 통해 백업 파일의 수명 주기를 관리할 수 있습니다.

버킷 객체의 수명 주기 관리를 구성하려면 다음 안내를 따르세요.

  1. Cloud Shell에서 JSON 수명 주기 구성 파일을 만듭니다. 이 파일은 Cloud Storage에서 30일이 지난 파일을 삭제하도록 지시합니다.

    bash -c 'cat <<EOF >  lifecycle.json
    {
        "lifecycle": {
            "rule": [{
                "action": { "type": "Delete" },
                "condition": { "age": 30 }
            }]
        }
    }
    EOF'
    
  2. Cloud Storage 버킷의 수명 주기 구성을 설정합니다. BUCKET_NAME을 버킷 이름으로 바꿉니다.

    gsutil lifecycle set lifecycle.json gs://BUCKET_NAME
    

백업 예약

일반적으로 정기적으로 전체 백업을 수행하고 다음 전체 백업까지 차등 백업을 수행하는 것이 좋습니다. Windows에서 백업을 예약하는 한 가지 방법은 예약 태스크를 사용하는 것입니다.

일련의 백업을 수행하는 백업 스크립트를 만들 때는 성공적인 완료를 확인하기 위해 각 지점에 몇 가지 논리적 유효성 검사 단계를 포함시켜야 합니다. 유효성 검사가 실패하면 스크립트에서 Windows 경고를 보내야 합니다. 또한 로컬 디스크가 가득 차지 않도록 하기 위해 Cloud Storage에 성공적으로 업로드한 후 스크립트에서 로컬 백업 파일을 제거해야 합니다.

백업에서 복원

이 섹션에서는 Cloud Storage에 저장한 백업 파일에서 SQL Server 데이터베이스를 복원합니다.

SQL Server 2019 이하

  1. RDP 세션의 Cloud Shell에서 Cloud Storage로부터 백업 파일을 다운로드합니다. BUCKET_NAME을 SQL Server 백업 스토리지 버킷 이름으로 바꿉니다.

    gsutil cp gs://BUCKET_NAME/testdb*.bak c:\restore
    
  2. SQL Server Management 콘솔을 엽니다.

  3. Start(시작) 버튼을 클릭한 후 Microsoft SQL Server Tools 18 > Microsoft SQL Server Management Studio 18을 클릭합니다.

  4. Connection(연결) 필드는 그대로 놔두고 Connect(연결)를 클릭합니다.

  1. 왼쪽 창에서 Databases(데이터베이스)를 펼칩니다.
  2. testdb를 마우스 오른쪽 버튼으로 클릭하고 팝업 메뉴에서 Tasks(작업) > Restore(복원) > Database(데이터베이스)를 클릭합니다.
  3. 백업 파일을 콘솔로 가져옵니다.
    1. Source(소스)에서 Device(기기)를 선택합니다.
    2. 버튼을 클릭합니다.
    3. 대화상자가 열리면 Add(추가)를 클릭하고 C:\restore 아래의 모든 파일을 선택한 후 OK(확인)를 클릭합니다.
    4. OK(확인)를 클릭합니다.
  4. 특정 시점 복원 옵션을 보려면 다음 안내를 따르세요.

    1. Timeline(타임라인)을 클릭합니다.
    2. Restore to(복원 대상)에서 Specific date and time(특정 날짜 및 시간)을 클릭합니다.
    3. Timeline Interval(타임라인 간격)에서 hour(시간)를 선택합니다.
    4. Transaction Log Backup(트랜잭션 로그 백업) 범위에서 시간을 선택합니다.
    5. Cancel(취소)을 클릭하여 타임라인 화면을 종료합니다.

  5. 이 가이드에서는 트랜잭션 로그 백업 전 상태로 데이터베이스를 복원합니다. 이를 수행하려면 백업 목록에서 트랜잭션 로그 행을 지웁니다.

    백업 목록에서 트랜잭션 로그 행 지우기

  6. 복원 프로세스를 시작합니다.

    1. OK(확인)를 클릭합니다.
    2. 데이터베이스가 복원 프로세스를 마칠 때까지 기다립니다. Database 'testdb' restored successfully 메시지가 표시되면 OK(확인)를 클릭합니다.
  7. 테스트 테이블의 행을 나열합니다.

    osql -E -Q "select * from testdb.dbo.testtable;"
    

    출력에 행 두 개가 표시됩니다.

    "Initial
    "After Full Backup"
    

    트랜잭션 로그 백업을 수행하기 전에 테이블에 삽입한 모든 줄이 표시됩니다.

SQL Server 2022

RESTORE 작업을 수행할 수 있습니다. Cloud Storage 파일 경로를 URL 매개변수 값으로 설정합니다. 예를 들어 이 T-SQL 스크립트는 Cloud Storage에서 직접 전체 백업을 복원합니다.

```
osql -E -Q "
RESTORE DATABASE testdb
FROM
    URL = 's3://storage.googleapis.com/BUCKET_NAME/FOLDER_NAME/testdb.bak'
WITH
    CREDENTIAL = 'CREDENTIAL_NAME';
    "
```
  1. SQL Server Management 콘솔을 엽니다.
  2. Start(시작) 버튼을 클릭한 후 Microsoft SQL Server Tools 19 > Microsoft SQL Server Management Studio 19을 클릭합니다.
  1. Connection(연결) 필드는 그대로 놔두고 Connect(연결)를 클릭합니다.
  1. 왼쪽 창에서 Databases(데이터베이스)를 펼칩니다.
  2. testdb를 마우스 오른쪽 버튼으로 클릭하고 팝업 메뉴에서 Tasks(작업) > Restore(복원) > Database(데이터베이스)를 클릭합니다.
  3. 백업 파일을 콘솔로 가져옵니다.

    1. Source(소스)에서 Device(기기)를 선택합니다.
    2. 버튼을 클릭합니다.
    3. 대화상자가 열리면 백업 미디어 유형을 클릭하고 S3 URL을 선택합니다.
    4. 대화상자가 열리면 Add(추가)를 클릭합니다. Cloud Storage 버킷에 백업 파일의 세 위치와 사용자 인증 정보를 만들 때 제공한 보안 비밀 키 및 액세스 키를 추가합니다.

    5. OK(확인)를 클릭합니다.

  4. 특정 시점 복원 옵션을 보려면 다음 안내를 따르세요.

    1. Timeline(타임라인)을 클릭합니다.
    2. Restore to(복원 대상)에서 Specific date and time(특정 날짜 및 시간)을 클릭합니다.
    3. Timeline Interval(타임라인 간격)에서 hour(시간)를 선택합니다.
    4. Transaction Log Backup(트랜잭션 로그 백업) 범위에서 시간을 선택합니다.
    5. Cancel(취소)을 클릭하여 타임라인 화면을 종료합니다.

  5. 이 가이드에서는 트랜잭션 로그 백업 전 상태로 데이터베이스를 복원합니다. 이를 수행하려면 백업 목록에서 트랜잭션 로그 행을 지웁니다.

    백업 목록에서 트랜잭션 로그 행 지우기

  6. 복원 프로세스를 시작합니다.

    1. OK(확인)를 클릭합니다.
    2. 데이터베이스가 복원 프로세스를 마칠 때까지 기다립니다. Database 'testdb' restored successfully 메시지가 표시되면 OK(확인)를 클릭합니다.
  7. 테스트 테이블의 행을 나열합니다.

    osql -E -Q "select * from testdb.dbo.testtable;"
    

    출력에 행 두 개가 표시됩니다.

    "Initial
    "After Full Backup"
    

    트랜잭션 로그 백업을 수행하기 전에 테이블에 삽입한 모든 줄이 표시됩니다.

삭제

프로젝트 삭제

  1. Google Cloud 콘솔에서 리소스 관리 페이지로 이동합니다.

    리소스 관리로 이동

  2. 프로젝트 목록에서 삭제할 프로젝트를 선택하고 삭제를 클릭합니다.
  3. 대화상자에서 프로젝트 ID를 입력한 후 종료를 클릭하여 프로젝트를 삭제합니다.

다음 단계