S3 호환 개체 스토리지의 URL에 SQL Server 백업

적용 대상: SQL Server 2022(16.x)

이 문서에서는 S3 호환 개체 스토리지를 백업 대상으로 사용하는 데 필요한 개념, 요구 사항 및 구성 요소를 소개합니다. 백업 및 복원 기능은 백업 디바이스 유형으로 Azure Blob Storage URL에 대한 SQL Server 백업 작업과 개념상 유사합니다.

지원되는 플랫폼에 관한 자세한 내용은 S3 호환 개체 스토리지 공급자를 참조하세요.

개요

SQL Server 2022(16.x)에서는 데이터 플랫폼에 개체 스토리지 통합을 도입하여 Azure Storage 외에도 S3 호환 개체 스토리지와 SQL Server를 통합할 수 있습니다. 이 통합을 제공하기 위해 SQL Server가 S3 REST API를 사용하여 S3 호환 개체 스토리지의 공급자에 연결하는 S3 커넥터를 지원합니다. SQL Server 2022(16.x)는 REST API를 사용하여 새 S3 커넥터에 대한 지원을 추가하여 기존 BACKUP/RESTORE TO/FROM URL 구문을 확장합니다.

S3 호환 리소스를 가리키는 URL에는 S3 커넥터가 사용되고 있음을 나타내는 접두사로 s3://가 사용됩니다. s3://로 시작하는 URL은 항상 기본 프로토콜이 https라고 가정합니다.

부품 번호 및 파일 크기 제한 사항

데이터를 저장하려면 S3 호환 개체 스토리지 공급자는 Azure Blob Storage를 사용할 때 블록 Blob과 유사한 여러 블록, 즉, 파트로 파일을 분할해야 합니다.

각 파일은 최대 10,000개의 파트로 분할할 수 있으며, 각 파트의 크기의 범위는 5MB에서 20MB입니다. 매개 변수 MAXTRANSFERSIZE를 통해 T-SQL BACKUP 명령으로 이 범위를 제어합니다. MAXTRANSFERSIZE의 기본값은 10MB이므로 각 파트의 기본 크기는 10MB입니다.

단일 파일의 지원 가능한 최대 크기는 10,000파트 * MAXTRANSFERSIZE의 결과입니다. 더 큰 파일을 백업해야 하는 경우 최대 64개의 URL을 분할/스트라이프해야 합니다. 한 파일의 지원 가능한 최종 최대 크기는 10,000파트 * MAXTRANSFERSIZE * URL입니다.

참고 항목

MAXTRANSFERSIZE 값을 변경하려면 COMPRESSION을 사용해야 합니다.

S3 엔드포인트에 대한 필수 구성 요소

S3 끝점을 다음과 같이 구성해야 합니다.

  • TLS가 구성되어야 합니다. 모든 연결이 HTTP가 아닌 HTTPS를 통해 안전하게 전송된다고 가정합니다. 끝점은 SQL Server OS 호스트에 설치된 인증서로 유효성을 검사합니다.
  • 작업을 수행할 수 있는 적절한 권한이 있는 S3 호환 개체 스토리지에서 만든 자격 증명입니다. 스토리지 레이어에서 만든 사용자 및 비밀번호의 이름은 Access Key IDSecret Key ID입니다. S3 끝점에 대해 인증하려면 둘 다 필요합니다.
  • 하나 이상의 버킷이 구성되었습니다. 버킷은 SQL Server 2022(16.x)에서 만들거나 구성할 수 없습니다.

보안

백업 권한

SQL Server를 S3 호환 개체 스토리지에 연결하려면 SQL Server 및 스토리지 레이어에 하나씩 두 개의 권한 집합을 설정해야 합니다.

SQL Server에서 BACKUP 또는 RESTORE 명령을 실행하는 데 사용되는 사용자 계정은 모든 자격 증명 변경 권한이 있는 db_backup operator 데이터베이스 역할에 있어야 합니다.

스토리지 레이어에서 다음을 수행합니다.

  • AWS S3에서 사용자 지정 역할을 만들고 특히 액세스가 필요한 S3 API를 명시합니다. 백업 및 복원에는 ListBucket(찾아보기), PutObject(쓰기 - 백업용) 권한이 필요합니다.
  • 다른 S3 호환 스토리지에서 사용자(Access Key ID)에는 ListBucketWriteOnly 권한이 모두 있어야 합니다.

복원 권한

