Azure SQL 내부 디스크 할당 방법   저장 가능 용량 확인

 

·         Version : Azure SQL

 

Azure SQL Database Managed Instance 모든 데이터베이스 파일을 Azure Storage 보관하는 Azure Cloud SQL Server 서비스 이다. 이번 포스트에서는 Managed Instance 스토리지 계층에 디스크를 할당하는 방법과 최대 사용한 가능한 디스크 공간을 확인하는 방법에 대해서 살펴본다.

 

 Azure SQL Database Managed Instance 일반적인 목적의  스토리지 계층과 데이터베이스 파일이 위치하는 Azure Premium 스토리지 계층을 가지고 있다. Managed Instance 모든 파일에 대해 미리 정의된 크기의 Azure disk(128GB, 256GB, 512GB ) 사용한다. 모든 파일은 현재 파일의 크기를 포함할 있는 가장 작은 단일 디스크에 저장된다. 이는 모든 Managed Instance 최대 35TB 내부 저장장치를 가지고 있기 때문에 중요하다. Managed Instance 프로비저닝하면 가지 스토리지 제한이 있다.

1.       Managed Instance 사용자 저장소는 사용자가 포털에서 선택한 managed instance 저장소 이며 저장소 크기에 따라 비용을 지불한다.

2.       Azure Premium disk 내부에서 물리적으로 공간을 할당할 35TB 초과 없다. 결과적으로 GP 인스턴스에서  가장 작은 디스크(128GB) 위치한 280개의 파일이 35TB 한도에 도달하므로 GP인스턴스에 280 넘는 파을을 저장할 없다.

 

데이터베이스 파일을 만들때,  Azure Premium Disk 사용하는데 파일크기가 경우 파일의 내부 조각화가 발생할 있다. Azure Premium Disk 고정된 디스크 크기 집합을 제공하므로 Managed Instance 데이터베이스 파일을 일치하는 디스크에 저장하도록 구현된다. 할당된 디스크 크기의 합은 35TB 초과할 없다. 만약 한계에 도달하면 에러가 발생할 있다. 아래 스크립트는 저장용량 한도에 도달했는지 확인할 있다.  sys.master_files뷰를 래핑하고 모든 파일에 할당된 디스크 크기를 반환하는 표준 스키마뷰를 만든다.

CREATE SCHEMA mi;

GO

CREATE OR ALTER VIEW mi.master_files

AS

WITH mi_master_files AS

( SELECT *, size_gb = CAST(size * 8. / 1024 / 1024 AS decimal(12,4))

FROM sys.master_files )

SELECT *, azure_disk_size_gb = IIF(

database_id <> 2,

CASE WHEN size_gb <= 128 THEN 128

WHEN size_gb > 128 AND size_gb <= 256 THEN 256

WHEN size_gb > 256 AND size_gb <= 512 THEN 512

WHEN size_gb > 512 AND size_gb <= 1024 THEN 1024

WHEN size_gb > 1024 AND size_gb <= 2048 THEN 2048

WHEN size_gb > 2048 AND size_gb <= 4096 THEN 4096

ELSE 8192

END, NULL)

FROM mi_master_files;

GO

 

이제 Azure Premium disk 할당된 모든 데이터베이스 파일에 대한 크기를 있다.

SELECT db = db_name(database_id), name, size_gb, azure_disk_size_gb

from mi.master_files;

 

Azure disk 크기의 합은 35TB 초과해서는 안된다. 그렇지 않으면 Azure disk 오류가 발생한다. 다음 쿼리를 사용하여 할당된 저장 공간을 확인할 있다.

SELECT storage_size_tb = SUM(azure_disk_size_gb) /1024.

FROM mi.master_files

 

아래 스크립트는 새로운 파일이 128GB보다 작은것으로 가정하고 Managed Instance 추가할 있는 파일 수를 확인한다. 결과값이 0 경우 (또는 0 근사할 수록) 파일을 할당할 없으므로 새로운 계획이 필요 하다.

SELECT remaining_number_of_128gb_files =

(35 - ROUND(SUM(azure_disk_size_gb) /1024,0)) * 8

FROM mi.master_files

 

 

[참고자료]

https://blogs.msdn.microsoft.com/sqlserverstorageengine/2018/08/20/reaching-azure-disk-storage-limit-on-general-purpose-azure-sql-database-managed-instance/

 

 

2018-09-05 / Sungwook Kang / http://sqlmvp.kr

 

