

# Linux의 BCP 유틸리티를 사용하여 데이터 가져오기 및 내보내기
<a name="SQLServer.Procedural.Importing.BCP.Linux"></a>

Bulk Copy Program(BCP) 유틸리티는 RDS for SQL Server DB 인스턴스와 데이터 파일 간에 대량의 데이터를 전송하는 효율적인 방법을 제공합니다. Linux 환경의 BCP를 사용하여 일괄 데이터 작업을 수행할 수 있으므로 데이터 마이그레이션, ETL 프로세스 및 정기적인 데이터 전송에 유용합니다.

BCP는 파일에서 SQL Server 테이블로 데이터를 가져오고 SQL Server 테이블에서 파일로 데이터를 내보내는 것을 모두 지원합니다. 이는 구분된 텍스트 파일을 포함한 다양한 형식의 정형 데이터를 전송하는 데 특히 효과적입니다.

## 사전 조건
<a name="SQLServer.Procedural.Importing.BCP.Linux.Prerequisites"></a>

Linux에서 RDS for SQL Server DB 인스턴스와 함께 BCP를 사용하기 전에 다음 사항이 있는지 확인합니다.
+ RDS for SQL Server DB 인스턴스에 네트워크로 연결된 Linux 환경
+ 다음을 포함하여 Linux 시스템에 설치된 Microsoft SQL Server 명령줄 도구:
  + sqlcmd - SQL Server 명령줄 쿼리 도구
  + bcp - Bulk Copy Program 유틸리티
+ RDS for SQL Server DB 인스턴스에 유효한 자격 증명
+ SQL Server 포트(일반적으로 1433)에서 연결을 허용하도록 보안 그룹을 통해 구성된 네트워크 액세스
+ 수행하려는 작업에 대한 적절한 데이터베이스 권한

## Linux에 SQL Server 명령줄 도구 설치
<a name="SQLServer.Procedural.Importing.BCP.Linux.Installing"></a>

