작은 조각만 필요하면 전체 dump을 가져오지 마세요

발행: (2026년 1월 12일 오전 02:46 GMT+9)
7 min read
원문: Dev.to

Source: Dev.to

문제: 작은 테스트를 위한 거대한 백업

최근 프로젝트에서 분산 데이터 시스템으로부터 복잡한 PDF 보고서를 생성해야 했습니다.
보고서는 세 개의 테이블에 의존했으며, 각 테이블은 수백만 행을 포함하고 있었습니다.

디버깅을 위해 전체 백업(수백 GB)을 로컬 머신으로 가져오는 것은 시간과 디스크 공간을 낭비합니다.

순진한 접근법

대부분의 팀은 다음 옵션 중 하나로 시작합니다:

  • 전체 데이터베이스 백업을 로컬에 복원한다.
  • **SSMS → 스크립트 생성(스키마 + 데이터)**을 사용해 필요한 테이블을 추출한다.

두 방법 모두 규모가 커지면 한계에 부딪힙니다:

전체 백업

  • 다운로드 및 복원에 몇 시간이 걸림.
  • 막대한 디스크 공간을 차지함.
  • 필요 없는 데이터까지 포함됨.

SSMS “스크립트 생성”

  • 거대한 INSERT 스크립트를 만들려고 함.
  • 종종 멈추거나 메모리 부족 오류가 발생함.
  • 스크립트가 생성되더라도 실행에 여러 시간이 걸릴 수 있음.

어느 순간 명확해집니다: 우리는 전체 산이 아니라 한 조각의 바위만 필요하다.

더 나은 접근법: BCP를 이용한 정밀 추출

SQL Server에서는 bcp(Bulk Copy Program)가 대표적인 도구입니다.
200 GB가 넘는 전체 데이터베이스를 이동하는 대신, 디버깅에 필요한 데이터 조각만 추출해 로컬에 재현합니다.

이 사용 사례에서 BCP가 SSMS보다 뛰어난 이유

장점설명
속도네이티브 바이너리 스트림으로 작업하므로 거대한 INSERT 문이 필요 없습니다. 수백만 행을 몇 분 안에 내보내고 가져올 수 있습니다.
안정성콘솔 유틸리티이므로 무거운 UI 작업에 걸리지 않으며, 빠르게 실행되거나 명확한 오류와 함께 실패합니다.
유연성전체 테이블 또는 조인·필터가 포함된 임의의 SELECT 결과를 내보낼 수 있어,
‑ 필요한 부분만 추출할 수 있습니다.
‑ 쿼리에서 직접 민감한 컬럼을 제외하거나 마스킹할 수 있습니다.

실용적인 워크플로우: 프로덕션 조각을 로컬 디버그 환경으로

  1. 로컬에 스키마 준비 – 마이그레이션을 적용하거나 DDL 스크립트를 실행해 동일한 테이블(구조만)을 생성합니다.

  2. 업스트림 환경에서 데이터 조각을 내보냅니다.

    bcp "SELECT c.Id, c.Name, o.Id, o.Date, o.Total
         FROM dbo.Customers c
         JOIN dbo.Orders o ON o.CustomerId = c.Id
         WHERE o.Date >= '2025-01-01'"
         queryout orders_customers.dat -n -S your-server -T
    • queryoutSELECT 결과를 내보냅니다.
    • -n은 네이티브(바이너리) 형식을 사용 – 빠르고 압축됩니다.
    • -T는 신뢰된 연결을 사용합니다(-U/-P로 교체 가능).
  3. 로컬 데이터베이스에 가져옵니다.

    bcp dbo.OrdersCustomers in orders_customers.dat -n -S localhost -T

    로컬 스키마에 맞게 여러 파일(테이블당 하나)로 내보내어 가져올 수도 있습니다.

  4. 현실적인 볼륨으로 디버깅 – 이제 로컬 데이터베이스에 관련 테이블과 올바른 데이터 형태, 필요 시 수백만 행 규모의 데이터가 들어 있어 전체 백업을 복원하지 않아도 됩니다.

이 접근법을 고려해야 할 시점

  • 상위 환경에 거대한 SQL Server 데이터베이스가 존재할 때.
  • 복잡한 비즈니스 로직 디버깅, 프로덕션 전용 버그 재현, 혹은 보고서·배치 작업 성능 테스트를 위해 현실적인 데이터가 필요할 때.
  • 전체 백업을 옮기거나, 불안정한 UI 내보내기에 의존하거나, 방대한 수동 테스트 데이터 스크립트를 유지하고 싶지 않을 때.

BCP가 모든 문제를 해결해 주는 마법은 아니지만, 다음 조건에 해당한다면:

  • 정확히 어떤 데이터 서브셋이 필요한지 알고 있을 때,
  • SSMS 스크립팅으로는 감당하기 힘든 규모일 때, 그리고
  • 이미 스키마 마이그레이션이 준비돼 있을 때,

주당 여러 시간을 절약하고 로컬 디버깅을 훨씬 쾌적하게 만들 수 있습니다.

여러분은 대규모 업스트림 환경에서 로컬 데이터베이스를 어떻게 시드하고 있나요? 전체 백업, BACPAC, 커스텀 시더, 혹은 다른 방법?

Back to Blog

관련 글

더 보기 »

데이터베이스 트랜잭션 누수

소개 우리는 memory leaks에 대해 자주 이야기하지만, backend development에서 또 다른 조용한 성능 저해 요인이 있습니다: Database Transaction Leaks. 나는 최근에 ...

2025년 SQL Server 클라이언트 비교

개요 SQL Server를 사용할 때 클라이언트 도구는 중요합니다. 이는 쿼리를 작성하고, 데이터를 검사하며, 변경 사항을 관리하는 방식을 형성합니다. 대부분의 SQL Server 클라이언트는 공유합니다.