SQL Server 테이블 단위 내보내기/가져오기 (bcp, sqlpackage)
SQL Server난이도: 중급소요 시간: 20–60분백업이 아니라 논리적 데이터 이동입니다: bcp로 테이블을 내보내 다른 데이터베이스에 로드(native 또는 문자 형식, 서식 파일, batch, TABLOCK, ID 열, UTF-8), 쿼리 결과를 CSV/텍스트 파일로 저장(queryout), sqlpackage로 스키마 + 데이터 이동(.bacpac Export/Import, 예: Azure SQL Database로 마이그레이션), 스키마만 이동(.dacpac Extract, Script, Publish). Linux의 mssql-tools18 및 sqlpackage 설치도 포함합니다. 결과적으로 대상에 원본과 행 수가 일치함을 확인한 테이블이나 공유할 수 있는 파일을 얻습니다.
데이터베이스 전체를 같은 버전 또는 더 새로운 SQL Server로 옮긴다면 백업/복원이 더 빠르고 일관성이 있습니다: SQL Server 백업 및 복원.
구성: 서버 1대 (명령은 SQL Server 자체나 관리 서버에서 실행)
시나리오
- 테이블 이동: bcp out → bcp in — 하나 이상의 테이블을 다른 SQL Server 데이터베이스로 복사합니다. 대상에 테이블이 미리 있어야 합니다.
- 쿼리 결과를 파일로 저장: bcp queryout (CSV/텍스트) — 쿼리 결과를 다른 시스템(Excel, ETL, 보고서)에 넘길 CSV/텍스트 파일로 저장합니다.
- 스키마 + 데이터: sqlpackage Export / Import (.bacpac) — 스키마와 데이터를 파일 하나로 옮깁니다. 특히 Azure SQL Database로 마이그레이션하거나 중소 규모 데이터베이스에 적합합니다.
- 스키마만: sqlpackage Extract / Script / Publish (.dacpac) — 스키마만 추출하거나, 대상과 비교해 변경 스크립트를 생성하거나, 빈 스키마를 새 환경에 배포합니다.
시작하기 전에
- 적합한 도구를 선택했습니다. - bcp (native): 하나 이상의 대용량 테이블을 SQL Server에서 SQL Server로 이동. 가장 빠릅니다. 대상 테이블이 미리 있어야 합니다. - bcp (문자) / queryout: 다른 시스템(ETL, 보고서, Excel)에 텍스트/CSV 전달. - .bacpac (Export/Import): 스키마 + 데이터를 파일 하나로 이동. 특히 Azure SQL Database 마이그레이션. 대용량 데이터베이스(수백 GB)에서는 느리므로 이 경우 백업/복원이나 bcp를 사용하십시오. - .dacpac (Extract): 스키마만(테이블, 뷰, 프로시저). 스키마 비교와 새 환경에 빈 스키마 배포.
- …에 원본 읽기 권한(테이블 SELECT, Export/Extract는 db_owner 권장)과 대상 쓰기 권한(bcp in은 INSERT + ALTER TABLE, Import/Publish는 dbcreator 또는 db_owner)이 있습니다. 스크립트 실행 전에 비밀번호를 지정하십시오: read -rsp '비밀번호: ' SQLCMDPASSWORD; export SQLCMDPASSWORD 및 sudo --preserve-env=SQLCMDPASSWORD bash <script>.sh.
- PowerShell을 관리자로 열었습니다(시작 → "PowerShell" → 마우스 오른쪽 클릭 → Run as administrator). …PowerShell을 연 Windows 계정에…… 로그인에… 원본 읽기 권한과 대상 쓰기 권한(bcp in은 INSERT + ALTER TABLE, Import/Publish는 dbcreator 또는 db_owner)이 있습니다.
- 명령 서버에서 원본(…)…과 대상(…)… SQL Server에 TCP로 접근할 수 있습니다.
- 명령 서버에서 원본(…)…과 대상(…)… SQL Server에 TCP로 접근할 수 있으며, bcp와 sqlcmd가 PATH에 있습니다(SQL Server 설치 또는 "Microsoft Command Line Utilities for SQL Server"에 포함).
- 내보내기 디렉터리(…)가 있는 디스크에 이동할 데이터 크기만큼 여유 공간이 있습니다(native 파일은 대략 테이블 데이터 크기, 문자 파일은 더 클 수 있음, .bacpac은 압축됨).
- 내보내기 디렉터리(…)가 있는 드라이브에 이동할 데이터 크기만큼 여유 공간이 있습니다.
- 대상 데이터베이스(…)에 테이블이 같은 구조로 만들어져 있습니다(bcp는 테이블을 만들지 않음). 스키마를 옮기는 쉬운 방법은 이 가이드의 스키마만 (.dacpac) 옵션입니다. 대량 로드 시에는 대상 테이블의 비클러스터형 인덱스와 트리거를 비활성화하고 외래 키는 나중에 검사할 수 있습니다.
- 내보내는 동안 원본에 쓰기가 없거나(애플리케이션 중지), 원본으로 데이터베이스 사본(COPY_ONLY 백업에서 복원했거나 데이터베이스 스냅샷)을 사용합니다. bcp와 sqlpackage Export는 트랜잭션 일관성을 보장하지 않습니다. 내보내는 동안 변경된 테이블끼리 일관되지 않을 수 있습니다.
가이드 단계
- 도구와 준비 — sqlcmd 및 bcp 도구 설치 (mssql-tools18) · sqlpackage 설치 · bcp 및 sqlcmd 도구 확인 · sqlpackage 설치 · 내보내기 디렉터리 생성 · 내보내기 디렉터리 생성
- 테이블 이동 (bcp out / in) — 원본 테이블의 행 수와 크기 기록 · 서식 파일 생성 · 서식 파일 생성 · 테이블 내보내기 (bcp out) · 테이블 내보내기 (bcp out) · 대상 테이블 확인 …
- 쿼리 결과 내보내기 (queryout) — 쿼리 결과를 파일로 저장 (bcp queryout) · 쿼리 결과를 파일로 저장 (bcp queryout)
- 스키마 + 데이터 (.bacpac) — 데이터베이스를 .bacpac으로 내보내기 (Export) · 데이터베이스를 .bacpac으로 내보내기 (Export) · 대상 데이터베이스 생성 (없는 경우) · 대상에 .bacpac 로드 (Import) · 대상에 .bacpac 로드 (Import) · 대상 데이터베이스의 테이블과 행 수 확인
- 스키마만 (.dacpac) — 스키마를 .dacpac으로 추출 (Extract) · 스키마를 .dacpac으로 추출 (Extract) · 대상 데이터베이스 생성 (없는 경우) · 대상 기준 변경 스크립트 생성 (Script) · 대상 기준 변경 스크립트 생성 (Script) · 스키마를 대상에 적용 (Publish) …
- 후속 작업 — 내보내기 파일 정리 · 내보내기 파일 정리