Azure SQL,  Managed Instance, SQL, Azure disk, database file. Azure storage

Azure SQL에서 이메일 보내기

 

·         Version : Azure SQL

 

Azure SQL Database Managed Instance Azure 클라우드에서 대부분의 SQL Server 기능을 사용할 있다. 이번 포스트에서는 Managed Instance에서 메일 프로필을 설정하고 이메일을 보내는 방법에 대해서 알아본다.

 

먼저 이메일 서버에 액세스하는데 필요한 로그인/암호 정보와 함께 실제 이메일을 보낼 전자 메일 서버의 주소가 포함된 이메일 계정 정보를 설정한다. 아래 스크립트를 참고하여 설정을 사용자에게 맞게 변경 실행 한다.

-- Create a Database Mail account

EXECUTE msdb.dbo.sysmail_add_account_sp

    @account_name = '...',

    @description = '...',

    @email_address = '$(loginEmail)',

    @display_name = '...',

    @mailserver_name = '$(mailserver)' ,

    @username = '$(loginEmail)' , 

    @password = '$(password)'

 

-- Create a Database Mail profile

EXECUTE msdb.dbo.sysmail_add_profile_sp

    @profile_name = 'AzureManagedInstance_dbmail_profile',

    @description = '...' ;

 

-- Add the account to the profile

EXECUTE msdb.dbo.sysmail_add_profileaccount_sp

    @profile_name = 'AzureManagedInstance_dbmail_profile',

    @account_name = '...',

    @sequence_number = 1;

 

여기서 중요한것은 하나의 이메일 프로필만 만들 있으며 프로필명은 반드시 AzureManagedInstance_dbmail_Profile 이라고 해야 한다. 이렇게 하지 않으면 Managed Instance 프로필을 사용하여 이메일을 보낼 없다.

 

이메일 서버 설정이 완료되었으면 sp_configure에서 Database Mail XPs 옵션을 활성화 한다.

EXEC sp_configure 'show advanced options', 1; 

GO 

RECONFIGURE; 

GO 

EXEC sp_configure 'Database Mail XPs', 1; 

GO 

RECONFIGURE 

GO

 

이제 sp_send_dbmail sp_notify_operator 프로시저를 사용하여 전자 메일을 보내 구성을 테스트할 있다. 전자 메일을 보내는 방법은 아래 스크립트를 참고 한다.

DECLARE @body VARCHAR(4000) = 'The email is sent with msdb.dbo.sp_send_dbmail from ' + @@SERVERNAME;

EXEC msdb.dbo.sp_send_dbmail

        @profile_name = 'AzureManagedInstance_dbmail_profile',

        @recipients = '$(email)',

        @body = @body,

        @subject = 'Azure SQL Instance - test email' ;

 

운영자에게 이메일을 보내기 위해서는 운영자 정보를 추가해야 한다. 아래 스크립트를 참고하여 운영자 이메일을 설정하여 그룹을 생성한다.

EXEC msdb.dbo.sp_add_operator

          @name = N'SQL DevOp',

          @enabled = 1,

          @email_address = N'$(email)',

          @weekday_pager_start_time = 080000,

          @weekday_pager_end_time = 170000,

          @pager_days = 62 ;

 

운영자 등록이 완료되었으며 아래 스크립트를 참고하여 설정이 정상적으로 되었는지 운영자에게 이메일 알림을 전송해본다.

DECLARE @body VARCHAR(4000) = 'The email is sent using sp_notify_operator from ' + @@SERVERNAME;

EXEC msdb.dbo.sp_notify_operator

              @profile_name = N'AzureManagedInstance_dbmail_profile',

              @name = N'SQL DevOp',

              @subject = N'Azure SQL Instance - Test Notification',

              @body = @body;

 

아래 예시는 Managed Instance에서 작업이 성공하거나 실패할 이메을 통해 운영자에게 알릴 있다.

EXEC msdb.dbo.sp_update_job

              @job_name=N'My job name',

              @notify_level_email=2,

              @notify_level_page=2,

              @notify_email_operator_name=N'SQL DevOp'

 

 

[참고자료]

https://blogs.msdn.microsoft.com/sqlserverstorageengine/2018/08/31/sending-emails-in-azure-sql-managed-instance/

 

 

2018-09-04 / Sungwook Kang / http://sqlmvp.kr

 

Azure SQL,  Managed Instance, SQL, database mail, XPs Mail, sp_send_dbmail, sp_notify_operator


