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

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

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

로그 전달(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)

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