복원할 데이터베이스가 없으면 CREATE DATABASE 권한이 있어야 RESTORE를 실행할 수 있습니다. 데이터베이스가 있으면 기본적으로 sysadmindbcreator 고정 서버 역할의 멤버와 데이터베이스의 소유자(dbo)에게 RESTORE 권한이 설정됩니다.

멤버 자격 정보를 서버에서 항상 사용할 수 있는 역할에 RESTORE 권한이 제공됩니다. 고정 데이터베이스 역할의 멤버 자격은 데이터베이스가 액세스 가능한 상태이며 손상되지 않은 경우에만 확인할 수 있는데, RESTORE 실행 시 데이터베이스가 항상 이러한 상태인 것은 아니므로 db_owner 고정 데이터베이스 역할의 멤버에게는 RESTORE 권한이 없습니다.

스토리지 레이어에서 다음을 수행합니다.

  • AWS S3에서 사용자 지정 역할을 만들고 특히 액세스가 필요한 S3 API를 명시합니다. 백업 및 복원에는 ListBucket(찾아보기), GetObject(읽기 - 복원용) 권한이 필요합니다.
  • 다른 S3 호환 스토리지에서 사용자(Access Key ID)에는 ListBucketReadOnly 권한이 모두 있어야 합니다.

지원되는 기능

BACKUPRESTORE에 대해 지원되는 기능에 대한 대략적인 개요:

  1. 단일 백업 파일은 URL당 최대 200,000MiB일 수 있습니다(MAXTRANSFERSIZE를 20MB로 설정 시).
  2. 백업은 최대 64개의 URL에 걸쳐 스트라이프할 수 있습니다.
  3. 미러링이 지원되지만 URL에서만 지원됩니다. URL과 DISK를 모두 사용하는 미러링은 지원되지 않습니다.
  4. 압축이 지원되며 권장됩니다.
  5. 암호화가 지원됩니다.
  6. S3 호환 개체 스토리지를 사용하여 URL에서 복원하는 데는 크기 제한이 없습니다.
  7. 데이터베이스를 복원할 때 MAXTRANSFERSIZE는 백업 단계 중에 할당된 값에 따라 결정됩니다.
  8. URL은 가상 호스트 또는 경로 스타일 형식으로 지정할 수 있습니다.
  9. WITH CREDENTIAL이 지원됩니다.
  10. REGION가 지원되고 기본값은 us-east-1입니다.
  11. MAXTRANSFERSIZE 범위는 5MB에서 20MB입니다. S3 커넥터의 기본값은 10MB입니다.

백업에 지원되는 인수

WITH 옵션 S3 엔드포인트 주의
BLOCKSIZE Y MAXTRANSFERSIZE는 파트 크기를 결정합니다.
BUFFERCOUNT Y
COMPRESSION Y
COPY_ONLY Y
CREDENTIAL Y
DESCRIPTION Y
DIFFERENTIAL Y
ENCRYPTION Y
FILE_SNAPSHOT N
MAXTRANSFERSIZE Y 5MB(5,242,880바이트)에서 20MB(20,971,520바이트)까지, 기본값은 10MB(10,485,760바이트)입니다.
MEDIADESCRIPTION Y
MEDIANAME Y
MIRROR TO Y 다른 URL에서만 작동하며 MIRRORDISK를 사용하는 URL는 지원되지 않습니다.
NAME Y
NOFORMAT / FORMAT Y
NOINIT / INIT N 추가는 지원되지 않습니다. 백업을 덮어쓰려면 WITH FORMAT을 사용하세요.
NO_CHECKSUM / CHECKSUM Y
NO_TRUNCATE Y
REGION Y 기본값은 us-east-1여야 합니다. BACKUP_OPTIONS와 함께 사용해야 합니다.
STATS Y

복원에 지원되는 인수

WITH 옵션 S3 엔드포인트 주의
BLOCKSIZE Y MAXTRANSFERSIZE는 파트 크기를 결정합니다.
BUFFERCOUNT N
CHECKSUM / NO_CHECKSUM Y
CREDENTIAL Y
ENABLE_BROKER / ERROR_BROKER_CONVERSATIONS / NEW_BROKER Y
FILE N 논리적 이름은 RESTORE FROM URL에서 지원되지 않습니다.
FILESTREAM Y
KEEP_CDC Y
KEEP_REPLICATION Y
LOADHISTORY Y
MAXTRANSFERSIZE
MEDIANAME Y
MEDIAPASSWORD N SQL Server 2012 이전 버전에서 수행된 일부 백업에 필요합니다.
MOVE Y
PARTIAL Y
PASSWORD N SQL Server 2012 이전 버전에서 수행된 일부 백업에 필요합니다.
RECOVERY / NORECOVERY / STANDBY Y
REGION Y 기본값은 us-east-1여야 합니다. RESTORE_OPTIONS와 함께 사용해야 합니다.
REPLACE Y
RESTART Y
RESTRICTED_USER Y
REWIND / NOREWIND N
STATS Y
STOP_ON_ERROR / CONTINUE_AFTER_ERROR Y
STOPAT / STOPATMARK / STOPBEFOREMARK Y
UNLOAD / NOUNLOAD N

