

# Linux の BCP ユーティリティを使用してデータをインポートおよびエクスポートする
<a name="SQLServer.Procedural.Importing.BCP.Linux"></a>

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 - 一括コピープログラムユーティリティ
+ 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 ドキュメントを参照してください。
+ 「[sqlcmd と bcp SQL Server コマンドラインツールを Linux にインストールする](https://docs.microsoft.com/en-us/sql/linux/sql-server-linux-setup-tools)」
+ [bcp ユーティリティ](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 を使用する際に発生する可能性がある一般的な問題とその解決策を示しています。


| 問題 | ソリューション | 
| --- | --- | 
| 接続タイムアウトまたはネットワークエラー | Amazon RDS エンドポイント、セキュリティグループ設定、およびネットワーク接続を確認します。SQL Server ポート (通常は 1433) が Linux システムからアクセス可能であることを確認します。 | 
| 認証の失敗 | ユーザー名とパスワードを確認します。データベースユーザーに、実行している操作に対する適切なアクセス許可があることを確認します。 | 
| データフォーマットエラー | フィールドと行の区切り文字を確認します。データ形式が BCP が期待するものと一致していることを確認します。複雑なデータ構造にはフォーマットファイルを使用します。 | 
| アクセス拒否エラー | データベースユーザーに、ターゲットテーブルのインポート用の INSERT アクセス許可、またはエクスポート用の SELECT アクセス許可があることを確認します。 | 
| 大きなファイル処理の問題 | -b オプションでバッチ処理を使用します。パフォーマンスとエラー復旧を向上させるために、大きなファイルを小さなチャンクに分割することを検討してください。 | 
| 文字エンコードの問題 | データファイルで互換性のある文字エンコードを使用していることを確認します。文字形式には -c オプションを使用するか、適切なコードページを指定します。 | 