온라인 방법을 사용하여 Azure SQL Database로 마이그레이션

완료됨

마이그레이션하는 중에도 사용자들을 위해 데이터베이스가 온라인 상태로 유지되어야 하는 경우 트랜잭션 복제를 통해 데이터를 이동할 수 있습니다. 트랜잭션 복제는 Azure SQL Database로 마이그레이션할 수 있는 유일한 온라인 방법입니다.

여기 자전거 제조업체 시나리오에서는 창고가 연중무휴로 운영되며 중지 기간이 없습니다. 회사 이사회는 Azure SQL Database로 마이그레이션하는 동안에도 재고 데이터베이스를 계속 사용할 수 있기를 바랍니다.

Diagram showing the replication topology involving SQL Server and Azure SQL Database.

트랜잭션 복제란?

트랜잭션 복제는 지속적으로 연결된 데이터베이스 서버 간에 데이터를 이동하는 방법입니다.

이 프로세스는 게시 데이터베이스 개체 및 데이터의 스냅샷부터 시작합니다. 초기 스냅샷이 확보된 후에는 게시자에 있는 데이터 또는 스키마에 대한 후속 변경 내용이 일반적으로 거의 실시간으로 Azure SQL Database에 전달됩니다.

Diagram showing the key components in a transactional replication.

Azure SQL Database는 트랜잭션과 스냅샷 복제 둘 다를 밀어넣기 구독자로 지원합니다. 이는 Azure SQL Database가 트랜잭션 또는 스냅샷 복제를 사용하여 게시자로부터 변경 내용을 수신하고 적용할 수 있음을 의미합니다.

게시자 및/또는 배포자는 온-프레미스 또는 클라우드의 Azure 가상 머신에서 실행되는 SQL Server 인스턴스이거나, Azure SQL Managed Instance일 수 있습니다.

트랜잭션 복제는 SQL Server Management Studio를 통해 또는 게시자에서 Transact-SQL 문을 실행하여 구성할 수 있습니다. 트랜잭션 복제를 Azure Portal에서 구성할 수 없습니다.

트랜잭션 복제에는 다음 구성 요소가 필요합니다.

역할 정의
게시자 복제할 데이터(원본)를 호스트하는 데이터베이스 인스턴스입니다.
구독자 게시자(대상)에서 복제되는 데이터를 받습니다.
배포자 게사자에서 문서의 변경 내용을 수집하고 구독자에게 배포합니다.
아티클 데이터베이스 개체(예: 게시에 포함된 테이블)입니다.
게시 복제되는 데이터베이스에 있는 하나 이상의 아티클 컬렉션입니다.
구독 게시에 대한 구독자의 요청입니다.

트랜잭션 복제 설정

아래 단계에 따라 가동 중지 시간 없이 [Person].[Person] 테이블을 AdventureWorks 데이터베이스에서 Azure SQL Database로 마이그레이션합니다. 트랜잭션 복제는 Azure SQL Database에 연결하는 데 SQL Server 인증 로그인만 사용할 수 있습니다.

매개 변수 정의
@distributor 소스 인스턴스 이름입니다.
@publisher 소스 인스턴스 이름입니다.
@subscriber <server>.database.windows.net 형식의 Azure SQL Database입니다. 스크립트를 실행하기 전에 Azure SQL Database가 있어야 합니다.
@dbname 원본의 데이터베이스 이름입니다.
@publisher_login 원본에서 필요한 사용 권한이 있는 SQL 사용자입니다.
@publisher_password SQL 사용자의 암호입니다.
@destination_db 대상의 데이터베이스 이름입니다.
@subscriber_login 대상에서 필요한 사용 권한이 있는 SQL 사용자입니다.
@subscriber_password SQL 사용자의 암호입니다.
@working_directory 복제 작업 디렉터리에서 이 위치를 적절하게 변경합니다.

스크립트를 실행할 때 사용자 환경에 따라 위의 매개 변수를 조정합니다.

배포자 만들기

다음 스크립트는 배포자 데이터베이스, 배포자 게시자, 에이전트를 만듭니다.

USE [master]
GO

EXEC sp_adddistributor @distributor = N'CONTOSO-SRV', @password = N''
GO

EXEC sp_adddistributiondb 
		@database = N'distribution', 
		@data_folder = N'C:\Program Files\Microsoft SQL Server\MSSQL16.MSSQLSERVER\MSSQL\Data', 
		@data_file = N'distribution.MDF', 
		@data_file_size = 13, 
		@log_folder = N'C:\Program Files\Microsoft SQL Server\MSSQL16.MSSQLSERVER\MSSQL\Data', 
		@log_file = N'distribution.LDF', 
		@log_file_size = 9, 
		@min_distretention = 0, 
		@max_distretention = 72, 
		@history_retention = 48, 
		@deletebatchsize_xact = 5000, 
		@deletebatchsize_cmd = 2000, 
		@security_mode = 1
GO

-- Adding the distribution publishers
exec sp_adddistpublisher 
	@publisher = N'CONTOSO-SRV', 
	@distribution_db = N'distribution',
	@security_mode = 1, 
	@working_directory = N'C:\REPL', 
	@trusted = N'false', 
	@thirdparty_flag = 0, 
	@publisher_type = N'MSSQLSERVER'
GO

exec sp_addsubscriber 
	@subscriber = N'contoso.database.windows.net', 
	@type = 0, 
	@description = N'Azure SQL Database (target)'
GO

-- Enabling the replication database
use master
exec sp_replicationdboption 
	@dbname = N'AdventureWorks', 
	@optname = N'publish', 
	@value = N'true'
GO

--Adds a Log Reader agent for the AdventureWorks database. 
exec [AdventureWorks].sys.sp_addlogreader_agent 
	@publisher_security_mode = 1