지역

S3 호환 개체 스토리지 공급자는 버킷 위치에 대한 특정 지역을 결정하는 기능을 제공할 수 있습니다. 이 선택적 매개 변수를 사용하면 특정 버킷이 속한 지역을 지정하여 더 많은 유연성을 제공할 수 있습니다. 이 매개 변수는 둘 중 하나 BACKUP_OPTIONS 또는 RESTORE_OPTIONS와 함께 WITH를 사용해야 합니다. 이러한 옵션은 JSON 형식으로 값을 선언해야 합니다. 이렇게 하면 S3 호환 스토리지 공급자가 동일한 범용 URL을 가질 수 있지만 여러 지역에 분산되는 시나리오를 사용할 수 있습니다. 이 경우, 백업 또는 복원 명령은 URL을 변경할 필요 없이 지정된 지역을 가리킵니다.

값이 선언되지 않은 경우, us-east-1이 기본값으로 할당됩니다.

백업 예제:

WITH BACKUP_OPTIONS = '{"s3": {"region":"us-west-1"}}'

복원 예제:

WITH RESTORE_OPTIONS = '{"s3": {"region":"us-west-1"}}'

Linux 지원

SQL Server는 사용하는 HTTP REST API의 클라이언트를 구현하기 위해 WinHttp를 사용합니다. http(s) 끝점에서 제공하는 TLS 인증서의 유효성 검사를 위해 OS 인증서 저장소를 사용합니다. 그러나 SQL Server on Linux CA는 /var/opt/mssql/security/ca-certificates에 생성할 미리 정의된 위치에 배치해야 하며 이 폴더에는 첫 50개의 인증서만 저장하고 지원할 수 있습니다. SQL Server 프로세스가 시작되기 전에 CA가 있어야 합니다.

SQL Server는 시작하는 동안 폴더에서 인증서를 읽고 신뢰 저장소에 인증서를 추가합니다.

슈퍼 사용자만 폴더에 쓸 수 있어야 하며 mssql 사용자는 읽을 수 있어야 합니다.

지원되지 않는 기능

  • 안전하지 않은 http URL을 사용하여 S3 호환 개체 스토리지에 백업하는 기능은 지원되지 않습니다. 고객은 https URL을 사용하여 S3 호스트를 설정해야 하며 이 끝점은 SQL Server OS 호스트에 설치된 인증서로 유효성 검사를 실행합니다.
  • S3 호환 개체 스토리지에 대한 백업은 SQL Server Express 및 SQL Server Express with Advanced Services 버전에서 지원되지 않습니다.

제한 사항

S3 호환 개체 스토리지를 사용하는 백업 및 복원의 현재 제한 사항은 다음과 같습니다.

  • S3 Standard REST API의 현재 제한 사항으로 인해 BACKUP T-SQL 명령이 실행되는 동안 고객의 S3 호환 개체 스토리지에 생성되는 파일로서 (진행 중인 다중 파트 업로드 작업으로 인해) 커밋되지 않은 임시 데이터 파일은 실패 시 제거되지 않습니다. 커밋되지 않은 이러한 데이터 블록은 BACKUP T-SQL 명령이 실패하거나 취소되는 경우 S3 호환 개체 스토리지에서 계속 유지됩니다. 백업에 성공하면 이러한 임시 파일이 개체 스토리지에 의해 자동으로 제거되어 최종 백업 파일을 형성합니다. 일부 S3 호환 저장소 공급자는 가비지 수집기 시스템을 통해 임시 파일을 처리합니다.
  • 전체 URL 길이는 259자로 제한됩니다. 전체 문자열은 s3:// 커넥터 이름을 포함하여 이 제한 사항에서 계산됩니다. 따라서 사용 가능한 한도는 254자입니다. 그러나 쿼리 매개 변수를 도입할 수 있도록 200자 제한을 준수하는 것이 좋습니다.
  • SQL 자격 증명 이름은 UTF-16 형식에서 128자로 제한됩니다.
  • 비밀 키 ID에는 : 문자가 없어야 합니다.

