Transact-SQL을 사용하여 Always On 가용성 그룹 만들기(T-SQL)
적용 대상: SQL Server
이 항목에서는 Transact-SQL 기능이 설정된 SQL Server 인스턴스에서 Always On 가용성 그룹을 사용하여 가용성 그룹을 만들고 구성하는 방법을 설명합니다. 가용성 그룹은 단일 단원으로 장애 조치(failover)할 사용자 데이터베이스 설정과 장애 조치(failover)를 지원하는 가용성 복제본(replica)이라고 하는 장애 조치(failover) 파트너 설정을 정의합니다.
참고 항목
가용성 그룹에 대한 소개는 Always On 가용성 그룹 개요(SQL Server)를 참조하세요.
참고 항목
Transact-SQL을 사용하는 대신 가용성 그룹 만들기 마법사나 SQL Server PowerShell cmdlet을 사용할 수도 있습니다. 자세한 내용은 가용성 그룹 마법사 사용(SQL Server Management Studio), 새 가용성 그룹 대화 상자 사용(SQL Server Management Studio)또는 가용성 그룹 만들기(SQL Server PowerShell)를 참조하세요.
사전 요구 사항, 제한 사항 및 권장 사항
- 가용성 그룹을 만들기 전에 가용성 복제본(replica) 호스트하는 SQL Server 인스턴스가 동일한 WSFC 장애 조치(failover) 클러스터 내의 다른 WSFC(Windows Server 장애 조치 클러스터링) 노드에 있는지 확인해 보세요. 또한 각 서버 인스턴스가 다른 모든 Always On 가용성 그룹 필수 구성 요소를 충족하는지 확인해 보세요. 자세한 내용은 Always On 가용성 그룹 사전 요구 사항, 제한 사항 및 권장 사항(SQL Server)을 참조하세요.
사용 권한
CREATE AVAILABILITY GROUP 서버 권한, ALTER ANY AVAILABILITY GROUP 권한, CONTROL SERVER 권한 중 하나와 sysadmin 고정 서버 역할의 멤버 자격이 필요합니다.
Transact-SQL을 사용하여 가용성 그룹 만들기 및 구성
작업 및 해당 Transact-SQL 문의 요약
다음 표에서는 가용성 그룹을 만들고 구성하는 데 필요한 기본 작업과 이러한 작업에 사용할 Transact-SQL 문을 보여 줍니다. Always On 가용성 그룹 작업은 테이블에 표시되는 순서대로 실행해야 합니다.
작업 | Transact-SQL 문 | 작업을 수행할 위치***** |
---|---|---|
데이터베이스 미러링 엔드포인트 만들기(SQL Server 인스턴스당 한 번) | CREATE ENDPOINT endpointName ... FOR DATABASE_MIRRORING | 데이터베이스 미러링 엔드포인트가 없는 각 서버 인스턴스에서 실행합니다. |
가용성 그룹 만들기 | CREATE AVAILABILITY GROUP | 초기 주 복제본(replica)호스트하는 서버 인스턴스에서 실행합니다. |
가용성 그룹에 보조 복제본 조인 | ALTER AVAILABILITY GROUP group_name JOIN | 보조 복제본(replica)을 호스트하는 각 서버 인스턴스에서 실행합니다. |
보조 데이터베이스 준비 | 백업 및 복원. | 주 복제본을 호스트하는 서버 인스턴스에 백업을 만듭니다. RESTORE WITH NORECOVERY를 사용하여 보조 복제본(replica) 호스트하는 각 서버 인스턴스에서 백업을 복원합니다. |
각 보조 데이터베이스를 가용성 그룹에 조인함으로써 데이터 동기화 시작 | ALTER DATABASE database_name SET HADR 가용성 구륩 = group_name | 보조 복제본(replica) 호스트하는 각 서버 인스턴스에서 실행합니다. |
*지정된 작업을 수행하려면 지정된 서버 인스턴스 또는 인스턴스에 연결합니다.
Transact-SQL 사용
참고 항목
이러한 각 Transact-SQL 문의 코드 예제가 포함된 샘플 구성 프로시저는 예: Windows 인증을 사용하는 가용성 그룹 구성을 참조하세요.
주 복제본(replica)을 호스트할 서버 인스턴스에 연결합니다.
CREATE AVAILABILITY GROUPTransact-SQL 문을 사용하여 가용성 그룹을 만듭니다.
새로운 보조 복제본(replica)을 가용성 그룹에 조인합니다. 자세한 내용은 가용성 그룹에 보조 복제본 조인(SQL Server)을 참조하세요.
가용성 그룹의 각 데이터베이스에 대해 RESTORE WITH NORECOVERY를 사용하여 주 데이터베이스의 최근 백업을 복원함으로써 보조 데이터베이스를 만듭니다. 자세한 정보는 데이터베이스 백업을 복원하는 단계부터 시작하여 Windows 인증(Transact-SQL)을 사용하여 가용성 그룹 설정 예제를 참조해 주세요.
모든 새 보조 데이터베이스를 가용성 그룹에 조인합니다. 자세한 내용은 가용성 그룹에 보조 복제본 조인(SQL Server)을 참조하세요.
예: Windows 인증을 사용하는 가용성 그룹 구성
이 예에서 만드는 샘플 Always On 가용성 그룹 구성 프로시저는 Transact-SQL을 사용하여 Windows 인증을 사용하는 데이터베이스 미러링 엔드포인트를 설정하고, 가용성 그룹과 해당 보조 데이터베이스를 만들고 구성합니다.
이 예제에는 다음 섹션이 포함되어 있습니다:
샘플 구성 절차를 위한 필수 구성 요소
이 예제 프로시저에 대한 요구 사항은 다음과 같습니다.
서버 인스턴스는 Always On 가용성 그룹을 지원해야 합니다. 자세한 내용은 Always On 가용성 그룹에 대한 사전 요구 사항, 제한 사항 및 권장 사항(SQL Server)을 참조하세요.
두 개의 샘플 데이터베이스인 MyDb1 및 MyDb2는 주 복제본(replica) 호스트할 서버 인스턴스에 있어야 합니다. 다음 코드 예제는 이러한 두 데이터베이스를 만들고 구성하고 각각에 대한 전체 백업을 만듭니다. 샘플 가용성 그룹을 만들기 위해서 서버 인스턴스에서 이러한 코드 예제를 실행합니다. 이 서버 인스턴스는 예제 가용성 그룹의 초기 주 복제본을 호스팅합니다.
다음 Transact-SQL 예에서는 이러한 데이터베이스를 만든 다음 전체 복구 모델을 사용하도록 데이터베이스를 변경합니다.
-- Create sample databases: CREATE DATABASE MyDb1; GO ALTER DATABASE MyDb1 SET RECOVERY FULL; GO CREATE DATABASE MyDb2; GO ALTER DATABASE MyDb2 SET RECOVERY FULL; GO
다음 코드 예제에서는 MyDb1 및 MyDb2의 전체 데이터베이스 백업을 만듭니다. 이 코드 예제에서는 가상의 백업 공유인 \\FILESERVER\SQLbackups를 사용합니다.
-- Backup sample databases: BACKUP DATABASE MyDb1 TO DISK = N'\\FILESERVER\SQLbackups\MyDb1.bak' WITH FORMAT; GO BACKUP DATABASE MyDb2 TO DISK = N'\\FILESERVER\SQLbackups\MyDb2.bak' WITH FORMAT; GO
샘플 구성 절차
이 샘플 구성에는 서비스 계정이 서로 다르지만 신뢰할 수 있는 두 개의 독립 실행형 서버 인스턴스에서 가용성 복제본(replica)이 만들어집니다(DOMAIN1
및 DOMAIN2
).
다음 표에는 이 샘플 구성에 사용된 값이 요약되어 있습니다.
초기 역할 | 시스템 | 호스트 SQL Server 인스턴스 |
---|---|---|
주 | COMPUTER01 |
AgHostInstance |
보조 | COMPUTER02 |
기본 인스턴스입니다. |
가용성 그룹을 만들기 위한 서버 인스턴스에 dbm_endpoint 데이터베이스 미러 엔드포인트를 만듭니다(
AgHostInstance
및COMPUTER01
이라는 이름이 지정된 인스턴스임). 이 엔드포인트는 포트 7022를 사용합니다. 가용성 그룹을 만드는 서버 인스턴스는 주 복제본(replica)을 호스트합니다.-- Create endpoint on server instance that hosts the primary replica: CREATE ENDPOINT dbm_endpoint STATE=STARTED AS TCP (LISTENER_PORT=7022) FOR DATABASE_MIRRORING (ROLE=ALL); GO
보조 복제본을 호스트할 서버 인스턴스( 에 있는 기본 서버 인스턴스)에 dbm_endpoint
COMPUTER02
라는 엔드포인트를 만듭니다. 이 엔드포인트는 포트 5022를 사용합니다.-- Create endpoint on server instance that hosts the secondary replica: CREATE ENDPOINT dbm_endpoint STATE=STARTED AS TCP (LISTENER_PORT=5022) FOR DATABASE_MIRRORING (ROLE=ALL); GO
-
참고 항목
가용성 복제본(replica) 호스트할 서버 인스턴스의 서비스 계정이 동일한 도메인 계정으로 실행되는 경우 이 단계는 필요하지 않습니다. 이 단계를 생략하고 다음 단계로 직접 이동합니다.
서버 인스턴스의 서비스 계정이 다른 도메인 사용자로 실행되는 경우 각 서버 인스턴스에서 다른 서버 인스턴스에 대한 로그인을 만들고 이 로그인 권한을 부여하여 로컬 데이터베이스 미러 엔드포인트에 액세스할 수 있습니다.
다음 코드 예제에서는 로그인을 만들고 이 로그인에 엔드포인트에 대한 사용 권한을 부여하기 위한 Transact-SQL 문을 보여 줍니다. 원격 서버 인스턴스의 도메인 계정은 여기에 이와 같이 표시됩니다domain_name\user_name..
-- If necessary, create a login for the service account, domain_name\user_name -- of the server instance that will host the other replica: USE master; GO CREATE LOGIN [domain_name\user_name] FROM WINDOWS; GO -- And Grant this login connect permissions on the endpoint: GRANT CONNECT ON ENDPOINT::dbm_endpoint TO [domain_name\user_name]; GO
사용자 데이터베이스가 있는 서버 인스턴스에서 가용성 그룹을 만듭니다.
다음 코드 예제에서는 샘플 데이터베이스인 MyDb1 및 MyDb2 가 만들어진 서버 인스턴스에 MyAG라는 가용성 그룹을 만듭니다. COMPUTER01의 로컬 서버 인스턴스
AgHostInstance
가 먼저 지정됩니다. 이 인스턴스는 초기 주 복제본(replica)을 호스팅합니다. COMPUTER02 기본 서버 인스턴스인 원격 서버 인스턴스는 보조 복제본(replica)을 호스트하도록 지정됩니다. 두 가용성 복제본 모두 수동 장애 조치와 함께 비동기 커밋 모드를 사용하도록 구성됩니다. 비동기 커밋 복제본에 대한 수동 장애 조치(failover)는 데이터 손실이 가능한 강제 장애 조치(failover)를 의미합니다.-- Create the availability group, MyAG: CREATE AVAILABILITY GROUP MyAG FOR DATABASE MyDB1, MyDB2 REPLICA ON 'COMPUTER01\AgHostInstance' WITH ( ENDPOINT_URL = 'TCP://COMPUTER01.Adventure-Works.com:7022', AVAILABILITY_MODE = ASYNCHRONOUS_COMMIT, FAILOVER_MODE = MANUAL ), 'COMPUTER02' WITH ( ENDPOINT_URL = 'TCP://COMPUTER02.Adventure-Works.com:5022', AVAILABILITY_MODE = ASYNCHRONOUS_COMMIT, FAILOVER_MODE = MANUAL ); GO
가용성 그룹을 만드는 다른 Transact-SQL 코드 예제를 보려면 CREATE AVAILABILITY GROUP(Transact-SQL)을 참조하세요.
보조 복제본(replica) 호스트하는 서버 인스턴스에서 보조 복제본(replica)을 가용성 그룹에 조인합니다.
다음 예제에서는
COMPUTER02
보조 복제본을MyAG
가용성 그룹에 조인합니다.-- On the server instance that hosts the secondary replica, -- join the secondary replica to the availability group: ALTER AVAILABILITY GROUP MyAG JOIN; GO
보조 복제본을 호스팅하는 서버 인스턴스에서 보조 데이터베이스를 만듭니다.
다음 코드 예제에서는 RESTORE WITH NORECOVERY를 사용하여 데이터베이스 백업을 복원하여 MyDb1 및 MyDb2 보조 데이터베이스를 만듭니다.
-- On the server instance that hosts the secondary replica, -- Restore database backups using the WITH NORECOVERY option: RESTORE DATABASE MyDb1 FROM DISK = N'\\FILESERVER\SQLbackups\MyDb1.bak' WITH NORECOVERY; GO RESTORE DATABASE MyDb2 FROM DISK = N'\\FILESERVER\SQLbackups\MyDb2.bak' WITH NORECOVERY; GO
주 복제본(replica)을 호스트하는 서버 인스턴스에서 각 주 데이터베이스에 대한 트랜잭션 로그를 백업합니다.
Important
실제 가용성 그룹을 구성할 때는 해당 보조 데이터베이스를 가용성 그룹에 조인한 후에 주 데이터베이스에 대한 로그 백업 태스크를 수행하는 것이 좋습니다.
다음 코드 예제에서는 MyDb1 및 MyDb2에 트랜잭션 로그 백업을 만듭니다.
-- On the server instance that hosts the primary replica, -- Backup the transaction log on each primary database: BACKUP LOG MyDb1 TO DISK = N'\\FILESERVER\SQLbackups\MyDb1.bak' WITH NOFORMAT; GO BACKUP LOG MyDb2 TO DISK = N'\\FILESERVER\SQLbackups\MyDb2.bak' WITH NOFORMAT; GO
팁
일반적으로 각 주 데이터베이스에서 로그 백업을 수행한 이후에 해당 보조 데이터베이스에서 복원해야 합니다(WITH NORECOVERY 사용). 그러나, 데이터베이스가 방금 생성되었으며 아직 로그 백업이 수행되지 않았거나 또는 복구 모델이 방금 SIMPLE에서 FULL로 변경된 경우에는 로그 백업이 필요하지 않을 수 있습니다.
보조 복제본(replica)을 호스트하는 서버 인스턴스에서 보조 데이터베이스에 백업을 적용합니다.
다음 코드 예제에서는 RESTORE WITH NORECOVERY를 사용하여 데이터베이스 백업을 복원하여 MyDb1 및 MyDb2 보조 데이터베이스에 백업을 적용합니다.
Important
실제 보조 데이터베이스를 준비할 때는 보조 데이터베이스를 만든 데이터베이스 백업 이후 수행된 모든 로그 백업을 적용해야 합니다. 이 백업은 가장 이른 데이터베이스부터 시작하여 항상 RESTORE WITH NORECOVERY를 사용합니다. 물론 전체 및 차등 데이터베이스 백업을 모두 복원하는 경우라면 차등 백업 후에 수행된 로그 백업만 적용하면 됩니다.
-- Restore the transaction log on each secondary database, -- using the WITH NORECOVERY option: RESTORE LOG MyDb1 FROM DISK = N'\\FILESERVER\SQLbackups\MyDb1.bak' WITH FILE=1, NORECOVERY; GO RESTORE LOG MyDb2 FROM DISK = N'\\FILESERVER\SQLbackups\MyDb2.bak' WITH FILE=1, NORECOVERY; GO
보조 복제본을 호스트하는 서버 인스턴스에서 새로운 보조 데이터베이스를 가용성 그룹에 조인합니다.
다음 코드 예제에서는 MyDb1 보조 데이터베이스와 MyDb2 보조 데이터베이스를 MyAG 가용성 그룹에 조인합니다.
-- On the server instance that hosts the secondary replica, -- join each secondary database to the availability group: ALTER DATABASE MyDb1 SET HADR AVAILABILITY GROUP = MyAG; GO ALTER DATABASE MyDb2 SET HADR AVAILABILITY GROUP = MyAG; GO
예제 구성 프로시저에 대한 전체 코드 예
다음 예에서는 예제 구성 프로시저의 모든 단계에 포함된 코드 예를 병합합니다. 다음 표에는 이 코드 예에 사용된 자리 표시자 값이 요약되어 있습니다. 이 코드 예제의 단계에 대한 자세한 정보는 항목의 앞부분에 있는 샘플 구성 절차 사용을 위한 필수 조건 및 샘플 구성 절차를 참조해 주세요.
자리 표시자 | 설명 |
---|---|
\\FILESERVER\SQLbackups | 가상의 백업 공유입니다. |
\\FILESERVER\SQLbackups\MyDb1.bak | MyDb1에 대한 백업 파일입니다. |
\\FILESERVER\SQLbackups\MyDb2.bak | MyDb2에 대한 백업 파일입니다. |
7022 | 각 데이터베이스 미러 엔드포인트에 할당된 포트 번호입니다. |
COMPUTER01\AgHostInstance | 초기 보조 복제본을 호스트하는 서버 인스턴스입니다. |
COMPUTER02 | 초기 보조 복제본을 호스팅하는 서버 인스턴스입니다. 이 인스턴스는 .의 기본 서버 인스턴스입니다 COMPUTER02 . |
dbm_endpoint | 엔드포인트를 미러 각 데이터베이스에 대해 지정된 이름입니다. |
MyAG | 샘플 가용성 그룹의 이름입니다. |
MyDb1 | 첫 번째 샘플 데이터베이스의 이름입니다. |
MyDb2 | 두 번째 샘플 데이터베이스의 이름입니다. |
DOMAIN1\user1 | 초기 주 복제본(replica) 호스트할 서버 인스턴스의 서비스 계정입니다. |
DOMAIN2\user2 | 초기 보조 복제본(replica) 호스트할 서버 인스턴스의 서비스 계정입니다. |
TCP://COMPUTER01.Adventure-Works.com:7022 | COMPUTER01 SQL Server의 AgHostInstance 인스턴스의 엔드포인트 URL입니다. |
TCP://COMPUTER02.Adventure-Works.com:5022 | COMPUTER02 SQL Server 기본 인스턴스의 엔드포인트 URL입니다. |
참고 항목
가용성 그룹을 만드는 다른 Transact-SQL 코드 예제를 보려면 CREATE AVAILABILITY GROUP(Transact-SQL)을 참조하세요.
-- on the server instance that will host the primary replica,
-- create sample databases:
CREATE DATABASE MyDb1;
GO
ALTER DATABASE MyDb1 SET RECOVERY FULL;
GO
CREATE DATABASE MyDb2;
GO
ALTER DATABASE MyDb2 SET RECOVERY FULL;
GO
-- Backup sample databases:
BACKUP DATABASE MyDb1
TO DISK = N'\\FILESERVER\SQLbackups\MyDb1.bak'
WITH FORMAT;
GO
BACKUP DATABASE MyDb2
TO DISK = N'\\FILESERVER\SQLbackups\MyDb2.bak'
WITH FORMAT;
GO
-- Create the endpoint on the server instance that will host the primary replica:
CREATE ENDPOINT dbm_endpoint
STATE=STARTED
AS TCP (LISTENER_PORT=7022)
FOR DATABASE_MIRRORING (ROLE=ALL);
GO
-- Create the endpoint on the server instance that will host the secondary replica:
CREATE ENDPOINT dbm_endpoint
STATE=STARTED
AS TCP (LISTENER_PORT=7022)
FOR DATABASE_MIRRORING (ROLE=ALL);
GO
-- If both service accounts run under the same domain account, skip this step. Otherwise,
-- On the server instance that will host the primary replica,
-- create a login for the service account
-- of the server instance that will host the secondary replica, DOMAIN2\user2,
-- and grant this login connect permissions on the endpoint:
USE master;
GO
CREATE LOGIN [DOMAIN2\user2] FROM WINDOWS;
GO
GRANT CONNECT ON ENDPOINT::dbm_endpoint
TO [DOMAIN2\user2];
GO
-- If both service accounts run under the same domain account, skip this step. Otherwise,
-- On the server instance that will host the secondary replica,
-- create a login for the service account
-- of the server instance that will host the primary replica, DOMAIN1\user1,
-- and grant this login connect permissions on the endpoint:
USE master;
GO
CREATE LOGIN [DOMAIN1\user1] FROM WINDOWS;
GO
GRANT CONNECT ON ENDPOINT::dbm_endpoint
TO [DOMAIN1\user1];
GO
-- On the server instance that will host the primary replica,
-- create the availability group, MyAG:
CREATE AVAILABILITY GROUP MyAG
FOR
DATABASE MyDB1, MyDB2
REPLICA ON
'COMPUTER01\AgHostInstance' WITH
(
ENDPOINT_URL = 'TCP://COMPUTER01.Adventure-Works.com:7022',
AVAILABILITY_MODE = SYNCHRONOUS_COMMIT,
FAILOVER_MODE = AUTOMATIC
),
'COMPUTER02' WITH
(
ENDPOINT_URL = 'TCP://COMPUTER02.Adventure-Works.com:7022',
AVAILABILITY_MODE = SYNCHRONOUS_COMMIT,
FAILOVER_MODE = AUTOMATIC
);
GO
-- On the server instance that hosts the secondary replica,
-- join the secondary replica to the availability group:
ALTER AVAILABILITY GROUP MyAG JOIN;
GO
-- Restore database backups onto this server instance, using RESTORE WITH NORECOVERY:
RESTORE DATABASE MyDb1
FROM DISK = N'\\FILESERVER\SQLbackups\MyDb1.bak'
WITH NORECOVERY;
GO
RESTORE DATABASE MyDb2
FROM DISK = N'\\FILESERVER\SQLbackups\MyDb2.bak'
WITH NORECOVERY;
GO
-- Back up the transaction log on each primary database:
BACKUP LOG MyDb1
TO DISK = N'\\FILESERVER\SQLbackups\MyDb1.bak'
WITH NOFORMAT;
GO
BACKUP LOG MyDb2
TO DISK = N'\\FILESERVER\SQLbackups\MyDb2.bak'
WITH NOFORMAT
GO
-- Restore the transaction log on each secondary database,
-- using the WITH NORECOVERY option:
RESTORE LOG MyDb1
FROM DISK = N'\\FILESERVER\SQLbackups\MyDb1.bak'
WITH FILE=1, NORECOVERY;
GO
RESTORE LOG MyDb2
FROM DISK = N'\\FILESERVER\SQLbackups\MyDb2.bak'
WITH FILE=1, NORECOVERY;
GO
-- On the server instance that hosts the secondary replica,
-- join each secondary database to the availability group:
ALTER DATABASE MyDb1 SET HADR AVAILABILITY GROUP = MyAG;
GO
ALTER DATABASE MyDb2 SET HADR AVAILABILITY GROUP = MyAG;
GO
관련 작업
가용성 그룹 및 복제본(replica) 속성을 구성하려면
가용성 그룹 구성을 완료하려면
가용성 그룹을 만드는 다른 방법
Always On 가용성 그룹을 사용하도록 설정하려면
데이터베이스 미러링 엔드포인트를 구성하려면
Always On 가용성 그룹 구성 문제를 해결하려면
관련 내용
블로그:
Always On - HADRON 학습 시리즈: HADRON 사용 데이터베이스의 작업자 풀 사용
백서:
참고 항목
데이터베이스 미러링 엔드포인트(SQL Server)
Always On 가용성 그룹 개요(SQL Server)
가용성 그룹 수신기, 클라이언트 연결 및 애플리케이션 장애 조치(failover)(SQL Server)
Always On 가용성 그룹에 대한 필수 조건, 제한 사항 및 권장 사항(SQL Server)