홈/엔지니어/데이터베이스/MSSQL 로그 전달(Log Shipping) — …
데이터베이스중급windowsmssqlsql-serverlog-shipping

MSSQL 로그 전달(Log Shipping) — 재해 복구 이중화 구성

SQL Server Log Shipping으로 Primary-Secondary DR 구성을 설정하고, 백업·복사·복원 작업 스케줄링과 모니터링 방법을 실습합니다.

목차
  1. 로그 전달(Log Shipping)이란?
  2. 환경 구성
  3. Step 1 — 공유 백업 폴더 설정 (Primary)
  4. Step 2 — 데이터베이스 복구 모드 확인
  5. Step 3 — SSMS로 Log Shipping 구성
  6. T-SQL로 직접 구성 (선택)
  7. 모니터링
  8. 페일오버 절차
  9. Log Shipping vs Always On AG 비교

로그 전달(Log Shipping)이란?

Log Shipping은 트랜잭션 로그 백업을 주기적으로 Secondary 서버에 복원해 데이터를 동기화하는 SQL Server 내장 DR 솔루션입니다.

  • Always On AG보다 구성 단순 (도메인/WSFC 불필요)
  • 허용 지연 시간: 분 단위 (15분~1시간)
  • 비용 효율: Standard 에디션에서도 사용 가능
  • 여러 Secondary 구성 가능

3가지 SQL Agent 작업

작업실행 서버역할
백업Primary트랜잭션 로그 백업 생성
복사Secondary백업 파일을 로컬로 복사
복원Secondary로그 백업을 DB에 적용

환경 구성

서버IP역할
SQL-Primary192.168.1.10Primary DB
SQL-Secondary192.168.1.11Secondary (DR)
모니터 서버192.168.1.12선택 사항

공유 폴더: \\SQL-Primary\LogShipBackup


Step 1 — 공유 백업 폴더 설정 (Primary)

POWERSHELL
# 폴더 생성
New-Item -Path "C:\LogShipBackup" -ItemType Directory