경로 스타일 및 가상 호스트 스타일

S3 백업은 경로 스타일 또는 가상 호스트 스타일, 두 가지 모두로 URL을 작성할 수 있도록 지원합니다.

경로 스타일 예: s3://<endpoint>:<port>/<bucket>/<backup_file_name>

가상 호스트 예: s3://<bucket>.<domain>/<backup_file_name>

예제

자격 증명 만들기

  • 자격 증명의 이름은 스토리지 경로를 제공해야 하며 스토리지 플랫폼에 따라 이름에 대한 여러 표준이 있습니다.
  • ID는 S3 커넥터를 사용 시 항상 'S3 Access Key'여야 합니다.
  • 액세스 키 ID 및 비밀 키 ID에는 콜론이 포함되어서는 안 됩니다. 액세스 키 ID 및 비밀 키 ID는 S3 호환 개체 스토리지에서 만든 사용자 및 비밀번호입니다.
  • 영숫자 값만 허용됩니다.
  • 액세스 키 ID에는 S3 호환 개체 스토리지에 대한 적절한 권한이 있어야 합니다.

CREATE CREDENTIAL을 사용하여 S3 호환 개체 스토리지 끝점으로 인증할 서버 수준 자격 증명을 만듭니다.

USE [master];
CREATE CREDENTIAL [s3://<endpoint>:<port>/<bucket>]
WITH
        IDENTITY    = 'S3 Access Key',
        SECRET      = '<AccessKeyID>:<SecretKeyID>';
GO

BACKUP DATABASE [SQLTestDB]
TO      URL = 's3://<endpoint>:<port>/<bucket>/SQLTestDB.bak'
WITH    FORMAT /* overwrite any existing backup sets */
,       STATS = 10
,       COMPRESSION;

그러나 AWS S3은 두 가지 서로 다른 URL 표준을 지원합니다.

  • S3://<BUCKET_NAME>.S3.<REGION>.AMAZONAWS.COM/<FOLDER> (기본값)
  • S3://S3.<REGION>.AMAZONAWS.COM/<BUCKET_NAME>/<FOLDER>

AWS S3에 대한 자격 증명을 성공적으로 만드는 여러 가지 방법이 있습니다.

-- S3 bucket name: datavirtualizationsample
-- S3 bucket region: us-west-2
-- S3 bucket folder: backup

CREATE CREDENTIAL [s3://datavirtualizationsample.s3.us-west-2.amazonaws.com/backup]
WITH    
        IDENTITY    = 'S3 Access Key'
,       SECRET      = 'accesskey:secretkey';
GO

BACKUP DATABASE [AdventureWorks2022]
TO URL  = 's3://datavirtualizationsample.s3.us-west-2.amazonaws.com/backup/AdventureWorks2022.bak'
WITH COMPRESSION, FORMAT, MAXTRANSFERSIZE = 20971520;
GO

또는,

CREATE CREDENTIAL [s3://s3.us-west-2.amazonaws.com/datavirtualizationsample/backup]
WITH    
        IDENTITY    = 'S3 Access Key'
,       SECRET      = 'accesskey:secretkey';
GO

BACKUP DATABASE [AdventureWorks2022]
TO URL  = 's3://s3.us-west-2.amazonaws.com/datavirtualizationsample/backup/AdventureWorks2022.bak'
WITH COMPRESSION, FORMAT, MAXTRANSFERSIZE = 20971520;
GO

URL로 백업

다음 예제에서는 여러 파일에 스트라이프된 개체 스토리지 엔드포인트에 대한 전체 데이터베이스 백업을 수행합니다.

BACKUP DATABASE <db_name>
TO      URL = 's3://<endpoint>:<port>/<bucket>/<database>_01.bak'
,       URL = 's3://<endpoint>:<port>/<bucket>/<database>_02.bak'
,       URL = 's3://<endpoint>:<port>/<bucket>/<database>_03.bak'
--
,       URL = 's3://<endpoint>:<port>/<bucket>/<database>_64.bak'
WITH    FORMAT -- overwrite
,       STATS               = 10
,       COMPRESSION;

URL에서 복원

다음 예제에서는 개체 스토리지 엔드포인트 위치에서 데이터베이스 복원을 수행합니다.

RESTORE DATABASE <db_name>
FROM    URL = 's3://<endpoint>:<port>/<bucket>/<database>_01.bak'
,       URL = 's3://<endpoint>:<port>/<bucket>/<database>_02.bak'
,       URL = 's3://<endpoint>:<port>/<bucket>/<database>_03.bak'
--
,       URL = 's3://<endpoint>:<port>/<bucket>/<database>_64.bak'
WITH    REPLACE -- overwrite
,       STATS  = 10;

암호화 및 압축 옵션

다음 예제에서는 20MB 및 압축으로 암호화 MAXTRANSFERSIZE를 사용하여 AdventureWorks2022 데이터베이스를 백업하고 복원하는 방법을 보여줍니다.

CREATE MASTER KEY ENCRYPTION BY PASSWORD = <password>;
GO

CREATE CERTIFICATE AdventureWorks2022Cert
    WITH SUBJECT = 'AdventureWorks2022 Backup Certificate';
GO
-- Backup database
BACKUP DATABASE AdventureWorks2022
TO URL = 's3://<endpoint>:<port>/<bucket>/AdventureWorks2022_Encrypt.bak'
WITH FORMAT, MAXTRANSFERSIZE = 20971520, COMPRESSION,
ENCRYPTION (ALGORITHM = AES_256, SERVER CERTIFICATE = AdventureWorks2022Cert)
GO

-- Restore database
RESTORE DATABASE AdventureWorks2022
FROM URL = 's3://<endpoint>:<port>/<bucket>/AdventureWorks2022_Encrypt.bak'
WITH REPLACE

백업 및 복원에 지역 사용

다음 예제에서는 AdventureWorks2022를 사용하여 REGION_OPTIONS 데이터베이스를 백업하고 복원하는 방법을 보여줍니다.

BACKUP / RESTORE 명령 내에서 지역을 매개 변수화할 수 있습니다. BACKUP_OPTIONSRESTORE_OPTIONS(예: '{"s3": {"region":"us-west-2"}}')의 S3 지정 지역 문자열을 확인합니다. 기본 지역은 us-east-1입니다. 간단한 예는 다음과 같습니다.

-- Backup Database
BACKUP DATABASE AdventureWorks2022
TO URL = 's3://<endpoint>:<port>/<bucket>/AdventureWorks2022.bak'
WITH BACKUP_OPTIONS = '{"s3": {"region":"us-west-2"}}'

-- Restore Database
RESTORE DATABASE AdventureWorks2022
FROM URL = 's3://<endpoint>:<port>/<bucket>/AdventureWorks2022.bak'
WITH 
  MOVE 'AdventureWorks2022' 
  TO 'C:\Program Files\Microsoft SQL Server\MSSQL16.MSSQLSERVER\MSSQL\DATA\AdventureWorks2022.mdf'
, MOVE 'AdventureWorks2022_log' 
  TO 'C:\Program Files\Microsoft SQL Server\MSSQL16.MSSQLSERVER\MSSQL\DATA\AdventureWorks2022.ldf'
, RESTORE_OPTIONS = '{"s3": {"region":"us-west-2"}}'

예시:

-- S3 bucket name: datavirtualizationsample
-- S3 bucket region: us-west-2
-- S3 bucket folder: backup

CREATE CREDENTIAL   [s3://datavirtualizationsample.s3.amazonaws.com/backup]
WITH    
        IDENTITY    = 'S3 Access Key'
,       SECRET      = 'accesskey:secretkey';
GO

BACKUP DATABASE [AdventureWorks2022]
TO URL  = 's3://datavirtualizationsample.s3.amazonaws.com/backup/AdventureWorks2022.bak'
WITH
    BACKUP_OPTIONS = '{"s3": {"region":"us-west-2"}}' -- REGION AS PARAMETER)
, COMPRESSION, FORMAT, MAXTRANSFERSIZE = 20971520;
GO

RESTORE DATABASE AdventureWorks2022_1 
FROM URL = 's3://datavirtualizationsample.s3.amazonaws.com/backup/AdventureWorks2022.bak'
WITH 
  MOVE 'AdventureWorks2022' 
  TO 'C:\Program Files\Microsoft SQL Server\MSSQL16.MSSQLSERVER\MSSQL\DATA\AdventureWorks2022_1.mdf'
, MOVE 'AdventureWorks2022_log' 
  TO 'C:\Program Files\Microsoft SQL Server\MSSQL16.MSSQLSERVER\MSSQL\DATA\AdventureWorks2022_1.ldf'
, STATS = 10, RECOVERY
, REPLACE, RESTORE_OPTIONS = '{"s3": {"region":"us-west-2"}}'; -- REGION AS PARAMETER)
GO