Azure SQL에서 읽기 전용 복제본에 대한 접속 링크 서버 생성

 

·         Version : Azure SQL

 

Azure SQL Database Managed Instance Azure 클라우드에서 호스트 되는 완벽하게 관리되는 SQL Server 데이터베이스 엔진으로 Azure SQL Pass SQL Server 기능(: 링크된 서버 기본 제공되는 무료 보조 읽기 전용 복제본) 제공한다. 이번 포스트에서는 연결된 서버(링크드 서버) 사용하여 읽을 있는 보조 복제본을 연결하는 방법을 살펴 본다.

 

Managed Instance Business Critical Tier 모든 데이터베이스에 대해서 리포트 목적의 용도로 사용할 있는 읽기 전용 상태의 무료 읽기 전용 복제본을 제공한다. 아래 그림에는 하나의 기본 인스턴스와   개의 읽기 전용 서버로 구성된다. 서버는 읽기 전용 끝점을 이용해서 연결된다.


어플리케이션에서 보조 복제본에 접속하는 방법은 기본 인스턴스에 액세스하는 사용하는 것과 동일한 연결 문자열을 사용한다. 다만 연결 문자열에ApplicationIntent=ReadOnly 추가하면 된다.

기본 인스턴스에서 보조 인스턴스로 연결된 서버를 만드는 경우 T-SQL 사용하여 기본 인스턴스에서 보조 인스턴스로 연결할 있다. 아래 스크립트는 보조 복제본에 연결된 서버를 만든다.

EXEC sp_addlinkedserver

@server=N'SECONDARY',

@srvproduct=N'',

@provider=N'SQLNCLI',

@provstr = N'ApplicationIntent=ReadOnly',

@datasrc= @@SERVERNAME;

 

@@SERVERNAME Managed Instance 정규화된 도메인 이름을 반환하고 동일한 이름은 보조 인스턴스에 액세스하는데 사용된다. 추가해야하는 유일한 것은 공급자 문자열에서 ApplicationIntent=ReadOnly 이다

 

읽기 보조 복제본 서버로 연결된 서버를 생성하면 T-SQL 사용하여 읽기 전용 인스턴스를 쿼리 있다. 예를 들어 아래 쿼리를 사용하여 보조 데이터베이스가 읽기 전용인지 확인할 있다.

SELECT *

FROM OPENQUERY([SECONDARY],

'SELECT DATABASEPROPERTYEX (''master'', ''Updateability'' ) ')

 

또한 4 part name 구문을 사용하여 Secondary 서버의 테이블이나 뷰를 쿼리할 있다.

SELECT *

FROM SECONDARY.master.sys.databases;

 

 

[참고자료]

https://blogs.msdn.microsoft.com/sqlserverstorageengine/2018/08/27/create-linked-server-to-readable-secondary-replica-in-managed-instance-business-critical-service-tier/

 

 

 

2018-08-30 / Sungwook Kang / http://sqlmvp.kr

 

Azure SQL,  Managed Instance, SQL, read only, High Availability, Linked server, Read-only replica

Azure SQL에서 네트워크를 구성하는 방법

 

·         Version : Azure SQL

 

Azure SQL Managed Instance Azure 클라우드에서 호스팅되고 Azure 가상 네트워크를 사용하는 완전히 관리되는 SQL Server 인스턴스이다. Managed Instance 가상 네트워크를 사용하기 때문에  Azure 관리 서비스에서 사용자가 네트워크 액세스 규칙을 정의할 있다. 잘못된 네트워크 구성은  Managed Instance  배포할때  오류가 발생하므로 아래 순서에 따라서 네트워크 환경을 구성하여 사용한다. 일반적으로 인스턴스용 가상 네트워크를 구성할 기본 5가지 단계로 정리할 있다.

1.       Managed Instance 사용할 가상 네트워크를 구성

2.       Managed Instance Azure 관리 서비스와 통신할 있도록Route 테이블 생성

3.       가상 네트워크 생성시 생성된 기본 서브넷을 사용하거나Managed Instance 전용 서브넷을생성

4.       서브넷에 Route 테이블 할당

5.       4단계 까지 올바르게 구성되었는지 확인

 

[1. 가성 네트워크 구성]

