DBAtlas · データベース運用アトラス

SQL Server テーブル単位のエクスポート/インポート (bcp, sqlpackage)

SQL Serverレベル: 中級所要時間: 20–60 分

バックアップではなく論理的なデータ移動です。bcp でテーブルをエクスポートして別のデータベースに読み込む (ネイティブ形式または文字形式、フォーマット ファイル、バッチ、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 — 1 つ以上のテーブルを別の SQL Server データベースにコピーします。ターゲットにテーブルが事前に存在している必要があります。
  • クエリ結果をファイルに出力: bcp queryout (CSV/テキスト) — クエリの結果を、他のシステム (Excel、ETL、レポート) に渡す CSV/テキスト ファイルに書き出します。
  • スキーマ + データ: sqlpackage Export / Import (.bacpac) — スキーマとデータを 1 つのファイルで移動します。特に Azure SQL Database への移行や、小~中規模のデータベース向けです。
  • スキーマのみ: sqlpackage Extract / Script / Publish (.dacpac) — スキーマのみを抽出する、ターゲットと比較して変更スクリプトを生成する、または空のスキーマを新しい環境に展開します。

開始前の確認

  • 適切なツールを選択済み: - bcp (ネイティブ): SQL Server から SQL Server へ 1 つ以上の大きなテーブルを移動。最も高速です。ターゲットのテーブルが事前に存在している必要があります。 - bcp (文字) / queryout: 他のシステム (ETL、レポート、Excel) にテキスト/CSV を渡す。 - .bacpac (Export/Import): スキーマ + データを 1 ファイルで移動。特に 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" に含まれる)。
  • エクスポート ディレクトリ (…) のあるディスクに、転送するデータ量分の空き容量がある (ネイティブ ファイルはおおよそテーブルのデータ サイズ、文字ファイルはそれより大きくなることがあり、.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) …
  • 事後作業 — エクスポート ファイルを削除する · エクスポート ファイルを削除する
環境に合わせた手順プランを開く →