적용 대상:Azure SQL Managed Instance
트랜잭션 복제를 사용하면 한 데이터베이스의 SQL Server 또는 Azure SQL Managed Instance에서 호스팅되는 다른 데이터베이스로 데이터를 복제할 수 있습니다. SQL Managed Instance는 복제 토폴로지의 게시자, 배포자 또는 구독자일 수 있습니다. 사용 가능한 구성에 대해서는 트랜잭션 복제 구성을 참조하세요.
이 자습서에서는 다음 작업 방법을 알아봅니다.
- SQL 관리되는 인스턴스를 복제 게시자로 구성합니다.
- SQL 관리되는 인스턴스를 복제 배포자로 구성합니다.
- SQL Server를 구독자로 구성합니다.
이 자습서는 숙련된 대상 그룹을 위한 것이며, 사용자가 Azure 내에서 SQL 관리형 인스턴스와 SQL Server VM을 배포하고 연결하는 데 익숙하다고 가정합니다.
참고
이 문서에서는 Azure SQL Managed Instance에서 트랜잭션 복제를 사용하는 방법을 설명합니다. 개별 인스턴스의 읽기 가능한 전체 복제본을 만들 수 있는 Azure SQL Managed Instance 기능인 장애 조치(failover) 그룹과는 관련이 없습니다. 장애 조치(failover) 그룹을 사용하여 트랜잭션 복제를 구성할 때 추가 고려 사항이 있습니다.
필수 조건
이 자습서를 완료하려면 다음 필수 조건이 충족되어야 합니다.
- Azure 구독.
- 동일한 가상 네트워크 내에 두 개의 SQL 관리형 인스턴스를 배포한 경험
- 온-프레미스 또는 Azure VM의 SQL Server 구독자. 이 자습서에서는 Azure VM을 사용합니다.
- SSMS(SQL Server Management Studio) 18.0 이상.
- 최신 버전의 Azure PowerShell
- 포트 445 및 1433은 Azure 방화벽과 Windows 방화벽 모두에서 SQL 트래픽을 허용합니다.
필수 이름 및 네트워크 설정
이 자습서에서는 다음 리소스 이름 및 설정을 사용합니다.
| Resource | 이름 | 비고 |
|---|---|---|
| 퍼블리셔 SQL 관리형 인스턴스 | sql-mi-publisher |
고유성을 위해 임의 문자 추가 |
| 게시자 가상 네트워크 | vnet-sql-mi-publisher |
게시자 인스턴스를 호스트합니다. |
| 배포자 SQL 관리형 인스턴스 | sql-mi-distributor |
게시자와 동일한 VNet에 있어야 합니다. |
| SQL Server VM(구독) | sql-vm-subscriber |
지원 가능성 매트릭스에 따라 지원되는 SQL Server 버전 사용 |
| 구독자 가상 네트워크 | sql-vm-subscriber-vnet |
VNet 피어링이 게시자 VNet에 필요합니다. |
| 프라이빗 DNS 영역 | repldns.com |
DNS 라우팅의 임의 이름 |
| 필수 포트 | 445(SMB), 1433(SQL) | Azure Firewall 및 Windows 방화벽에서 열려 있어야 합니다. |
리소스 그룹 만들기
다음 PowerShell 코드 조각을 사용하여 새 리소스 그룹을 만듭니다.
변수를 설정합니다.
$ResourceGroupName = "SQLMI-Repl"
$Location = "East US 2"
리소스 그룹을 만듭니다.
New-AzResourceGroup -Name $ResourceGroupName -Location $Location
리소스 그룹이 만들어졌는지 확인합니다.
Get-AzResourceGroup -Name $ResourceGroupName | Select-Object ResourceGroupName, Location
두 개의 SQL 관리되는 인스턴스 만들기
Azure Portal을 사용하여 이 새 리소스 그룹 내에 두 개의 SQL 관리형 인스턴스를 만듭니다.
게시자 SQL 관리형 인스턴스의 이름은 임의화에 대한 몇 문자와 함께 있어야
sql-mi-publisher하며 가상 네트워크의 이름은 여야vnet-sql-mi-publisher합니다.배포자 SQL 관리형 인스턴스의 이름은 임의화에 대한 몇 문자와 함께 있어야
sql-mi-distributor하며 게시자 SQL 관리형 인스턴스와 동일한 가상 네트워크에 있어야 합니다.
SQL 관리형 인스턴스를 만드는 방법에 대한 자세한 내용은 빠른 시작: Azure SQL Managed Instance 만들기를 참조하세요.
참고
간단히 하기 위해 이 자습서에서는 배포자 SQL 관리형 인스턴스를 게시자와 동일한 가상 네트워크에 배치합니다. 그러나 적절한 VNet 피어링을 사용하여 별도의 가상 네트워크에 배포자를 만들 수 있습니다.
SQL Server VM 만들기
Azure Portal을 사용하여 SQL Server 가상 머신을 만듭니다. SQL Server 가상 머신에는 다음과 같은 특성이 있어야 합니다.
- 이름:
sql-vm-subscriber - 이미지: 지원 가능성 매트릭스에 따라 Azure SQL Managed Instance를 사용하여 트랜잭션 복제를 지원하는 SQL Server 버전
- 리소스 그룹: SQL 관리되는 인스턴스와 동일
- 가상 네트워크:
sql-vm-subscriber-vnet
Azure에 SQL Server VM을 배포하는 방법에 대한 자세한 내용은 빠른 시작: Azure Portal의 Windows 가상 머신에서 SQL Server 만들기를 참조하세요.
VNet 피어링 구성
두 SQL 관리형 인스턴스의 가상 네트워크와 SQL Server의 가상 네트워크 간에 통신을 사용하도록 VNet 피어링을 구성합니다.
변수를 설정합니다.
$SubscriptionId = '<SubscriptionID>'
$resourceGroup = 'SQLMI-Repl'
$pubvNet = 'sql-mi-publisher-vnet'
$subvNet = 'sql-vm-subscriber-vnet'
$pubsubName = 'Pub-to-Sub-Peer'
$subpubName = 'Sub-to-Pub-Peer'
가상 네트워크를 검색합니다.
$virtualNetwork1 = Get-AzVirtualNetwork -ResourceGroupName $resourceGroup -Name $pubvNet
$virtualNetwork2 = Get-AzVirtualNetwork -ResourceGroupName $resourceGroup -Name $subvNet
게시자에서 구독자로 VNet 피어링을 구성합니다.
Add-AzVirtualNetworkPeering `
-Name $pubsubName `
-VirtualNetwork $virtualNetwork1 `
-RemoteVirtualNetworkId $virtualNetwork2.Id
구독자에서 게시자로 VNet 피어링을 구성합니다.
Add-AzVirtualNetworkPeering `
-Name $subpubName `
-VirtualNetwork $virtualNetwork2 `
-RemoteVirtualNetworkId $virtualNetwork1.Id
게시자 VNet에서 피어링 상태를 확인합니다(반환될 것입니다 Connected)
Get-AzVirtualNetworkPeering -ResourceGroupName $resourceGroup -VirtualNetworkName $pubvNet | Select-Object PeeringState
구독자 VNet의 피어링 상태를 확인하라(반환되어야 합니다. Connected)
Get-AzVirtualNetworkPeering -ResourceGroupName $resourceGroup -VirtualNetworkName $subvNet | Select-Object PeeringState
VNet 피어링이 설정되면 SQL Server 호스트에서 SSMS(SQL Server Management Studio)를 시작하고 두 SQL 관리형 인스턴스에 연결하여 연결을 테스트합니다. SSMS를 사용하여 SQL Managed Instance에 연결하는 방법에 대한 자세한 내용은 SSMS를 사용하여 SQL Managed Instance에 연결하는 방법을 참조하세요.
프라이빗 DNS 영역 만들기
프라이빗 DNS 영역은 SQL 관리되는 인스턴스와 SQL Server 간의 DNS 라우팅을 허용합니다.
프라이빗 영역 만들기
Azure Portal에 로그인합니다.
리소스 만들기를 선택하여 새 Azure 리소스를 만듭니다.
Azure Marketplace에서
private dns zone을 검색합니다.Microsoft에서 게시한 프라이빗 DNS 영역 리소스를 선택한 다음 만들기 를 선택하여 DNS 영역을 만듭니다.
드롭다운 목록에서 구독 및 리소스 그룹을 선택합니다.
DNS 영역의 임의 이름을 입력합니다(예:
repldns.com).검토 + 만들기를 선택합니다. 프라이빗 DNS 영역에 대한 매개 변수를 검토한 다음 만들기 를 선택하여 리소스를 만듭니다.
A 레코드 만들기
새 프라이빗 DNS 영역으로 이동하여 개요를 선택합니다.
+ 레코드 집합을 선택하여 새 A 레코드를 만듭니다.
SQL Server VM 이름과 비공개 내부 IP 주소를 입력합니다.
확인을 선택하여 A 레코드를 만듭니다.
가상 네트워크 연결
새 프라이빗 DNS 영역으로 이동하여 가상 네트워크 링크를 선택합니다.
+추가를 선택합니다.
링크 이름을 입력합니다(예:
Pub-link).드롭다운 목록에서 구독을 선택한 다음 게시자 SQL 관리형 인스턴스에 대한 가상 네트워크를 선택합니다.
자동 등록 사용 옆에 있는 확인란을 선택합니다.
확인을 선택하여 가상 네트워크를 연결합니다.
Sub-link와 같은 이름을 사용하여 구독자 가상 네트워크에 대한 링크를 추가하려면 이러한 단계를 반복합니다.
Azure Storage 계정 만들기
작업 디렉터리에 대한 Azure 스토리지 계정을 만든 다음, 스토리지 계정 내에서 파일 공유를 만듭니다.
스토리지 구성 값
배포를 구성할 때 다음 값이 필요합니다.
-
작업 디렉터리 경로 형식:
\\<storage-account-name>.file.core.windows.net\<file-share-name> -
스토리지 연결 문자열 형식:
DefaultEndpointsProtocol=https;AccountName=<Storage-Account-Name>;AccountKey=<key>;EndpointSuffix=core.windows.net
중요합니다
작업 디렉터리 경로에서 백슬라이시(\)만 사용합니다. 앞 슬래시(/)로 인해 연결 오류가 발생합니다.
이 자습서에서 사용되는 예제 값은 다음과 같습니다.
| 매개 변수 | 예제 값 |
|---|---|
| 작업 디렉터리 | \\replstorage.file.core.windows.net\replshare |
| 연결 문자열 | DefaultEndpointsProtocol=https;AccountName=replstorage;AccountKey=123456789aBcDeFgHiJkLmNoPqRsTuVwXyZ==;EndpointSuffix=core.windows.net |
자세한 내용은 스토리지 계정 액세스 키 관리를 참조하세요.
데이터베이스 만들기
게시자 SQL 관리형 인스턴스에 새 데이터베이스를 만듭니다. 이렇게 하려면 다음 단계를 따르십시오.
- SQL Server에서 SQL Server Management Studio를 시작합니다.
- 게시자 SQL 관리형 인스턴스()에
sql-mi-publisher연결합니다. - 새 쿼리 창을 열고 다음 T-SQL 쿼리를 실행합니다.
데이터베이스가 있는 경우 삭제하고 새 데이터베이스를 만듭니다.
USE [master];
GO
IF EXISTS (SELECT * FROM sys.sysdatabases WHERE name = 'ReplTutorial')
BEGIN
DROP DATABASE ReplTutorial;
END
GO
CREATE DATABASE [ReplTutorial];
GO
복제 테스트 테이블을 만듭니다.
USE [ReplTutorial];
GO
CREATE TABLE ReplTest (
ID INT NOT NULL PRIMARY KEY,
c1 VARCHAR(100) NOT NULL,
dt1 DATETIME NOT NULL DEFAULT getdate()
);
GO
샘플 데이터를 삽입합니다.
USE [ReplTutorial];
GO
INSERT INTO ReplTest (ID, c1) VALUES (6, 'pub');
INSERT INTO ReplTest (ID, c1) VALUES (2, 'pub');
INSERT INTO ReplTest (ID, c1) VALUES (3, 'pub');
INSERT INTO ReplTest (ID, c1) VALUES (4, 'pub');
INSERT INTO ReplTest (ID, c1) VALUES (5, 'pub');
GO
데이터가 삽입되었는지 확인합니다.
SELECT * FROM ReplTest;
GO
예상 출력: ID가 2, 3, 4, 5 및 6인 5개 행
배포 구성
연결이 설정되고 샘플 데이터베이스가 있으면 배포자 SQL 관리형 인스턴스(sql-mi-distributor)에서 배포를 구성할 수 있습니다.
배포 구성 매개 변수
배포를 구성하기 전에 다음 값을 수집합니다.
| 매개 변수 | Description | 예시 |
|---|---|---|
| 배포자 DNS 이름 | 배포자 인스턴스의 FQDN | sql-mi-distributor.b6bf57.database.windows.net |
| 게시자 DNS 이름 | 게시자 인스턴스의 FQDN | sql-mi-publisher.b6bf57.database.windows.net |
@working_directory |
Azure Files 공유 경로(백슬라이시만 사용) | \\replstorage.file.core.windows.net\replshare |
@storage_connection_string |
Storage 계정 연결 문자열 | DefaultEndpointsProtocol=https;AccountName=replstorage;... |
@security_mode |
인증 모드(0 = SQL 인증) | 0 |
@login / @password |
SQL 로그인 자격 증명 | azureuser |
배포자 인스턴스 구성
- SQL Server에서 SQL Server Management Studio를 시작합니다.
- 배포자 SQL 관리형 인스턴스()에
sql-mi-distributor연결합니다. - 새 쿼리 창을 열고 다음 명령을 실행합니다.
배포자를 추가합니다.
EXECUTE sp_adddistributor
@distributor = 'sql-mi-distributor.b6bf57.database.windows.net',
@password = '<distributor_admin_password>';
배포 데이터베이스를 만듭니다.
EXECUTE sp_adddistributiondb @database = N'distribution';
배포 데이터베이스가 만들어졌는지 확인합니다.
SELECT name FROM sys.databases WHERE name = 'distribution';
배포자에 게시자를 추가합니다.
EXECUTE sp_adddistpublisher
@publisher = 'sql-mi-publisher.b6bf57.database.windows.net',
@distribution_db = N'distribution',
@security_mode = 0,
@login = N'azureuser',
@password = N'<publisher_password>',
@working_directory = N'\\replstorage.file.core.windows.net\replshare',
@storage_connection_string = N'DefaultEndpointsProtocol=https;AccountName=replstorage;AccountKey=123456789aBcDeFgHiJkLmNoPqRsTuVwXyZ==;EndpointSuffix=core.windows.net';
참고
매개변수에는 오직 백슬래시(\)만 사용하십시오 @working_directory. 앞 슬래시(/)로 인해 연결 오류가 발생합니다.
게시자에게 배포자를 등록하세요
- 게시자 SQL 관리형 인스턴스()에
sql-mi-publisher연결합니다. - 새 쿼리 창을 열고 다음 명령을 실행하여 배포자를 등록합니다.
USE master;
GO
EXECUTE sys.sp_adddistributor
@distributor = 'sql-mi-distributor.b6bf57.database.windows.net',
@password = '<distributor_admin_password>';
배포자를 등록했는지 확인합니다.
SELECT * FROM sys.servers WHERE is_distributor = 1;
게시 만들기
배포가 구성되면 게시를 만들 수 있습니다. 이렇게 하려면 다음 단계를 따르십시오.
SQL Server에서 SQL Server Management Studio를 시작합니다.
게시자 SQL 관리형 인스턴스()에
sql-mi-publisher연결합니다.개체 탐색기에서 복제 노드를 확장하고 로컬 게시 폴더를 마우스 오른쪽 단추로 클릭합니다. 새 게시...를 선택합니다.
다음을 선택하여 이전 시작 페이지로 이동합니다.
게시 데이터베이스 페이지에서 이전에 만든
ReplTutorial데이터베이스를 선택합니다. 다음을 선택합니다.게시 유형 페이지에서 트랜잭션 게시를 선택합니다. 다음을 선택합니다.
문서 페이지에서 테이블 옆에 있는 확인란을 선택합니다. 다음을 선택합니다.
필터 테이블 행 페이지에서 필터를 추가하지 않고 다음을 선택합니다.
스냅샷 에이전트에서 즉시 스냅샷을 만들고 구독 초기화에 사용할 수 있도록 유지합니다. 옆에 있는 확인란을 선택합니다. 다음을 선택합니다.
에이전트 보안 페이지에서 보안 설정...을 선택합니다. 스냅샷 에이전트에 사용하고 게시자에 연결할 SQL Server 로그인 자격 증명을 제공합니다. 확인을 선택하여 스냅샷 에이전트 보안 페이지를 닫습니다. 다음을 선택합니다.
마법사 작업 페이지에서 게시 만들기를 선택하고 필요한 경우 나중에 이 스크립트를 저장하려면 게시를 만드는 단계를 사용하여 스크립트 파일 생성을 선택합니다.
마법사 완료 페이지에서 발행물
ReplTest이름을 지정하고 다음을 선택하여 발행물을 만듭니다.게시가 만들어지면 개체 탐색기에서 복제 노드를 새로 고치고, 로컬 게시를 펼쳐 새 게시를 확인합니다.
구독 만들기
게시가 생성되면 구독을 만들 수 있습니다. 이렇게 하려면 다음 단계를 따르십시오.
- SQL Server에서 SQL Server Management Studio를 시작합니다.
- 게시자 SQL 관리형 인스턴스()에
sql-mi-publisher연결합니다. - 새 쿼리 창을 열고 다음 Transact-SQL 명령을 실행합니다. 구독자 이름의 일부로 프라이빗 DNS 영역에 구성된 DNS 이름을 사용합니다.
구독 매개 변수
| 매개 변수 | 가치 | Description |
|---|---|---|
@subscriber |
sql-vm-subscriber.repldns.com |
구독자 DNS 이름(프라이빗 DNS 영역에서) |
@destination_db |
ReplSub |
구독자의 데이터베이스 |
@subscription_type |
Push |
배포자가 구독자에 변경 내용을 푸시합니다. |
@sync_type |
automatic |
자동 초기 동기화 |
구독을 추가합니다.
USE [ReplTutorial];
GO
EXEC sp_addsubscription
@publication = N'ReplTest',
@subscriber = N'sql-vm-subscriber.repldns.com',
@destination_db = N'ReplSub',
@subscription_type = N'Push',
@sync_type = N'automatic',
@article = N'all',
@update_mode = N'read only',
@subscriber_type = 0;
푸시 구독 에이전트를 추가합니다.
EXEC sp_addpushsubscription_agent
@publication = N'ReplTest',
@subscriber = N'sql-vm-subscriber.repldns.com',
@subscriber_db = N'ReplSub',
@job_login = N'azureuser',
@job_password = '<Complex Password>',
@subscriber_security_mode = 0,
@subscriber_login = N'azureuser',
@subscriber_password = '<Complex Password>',
@dts_package_location = N'Distributor';
GO
구독이 생성되었는지 확인합니다.
SELECT * FROM distribution.dbo.MSsubscriptions;
복제 테스트
복제가 구성되면 새 항목을 게시자에 삽입하고 구독자에 전파되는 변경 내용을 감시하여 이를 테스트할 수 있습니다.
구독자에서 초기 데이터 보기
SQL Server 구독자에 연결하고 다음 쿼리를 실행합니다.
USE ReplSub;
GO
SELECT * FROM dbo.ReplTest;
예상 출력: ID가 2, 3, 4, 5 및 6인 5개 행(게시자의 초기 데이터).
게시자에 새 데이터 삽입
게시자 SQL 관리형 인스턴스(sql-mi-publisher)에 연결하고 새 행을 삽입합니다.
USE ReplTutorial;
GO
INSERT INTO ReplTest (ID, c1) VALUES (15, 'pub');
퍼블리셔의 삽입을 확인하세요.
SELECT * FROM ReplTest WHERE ID = 15;
구독자에 대한 복제 확인
잠시 후 구독자에 연결하고 복제된 새 행을 확인합니다.
USE ReplSub;
GO
SELECT * FROM dbo.ReplTest WHERE ID = 15;
예상 출력: ID가 15이고 c1 값이 'pub'인 1행입니다.
리소스 정리
- Azure Portal에서 리소스 그룹으로 이동합니다.
- SQL 관리형 인스턴스를 선택한 다음 삭제를 선택합니다. 텍스트 상자에 입력
yes하여 리소스를 삭제할지 확인한 다음 삭제를 선택합니다. 이 프로세스는 백그라운드에서 완료하는 데 다소 시간이 걸릴 수 있으며 완료될 때까지 가상 클러스터 또는 다른 종속 리소스를 삭제할 수 없습니다. 작업 탭에서 삭제를 모니터링하여 SQL 관리되는 인스턴스가 삭제되었는지 확인합니다. - SQL 관리형 인스턴스가 삭제되면 리소스 그룹에서 가상 클러스터를 선택한 다음 삭제를 선택하여 가상 클러스터 를 삭제합니다. 텍스트 상자에 입력
yes하여 리소스를 삭제할지 확인한 다음 삭제를 선택합니다. - 남아 있는 리소스를 삭제합니다. 텍스트 상자에 입력
yes하여 리소스를 삭제할지 확인한 다음 삭제를 선택합니다. - 리소스 그룹 삭제를 선택하고 리소스 그룹의 이름을 입력한 다음 삭제를 선택하여 리소스 그룹을
myResourceGroup삭제합니다.
알려진 오류
Windows 로그인은 지원되지 않습니다.
Exception Message: Windows logins are not supported in this version of SQL Server.
에이전트가 Windows 로그인으로 구성되었으며 대신 SQL Server 로그인을 사용해야 합니다. 게시 속성의 에이전트 보안 페이지를 사용하여 로그인 자격 증명을 SQL Server 로그인으로 변경합니다.
Azure Storage에 연결하지 못함
Connecting to Azure Files Storage '\\replstorage.file.core.windows.net\replshare' Failed to connect to Azure Storage '' with OS error: 53.
2019-11-19 02:21:05.07 Obtained Azure Storage Connection String for replstorage
2019-11-19 02:21:05.07 Connecting to Azure Files Storage '\\replstorage.file.core.windows.net\replshare'
2019-11-19 02:21:31.21 Failed to connect to Azure Storage '' with OS error: 53.
이는 포트 445가 Azure 방화벽, Windows 방화벽 또는 둘 다에서 닫혀 있기 때문일 수 있습니다.
Connecting to Azure Files Storage '\\replstorage.file.core.windows.net\replshare' Failed to connect to Azure Storage '' with OS error: 55.
파일 공유의 파일 경로에서 백슬래시 대신 슬래시를 사용하면 이 오류가 발생할 수도 있습니다.
- 이는 허용됩니다.
\\replstorage.file.core.windows.net\replshare - 이로 인해 OS 55 오류(
\\replstorage.file.core.windows.net/replshare)가 발생할 수 있습니다.
구독자에 연결할 수 없음
The process could not connect to Subscriber 'SQL-VM-SUBSCRIBER
Could not open a connection to SQL Server [53].
A network-related or instance-specific error has occurred while establishing a connection to SQL Server. Server is not found or not accessible. Check if instance name is correct and if SQL Server is configured to allow remote connections.
가능한 해결 방법:
- 1433 포트가 열려 있는지 확인합니다.
- 구독에서 TCP/IP가 사용되도록 설정되어 있는지 확인합니다.
- 구독자를 만들 때 DNS 이름이 사용되었는지 확인합니다.
- 가상 네트워크가 프라이빗 DNS 영역에 올바르게 연결되어 있는지 확인합니다.
- A 레코드가 올바르게 구성되어 있는지 확인합니다.
- VNet 피어링이 올바르게 구성되었는지 확인합니다.
구독할 수 있는 게시가 없음
새 구독 마법사를 사용하여 새 구독을 추가하는 경우 게시 페이지에서 사용 가능한 옵션으로 나열된 데이터베이스 및 게시가 없는 것을 확인할 수 있으며 다음 오류 메시지가 표시될 수 있습니다.
There are no publications to which you can subscribe, either because this server has no publications or because you do not have sufficient privileges to access the publications.
이 오류 메시지가 정확하고 실제로 연결한 게시자에서 사용할 수 있는 게시가 없거나 충분한 권한이 부족할 수 있지만 이전 버전의 SQL Server Management Studio에서도 이 오류가 발생할 수 있습니다. SQL Server Management Studio 18.0 이상으로 업그레이드하여 근본 원인으로 배제해 보세요.