Managed Instance 사설 IP주소가 할당된 Azure Virtual network 사용한다. 가상 네트워크는 Managed Instance 만들기 전에 생성해야 한다. 가상 네트워크는 Azure Portal, PowerShell, Azure CLI등을 이용하여 생성할 있다. Azure Portal 사용하여 가상 네트워크를 생성할때 Resource Manager 배포 모델을 사용해야 한다. 클래식 가상 네트워크 모델은 지원되지 않는다. 가상 네트워크를 생성할 Virtual Network Blade Service Endpoint 옵션이 Disable 설정되어 생성 되는데 는기본 옵션이므로 변경하지 않는 것을 권장한다.

 

Managed Instance 서브넷은 16 ~ 256개의 주소를 사용할 있다. 따라서 기본 서브넷의IP범위를 정의할 서브넷 마스크 /28 - /24 범위를 사용한다. 많은 인스턴스가 있을 경우 기본 서브넷에 (인스턴스 X 2) + 5개의 주소가 있는지 확인한다.

 

[2. Route 테이블 생성]

가성 네트워크 생성이 완료 되었으면 Managed Instance Azure 관리 서비스와 통신할 있도록 Route 테이블을 구성해야한다. Route 테이블은 Managed Instance 배포된 서브넷에 연결되며 서브넷을 통해서 나가는 패킷은 연결된 Route 테이블 기반으로 처리된다. 서브넷은 단일 Route 테이블에만 연결할 있다. (Azure에서 Route 테이블을 만드는데는 비용이 부과 되지 않는다.)

Azure Portal에서 ‘Route table’이라는 리소스를 추가하고 Route 규칙에 “0.0.0.0/0 Next Hop Internet” 경로를 추가한다. 경로를 사용하면 가상 네트워크에 있는 Managed Instance 인스턴스를 관리하는 Azure 관리 서비스와 통신할 있다. 이렇게 하지 않으면 Managed Instance 배포 없다.

 

[3. 추가 서브넷 생성(선택사항)]

Managed Instance 서브넷에 배포되므로 Managed Instance 배포하기 전에 서브넷을 생성해야 한다. 기본 서브넷에 인스턴스를 배포하고 기본 경로를 사용하는경우 단계를 건너 있다. 서브넷은 Managed Instance 전용이며 다른 리소스를 포함할 없다. 서브넷에는 최소한 16개의 주소가 있어야 하고 5개의 주소는 Azure 내부 서비스용으로 예약되어 있다. 서브넷에 포함되는  모든 Managed Instance 에는 인스턴스당 2개의 주소가 필요하다. 서브넷에 Managed Instance 배치하면 서브넷의 크기를 변경할 없으므로 주의한다.

 

[4.서브넷 구성]

서브넷(기본값 1 또는 신규)에는 “0.0.0.0/0 Next Hop Internet” 정보를 포함한 User Route Table(UDR) 있어야 한다. “0.0.0.0/0 Next Hop Internet” Route 테이블을 생성하면 Managed Instance 서브넷에 할당 있다. Azure Portal에서 서브넷을 정보를 확인할 있으며 아래 항목을 확인한다.

1.       서브넷에 할당된 Managed Instance Route 테이블 있다.

2.       서브넷에는 네트워크 보안그룹이 없어야 한다.

3.       서브넷에는 서비스 엔드 포인트가 없어야 한다.

4.       서브넷에는 다른 리소스가 없다.

 

[5. 체크리스트]

4단계 까지 구성이 완료 되었으면 Managed Instance 배포할때 문제가 발생하지 않도록 아래 체크리스트 항목을 확인한다.

1.       가상 네트워크에서 서비스 끝점을 사용하지 않도록 설정한다.

2.       서브넷에는 16 ~256개의 IP 주소가 있어야 한다. (Masks from /28~ /24)

3.       Managed Instance 서브넷에는 다른 리소스가 없어야 한다.

4.       서브넷에는 0.0.0.0/0 Next Hop Internet 경로가 있어야 한다.

5.       서브넷에는 보안 그룹이 없어야 한다.

6.       서브넷에는 서비스 끝점이 없어야 한다.

 

모든 구성이 완료 되었어면 Azure Portal 사용하여  새로운 Managed Instance 만들고 사용자가 만든 가상 네트워크 서브넷을 할당 있다.

 

[참고자료]

https://blogs.msdn.microsoft.com/sqlserverstorageengine/2018/03/14/how-to-configure-network-for-azure-sql-managed-instance/

 

 

2018-06-14 / Sungwook Kang / http://sqlmvp.kr

 

SQL Server, Azure SQL, Azure Managed Instance, Azure network, Azure route table, Azure Virtual Network

+ Recent posts