# 공유 (Secondary 서버 컴퓨터 계정 허용)
New-SmbShare -Name "LogShipBackup" -Path "C:\LogShipBackup" `
  -FullAccess "DOMAIN\SQL-Secondary$", "DOMAIN\sql_agent"

Step 2 — 데이터베이스 복구 모드 확인

SQL
-- Primary에서
SELECT name, recovery_model_desc FROM sys.databases WHERE name = 'SalesDB';
-- FULL 이어야 함

-- SIMPLE이면 변경
ALTER DATABASE SalesDB SET RECOVERY FULL;

-- 전체 백업 (Log Shipping 초기화 전 필수)
BACKUP DATABASE SalesDB
  TO DISK = '\\SQL-Primary\LogShipBackup\SalesDB_full.bak'
  WITH FORMAT, COMPRESSION;

Step 3 — SSMS로 Log Shipping 구성

  1. SSMS → Primary DB 우클릭 → 속성 → 트랜잭션 로그 전달 탭
  2. 이 데이터베이스를 로그 전달 구성의 주 데이터베이스로 설정 체크
  3. 백업 설정:
    • 백업 폴더: C:\LogShipBackup
    • 네트워크 경로: \\SQL-Primary\LogShipBackup
    • 백업 간격: 15분
    • 백업 보관 기간: 72시간
  4. Secondary 데이터베이스 추가:
    • 서버: SQL-Secondary
    • 초기화: 전체 백업에서 복원 선택
    • 복사 간격: 15분
    • 복원 간격: 15분
    • 복원 모드: STANDBY (읽기 가능) 또는 NORECOVERY (읽기 불가)

T-SQL로 직접 구성 (선택)

Primary — 백업 작업

SQL
-- 로그 전달 Primary 등록
EXEC master.dbo.sp_add_log_shipping_primary_database
    @database = N'SalesDB',
    @backup_directory = N'C:\LogShipBackup',
    @backup_share = N'\\SQL-Primary\LogShipBackup',
    @backup_job_name = N'LSBackup_SalesDB',
    @backup_retention_period = 4320,      -- 72시간 (분 단위)
    @backup_threshold = 60,               -- 60분 초과 시 경고
    @threshold_alert_enabled = 1,
    @history_retention_period = 5760,
    @backup_job_id = @LS_BackupJobID OUTPUT,
    @primary_id = @LS_PrimaryId OUTPUT;

-- SQL Agent 백업 작업 스케줄 (15분마다)
EXEC msdb.dbo.sp_attach_schedule
    @job_name = N'LSBackup_SalesDB',
    @schedule_name = N'LS_15min';

Secondary — 복사 및 복원 작업

SQL
EXEC master.dbo.sp_add_log_shipping_secondary_primary
    @primary_server = N'SQL-Primary',
    @primary_database = N'SalesDB',
    @backup_source_directory = N'\\SQL-Primary\LogShipBackup',
    @backup_destination_directory = N'C:\LogShipRestore',
    @copy_job_name = N'LSCopy_SQL-Primary_SalesDB',
    @restore_job_name = N'LSRestore_SQL-Primary_SalesDB',
    @file_retention_period = 4320,
    @copy_job_id = @LS_CopyJobID OUTPUT,
    @restore_job_id = @LS_RestoreJobID OUTPUT,
    @secondary_id = @LS_SecondaryId OUTPUT;

EXEC master.dbo.sp_add_log_shipping_secondary_database
    @secondary_database = N'SalesDB',
    @primary_server = N'SQL-Primary',
    @primary_database = N'SalesDB',
    @restore_delay = 0,
    @restore_mode = 1,         -- 1: STANDBY (읽기 가능), 0: NORECOVERY
    @disconnect_users = 0,
    @block_size = 512,
    @buffer_count = 15,
    @max_transfer_size = 1048576,
    @restore_threshold = 45,   -- 45분 초과 시 경고
    @threshold_alert_enabled = 1,
    @history_retention_period = 5760,
    @secondary_id = @LS_SecondaryId;

모니터링

SQL
-- Primary에서 Log Shipping 상태 확인
SELECT
    primary_database,
    last_backup_file,
    last_backup_date,
    DATEDIFF(MINUTE, last_backup_date, GETDATE()) AS minutes_since_backup
FROM msdb.dbo.log_shipping_monitor_primary;

-- Secondary에서 복원 상태 확인
SELECT
    secondary_database,
    last_restored_file,
    last_restored_date,
    last_restored_latency,   -- 분 단위 지연
    restore_threshold
FROM msdb.dbo.log_shipping_monitor_secondary;

페일오버 절차

Primary 장애 시 Secondary를 운영 서버로 전환합니다.

SQL
-- Secondary에서: 마지막 로그까지 복원 후 RECOVERY
RESTORE DATABASE SalesDB WITH RECOVERY;
-- 이후 DB 상태: ONLINE (쓰기 가능)

-- 애플리케이션 연결 문자열을 SQL-Secondary IP로 변경

Log Shipping vs Always On AG 비교

항목Log ShippingAlways On AG
에디션Standard 가능Enterprise 필요
복구 시간분 단위 (RPO ~15분)초 단위
자동 페일오버불가 (수동)가능 (동기 모드)
도메인 필요불필요필요 (WSFC)
구성 복잡도낮음높음
읽기 오프로드STANDBY 모드 시 가능항상 가능
#mssql#sql-server#log-shipping#dr#backup#recovery
편집 안내 · Editorial Note

AI 도구가 초안 작성에 사용될 수 있습니다. 명령어의 실행 여부와 검증 환경은 각 가이드에 기재된 근거를 확인하세요. 적용 전 사용 중인 버전의 공식 문서를 확인하고, 오류는 이메일로 알려주세요. 이메일로 제보

질문 & 답변 (Q&A)

이 가이드에 대해 궁금한 점을 질문해보세요. 확인 후 답변드립니다.