Linux의 BCP를 사용하려면 Microsoft SQL Server 명령줄 도구를 설치해야 합니다. 특정 Linux 배포에 대한 자세한 설치 지침은 다음 Microsoft 설명서를 참조하세요.
+ [Install sqlcmd and bcp the SQL Server command-line tools on Linux](https://docs.microsoft.com/en-us/sql/linux/sql-server-linux-setup-tools)
+ [bcp utility](https://docs.microsoft.com/en-us/sql/tools/bcp-utility) - BCP 유틸리티에 대한 전체 참조 문서

설치 후 다음을 실행하여 PATH에서 도구를 사용할 수 있는지 확인합니다.

```
bcp -v
sqlcmd -?
```

## RDS for SQL Server에서 데이터 내보내기
<a name="SQLServer.Procedural.Importing.BCP.Linux.Exporting"></a>

BCP를 사용하여 RDS for SQL Server DB 인스턴스의 데이터를 Linux 시스템의 파일로 내보낼 수 있습니다. 이는 백업 생성, 데이터 분석 또는 마이그레이션을 위한 데이터 준비에 유용합니다.

### 기본 내보내기 구문
<a name="SQLServer.Procedural.Importing.BCP.Linux.Exporting.Basic"></a>

BCP를 사용하여 데이터를 내보내는 기본 구문은 다음과 같습니다.

```
bcp database.schema.table out output_file -S server_name -U username -P password [options]
```

위치:
+ `database.schema.table` - 정규화된 테이블 이름
+ `output_file` - 출력 파일의 경로 및 이름
+ `server_name` - RDS for SQL Server 엔드포인트
+ `username` - 데이터베이스 사용자 이름
+ `password` - 데이터베이스 암호

### 내보내기 예시
<a name="SQLServer.Procedural.Importing.BCP.Linux.Exporting.Example"></a>

다음 예시에서는 `sales` 데이터베이스의 `customers` 테이블에서 데이터를 내보냅니다.

```
bcp sales.dbo.customers out /home/user/customers.txt \
    -S mydb.cluster-abc123.us-east-1.rds.amazonaws.com \
    -U admin \
    -P mypassword \
    -c \
    -t "|" \
    -r "\n"
```

이 명령은 다음을 수행합니다.
+ `customers` 테이블에서 데이터 내보내기
+ 출력을 `/home/user/customers.txt`에 저장
+ 문자 형식(`-c`) 사용
+ 파이프(\$1)를 필드 구분 기호(`-t "|"`)로 사용
+ 줄 바꿈을 행 구분 기호(`-r "\n"`)로 사용

## RDS for SQL Server로 데이터 가져오기
<a name="SQLServer.Procedural.Importing.BCP.Linux.Importing"></a>

BCP를 사용하여 Linux 시스템의 파일에서 RDS for SQL Server DB 인스턴스로 데이터를 가져올 수 있습니다. 이는 데이터 마이그레이션, 테스트 데이터 로드 또는 정기적인 데이터 업데이트에 유용합니다.

### 기본 가져오기 구문
<a name="SQLServer.Procedural.Importing.BCP.Linux.Importing.Basic"></a>

BCP를 사용하여 데이터를 가져오는 기본 구문은 다음과 같습니다.

```
bcp database.schema.table in input_file -S server_name -U username -P password [options]
```

위치:
+ `database.schema.table` - 정규화된 대상 테이블 이름
+ `input_file` - 입력 파일의 경로 및 이름
+ `server_name` - RDS for SQL Server 엔드포인트
+ `username` - 데이터베이스 사용자 이름
+ `password` - 데이터베이스 암호

### 가져오기 예시
<a name="SQLServer.Procedural.Importing.BCP.Linux.Importing.Example"></a>

다음 예시에서는 파일에서 `customers` 테이블로 데이터를 가져옵니다.

```
bcp sales.dbo.customers in /home/user/customers.txt \
    -S mydb.cluster-abc123.us-east-1.rds.amazonaws.com \
    -U admin \
    -P mypassword \
    -c \
    -t "|" \
    -r "\n" \
    -b 1000
```

이 명령은 다음을 수행합니다.
+ 데이터를 `customers` 테이블로 가져오기
+ `/home/user/customers.txt`에서 데이터를 읽습니다.
+ 문자 형식(`-c`) 사용
+ 파이프(\$1)를 필드 구분 기호(`-t "|"`)로 사용
+ 줄 바꿈을 행 구분 기호(`-r "\n"`)로 사용
+ 1,000개 행의 배치로 데이터 처리(`-b 1000`)

## 일반적인 BCP 옵션
<a name="SQLServer.Procedural.Importing.BCP.Linux.Options"></a>

BCP는 데이터 형식 지정 및 전송 동작을 제어하는 다양한 옵션을 제공합니다. 다음 표에 일반적으로 사용되는 옵션이 설명되어 있습니다.


| 옵션 | 설명 | 
| --- | --- | 
| -c | 모든 열에 문자 데이터 유형 사용 | 
| -n | 기본 데이터베이스 데이터 유형 사용 | 
| -t | 필드 구분 기호 지정(기본값은 탭) | 
| -r | 행 구분 기호 지정(기본값은 줄 바꿈) | 
| -b | 일괄 작업의 배치 크기 지정 | 
| -F | 내보내거나 가져올 첫 번째 행 지정 | 
| -L | 내보내거나 가져올 마지막 행 지정 | 
| -e | 거부된 행을 캡처할 오류 파일 지정 | 
| -f | 데이터 형식 지정을 위한 형식 파일 지정 | 
| -q | 객체 이름에 따옴표로 묶인 식별자 사용 | 

## 모범 사례 및 고려 사항
<a name="SQLServer.Procedural.Importing.BCP.Linux.BestPractices"></a>

Linux에서 RDS for SQL Server와 함께 BCP를 사용하는 경우 다음 모범 사례를 고려하세요.
+ **배치 처리 사용** - 대규모 데이터세트의 경우 `-b` 옵션을 사용하여 데이터를 배치로 처리합니다. 이렇게 하면 성능이 개선되고 오류 복구가 개선됩니다.
+ **적절한 오류 처리** - `-e` 옵션을 사용하여 분석을 위해 오류 정보와 거부된 행을 별도의 파일로 캡처합니다.
+ **적절한 데이터 형식 선택** - 교차 플랫폼 호환성을 위해 문자 형식(`-c`)을 사용하거나 소스와 대상이 모두 SQL Server인 경우 더 나은 성능을 위해 기본 형식(`-n`)을 사용합니다.
+ **자격 증명 보호** - 암호를 명령줄에 직접 입력하지 마세요. 적절한 권한이 있는 환경 변수 또는 구성 파일을 사용하는 것이 좋습니다.
+ **작은 데이터세트로 테스트** - 대량의 데이터를 처리하기 전에 작은 데이터세트로 BCP 명령을 테스트하여 형식 지정 및 연결을 확인합니다.
+ **네트워크 연결 모니터링** - 특히 대규모 데이터 전송의 경우 안정적인 네트워크 연결을 보장합니다. 장기 실행 작업에는 `screen` 또는 `tmux`와 같은 도구를 사용하는 것이 좋습니다.
+ **데이터 무결성 검증** - 데이터 전송 후 행 수와 샘플 데이터를 확인하여 작업이 성공적으로 완료되었는지 확인합니다.

## 일반적인 문제 해결
<a name="SQLServer.Procedural.Importing.BCP.Linux.Troubleshooting"></a>

다음 표에는 Linux의 BCP 및 해당 솔루션을 사용할 때 발생할 수 있는 일반적인 문제가 설명되어 있습니다.


| 문제 | Solution | 
| --- | --- | 
| 연결 제한 시간 초과 또는 네트워크 오류 | Amazon RDS 엔드포인트, 보안 그룹 설정 및 네트워크 연결을 확인합니다. Linux 시스템에서 SQL Server 포트(일반적으로 1433)에 액세스할 수 있는지 확인합니다. | 
| 인증 실패 횟수 | 사용자 이름과 암호를 확인합니다. 데이터베이스 사용자에게 수행 중인 작업에 대한 적절한 권한이 있는지 확인합니다. | 
| 데이터 형식 오류 | 필드와 행 구분 기호를 확인합니다. 데이터 형식이 BCP에서 요구하는 것과 일치하는지 확인합니다. 복잡한 데이터 구조에 형식 파일을 사용합니다. | 
| 권한 거부 오류 | 데이터베이스 사용자에게 대상 테이블에 대한 가져오기의 경우 INSERT 권한, 내보내기의 경우 SELECT 권한이 있는지 확인합니다. | 
| 대용량 파일 처리 문제 | -b 옵션과 함께 배치 처리를 사용합니다. 성능 향상 및 오류 복구를 위해 대용량 파일을 더 작은 묶음으로 분할하는 것이 좋습니다. | 
| 문자 인코딩 문제 | 데이터 파일이 호환되는 문자 인코딩을 사용하는지 확인합니다. 문자 형식에 -c 옵션을 사용하거나 적절한 코드 페이지를 지정합니다. | 