GO

--Adds a Queue Reader agent for the distributor.
exec [AdventureWorks].sys.sp_addqreader_agent 
	@frompublisher = 1
GO

트랜잭션 게시 만들기

다음 스크립트는 게시자에서 AdventureWorks 데이터베이스의 트랜잭션 게시를 만듭니다.

USE [AdventureWorks]
GO

EXEC sp_addpublication 
	@publication = N'REPL-AdventureWorks', 
	@description = N'Transactional publication of database ''AdventureWorks'' from Publisher ''CONTOSO-SRV''.', 
	@sync_method = N'concurrent', 
	@retention = 0, 
	@allow_push = N'true', 
	@allow_pull = N'true', 
	@allow_anonymous = N'true', 
	@enabled_for_internet = N'false', 
	@snapshot_in_defaultfolder = N'false', 
	@alt_snapshot_folder = N'C:\REPL', 
	@compress_snapshot = N'true', 
	@ftp_port = 21,
	@ftp_login = N'anonymous', 
	@allow_subscription_copy = N'false', 
	@add_to_active_directory = N'false', 
	@repl_freq = N'continuous', 
	@status = N'active', 
	@independent_agent = N'true', 
	@immediate_sync = N'true', 
	@allow_sync_tran = N'false',
	@autogen_sync_procs = N'false', 
	@allow_queued_tran = N'false', 
	@allow_dts = N'false', 
	@replicate_ddl = 1, 
	@allow_initialize_from_backup = N'false', 
	@enabled_for_p2p = N'false',
	@enabled_for_het_sub = N'false'
GO

exec sp_addpublication_snapshot 
	@publication = N'REPL-AdventureWorks', 
	@frequency_type = 1, 
	@frequency_interval = 0, 
	@frequency_relative_interval = 0, 
	@frequency_recurrence_factor = 0, 
	@frequency_subday = 0, 
	@frequency_subday_interval = 0,
	@active_start_time_of_day = 0, 
	@active_end_time_of_day = 235959, 
	@active_start_date = 0,
	@active_end_date = 0, 
	@publisher_security_mode = 0,
	@publisher_login = N'sqladmin', 
	@publisher_password = N'<pwd>'

게시에 대한 아티클 만들기

다음 스크립트는 [Person].[Person] 테이블에 대한 아티클을 만듭니다.

USE [AdventureWorks]
GO

EXEC sp_addarticle 
	@publication = N'REPL-AdventureWorks', 
	@article = N'Person', 
	@source_owner = N'Person', 
	@source_object = N'Person',
	@type = N'logbased', 
	@description = N'', 
	@creation_script = N'',
	@pre_creation_cmd = N'drop', 
	@schema_option = 0x000000000803509F, 
	@identityrangemanagementoption = N'none', 
	@destination_table = N'Person',
	@destination_owner = N'Person',
	@status = 24, 
	@vertical_partition = N'false', 
	@ins_cmd = N'CALL [sp_MSins_PersonPerson]', 
	@del_cmd = N'CALL [sp_MSdel_PersonPerson]', 
	@upd_cmd = N'SCALL [sp_MSupd_PersonPerson]'
GO

구독 및 구독 에이전트 만들기

다음 스크립트는 Azure SQL Database 구독자에 대한 밀어넣기 구독을 만듭니다.

USE [AdventureWorks]
GO

EXEC sp_addsubscription 
	@publication = N'REPL-AdventureWorks', 
	@subscriber = N'contoso.database.windows.net', 
	@destination_db = N'my-db',
	@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'REPL-AdventureWorks', 
	@subscriber = N'contoso.database.windows.net', 
	@subscriber_db = N'my-db',
	@job_login = null, 
	@job_password = null, 
	@subscriber_security_mode = 0, 
	@subscriber_login = N'sqladmin',
	@subscriber_password = '<pwd>', 
	@frequency_type = 64, 
	@frequency_interval = 1, 
	@frequency_relative_interval = 1, 
	@frequency_recurrence_factor = 0,
	@frequency_subday = 4, 
	@frequency_subday_interval = 5,
	@active_start_time_of_day = 0, 
	@active_end_time_of_day = 235959, 
	@active_start_date = 0, 
	@active_end_date = 0, 
	@dts_package_location = N'Distributor'
GO

복제 시작 및 모니터링

복제 관리 및 모니터링은 Azure SQL Database에서 지원되지 않습니다. 대신 이러한 작업을 SQL Server에서 수행합니다. 복제를 시작하려면 스냅샷 작업, 로그 판독기 작업 및 배포자 작업을 시작합니다.

게시에서 마우스 오른쪽 단추를 클릭하고 해당 옵션을 선택하여 스냅샷 에이전트로그 판독기 에이전트를 모니터링할 수 있습니다. 에이전트가 실행되고 있지 않다면 해당 항목을 시작합니다.

Screenshot showing how to launch the snapshot agent.

동기화 상태를 보려면 구독에서 마우스 오른쪽 단추를 클릭하여 동기화 상태 보기를 선택한 다음 에이전트를 시작합니다. 오류 메시지가 발생하면 SQL Server 에이전트에서 에이전트 작업 기록을 검사합니다. 에이전트가 예상대로 실행되면 다음과 같은 결과가 표시됩니다.

스냅샷 에이전트:

Screenshot showing the snapshot agent status in a transactional replication.

로그 판독기 에이전트:

Screenshot showing the log reader status in a transactional replication.

동기화 상태:

Diagram showing the synchronization status in a transactional replication.

데이터를 Azure SQL Database에 완전히 복제한 후에는 연결을 구독자 데이터베이스로 보낸 다음 복제를 중지하고 제거할 수 있습니다.

지원되는 구성에 대한 자세한 내용은 Azure SQL Database로 복제를 참조하세요.