SQL Server 에서 AWS S3에 직접 백업하기
SQL Server 에서 AWS S3에 직접 백업하기
l Version : SQL Server 2022
SQL Server 2022부터는 데이터 플랫폼에 통합 오브젝트 스토리지를 도입하여 Azure Storage외에도 AWS S3 호환 오브젝트 스토리지도 사용할 수 있다. 즉, SQL Server에서 AWS S3로 직접 백업을 할 수 있게 되었다.
기존 SQL Server 2019의 경우 Microsoft Azure 저장소만 가능 하였다. SQL Server 2022 부터 도입된 S3 REST API는 SQL Server에서 AWS S3 직접 백업, 복원을 할 수 있어, 백업 후 이동에 따른 프로세스 단축 및 대용량 백업을 진행할 경우에도 로컬 공간이 부족하여도 백업을 진행할 수 있게 되었다.
지원되는 백업 종류
l 전체 백업
l 차등 백업
l 트랜잭션 로그 백업
l 복사 전용 백업 (COPY ONLY)
지원되지 않는 백업 종류
l 스냅샷 백업 (FILE_SNAPSHOT)
l 미러 백업 (MIRROR)
AWS S3버킷으로 백업 및 복원을 수행 하기위해서는 아래 정보가 필요 하다.
l S3 버킷이름
l S3 URI
l S3 URL
l IAM 액세스 ID
l IAM 액세스 키
AWS IAM(Idnetity Access Management)의 정책은 사용자의 권한 또는 특정 서비스에 대해 수행할 수 있는 역할을 정의한다. SQL Server 2022에서 S3 버킷으로 직접 데이터베이스 백업을 수행하려면 ListBucket 및 PutObject 권한이 필요하다.
l ListBucket : ListBucket 액세스는 요청의 인증된 발신자가 소유한 모든 버킷 목록을 반환한다.
l PutObject : PutObject 액세스를 통해 버킷에 객체를 작성하고 추가할 수 있다.
SQL Server에서 AWS S3로 백업을 하기 위해 우선 자격증명을 만들어야 한다. 아래는 자격증명을 만드는 스크립트이다.
| CREATE CREDENTIAL [s3://<endpoint>:<port>/<bucket>] WITH IDENTITY = 'S3 Access Key', SECRET = '<AccessKeyID>:<SecretKeyID>'; |
l [s3://<endpoint>:<port>/<bucket>] : 자격 증명 이름에는 S3 버킷 이름이 포함되어야 한다. S3://로 시작하고 접두사 HTTPS://를 제거한 후 S3 버킷 URL을 따른다.
l IDENTITY : S3 Access Key 값으로, 자격 증명에서 S3 커넥터를 사용하고 있음을 나타낸다.
l SECRET : 접근키 ID와 비밀 키를 콜론으로 구분하여 입력한다. 콜론 기호는 구분자 역할을 한다.

백업 명령은 기존에 사용하던 백업문과 거의 동일하다. 다만 백업 위치가 DISK 가 아닌 URL을 사용한다.
| BACKUP DATABASE [DatabaseName] TO URL = 'CredentialName\Backupfilename.bak' |

백업 완료 후 S3를 확인해보면 백업파일이 생성된 것을 확인할 수 있다.

아래 스크립트는 백업하려는 데이터베이스를 여러 스트라이프된 백업 파일로 오브젝트 스토리지 엔드포인트를 사용하여 백업을 수행한다.
| 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; |


아래 스크립트는 오브젝트 스토리지 엔드포인트 위치에서 데이터베이스 복원을 수행한다.
| 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; |
데이터를 저장하려면 S3 호환 오브젝트 스토리지 공급자는 파트(Part)라 불리는 여러 블록으로 파일을 분할해야 한다. 각 파일은 최대 10,000개의 파트로 분할 수 있으며, 각 파트의 크기는 5MB ~ 20MB이다. 이 범위는 매개변수 MAXTRANSFERSIZE를 통해 T-SQL BACKUP 명령으로 제어할 수 있다. MAXTRANSFERSIZE의 기본값은 10MB 이므로 각 파트의 기본 크기는 10MB이다. 즉, 단일 백업 파일의 크기는 MAXTRANSFERSIZE가 기본값으로 설정되어 있을 경우 100,000MB이다. 백업 스트라이프가 100,000MB를 초과할 경우 아래와 같은 오류 메시지를 반환한다.
| Msg 3202, Level 16, State 1, Line 161 Write on 's3://<endpoint>:<port>/<bucket>/<path>/<db_name>.bak' failed: 87(The parameter is incorrect.) Msg 3013, Level 16, State 1, Line 161 BACKUP DATABASE is terminating abnormally. |
단일 백업 파일의 크기가 100,000MB 보다 큰 파일을 백업 해야 할 경우 최대 64개의 URL 스트라이프 백업을 지원한다. 즉, 가능한 최대 백업 파일 크기는 10,000part * MAXTRANSFERSIZE * URL이다. 압축 백업을 사용할 경우 백업 파일 사이즈가 현저히 많이 줄어들기 때문에 백업 시 압축 옵션을 적극 활용할 수 있도록 한다.
아래 예제는 MAXTRANSFERSIZE를 사용하여 20MB으로 설정하고, 백업 시 압축 및 암호화한다.
| CREATE MASTER KEY ENCRYPTION BY PASSWORD = <password>; GO CREATE CERTIFICATE AdventureWorks2019Cert WITH SUBJECT = 'AdventureWorks2019 Backup Certificate'; GO -- Backup database BACKUP DATABASE AdventureWorks2019 TO URL = 's3://<endpoint>:<port>/<bucket>/AdventureWorks2019_Encrypt.bak' WITH FORMAT, MAXTRANSFERSIZE = 20971520, COMPRESSION, ENCRYPTION (ALGORITHM = AES_256, SERVER CERTIFICATE = AdventureWorks2019Cert) GO |
백업 및 복원 엔진에서 총 URL의 길이는 259바이트로 제한되어 있기 때문에 s3://를 제외하고 사용자의 경로 길이(호스트 이름 + 개체키)를 259 - 5 = 254글자까지 입력할 수 있다. 만약 URL 길이를 초과할 경우 아래와 같은 오류가 반환된다.
| SQL Server has a maximum limit of 259 characters for a backup device name. The BACKUP TO URL consumes 36 characters for the required elements used to specify the URL - 'https://.blob.core.windows.net//.bak', leaving 223 characters for account, container, and blob names put together' |
S3 스토리지는 SQL 호스트와 S3 서버간의 시간 차이가 15분을 초과할 때 마다 연결을 거부하고 “InvalidSignatureException”오류를 SQL Server로 보낸다. SQL Server에서는 아래와 같은 오류로 반환된다.
| Msg 3201, Level 16, State 1, Line 28 Cannot open backup device '<path>'. Operating system error 5(Access is denied.). Msg 3013, Level 16, State 1, Line 28 BACKUP DATABASE is terminating abnormally. |
[참고자료]
l SQL Server backup to URL for S3-compatible object storage : https://learn.microsoft.com/en-us/sql/relational-databases/backup-restore/sql-server-backup-to-url-s3-compatible-object-storage?view=sql-server-ver16
l SQL Server back up to URL for S3-compatible object storage best practices and troubleshooting : https://learn.microsoft.com/ko-kr/sql/relational-databases/backup-restore/sql-server-backup-to-url-s3-compatible-object-storage-best-practices-and-troubleshooting?view=sql-server-ver16
l https://www.mssqltips.com/sqlservertip/7301/sql-server-2022-backup-restore-aws-s3-storage/
l https://www.mssqltips.com/sqlservertip/7302/backup-sql-server-2022-database-aws-s3-storage/
2022-10-28/ Sungwook Kang / http://sungwookkang.com
SQL Server, MS SQL, AWS S3 backup, S3 백업, 클라우드 백업, cloud backup