

# ネイティブバックアップと復元を使用した SQL Server データベースのインポートとエクスポート
<a name="SQLServer.Procedural.Importing"></a>

Amazon RDS では、完全バックアップファイル (.bak ファイル) を使用した Microsoft SQL Server データベースのネイティブバックアップおよび復元がサポートされています。RDS を使用すると、データベースサーバー上のローカルファイルシステムを使用せずに Amazon S3 に格納されているファイルにアクセスします。

例えば、ローカルサーバーから完全バックアップを作成し、それを S3 に保存してから、既存の Amazon RDS DB インスタンスに復元することができます。RDS からバックアップを作成して S3 に保存することで、どこへでも復元することが可能となります。

ネイティブバックアップと復元は、すべての AWS リージョンで、シングル AZ DB インスタンスおよびマルチ AZ DB インスタンス (リードレプリカを持つマルチ AZ DB インスタンスを含む) に対して使用できます。ネイティブバックアップおよび復元は、Amazon RDS でサポートされているすべてのエディションの Microsoft SQL Server で使用できます。

次の図は、サポートされるシナリオを示しています。

![\[ネイティブバックアップおよび復元アーキテクチャ\]](http://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/UserGuide/images/SQL-bak-file.png)


ネイティブの .bak ファイルを使用したデータベースのバックアップと復元は、通常は、最も素早いデータベースのバックアップと復元を実現します。ネイティブバックアップおよび復元を使用することには、他にも多くの利点があります。例えば、次の操作を実行できます。
+ Amazon RDS との間でデータベースを移行できます。
+ RDS for SQL Server DB インスタンス間でデータベースを移動します。
+ データ、スキーマ、ストアドプロシージャ、トリガー、その他のデータベースコードを .bak ファイル内に移行します。
+ DB インスタンス全体ではなく、1 つのデータベースをバックアップおよび復元できます。
+ 開発、テスト、トレーニング、デモの目的でデータベースのコピーを作成できます。
+ 災害対策の追加保護レイヤーとして、Amazon S3 を使用したバックアップファイルの保管および転送ができます。
+ 透過的なデータ暗号化 (TDE) がオンになっているデータベースのネイティブバックアップを作成し、これらのバックアップをオンプレミスのデータベースに復元します。詳細については、「[SQL サーバーの透過的なデータの暗号化サポート](Appendix.SQLServer.Options.TDE.md)」を参照してください。
+ TDE がオンになっているオンプレミスデータベースのネイティブバックアップを RDS for SQL Server DB インスタンスに復元します。詳細については、「[SQL サーバーの透過的なデータの暗号化サポート](Appendix.SQLServer.Options.TDE.md)」を参照してください。

**Contents**
+ [制限と推奨事項](#SQLServer.Procedural.Importing.Native.Limitations)
+ [ネイティブバックアップおよび復元のセットアップ](SQLServer.Procedural.Importing.Native.Enabling.md)
  + [ネイティブバックアップおよび復元用の IAM ロールの手動作成](SQLServer.Procedural.Importing.Native.Enabling.md#SQLServer.Procedural.Importing.Native.Enabling.IAM)
+ [ネイティブバックアップおよび復元の使用](SQLServer.Procedural.Importing.Native.Using.md)
  + [データベースのバックアップ](SQLServer.Procedural.Importing.Native.Using.md#SQLServer.Procedural.Importing.Native.Using.Backup)
    + [Usage](SQLServer.Procedural.Importing.Native.Using.md#SQLServer.Procedural.Importing.Native.Backup.Syntax)
    + [例](SQLServer.Procedural.Importing.Native.Using.md#SQLServer.Procedural.Importing.Native.Backup.Examples)
  + [データベースの復元](SQLServer.Procedural.Importing.Native.Using.md#SQLServer.Procedural.Importing.Native.Using.Restore)
    + [Usage](SQLServer.Procedural.Importing.Native.Using.md#SQLServer.Procedural.Importing.Native.Restore.Syntax)
    + [例](SQLServer.Procedural.Importing.Native.Using.md#SQLServer.Procedural.Importing.Native.Restore.Examples)
  + [ログの復元](SQLServer.Procedural.Importing.Native.Using.md#SQLServer.Procedural.Importing.Native.Restore.Log)
    + [Usage](SQLServer.Procedural.Importing.Native.Using.md#SQLServer.Procedural.Importing.Native.Restore.Log.Syntax)
    + [例](SQLServer.Procedural.Importing.Native.Using.md#SQLServer.Procedural.Importing.Native.Restore.Log.Examples)
  + [データベースの復元を終了する](SQLServer.Procedural.Importing.Native.Using.md#SQLServer.Procedural.Importing.Native.Finish.Restore)
    + [Usage](SQLServer.Procedural.Importing.Native.Using.md#SQLServer.Procedural.Importing.Native.Finish.Restore.Syntax)
  + [部分的に復元したデータベースの使用](SQLServer.Procedural.Importing.Native.Using.md#SQLServer.Procedural.Importing.Native.Partially.Restored)
    + [部分的に復元したデータベースの削除](SQLServer.Procedural.Importing.Native.Using.md#SQLServer.Procedural.Importing.Native.Drop.Partially.Restored)
    + [部分的に復元したデータベースのスナップショット復元とポイントインタイム復元の動作](SQLServer.Procedural.Importing.Native.Using.md#SQLServer.Procedural.Importing.Native.Snapshot.Restore)
  + [タスクのキャンセル](SQLServer.Procedural.Importing.Native.Using.md#SQLServer.Procedural.Importing.Native.Using.Cancel)
    + [Usage](SQLServer.Procedural.Importing.Native.Using.md#SQLServer.Procedural.Importing.Native.Cancel.Syntax)
  + [タスクのステータスの追跡](SQLServer.Procedural.Importing.Native.Using.md#SQLServer.Procedural.Importing.Native.Tracking)
    + [Usage](SQLServer.Procedural.Importing.Native.Using.md#SQLServer.Procedural.Importing.Native.Tracking.Syntax)
    + [例](SQLServer.Procedural.Importing.Native.Using.md#SQLServer.Procedural.Importing.Native.Tracking.Examples)
    + [応答](SQLServer.Procedural.Importing.Native.Using.md#SQLServer.Procedural.Importing.Native.Tracking.Response)
+ [バックアップファイルの圧縮](SQLServer.Procedural.Importing.Native.Compression.md)
+ [トラブルシューティング](SQLServer.Procedural.Importing.Native.Troubleshooting.md)
+ [他の方法による SQL Server データのインポートとエクスポート](SQLServer.Procedural.Importing.Snapshots.md)
  + [スナップショットを使用した RDS for SQL Server へのデータのインポート](SQLServer.Procedural.Importing.Snapshots.md#SQLServer.Procedural.Importing.Procedure)
    + [データのインポート](SQLServer.Procedural.Importing.Snapshots.md#ImportData.SQLServer.Import)
      + [スクリプトの生成とパブリッシュウィザード](SQLServer.Procedural.Importing.Snapshots.md#ImportData.SQLServer.MgmtStudio.ScriptWizard)
      + [インポートおよびエクスポートウィザード](SQLServer.Procedural.Importing.Snapshots.md#ImportData.SQLServer.MgmtStudio.ImportExportWizard)
      + [一括コピー](SQLServer.Procedural.Importing.Snapshots.md#ImportData.SQLServer.MgmtStudio.BulkCopy)
  + [RDS for SQL Server からのデータのエクスポート](SQLServer.Procedural.Importing.Snapshots.md#SQLServer.Procedural.Exporting)
    + [SQL Server インポートおよびエクスポートウィザード](SQLServer.Procedural.Importing.Snapshots.md#SQLServer.Procedural.Exporting.SSIEW)
    + [SQL Server のスクリプトの生成とパブリッシュウィザードおよび bcp ユーティリティ](SQLServer.Procedural.Importing.Snapshots.md#SQLServer.Procedural.Exporting.SSGPSW)
+ [Linux の BCP ユーティリティを使用してデータをインポートおよびエクスポートする](SQLServer.Procedural.Importing.BCP.Linux.md)
  + [前提条件](SQLServer.Procedural.Importing.BCP.Linux.md#SQLServer.Procedural.Importing.BCP.Linux.Prerequisites)
  + [Linux での SQL Server コマンドラインツールのインストール](SQLServer.Procedural.Importing.BCP.Linux.md#SQLServer.Procedural.Importing.BCP.Linux.Installing)
  + [RDS for SQL Server からのデータのエクスポート](SQLServer.Procedural.Importing.BCP.Linux.md#SQLServer.Procedural.Importing.BCP.Linux.Exporting)
    + [基本的なエクスポート構文](SQLServer.Procedural.Importing.BCP.Linux.md#SQLServer.Procedural.Importing.BCP.Linux.Exporting.Basic)
    + [エクスポートの例](SQLServer.Procedural.Importing.BCP.Linux.md#SQLServer.Procedural.Importing.BCP.Linux.Exporting.Example)
  + [RDS for SQL Server へのデータのインポート](SQLServer.Procedural.Importing.BCP.Linux.md#SQLServer.Procedural.Importing.BCP.Linux.Importing)
    + [基本的なインポート構文](SQLServer.Procedural.Importing.BCP.Linux.md#SQLServer.Procedural.Importing.BCP.Linux.Importing.Basic)
    + [インポートの例](SQLServer.Procedural.Importing.BCP.Linux.md#SQLServer.Procedural.Importing.BCP.Linux.Importing.Example)
  + [一般的な BCP オプション](SQLServer.Procedural.Importing.BCP.Linux.md#SQLServer.Procedural.Importing.BCP.Linux.Options)
  + [ベストプラクティスと考慮事項](SQLServer.Procedural.Importing.BCP.Linux.md#SQLServer.Procedural.Importing.BCP.Linux.BestPractices)
  + [一般的な問題のトラブルシューティング](SQLServer.Procedural.Importing.BCP.Linux.md#SQLServer.Procedural.Importing.BCP.Linux.Troubleshooting)

## 制限と推奨事項
<a name="SQLServer.Procedural.Importing.Native.Limitations"></a>

ネイティブバックアップおよび復元を使用する際の制限事項を以下に示します。
+ Amazon RDS DB インスタンスとは異なる AWS リージョンの Amazon S3 バケットにバックアップしたり、このバケットから復元したりすることはできません。
+ 既存のデータベースと同じ名前のデータベースを復元することはできません。データベース名は一意です。
+ あるタイムゾーンのバックアップファイルを、別のタイムゾーンに復元しないことを強くお勧めします。バックアップを特定のタイムゾーンから別のタイムゾーンに復元した場合は、タイムゾーンの変更がクエリとアプリケーションにもたらす影響を監査する必要があります。
+ RDS for Microsoft SQL Server のサイズ制限は、ファイルあたり 5 TB です。大規模なデータベースのネイティブバックアップでは、マルチファイルバックアップを使用できます。
+ S3 にバックアップできる最大データベースサイズは、DB インスタンスで使用可能なメモリ、CPU、I/O、ネットワークリソースによって異なります。データベースが大きくなるほど、バックアップエージェントが消費するメモリは多くなります。
+ 同時に 10 以上のバックファイルから復元することはできません。
+ 差分バックアップは、最後の完全バックアップに基づいています。差分バックアップを機能させるには、最後の完全バックアップと差分バックアップの間でスナップショットを作成することはできません。差分バックアップが必要だが、手動スナップショットや自動スナップショットが存在する場合は、差分バックアップを続行する前に別の完全バックアップを作成してください。
+ ファイルの file\$1guid (一意の識別子) が `NULL` に設定されているデータベースでは、差分復元とログ復元はサポートされていません 。
+ 最大 2 のバックアップまたは復元タスクを同時に実行できます。
+ Amazon RDS では、SQL Server からネイティブログバックアップを実行できません。
+ RDS では最大 64 TiB のデータベースのネイティブ復元をサポートしています。SQL Server Express Edition のデータベースのネイティブリストアは、10 GB に制限されています。
+ メンテナンスウィンドウや、Amazon RDS がデータベースのスナップショットを作成しているときは、ネイティブバックを行うことはできません。ネイティブバックアップタスクが RDS の毎日のバックアップウィンドウと重複する場合、ネイティブバックアップタスクはキャンセルされます。
+ マルチ AZ DB インスタンスでは、完全な復元モデルでバックアップされているデータベースのみを、ネイティブに復元することができます。
+ トランザクション内でのネイティブバックアップと復元を目的とした RDS プロシージャの呼び出しはサポートされていません。
+ 対称暗号化 AWS KMS key を使用してバックアップを暗号化します。Amazon RDS は非対称 KMS キーをサポートしていません。詳細については、*AWS Key Management Service デベロッパーガイド*の「[非対称 KMS キーを作成する](https://docs.aws.amazon.com/kms/latest/developerguide/create-keys.html#create-symmetric-cmk)」を参照してください。
+ ネイティブバックアップファイルは、「暗号化のみ」の暗号モードを使用して、指定された KMS キーで暗号化されます。暗号化されたバックアップファイルを復元するときは、「暗号化のみ」の暗号モードで暗号化されていることに注意してください。
+ FILESTREAM ファイルグループを含むデータベースは復元できません。
+ AWS KMS (SSE-KMS) による Amazon S3 サーバー側の暗号化は、バックアップストアドプロシージャに `@enable_bucket_default_encryption=1` を渡すと、S3 バケットのデフォルトの暗号化設定でサポートされます。デフォルトでは、復元は S3 オブジェクトのサーバー側の暗号化をサポートします。

  ストアドプロシージャに KMS キーを指定すると、ネイティブバックアップと復元は KMS キーを使用してクライアント側で暗号化および復号されます。AWS は、`@enable_bucket_default_encryption=0` の場合は SSE-S3 を使用して、`@enable_bucket_default_encryption=1` の場合は S3 バケットで設定されたデフォルトの暗号化キーを使用して、バックアップを S3 バケットに保存します。
+ S3 アクセスポイントを使用する場合、アクセスポイントを RDS 内部 VPC を使用するように設定することはできません。
+ 最高のパフォーマンスのために、ディレクトリバケット、またはリージョンで利用可能な場合にはディレクトリバケットのアクセスポイントを使用することをお勧めします。

バックアップファイルの作成、コピー、復元時にデータベースをオフラインにできる場合、ネイティブバックアップを使用して復元し、RDS に移行することをお勧めします。オンプレミスデータベースをオフラインにできない場合、AWS Database Migration Service を使用してデータベースを Amazon RDS に移行することをお勧めします。詳細については、「[What is AWS Database Migration Service?](https://docs.aws.amazon.com/dms/latest/userguide/Welcome.html)」を参照してください。

ネイティブバックアップおよび復元は、クロスリージョンスナップショットコピー機能のデータ復元機能に代わるものではありません。Amazon RDS におけるクロスリージョンの災害対策のため、スナップショットコピーを使用してデータベーススナップショットを別の AWS リージョンにコピーしておくことをお勧めします。詳細については、「[Amazon RDS の DB スナップショットのコピー](USER_CopySnapshot.md)」を参照してください。

# ネイティブバックアップおよび復元のセットアップ
<a name="SQLServer.Procedural.Importing.Native.Enabling"></a>

ネイティブバックアップおよび復元をセットアップするには、3 つのコンポーネントが必要です。

1. バックアップファイルを保存する Amazon S3 バケット。

   バックアップファイルに使用する S3 バケットを用意してから、RDS に移行するバックアップをアップロードする必要があります。Amazon S3 バケットが既にある場合はそれを使用できます。バケットがない場合、[バケットを作成](https://docs.aws.amazon.com/AmazonS3/latest/userguide/CreatingaBucket.html)できます。または、`SQLSERVER_BACKUP_RESTORE` を使用して AWS マネジメントコンソール オプションを追加するときに新しいバケットの作成を選択することもできます。

   S3 を使用する方法の詳細については、「[Amazon Simple Storage Service ユーザーガイド](https://docs.aws.amazon.com/AmazonS3/latest/userguide/)」を参照してください。

1. バケットにアクセスするための AWS Identity and Access Management (IAM) ロール。

   IAM ロールが既にある場合はそれを使用できます。AWS マネジメントコンソール を使用して `SQLSERVER_BACKUP_RESTORE` オプションを追加する際に、新しい IAM ロールの作成を選択することもできます。または、手動で新しいロールを作成することもできます。

   手動で新しい IAM ロールを作成する場合は、次のセクションで示されている方法を使用します。既存の IAM ロールに信頼関係ポリシーとアクセス許可ポリシーをアタッチする場合は、同じ操作を行います。

1. DB インスタンスのオプショングループに追加された `SQLSERVER_BACKUP_RESTORE` オプション。

   DB インスタンスでネイティブバックアップおよび復元を有効にするには、DB インスタンスのオプショングループに `SQLSERVER_BACKUP_RESTORE` オプションを追加します。詳細と手順については、「[SQL Server のネイティブバックアップおよび復元のサポート](Appendix.SQLServer.Options.BackupRestore.md)」を参照してください。

## ネイティブバックアップおよび復元用の IAM ロールの手動作成
<a name="SQLServer.Procedural.Importing.Native.Enabling.IAM"></a>

ネイティブバックアップおよび復元用の新しいIAM ロールを手動で作成したい場合、作成することが可能です。その場合、 Amazon RDS サービスから Amazon S3 バケットに許可を委任する役割を作成します。IAM ロールを作成するときは、信頼関係とアクセス権限ポリシーをアタッチします。信頼関係により、RDS はこのロールを引き受けることができます。許可ポリシーは、このロールが実行できるアクションを定義します。ロールの作成の詳細については、「[AWS のサービスにアクセス許可を委任するロールの作成](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_create_for-service.html)」を参照してください。

ネイティブバックアップおよび復元機能では、このセクションの例と同様の信頼関係ポリシーおよびアクセス許可ポリシーを使用します。次の例では、すべてのサービスアカウントのエイリアスとしてサービスプリンシパル名 `rds.amazonaws.com` を使用します。他の例では、Amazon リソースネーム (ARN) を指定して、信頼ポリシーでアクセス許可を付与している別のアカウント、ユーザー、またはロールを特定します。

リソースベースの信頼関係では [https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-sourcearn](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-sourcearn) および [https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-sourceaccount](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-sourceaccount) のグローバル条件コンテキストキーを使用して、サービスに付与する特定のリソースへのアクセス許可を制限することをお勧めします。これは、[混乱した使節の問題](https://docs.aws.amazon.com/IAM/latest/UserGuide/confused-deputy.html)に対する最も効果的な保護方法です。

両方のグローバル条件コンテキストキーを使用し、`aws:SourceArn` 値にアカウント ID を含めます。この場合は、`aws:SourceAccount` 値と `aws:SourceArn` 値のアカウントは、同じステートメントで使用する場合、同じアカウント ID を使用する必要があります。
+ 単一リソースに対するクロスサービスアクセスが必要な場合は `aws:SourceArn` を使用します。
+ そのアカウント内の任意のリソースをクロスサービス使用に関連付けることを許可する場合、`aws:SourceAccount`を使用します。

信頼関係では、ロールにアクセスするリソースの完全な ARN を持つ `aws:SourceArn` グローバル条件コンテキストキーを必ず使用してください。ネイティブバックアップおよび復元では、次の例に示すように、DB オプショングループと DB インスタンスの両方を含めるようにしてください。

**Example ネイティブバックアップおよび復元のためのグローバル条件コンテキストキーによる信頼関係の例**    
****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "Service": "rds.amazonaws.com"
            },
            "Action": "sts:AssumeRole",
            "Condition": {
                "StringEquals": {
                    "aws:SourceArn": [
                        "arn:aws:rds:Region:0123456789:db:db_instance_identifier",
                        "arn:aws:rds:Region:0123456789:og:option_group_name"
                    ],
                    "aws:SourceAccount": "0123456789"
                }
            }
        }
    ]
}
```

次の例では、ARN を使用してリソースを指定しています。ARN の使用の詳細については、「[Amazon リソースネーム (ARN)](https://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html)」を参照してください。

**Example 暗号化をサポートしないネイティブバックアップおよび復元のためのアクセス許可ポリシーの例**    
****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement":
    [
        {
        "Effect": "Allow",
        "Action":
            [
                "s3:ListBucket",
                "s3:GetBucketLocation"
            ],
        "Resource": "arn:aws:s3:::amzn-s3-demo-bucket"
        },
        {
        "Effect": "Allow",
        "Action":
            [
                "s3:GetObjectAttributes",
                "s3:GetObject",
                "s3:PutObject",
                "s3:ListMultipartUploadParts",
                "s3:AbortMultipartUpload"
            ],
        "Resource": "arn:aws:s3:::amzn-s3-demo-bucket/*"
        }
    ]
}
```

**Example 暗号化をサポートするネイティブバックアップおよび復元のアクセス許可ポリシー**  
バックアップファイルを暗号化する場合は、アクセス権限ポリシーに暗号化キーを含めます。暗号化キーの詳細については、*AWS Key Management Service デベロッパーガイド*の「[開始方法](https://docs.aws.amazon.com/kms/latest/developerguide/getting-started.html)」を参照してください。  
バックアップを暗号化するには、対称暗号化 KMS キーを使用する必要があります。Amazon RDS は非対称 KMS キーをサポートしていません。詳細については、*AWS Key Management Service デベロッパーガイド*の「[非対称 KMS キーを作成する](https://docs.aws.amazon.com/kms/latest/developerguide/create-keys.html#create-symmetric-cmk)」を参照してください。  
IAM ロールは、KMS キーのキーユーザーおよびキー管理者であることも必要です。つまり、キーポリシーで指定する必要があります。詳細については、*AWS Key Management Service デベロッパーガイド*の「[非対称 KMS キーを作成する](https://docs.aws.amazon.com/kms/latest/developerguide/create-keys.html#create-symmetric-cmk)」を参照してください。  
****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Sid": "AllowAccessToKey",
      "Effect": "Allow",
      "Action": [
        "kms:DescribeKey",
        "kms:GenerateDataKey",
        "kms:Encrypt",
        "kms:Decrypt"
      ],
      "Resource": "arn:aws:kms:us-east-1:123456789012:key/key-id"
    },
    {
      "Sid": "AllowAccessToS3",
      "Effect": "Allow",
      "Action": [
        "s3:ListBucket",
        "s3:GetBucketLocation"
      ],
      "Resource": "arn:aws:s3:::amzn-s3-demo-bucket"
    },
    {
      "Sid": "GetS3Info",
      "Effect": "Allow",
      "Action": [
        "s3:GetObjectAttributes",
        "s3:GetObject",
        "s3:PutObject",
        "s3:ListMultipartUploadParts",
        "s3:AbortMultipartUpload"
      ],
      "Resource": "arn:aws:s3:::amzn-s3-demo-bucket/*"
    }
  ]
}
```

**Example 暗号化をサポートしないアクセスポイントを使用したネイティブバックアップおよび復元のアクセス許可ポリシー**  
S3 アクセスポイントを使用するために必要なアクションは、S3 バケットの場合と同じです。リソースパスは、S3 アクセスポイント ARN パターンと一致するように更新されます。  
RDS はプライベート VPC を発行しないため、アクセスポイントは **[ネットワークオリジン: インターネット]** を使用するように設定する必要があります。RDS インスタンスからの S3 トラフィックは、プライベート VPC を通過するため、パブリックインターネットを経由しません。  
****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "s3:ListBucket",
                "s3:GetBucketLocation"
                ],
            "Resource": [
            "arn:aws:s3:us-east-1:111122223333:accesspoint/amzn-s3-demo-ap",
            "arn:aws:s3:::underlying-bucket"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "s3:GetObjectAttributes",
                "s3:GetObject",
                "s3:PutObject",
                "s3:ListMultipartUploadParts",
                "s3:AbortMultipartUpload"
                ],
                "Resource": [
                "arn:aws:s3:us-east-1:111122223333:accesspoint/amzn-s3-demo-ap/*",
                    "arn:aws:s3:::underlying-bucket/*"
                    ]
                }
            ]   
}
```

**Example 暗号化をサポートしないディレクトリバケットのアクセスポイントを使用したネイティブバックアップおよび復元のアクセス許可ポリシー**  
ディレクトリバケットは汎用バケットとは異なる[セッションベースの認可メカニズム](https://docs.aws.amazon.com//AmazonS3/latest/userguide/s3-express-authenticating-authorizing.html)を使用するため、ネイティブバックアップ復元に必要なアクセス許可はバケットレベルの「s3express:CreateSession」アクセス許可のみです。オブジェクトレベルのアクセスを設定するには、[ディレクトリバケットのアクセスポイント](https://docs.aws.amazon.com//AmazonS3/latest/userguide/access-points-directory-buckets-policies.html)を使用する必要があります。  
RDS はプライベート VPC を発行しないため、アクセスポイントは **[ネットワークオリジン: インターネット]** を使用するように設定する必要があります。RDS インスタンスからの S3 トラフィックは、プライベート VPC を通過するため、パブリックインターネットを経由しません。  
****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement":
    [
        {
        "Effect": "Allow",
        "Action": "s3express:CreateSession",
        "Resource": 
            [
                "arn:aws:s3express:us-east-1:111122223333:accesspoint/amzn-s3-demo-accesspoint--use1-az6--xa-s3",
                "arn:aws:s3express:us-east-1:111122223333:bucket/amzn-s3-demo-bucket--use1-az6--x-s3"
            ]
        }
    ]
}
```

# ネイティブバックアップおよび復元の使用
<a name="SQLServer.Procedural.Importing.Native.Using"></a>

ネイティブバックアップおよび復元を有効に設定した後、使用を開始できます。最初に、Microsoft SQL Server データベースに接続し、Amazon RDS ストアドプロシージャを呼び出して作業を行います。データベースに接続する手順については、「[SQL Server DB インスタンスへの接続](USER_ConnectToMicrosoftSQLServerInstance.md)」を参照してください。

ストアドプロシージャによっては、Amazon リソースネーム (ARN) を Amazon S3 バケットおよびファイルに指定する必要があります。ARN の形式は `arn:aws:s3:::bucket_name/file_name.extension` です。Amazon S3 には、ARN のアカウント番号または AWS リージョンは不要です。

オプションの KMS キーも指定する場合、キーの ARN の形式は `arn:aws:kms:region:account-id:key/key-id` となります。詳細については、「[Amazon リソースネーム (ARN) と AWS のサービスの名前空間](https://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html)」を参照してください。バックアップを暗号化するには、対称暗号化 KMS キーを使用する必要があります。Amazon RDS は非対称 KMS キーをサポートしていません。詳細については、*AWS Key Management Service デベロッパーガイド*の「[非対称 KMS キーを作成する](https://docs.aws.amazon.com/kms/latest/developerguide/create-keys.html#create-symmetric-cmk)」を参照してください。

**注記**  
KMS キーを使用するかどうかにかかわらず、ネイティブバックアップおよび復元タスクでは、S3 にアップロードされたファイルに対して、SSE-S3 を介した Advanced Encryption Standard (AES) 256 ビット暗号化がデフォルトで有効になります。バックアップストアドプロシージャに `@enable_bucket_default_encryption=1` を渡すと、S3 バケットで設定されたデフォルトの暗号化キーが使用されます。

各ストアドプロシージャを呼び出す方法については、以下のトピックを参照してください。
+ [データベースのバックアップ](#SQLServer.Procedural.Importing.Native.Using.Backup)
+ [データベースの復元](#SQLServer.Procedural.Importing.Native.Using.Restore)
+ [ログの復元](#SQLServer.Procedural.Importing.Native.Restore.Log)
+ [データベースの復元を終了する](#SQLServer.Procedural.Importing.Native.Finish.Restore)
+ [部分的に復元したデータベースの使用](#SQLServer.Procedural.Importing.Native.Partially.Restored)
+ [タスクのキャンセル](#SQLServer.Procedural.Importing.Native.Using.Cancel)
+ [タスクのステータスの追跡](#SQLServer.Procedural.Importing.Native.Tracking)

## データベースのバックアップ
<a name="SQLServer.Procedural.Importing.Native.Using.Backup"></a>

データベースをバックアップするには、`rds_backup_database` ストアドプロシージャを呼び出します。

**注記**  
メンテナンスウィンドウが開いている間または Amazon RDS がスナップショットを作成している間は、データベースをバックアップできません。

### Usage
<a name="SQLServer.Procedural.Importing.Native.Backup.Syntax"></a>

```
exec msdb.dbo.rds_backup_database
	@source_db_name='database_name',
	@s3_arn_to_backup_to='arn:aws:s3:::bucket_name/file_name.extension',
	[@kms_master_key_arn='arn:aws:kms:region:account-id:key/key-id'],	
	[@overwrite_s3_backup_file=0|1],
	[@block_size=512|1024|2048|4096|8192|16384|32768|65536],
        [@max_transfer_size=n],
        [@buffer_count=n],
	[@type='DIFFERENTIAL|FULL'],
	[@number_of_files=n],
	[@enable_bucket_default_encryption=0|1];
```

以下のパラメータは必須です。
+ `@source_db_name` – バックアップするデータベースの名前。
+ `@s3_arn_to_backup_to` - バックアップに使用する Amazon S3 バケット、アクセスポイント、ディレクトリバケット、またはディレクトリバケットのアクセスポイントとバックアップファイル名を表示する ARN。

  ファイルは任意の拡張子を持つことができますが、通常は `.bak` が使用されます。アクセスポイント ARN は `arn:aws:s3:us-east-1:111122223333:access-point-name/object/key` の形式である必要があります。

以下のパラメータはオプションです。
+ `@kms_master_key_arn` - 項目の暗号化に使用する対称暗号化 KMS キーの ARN。
  + デフォルトの暗号化キーは使用できません。デフォルトキーを使用すると、データベースはバックアップされません。
  +  KMS キー識別子を指定しない場合、バックアップファイルは暗号化されません。詳細については、「[Amazon RDS リソースの暗号化](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/Overview.Encryption.html)」を参照してください。
  + KMS キーを指定すると、クライアント側の暗号化が使用されます。
  + Amazon RDS は非対称 KMS キーをサポートしていません。詳細については、*AWS Key Management Service デベロッパーガイド*の「[非対称 KMS キーを作成する](https://docs.aws.amazon.com/kms/latest/developerguide/create-keys.html#create-symmetric-cmk)」を参照してください。
+ `@overwrite_s3_backup_file` – 既存のバックアップファイルを上書きするかどうかを表す値。
  + `0` – 既存のファイルを上書きしません。この値はデフォルト値です。

    設定 `@overwrite_s3_backup_file` を 0 にすると、ファイルが既に存在している場合はエラーが返されます。
  + `1` – バックアップファイルではない場合でも、指定された名前を持つ既存のファイルを上書きします。
+ `@type` – バックアップのタイプ。
  + `DIFFERENTIAL` – 差分バックアップを取ります。
  + `FULL` – 完全バックアップを取ります。この値はデフォルト値です。

  差分バックアップは、最後の完全バックアップに基づいています。差分バックアップを機能させるには、最後の完全バックアップと差分バックアップの間でスナップショットを作成することはできません。差分バックアップを取りたいがスナップショットが存在する場合、差分バックアップを続行する前に別の完全バックアップを作成してください。

  最後のフルバックアップまたはスナップショットは、以下の SQL クエリの例を使用して検索できます。

  ```
  select top 1
  database_name
  , 	backup_start_date
  , 	backup_finish_date
  from    msdb.dbo.backupset
  where   database_name='mydatabase'
  and     type = 'D'
  order by backup_start_date desc;
  ```
+ `@number_of_files` – バックアップが分割される (チャンク) ファイルの数。最大数は 10 です。
  + マルチファイルバックアップは、完全バックアップと差分バックアップの両方でサポートされています。
  + 値 1 を入力するか、パラメータを省略すると、1 つのバックアップファイルが作成されます。

  ファイルに共通のプレフィックスを付けてから、そのプレフィックスにアスタリスクを付けます (`*`)。アスタリスクは、S3 ARN の *file\$1name* 部分のどこにでも使用できます。生成されたファイルのアスタリスクは、`1-of-number_of_files` で始まる一連の英数字文字列に置き換えられます。

  例えば、S3 ARN のファイル名が `backup*.bak` で `@number_of_files=4` を設定した場合、生成されるバックアップファイルは `backup1-of-4.bak`、`backup2-of-4.bak`、`backup3-of-4.bak`、`backup4-of-4.bak` です。
  + いずれかのファイル名が既に存在し、`@overwrite_s3_backup_file` が 0 の場合は、エラーが返されます。
  + マルチファイルバックアップでは、S3 ARN の *file\$1name* 部分にアスタリスクを 1 つだけ含めることができます。
  + シングルファイルバックアップでは、S3 ARN の *file\$1name* 部分にアスタリスクをいくつでも含めることができます。アスタリスクは、生成されたファイル名から削除されません。
+ `@block_size` – バックアップ処理の物理ブロックサイズをバイト単位で指定します。有効な値は 512、1024、2048、4096、8192、16384、32768、および 65536 です
+ `@max_transfer_size` – バックアッププロセス中、I/O オペレーションごとに転送されるデータボリュームの上限 (バイト単位) を示す最大転送サイズ。有効な値は、65536 バイト (64 KB) から 4194304 バイト (4 MB) までの倍数です。
+ `@buffer_count` – バックアッププロセスに使用する I/O バッファの合計数。
+ `@enable_bucket_default_encryption` - S3 のサーバー側の暗号化に S3 バケットのデフォルトの暗号化設定を使用するかどうかを示す値。ディレクトリバケットは、この設定に関係なく、常にバケットのデフォルトの暗号化設定を使用します。
  + `0` – のサーバー側の暗号化では、SSE-S3 を介した Advanced Encryption Standard (AES) 256 ビット暗号化が使用されます。
  + `1` – サーバー側の暗号化は、S3 バケットで設定された[デフォルトの暗号化](https://docs.aws.amazon.com//AmazonS3/latest/userguide/bucket-encryption.html)を使用します。

### 例
<a name="SQLServer.Procedural.Importing.Native.Backup.Examples"></a>

**Example 差分バックアップ**  

```
exec msdb.dbo.rds_backup_database
@source_db_name='mydatabase',
@s3_arn_to_backup_to='arn:aws:s3:::mybucket/backup1.bak',
@overwrite_s3_backup_file=1,
@type='DIFFERENTIAL';
```

**Example クライアント側の暗号化による完全バックアップ**  

```
exec msdb.dbo.rds_backup_database
@source_db_name='mydatabase',
@s3_arn_to_backup_to='arn:aws:s3:::mybucket/backup1.bak',
@kms_master_key_arn='arn:aws:kms:us-east-1:123456789012:key/AKIAIOSFODNN7EXAMPLE',
@overwrite_s3_backup_file=1,
@type='FULL';
```

**Example マルチファイルバックアップ**  

```
exec msdb.dbo.rds_backup_database
@source_db_name='mydatabase',
@s3_arn_to_backup_to='arn:aws:s3:::mybucket/backup*.bak',
@number_of_files=4;
```

**Example マルチファイル差分バックアップ**  

```
exec msdb.dbo.rds_backup_database
@source_db_name='mydatabase',
@s3_arn_to_backup_to='arn:aws:s3:::mybucket/backup*.bak',
@type='DIFFERENTIAL',
@number_of_files=4;
```

**Example 暗号化によるマルチファイルバックアップ**  

```
exec msdb.dbo.rds_backup_database
@source_db_name='mydatabase',
@s3_arn_to_backup_to='arn:aws:s3:::mybucket/backup*.bak',
@kms_master_key_arn='arn:aws:kms:us-east-1:123456789012:key/AKIAIOSFODNN7EXAMPLE',
@number_of_files=4;
```

**Example S3 の上書きによるマルチファイルバックアップ**  

```
exec msdb.dbo.rds_backup_database
@source_db_name='mydatabase',
@s3_arn_to_backup_to='arn:aws:s3:::mybucket/backup*.bak',
@overwrite_s3_backup_file=1,
@number_of_files=4;
```

**Example ブロックサイズによるバックアップ**  

```
exec msdb.dbo.rds_backup_database
@source_db_name='mydatabase',
@s3_arn_to_backup_to='arn:aws:s3:::mybucket/backup*.bak',
@block_size=512;
```

**Example `@max_transfer_size` と `@buffer_count` によるマルチファイルバックアップ**  

```
exec msdb.dbo.rds_backup_database
@source_db_name='mydatabase',
@s3_arn_to_backup_to='arn:aws:s3:::mybucket/backup*.bak',
@number_of_files=4,
@max_transfer_size=4194304,
@buffer_count=10;
```

**Example @number\$1of\$1files パラメータを使用したシングルファイルバックアップ**  
この例では、`backup*.bak` という名前のバックアップファイルを生成します。  

```
exec msdb.dbo.rds_backup_database
@source_db_name='mydatabase',
@s3_arn_to_backup_to='arn:aws:s3:::mybucket/backup*.bak',
@number_of_files=1;
```

**Example サーバー側の暗号化による完全バックアップ**  

```
exec msdb.dbo.rds_backup_database
@source_db_name='mydatabase',
@s3_arn_to_backup_to='arn:aws:s3:::mybucket/backup*.bak',
@overwrite_s3_backup_file=1,
@type='FULL',
@enable_bucket_default_encryption=1;
```

**Example アクセスポイントを使用した完全バックアップ**  

```
exec msdb.dbo.rds_backup_database
@source_db_name='mydatabase',
@s3_arn_to_backup_to='arn:aws:s3:us-east-1:111122223333:accesspoint/my-access-point/object/backup1.bak',
@overwrite_s3_backup_file=1,
@type='FULL';
```

**Example ディレクトリバケットのアクセスポイントを使用したフルバックアップの**  

```
exec msdb.dbo.rds_backup_database
@source_db_name='mydatabase',
@s3_arn_to_backup_to='arn:aws:s3express:us-east-1:123456789012:accesspoint/my-access-point--use1-az6--xa-s3/object/backup1.bak',
@overwrite_s3_backup_file=1,
@type='FULL';
```

## データベースの復元
<a name="SQLServer.Procedural.Importing.Native.Using.Restore"></a>

データベースを復元するには、`rds_restore_database` ストアドプロシージャを呼び出します。復元タスクが完了しデータベースが開くと、Amazon RDSによりデータベースの最初のスナップショットが作成されます。

### Usage
<a name="SQLServer.Procedural.Importing.Native.Restore.Syntax"></a>

```
exec msdb.dbo.rds_restore_database
	@restore_db_name='database_name',
	@s3_arn_to_restore_from='arn:aws:s3:::bucket_name/file_name.extension',
	@with_norecovery=0|1,
	[@keep_cdc=0|1],
	[@data_file_volume='D:|H:|I:|J:'],
	[@log_file_volume='D:|H:|I:|J:'],
	[@kms_master_key_arn='arn:aws:kms:region:account-id:key/key-id'],
        [@block_size=512|1024|2048|4096|8192|16384|32768|65536],
        [@max_transfer_size=n],
        [@buffer_count=n],
	[@type='DIFFERENTIAL|FULL'];
```

以下のパラメータは必須です。
+ `@restore_db_name` – 復元するデータベースの名前。データベース名は一意です。既存のデータベースと同じ名前のデータベースを復元することはできません。
+ `@s3_arn_to_restore_from` – Amazon S3 プレフィックスと、データベースの復元に使用するバックアップファイルの名前を示す ARN。
  + 単一ファイルのバックアップの場合は、ファイル名全体を入力します。
  + マルチファイルのバックアップの場合は、ファイルに共通のプレフィックスを付けてから、そのプレフィックスにアスタリスクを付けます (`*`)。
    + ディレクトリバケットを使用する場合、[ディレクトリバケットの違い](https://docs.aws.amazon.com//AmazonS3/latest/userguide/s3-express-differences.html)により、ARN は `/*` で終わる必要があります。
  + `@s3_arn_to_restore_from` が空の場合は、次のエラーメッセージが返ります: S3 ARN prefix cannot be empty。

以下のパラメータは、差分復元には必須ですが、完全復元ではオプションです。
+ `@with_norecovery` – 復元操作に使用する復元句。
  + `0` に設定して、RECOVERY で復元します。この場合、復元後にデータベースがオンラインになります。
  + `1` に設定して、NORECOVERY で復元します。この場合、復元タスクの完了後もデータベースが RESTORING 状態を保持します。このアプローチで、後から差分復元も実行することができます。
  + DIFFERENTIAL 復元は、`0` または `1` を指定してください。
  + `FULL` 復元の場合、この値はデフォルトで `0` です。

以下のパラメータはオプションです。
+ `@keep_cdc` – 復元されたデータベースに変更データキャプチャ (CDC) 設定を保持するかどうかを示します。KEEP\$1CDC を有効にするには `1` に、無効にするには `0` に設定します。デフォルト値は `0` です。
+ `@data_file_volume` – データベースデータファイルのドライブ文字を指定します。デフォルト値は `D:` です。
+ `@log_file_volume` – データベースログファイルのドライブ文字を指定します。デフォルト値は `D:` です。
+ `@kms_master_key_arn` - バックアップファイルを暗号化した場合の、ファイルの復号に使用する KMS キー。

  KMS キーを指定すると、クライアント側の暗号化が使用されます。
+ `@type` – 復元のタイプ。有効なタイプは、`DIFFERENTIAL`と`FULL` です。デフォルト値は `FULL` です。
+ `@block_size` – バックアップ処理の物理ブロックサイズをバイト単位で指定します。有効な値は 512、1024、2048、4096、8192、16384、32768、および 65536 です
+ `@max_transfer_size` – バックアッププロセス中、I/O オペレーションごとに転送されるデータボリュームの上限 (バイト単位) を示す最大転送サイズ。有効な値は、65536 バイト (64 KB) から 4194304 バイト (4 MB) までの倍数です。
+ `@buffer_count` – バックアッププロセスに使用する I/O バッファの合計数。

**注記**  
差分復元は、データベースが RESTORING 状態にあるか、NORECOVERY で復元するタスクが既に存在している必要があります。  
データベースがオンラインの場合、後から差分バックアップを復元することはできません。  
データベースに、RECOVERY を使用した復元中のタスクがある場合、復元タスクを提出することはできません。  
NORECOVERY と KEEP\$1CDC の両方を使用した完全な復元はサポートされていません。  
クロスリージョンリードレプリカを持つインスタンスでは、いずれのネイティブ復元もサポートされていません。  
サポートされている設定の場合、リードレプリカを持つマルチ AZ インスタンスでのデータベースの復元は、マルチ AZ インスタンスでのデータベースの復元に似ています。レプリカ上のデータベースを復元するために、追加のアクションを実行する必要はありません。

### 例
<a name="SQLServer.Procedural.Importing.Native.Restore.Examples"></a>

**Example 単一ファイルの復元**  

```
exec msdb.dbo.rds_restore_database
@restore_db_name='mydatabase',
@s3_arn_to_restore_from='arn:aws:s3:::mybucket/backup1.bak';
```

**Example マルチファイルの復元**  
複数ファイル復元中のエラーを回避するために、すべてのバックアップファイルに同じプレフィックスがあり、他のファイルでそのプレフィックスが使用されていないことを確認します。  

```
exec msdb.dbo.rds_restore_database
@restore_db_name='mydatabase',
@s3_arn_to_restore_from='arn:aws:s3:::mybucket/backup*';
```

**Example RECOVERY を使用したデータベースの復元**  
以下の 3 つの例は、RECOVERY を使用した完全復元という同じタスクを実行します。  

```
exec msdb.dbo.rds_restore_database
@restore_db_name='mydatabase',
@s3_arn_to_restore_from='arn:aws:s3:::mybucket/backup1.bak';
```

```
exec msdb.dbo.rds_restore_database
@restore_db_name='mydatabase',
@s3_arn_to_restore_from='arn:aws:s3:::mybucket/backup1.bak',
[@type='DIFFERENTIAL|FULL'];
```

```
exec msdb.dbo.rds_restore_database
@restore_db_name='mydatabase',
@s3_arn_to_restore_from='arn:aws:s3:::mybucket/backup1.bak',
@type='FULL',
@with_norecovery=0;
```

**Example 暗号化を使用したデータベースの完全復元**  

```
exec msdb.dbo.rds_restore_database
@restore_db_name='mydatabase',
@s3_arn_to_restore_from='arn:aws:s3:::mybucket/backup1.bak',
@kms_master_key_arn='arn:aws:kms:us-east-1:123456789012:key/AKIAIOSFODNN7EXAMPLE';
```

**Example ブロックサイズによる復元**  

```
exec msdb.dbo.rds_restore_database
@restore_db_name='mydatabase',
@s3_arn_to_restore_from='arn:aws:s3:::mybucket/backup1.bak',
@block_size=512;
```

**Example @max\$1transfer\$1size と @buffer\$1count によるマルチファイル復元**  

```
exec msdb.dbo.rds_restore_database
@restore_db_name='mydatabase',
@s3_arn_to_restore_from='arn:aws:s3:::mybucket/backup*',
@max_transfer_size=4194304,
@buffer_count=10;
```

**Example NORECOVERY を使用したデータベースの完全復元**  

```
exec msdb.dbo.rds_restore_database
@restore_db_name='mydatabase',
@s3_arn_to_restore_from='arn:aws:s3:::mybucket/backup1.bak',
@type='FULL',
@with_norecovery=1;
```

**Example NORECOVERY を使用した差分復元**  

```
exec msdb.dbo.rds_restore_database
@restore_db_name='mydatabase',
@s3_arn_to_restore_from='arn:aws:s3:::mybucket/backup1.bak',
@type='DIFFERENTIAL',
@with_norecovery=1;
```

**Example RECOVERY を使用した差分復元**  

```
exec msdb.dbo.rds_restore_database
@restore_db_name='mydatabase',
@s3_arn_to_restore_from='arn:aws:s3:::mybucket/backup1.bak',
@type='DIFFERENTIAL',
@with_norecovery=0;
```

**Example アクセスポイントを使用した RECOVERY によるデータベース全体の復元**  

```
exec msdb.dbo.rds_restore_database
@restore_db_name='mydatabase',
@s3_arn_to_backup_to='arn:aws:s3:us-east-1:111122223333:accesspoint/my-access-point/object/backup1.bak',
@with_norecovery=0;
```

**Example KEEP\$1CDC を使用したデータベースの復元**  

```
exec msdb.dbo.rds_restore_database
@restore_db_name='mydatabase',
@s3_arn_to_restore_from='arn:aws:s3:::mybucket/backup1.bak',
@keep_cdc=1;
```

## ログの復元
<a name="SQLServer.Procedural.Importing.Native.Restore.Log"></a>

ログを復元するには、`rds_restore_log` ストアドプロシージャを呼び出します。

### Usage
<a name="SQLServer.Procedural.Importing.Native.Restore.Log.Syntax"></a>

```
exec msdb.dbo.rds_restore_log 
	@restore_db_name='database_name',
	@s3_arn_to_restore_from='arn:aws:s3:::bucket_name/log_file_name.extension',
	[@kms_master_key_arn='arn:aws:kms:region:account-id:key/key-id'],
	[@with_norecovery=0|1],
	[@keep_cdc=0|1],
	[@stopat='datetime'],
	[@block_size=512|1024|2048|4096|8192|16384|32768|65536],
        [@max_transfer_size=n],
        [@buffer_count=n];
```

以下のパラメータは必須です。
+ `@restore_db_name` – 復元するログのデータベース名。
+ `@s3_arn_to_restore_from` – ARN が、Amazon S3プレフィックスと、ログを復元する際に使用するログファイル名を表示します。ファイルは任意の拡張子を持つことができますが、通常は `.trn` が使用されます。

  `@s3_arn_to_restore_from` が空の場合は、次のエラーメッセージが返ります: S3 ARN prefix cannot be empty。

以下のパラメータはオプションです。
+ `@keep_cdc` – 復元されたデータベースに変更データキャプチャ (CDC) 設定を保持するかどうかを示します。KEEP\$1CDC を有効にするには 1 に、無効にするには 0 に設定します。デフォルト値は 0 です。
+ `@kms_master_key_arn` - ログを暗号化した場合の、ログの復号に使用する KMS キー。
+ `@with_norecovery` – 復元操作に使用する復元句。この値のデフォルト値は`1`です。
  + `0` に設定して、RECOVERY で復元します。この場合、復元後にデータベースがオンラインになります。データベースがオンラインの場合、さらにログバックアップを復元することはできません。
  + `1` に設定して、NORECOVERY で復元します。この場合、復元タスクの完了後もデータベースが RESTORING 状態を保持します。このアプローチで、後からログ復元も実行することができます。
+ `@stopat` – データべ－スが、指定の日付と時間の状態に復元されたこと（日付時間形式）を指定するための値。指定の日時以前に書き込まれた取引きログ記録のみが、データベースに適用されます。

  このパラメータを指定していない場合 (NULL)、完全なログが復元されます。
+ `@block_size` – バックアップ処理の物理ブロックサイズをバイト単位で指定します。有効な値は 512、1024、2048、4096、8192、16384、32768、および 65536 です
+ `@max_transfer_size` – バックアッププロセス中、I/O オペレーションごとに転送されるデータボリュームの上限 (バイト単位) を示す最大転送サイズ。有効な値は、65536 バイト (64 KB) から 4194304 バイト (4 MB) までの倍数です。
+ `@buffer_count` – バックアッププロセスに使用する I/O バッファの合計数。

**注記**  
ログ復元は、データベースが復元状態にあるか、NORECOVERY で復元するタスクが既に存在している必要があります。  
データベースがオンラインの場合、ログバックアップを復元することはできません。  
データベースに、RECOVERY を使用した復元中のタスクがある場合、ログ復元タスクを提出することはできません。

### 例
<a name="SQLServer.Procedural.Importing.Native.Restore.Log.Examples"></a>

**Example ログの復元**  

```
exec msdb.dbo.rds_restore_log
@restore_db_name='mydatabase',
@s3_arn_to_restore_from='arn:aws:s3:::mybucket/mylog.trn';
```

**Example 暗号化を使用したログの復元**  

```
exec msdb.dbo.rds_restore_log
@restore_db_name='mydatabase',
@s3_arn_to_restore_from='arn:aws:s3:::mybucket/mylog.trn',
@kms_master_key_arn='arn:aws:kms:us-east-1:123456789012:key/AKIAIOSFODNN7EXAMPLE';
```

**Example NORECOVERY を使用したログの復元**  
以下の 2 つの例は、NORECOVERY を使用したログ復元という同じタスクを実行します。  

```
exec msdb.dbo.rds_restore_log
@restore_db_name='mydatabase',
@s3_arn_to_restore_from='arn:aws:s3:::mybucket/mylog.trn',
@with_norecovery=1;
```

```
exec msdb.dbo.rds_restore_log
@restore_db_name='mydatabase',
@s3_arn_to_restore_from='arn:aws:s3:::mybucket/mylog.trn';
```

**Example ブロックサイズによる復元**  

```
exec msdb.dbo.rds_restore_log
@restore_db_name='mydatabase',
@s3_arn_to_restore_from='arn:aws:s3:::mybucket/mylog.trn',
@block_size=512;
```

**Example RECOVERY を使用したログの復元**  

```
exec msdb.dbo.rds_restore_log
@restore_db_name='mydatabase',
@s3_arn_to_restore_from='arn:aws:s3:::mybucket/mylog.trn',
@with_norecovery=0;
```

**Example STOPAT 句を使用したログの復元**  

```
exec msdb.dbo.rds_restore_log
@restore_db_name='mydatabase',
@s3_arn_to_restore_from='arn:aws:s3:::mybucket/mylog.trn',
@with_norecovery=0,
@stopat='2019-12-01 03:57:09';
```

**Example KEEP\$1CDC を使用したログの復元**  

```
exec msdb.dbo.rds_restore_database
@restore_db_name='mydatabase',
@s3_arn_to_restore_from='arn:aws:s3:::mybucket/backup1.bak',
@keep_cdc=1;
```

## データベースの復元を終了する
<a name="SQLServer.Procedural.Importing.Native.Finish.Restore"></a>

データベースの最後の復元タスクを `@with_norecovery=1` を使用して実行した場合、データベースが RESTORING 状態になります。`rds_finish_restore`ストアドプロシージャを使用して、このデータベースを通常操作用に開きます。

### Usage
<a name="SQLServer.Procedural.Importing.Native.Finish.Restore.Syntax"></a>

```
exec msdb.dbo.rds_finish_restore @db_name='database_name';
```

**注記**  
このアプローチを使用するには、実行中の復元タスクのない状態で、データベースが RESTORING 状態である必要があります。  
データベースの復元が終了したら、マスターログインを使用してください。または、NORECOVERY を使用して直近にデータベースを復元したユーザーログインを使用またはログします。

## 部分的に復元したデータベースの使用
<a name="SQLServer.Procedural.Importing.Native.Partially.Restored"></a>

### 部分的に復元したデータベースの削除
<a name="SQLServer.Procedural.Importing.Native.Drop.Partially.Restored"></a>

部分的に復元したデータベースを削除するには（RESTORING状態のまま）、`rds_drop_database` ストアドプロシージャを使用してください。

```
exec msdb.dbo.rds_drop_database @db_name='database_name';
```

**注記**  
復元の中断中または復元タスクが完了したデータベースに対し、DROP データベースリクエストを送信することはできません。  
データベースを削除するには、マスターログインを使用します。または、NORECOVERY を使用して直近にデータベースを復元したユーザーログインを使用またはログします。

### 部分的に復元したデータベースのスナップショット復元とポイントインタイム復元の動作
<a name="SQLServer.Procedural.Importing.Native.Snapshot.Restore"></a>

ソースインスタンス内の部分的に復元されたデータベース（RESTORING状態のまま）は、スナップショットの復元またはポイントインタイム復元中に対象のインスタンスから削除されます。

## タスクのキャンセル
<a name="SQLServer.Procedural.Importing.Native.Using.Cancel"></a>

バックアップまたは復元タスクをキャンセルするには、`rds_cancel_task` ストアドプロシージャを呼び出します。

**注記**  
FINISH\$1RESTORE タスクはキャンセルできません。

### Usage
<a name="SQLServer.Procedural.Importing.Native.Cancel.Syntax"></a>

```
exec msdb.dbo.rds_cancel_task @task_id=ID_number;
```

以下のパラメータは必須です。
+ `@task_id` – キャンセルするタスクの ID。`rds_task_status` を呼び出すことにより、タスク ID を取得できます。

## タスクのステータスの追跡
<a name="SQLServer.Procedural.Importing.Native.Tracking"></a>

バックアップおよび復元タスクのステータスを追跡するには、`rds_task_status` ストアドプロシージャを呼び出します。パラメータを何も指定しない場合、ストアドプロシージャによりすべてのタスクのステータスが返されます。タスクのステータスは、約 2 分ごとに更新されます。タスクの履歴は 36 日間保持されます。

### Usage
<a name="SQLServer.Procedural.Importing.Native.Tracking.Syntax"></a>

```
exec msdb.dbo.rds_task_status
	[@db_name='database_name'],
	[@task_id=ID_number];
```

以下のパラメータはオプションです。
+ `@db_name` – タスクのステータスを表示するデータベースの名前。
+ `@task_id` – タスクのステータスを表示するタスクの ID。

### 例
<a name="SQLServer.Procedural.Importing.Native.Tracking.Examples"></a>

**Example 特定タスクのステータスのリスト化**  

```
exec msdb.dbo.rds_task_status @task_id=5;
```

**Example 特定データベースおよびタスクのステータスのリスト化**  

```
exec msdb.dbo.rds_task_status
@db_name='my_database',
@task_id=5;
```

**Example 特定データベースのすべてのタスクおよびステータスのリスト化**  

```
exec msdb.dbo.rds_task_status @db_name='my_database';
```

**Example 現在のインスタンスのすべてのタスクおよびステータスのリスト化**  

```
exec msdb.dbo.rds_task_status;
```

### 応答
<a name="SQLServer.Procedural.Importing.Native.Tracking.Response"></a>

`rds_task_status` ストアドプロシージャは、次の列を返します。


****  

| 列 | 説明 | 
| --- | --- | 
| `task_id` |  タスクの ID。  | 
| `task_type` |  入力パラメータによるタスクタイプは以下の通りです。 [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/UserGuide/SQLServer.Procedural.Importing.Native.Using.html) 以下の復元タスクが完了してデータベースが開くと、Amazon RDSが初期のスナップショットを作成します。 [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/UserGuide/SQLServer.Procedural.Importing.Native.Using.html)  | 
| `database_name` |  タスクが関連付けられているデータベースの名前。  | 
| `% complete` |  タスクの進行状況の割合値。  | 
| `duration (mins)` |  タスクにかかった時間 (分単位)。  | 
| `lifecycle` |  タスクのステータス。有効な状態には、以下が含まれます。 [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/UserGuide/SQLServer.Procedural.Importing.Native.Using.html)  | 
| `task_info` |  タスクに関する追加情報。 データベースのバックアップまたは復元中にエラーが発生した場合は、この列にエラーに関する情報が表示されます。発生する可能性があるエラーのリストと軽減戦略については、「[トラブルシューティング](SQLServer.Procedural.Importing.Native.Troubleshooting.md)」を参照してください。  | 
| `last_updated` |  タスクのステータスが最後に更新された日時。5% 進行するたびに、ステータスが更新されます。  | 
| `created_at` | タスクが作成された日時。 | 
| S3\$1object\$1arn | Amazon S3プレフィックスを表す ARN とバックアップまたは復元したファイルの名前。 | 
| `overwrite_s3_backup_file` |  バックアップタスクを呼び出すときに指定される `@overwrite_s3_backup_file` パラメータの値。詳細については、「[データベースのバックアップ](#SQLServer.Procedural.Importing.Native.Using.Backup)」を参照してください。  | 
| KMS\$1master\$1key\$1arn | (バックアップ時の) 暗号化および (復元時の) 復号に使用する KMS キーの ARN。 | 
| filepath | ネイティブバックアップおよびタスクの復元には適用されません。 | 
| overwrite\$1file | ネイティブバックアップおよびタスクの復元には適用されません。 | 

# バックアップファイルの圧縮
<a name="SQLServer.Procedural.Importing.Native.Compression"></a>

Amazon S3 バケットの容量を節約するために、バックアップファイルを圧縮できます。バックアップファイルの圧縮の詳細については、Microsoft ドキュメントの「[バックアップの圧縮](https://msdn.microsoft.com/en-us/library/bb964719.aspx)」を参照してください。

バックアップファイルの圧縮は、以下のデータベースエディションでサポートされています。
+ Microsoft SQL Server Enterprise Edition 
+ Microsoft SQL Server Standard Edition 

バックアップファイルの圧縮オプションを確認するには、次のコードを実行します。

```
1. exec rdsadmin.dbo.rds_show_configuration 'S3 backup compression';
```

バックアップファイルの圧縮を有効にするには、以下のコードを実行します。

```
1. exec rdsadmin.dbo.rds_set_configuration 'S3 backup compression', 'true';
```

バックアップファイルの圧縮を無効にするには、以下のコードを実行します。

```
1. exec rdsadmin.dbo.rds_set_configuration 'S3 backup compression', 'false';
```

# トラブルシューティング
<a name="SQLServer.Procedural.Importing.Native.Troubleshooting"></a>

以下は、ネイティブ バックアップおよび復元を使用する場合に遭遇する可能性のある問題です。


****  

| 問題 | トラブルシューティングの推奨事項 | 
| --- | --- | 
|  データベースのバックアップ/復元オプションが有効になっていないか、有効化中です。後で再試行してください。  |  DB インスタンスに関連付けられた DB オプショングループに`SQLSERVER_BACKUP_RESTORE`オプションが追加されていることを確認します。詳細については、「[ネイティブバックアップおよび復元オプションの追加](Appendix.SQLServer.Options.BackupRestore.md#Appendix.SQLServer.Options.BackupRestore.Add)」を参照してください。  | 
|  EXECUTE アクセス許可は、オブジェクト「*rds\$1backup\$1database*」、データベース「msdb」、スキーマ「dbo」で拒否されました。  |  ストアドプロシージャを実行するときは、マスターユーザーを使用していることを確認してください。マスターユーザーとしてログインした後でもこのエラーが発生した場合は、管理者ユーザーのアクセス許可の不一致が原因である可能性があります。マスターユーザーをリセットするには、AWS マネジメントコンソールを使用します。「[Amazon RDS for SQL Server のマスターユーザーの db\$1owner ロールメンバーシップのリセット](Appendix.SQLServer.CommonDBATasks.ResetPassword.md)」を参照してください。  | 
|  EXECUTE アクセス許可は、オブジェクト「*rds\$1restore\$1database*」、データベース「msdb」、スキーマ「dbo」で拒否されました。  |  ストアドプロシージャを実行するときは、マスターユーザーを使用していることを確認してください。マスターユーザーとしてログインした後でもこのエラーが発生した場合は、管理者ユーザーのアクセス許可の不一致が原因である可能性があります。マスターユーザーをリセットするには、AWS マネジメントコンソールを使用します。「[Amazon RDS for SQL Server のマスターユーザーの db\$1owner ロールメンバーシップのリセット](Appendix.SQLServer.CommonDBATasks.ResetPassword.md)」を参照してください。  | 
|  アクセスが拒否されました  | バックアップまたは復元プロセスは、バックアップファイルにアクセスできません。通常、この原因は以下のような問題にあります。 [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/UserGuide/SQLServer.Procedural.Importing.Native.Troubleshooting.html)  | 
|  BACKUP DATABASE WITH COMPRESSION は <edition\$1name> エディションではサポートされていません  |  バックアップファイルの圧縮は、Microsoft SQL Server Enterprise Edition と Standard Edition でのみサポートされています。 詳細については、「[バックアップファイルの圧縮](SQLServer.Procedural.Importing.Native.Compression.md)」を参照してください。  | 
|  キー <ARN> が存在しません  |  暗号化されたバックアップを復元しようとしましたが、有効な暗号化キーを指定しませんでした。暗号化キーを確認し、再試行してください。詳細については、「[データベースの復元](SQLServer.Procedural.Importing.Native.Using.md#SQLServer.Procedural.Importing.Native.Using.Restore)」を参照してください。  | 
|  正しいタイプでタスクを再発行し、プロパティを上書きしてください  |  データベースをバックアップする際に、既存のファイル名を指定して上書きのプロパティを false に設定すると、保存オペレーションは失敗します。このエラーを修正するには、既存のファイル名以外の名前を指定するか、上書きのプロパティを true に設定します。 詳細については、「[データベースのバックアップ](SQLServer.Procedural.Importing.Native.Using.md#SQLServer.Procedural.Importing.Native.Using.Backup)」を参照してください。 また、データベースを復元しようとして、間違えて `rds_backup_database` ストアドプロシージャを呼び出した可能性もあります。この場合は、代わりに `rds_restore_database` ストアドプロシージャを呼び出します。 詳細については、「[データベースの復元](SQLServer.Procedural.Importing.Native.Using.md#SQLServer.Procedural.Importing.Native.Using.Restore)」を参照してください。 データベースを復元するために `rds_restore_database` ストアドプロシージャを呼び出した場合は、有効なバックアップファイルの名前を指定したことを確認してください。 詳細については、「[ネイティブバックアップおよび復元の使用](SQLServer.Procedural.Importing.Native.Using.md)」を参照してください。  | 
|  RDS インスタンスと同じリージョンにあるバケットを指定してください  |  Amazon RDS DB インスタンスとは異なる AWS リージョンの Amazon S3 バケットにバックアップしたり、このバケットから復元したりすることはできません。Amazon S3 レプリケーションを使用すると、正しい AWS リージョンにバックアップファイルをコピーできます。 詳細については、Amazon S3 ドキュメントの「[クロスリージョンレプリケーション](https://docs.aws.amazon.com/AmazonS3/latest/userguide/crr.html)」を参照してください。  | 
|  指定されたバケットは存在しません  | バケットとファイルの正しい ARN を正しい形式で指定したこと確認してください。 詳細については、「[ネイティブバックアップおよび復元の使用](SQLServer.Procedural.Importing.Native.Using.md)」を参照してください。  | 
|  ユーザー <ARN> にはリソース <ARN> で <kms action> を実行する権限がありません  |  暗号化されたオペレーションをリクエストしましたが、指定した AWS KMS のアクセス権限が正しくありません。適切なアクセス権限を持っていることを確認してください。持っていない場合は、追加してください。 詳細については、「[ネイティブバックアップおよび復元のセットアップ](SQLServer.Procedural.Importing.Native.Enabling.md)」を参照してください。  | 
|  Restore タスクは、10 個を超えるバックアップファイルから復元できません。一致するファイルの数を減らして、もう一度お試しください。  |  復元しようとしているファイル数を減らします。必要に応じて、個々のファイルを大きくすることができます。  | 
|  データベース「*database\$1name*」は既に存在します。大文字と小文字またはアクセントのみが異なる 2 つのデータベースは使用できません。別のデータベース名を選択します。  |  既存のデータベースと同じ名前のデータベースを復元することはできません。データベース名は一意です。  | 

# 他の方法による SQL Server データのインポートとエクスポート
<a name="SQLServer.Procedural.Importing.Snapshots"></a>

次に、自分の Microsoft SQL Server データを Amazon RDS にインポートするためのスナップショット使用に関する情報を、確認することができます。また、SQL Server を実行する RDS DB インスタンスからデータをエクスポートするためのスナップショット使用に関する情報を確認することができます。

シナリオでサポートされている場合は、ネイティブバックアップおよび復元機能を使用して Amazon RDS との間でデータを移動する方が簡単です。詳細については、「[ネイティブバックアップと復元を使用した SQL Server データベースのインポートとエクスポート](SQLServer.Procedural.Importing.md)」を参照してください。

**注記**  
Amazon RDS for Microsoft SQL Server では、`msdb` データベースへのデータのインポートがサポートされていません。

## スナップショットを使用した RDS for SQL Server へのデータのインポート
<a name="SQLServer.Procedural.Importing.Procedure"></a>

**スナップショットを使用して SQL Server DB インスタンスにデータをインポートするには**

1. DB インスタンスを作成します。詳細については、「[Amazon RDS DB インスタンスの作成](USER_CreateDBInstance.md)」を参照してください。

1. アプリケーションの送信先 DB インスタンスへのアクセスを停止します。

   データをインポートしている間 DB インスタンスにアクセスできないようにすると、データ転送が速くなります。さらに、データのロード中に他のアプリケーションが同時に DB インスタンスに書き込むことができなければ、競合について心配する必要がなくなります。何か問題が発生し、以前のデータベーススナップショットにロールバックする必要がある場合、失われる変更内容は、インポートされたデータのみです。問題の解決後に、このデータを再インポートすることができます。

   DB インスタンスへのアクセス制御の詳細については、「[セキュリティグループによるアクセス制御](Overview.RDSSecurityGroups.md)」を参照してください。

1. ターゲットデータベースのスナップショットを作成します。

   ターゲットデータベースに既にデータが設定されている場合は、データをインポートする前にデータベースのスナップショットを作成することをお勧めします。データのインポートで何か問題があった場合や、変更を破棄する必要がある場合は、スナップショットを使用してデータベースを前の状態に復元できます。データベースのスナップショットの詳細については、「[Amazon RDS のシングル AZ DB インスタンスの DB スナップショットの作成](USER_CreateSnapshot.md)」を参照してください。
**注記**  
データベースのスナップショットを作成するときは、バックアップ処理中の間 (数ミリ秒)、データベースの I/O オペレーションは一時停止されます。

1. ターゲットデータベースの自動バックアップを無効にします。

   ターゲット DB インスタンスの自動バックアップを無効にすると、データのインポート中のパフォーマンスが向上します。これは、自動バックアップが無効化されると、Amazon RDS がトランザクションを記録しなくなるためです。ただし、考慮しなければならないことがあります。ポイントインタイムリカバリを実行するには、自動化バックアップが必要です。そのため、データのインポート中は、データベースを指定のところまで復元することはできません。さらに、保持することを選択する場合を除き、DB インスタンスに作成されていた自動バックアップはすべて消去されます。

   自動バックアップを保持するよう選択すると、誤ってデータを削除することを防止できます。また Amazon RDS では、それぞれの自動バックアップとともにデータベースインスタンスのプロパティも保存されます。これにより、復元が容易になります。このオプションを使用することで、データベースインスタンスを (削除後でも) バックアップ保存期間内の指定した時点に復元できます。削除したデータベースインスタンスの自動バックアップは、アクティブなデータベースインスタンスの自動バックアップと同様、指定したバックアップ期間の終了時に自動的に削除されます。

   以前のスナップショットを使用してデータベースを復元することもできます。また、お客様が作成したスナップショットは、引き続き使用できます。自動バックアップの詳細については、「[バックアップの概要](USER_WorkingWithAutomatedBackups.md)」を参照してください。

1. 外部キーの制約を無効にします (該当する場合)。

    外部キーの制約を無効にする必要がある場合は、次のスクリプトを使用できます。

   ```
   --Disable foreign keys on all tables
       DECLARE @table_name SYSNAME;
       DECLARE @cmd NVARCHAR(MAX);
       DECLARE table_cursor CURSOR FOR SELECT name FROM sys.tables;
       
       OPEN table_cursor;
       FETCH NEXT FROM table_cursor INTO @table_name;
       
       WHILE @@FETCH_STATUS = 0 BEGIN
         SELECT @cmd = 'ALTER TABLE '+QUOTENAME(@table_name)+' NOCHECK CONSTRAINT ALL';
         EXEC (@cmd);
         FETCH NEXT FROM table_cursor INTO @table_name;
       END
       
       CLOSE table_cursor;
       DEALLOCATE table_cursor;
       
       GO
   ```

1. インデックスを削除します (該当する場合)。

1. トリガーを無効にします (該当する場合)。

    トリガーを無効にする必要がある場合は、以下のスクリプトを使用できます。

   ```
   --Disable triggers on all tables
       DECLARE @enable BIT = 0;
       DECLARE @trigger SYSNAME;
       DECLARE @table SYSNAME;
       DECLARE @cmd NVARCHAR(MAX);
       DECLARE trigger_cursor CURSOR FOR SELECT trigger_object.name trigger_name,
        table_object.name table_name
       FROM sysobjects trigger_object
       JOIN sysobjects table_object ON trigger_object.parent_obj = table_object.id
       WHERE trigger_object.type = 'TR';
       
       OPEN trigger_cursor;
       FETCH NEXT FROM trigger_cursor INTO @trigger, @table;
       
       WHILE @@FETCH_STATUS = 0 BEGIN
         IF @enable = 1
            SET @cmd = 'ENABLE ';
         ELSE
            SET @cmd = 'DISABLE ';
       
         SET @cmd = @cmd + ' TRIGGER dbo.'+QUOTENAME(@trigger)+' ON dbo.'+QUOTENAME(@table)+' ';
         EXEC (@cmd);
         FETCH NEXT FROM trigger_cursor INTO @trigger, @table;
       END
       
       CLOSE trigger_cursor;
       DEALLOCATE trigger_cursor;
       
       GO
   ```

1. 送信先 DB インスタンスにインポートする必要のあるログインについて、送信元 SQL Server インスタンスに問い合わせます。

   SQL Server では、ログインとパスワードを `master` データベースに保存します。Amazon RDS では `master` データベースへのアクセス権を付与しないため、送信先 DB インスタンスに直接ログインとパスワードをインポートすることはできません。その代わり、元の SQL サーバーインスタンスの `master` データベースに問い合わせ、データ定義言語 (DDL) を作成しなければなりません。このファイルには、最終的な DB インスタンスに加えたいすべてのログイン情報とパスワードが含まれるようにします。またファイルには、転送したロールメンバーシップと許可も含まれます。

   `master` データベースへのクエリ実行については、Microsoft サポート技術情報の「[SQL Server のインスタンス間でログインおよびパスワードを転送する](https://learn.microsoft.com/en-us/troubleshoot/sql/database-engine/security/transfer-logins-passwords-between-instances)」を参照してください。

   スクリプトの出力は、送信先 DB インスタンスで実行できる別のスクリプトです。サポート技術情報の記事にあるスクリプトには、次のコードがあります。

   ```
   p.type IN 
   ```

   `p.type` が表示された場合はいつでも、次のコードを代わりに使用します。

   ```
   p.type = 'S' 
   ```

1. 「[データのインポート](#ImportData.SQLServer.Import)」の方法を使用してデータをインポートします。

1. アプリケーションにターゲット DB インスタンスへのアクセス権を付与します。

   データのインポートが完了したら、インポート中に止めていた DB インスタンスへのアプリケーションのアクセスを許可できます。DB インスタンスへのアクセス制御の詳細については、「[セキュリティグループによるアクセス制御](Overview.RDSSecurityGroups.md)」を参照してください。

1. ターゲット DB インスタンスの自動バックアップを有効にします。

   自動バックアップの詳細については、「[バックアップの概要](USER_WorkingWithAutomatedBackups.md)」を参照してください。

1. 外部キーの制約を有効化します。

    以前に外部キーの制約を無効にした場合は、ここで以下のスクリプトを使用してそれらを有効にすることができます。

   ```
   --Enable foreign keys on all tables
       DECLARE @table_name SYSNAME;
       DECLARE @cmd NVARCHAR(MAX);
       DECLARE table_cursor CURSOR FOR SELECT name FROM sys.tables;
       
       OPEN table_cursor;
       FETCH NEXT FROM table_cursor INTO @table_name;
       
       WHILE @@FETCH_STATUS = 0 BEGIN
         SELECT @cmd = 'ALTER TABLE '+QUOTENAME(@table_name)+' CHECK CONSTRAINT ALL';
         EXEC (@cmd);
         FETCH NEXT FROM table_cursor INTO @table_name;
       END
       
       CLOSE table_cursor;
       DEALLOCATE table_cursor;
   ```

1. インデックスを有効にします (該当する場合)。

1. トリガーを有効にします (該当する場合)。

    トリガーを無効化していた場合は、以下のスクリプトでそれらを有効にすることができます。

   ```
   --Enable triggers on all tables
       DECLARE @enable BIT = 1;
       DECLARE @trigger SYSNAME;
       DECLARE @table SYSNAME;
       DECLARE @cmd NVARCHAR(MAX);
       DECLARE trigger_cursor CURSOR FOR SELECT trigger_object.name trigger_name,
        table_object.name table_name
       FROM sysobjects trigger_object
       JOIN sysobjects table_object ON trigger_object.parent_obj = table_object.id
       WHERE trigger_object.type = 'TR';
       
       OPEN trigger_cursor;
       FETCH NEXT FROM trigger_cursor INTO @trigger, @table;
       
       WHILE @@FETCH_STATUS = 0 BEGIN
         IF @enable = 1
            SET @cmd = 'ENABLE ';
         ELSE
            SET @cmd = 'DISABLE ';
       
         SET @cmd = @cmd + ' TRIGGER dbo.'+QUOTENAME(@trigger)+' ON dbo.'+QUOTENAME(@table)+' ';
         EXEC (@cmd);
         FETCH NEXT FROM trigger_cursor INTO @trigger, @table;
       END
       
       CLOSE trigger_cursor;
       DEALLOCATE trigger_cursor;
   ```

### データのインポート
<a name="ImportData.SQLServer.Import"></a>

Microsoft SQL Server Management Studio は、Microsoft SQL Server の Express エディションを除くすべてのエディションに含まれるグラフィカル SQL Server クライアントです。SQL Server Management Studio Express は、Microsoft から無料でダウンロードできます。このダウンロードを確認するには、「[Microsoft ウェブサイト](https://www.microsoft.com/en-us/download)」を参照してください。

**注記**  
SQL Server Management Studio は、Windows ベースのアプリケーションとしてのみ使用できます。

SQL Server Management Studio には、SQL Server DB インスタンスにデータをインポートするときに便利な、次のツールが含まれています。
+ スクリプトの生成とパブリッシュウィザード
+ インポートおよびエクスポートウィザード
+ 一括コピー

#### スクリプトの生成とパブリッシュウィザード
<a name="ImportData.SQLServer.MgmtStudio.ScriptWizard"></a>

スクリプトの生成とパブリッシュウィザードは、データベースのスキーマ、データそのもの、または両方を含むスクリプトを作成します。ローカル SQL サーバーのデプロイ内のデータベースに、スクリプトを作成することができます。その後スクリプトを実行し、そこに含まれる情報を Amazon RDS DB インスタンスに転送することができます。

**注記**  
1 GiB 以上のデータベースについては、データベーススキーマのみをスクリプトするほうが効率的です。次に、インポートおよびエクスポートウィザードを使用するか、SQL Server の一括コピー機能を使用して、データを転送します。

スクリプトの生成とパブリッシュウィザードの詳細については、[Microsoft SQL Server のドキュメント](http://msdn.microsoft.com/en-us/library/ms178078%28v=sql.105%29.aspx)を参照してください。

ウィザードでは、特に [**Set Scripting Options**] ページの高度なオプションに注意を払い、スクリプトに含める必要のあるものがすべて選択されていることを確認します。例えば、デフォルトでは、データベースのトリガーはスクリプトに含まれていません。

スクリプトが生成されて保存されると、SQL Server Management Studio を使用して DB インスタンスに接続し、スクリプトを実行することができます。

#### インポートおよびエクスポートウィザード
<a name="ImportData.SQLServer.MgmtStudio.ImportExportWizard"></a>

インポートおよびエクスポートウィザードは、特別な Integration Services パッケージを作成します。これを使用して、ローカルの SQL Server データベースから転送先 DB インスタンスにデータをコピーすることができます。ウィザードでは、転送先 DB インスタンスにコピーするテーブルおよびタプルをフィルタできます。

**注記**  
インポートおよびエクスポートウィザードは、大規模なデータセットには有効に機能しますが、ローカルデプロイメントからリモートにデータをエクスポートするには、最速の方法とはいえません。より速い方法については、SQL Server の一括コピー機能を検討できます。

インポートおよびエクスポートウィザードの詳細については、[Microsoft SQL Server のドキュメント](http://msdn.microsoft.com/en-us/library/ms140052%28v=sql.105%29.aspx)を参照してください。

ウィザードでは、[**Choose a Destination**] ページで、次の操作を行います。
+ [**Server Name**] に、DB インスタンスのエンドポイント名を入力します。
+ サーバー認証のモードの場合は、[**Use SQL Server Authentication**] を選択します。
+ [**User name**] と [**Password**] に、DB インスタンス用に作成したマスターユーザーの認証情報を入力します。

#### 一括コピー
<a name="ImportData.SQLServer.MgmtStudio.BulkCopy"></a>

SQL Server の一括コピー機能は、ソースデータベースから DB インスタンスにデータをコピーするための効率的な手段です。一括コピーは、指定したデータを ASCII ファイルなどのデータファイルに書き込みます。その後、一括コピーを再度実行して、そのファイルのコンテンツを転送先の DB インスタンスに書き込みます。

このセクションでは、SQL Server のすべてのエディションに含まれる **bcp** ユーティリティを使用します。一括インポートおよびエクスポートオペレーションの詳細については、[Microsoft SQL Server のドキュメント](http://msdn.microsoft.com/en-us/library/ms187042%28v=sql.105%29.aspx)を参照してください。

**注記**  
一括コピーを使用する前に、データベーススキーマを転送先の DB インスタンスにインポートする必要があります。これを行うには、このトピックですでに説明したスクリプトの生成とパブリッシュウィザードが最適なツールです。

以下のコマンドは、ローカルの SQL Server インスタンスに接続されます。そして指定されたテーブルのタブ区切りファイルを、既存の SQL Server デプロイメントの C:\$1 ルートディレクトリに生成します。テーブルは完全修飾名で指定し、テキストファイルはコピーされるテーブルと同じ名前になります。

```
bcp dbname.schema_name.table_name out C:\table_name.txt -n -S localhost -U username -P password -b 10000 
```

前述のコードには、以下のオプションがあります。
+ `-n` 一括コピーではコピーするデータのネイティブデータ型を使用するように指定します。
+ `-S` *bcp* ユーティリティが、接続する SQL Server インスタンスを指定します。
+ `-U` SQL Server インスタンスにログインするアカウントのユーザー名を指定します。
+ `-P` で指定したユーザーのパスワードを指定します。`-U`
+ `-b` 一括インポートするデータの行数を指定します。

**注記**  
インポートの状況にとって重要な他のパラメータがある場合があります。例えば、ID 値に関連する `-E` パラメータを必要とする場合があります。詳細については、[Microsoft SQL Server のドキュメント](http://msdn.microsoft.com/en-us/library/ms162802%28v=sql.105%29.aspx)の **bcp** ユーティリティのコマンドライン構文の詳細な説明を参照してください。

例えば、`store` という名前のデータベースには、デフォルトスキーマ `dbo` を使用し、`customers` という名前のテーブルが含まれているとします。ユーザーアカウント `admin` とパスワード `insecure` で、`customers` テーブルの 10,000 行を `customers.txt` という名前のファイルにコピーします。

```
bcp store.dbo.customers out C:\customers.txt -n -S localhost -U admin -P insecure -b 10000 
```

データファイルの作成後、類似のコマンドを使用して、自分の DB インスタンスにデータをアップロードすることができます。事前に、ターゲット DB インスタンスにデータベースとスキーマを作成します。次に、`in`引数で出力ファイルを指定する代わりに、`out`引数を使用して入力ファイルを指定します。localhost を使用してローカル SQL Server インスタンスを指定する代わりに、DB インスタンスのエンドポイントを指定します。1433 以外のポートを使用する場合は、それも指定します。ユーザー名とパスワードは、DB インスタンスのマスターユーザーとパスワードです。構文は次のとおりです。

```
bcp dbname.schema_name.table_name 
					in C:\table_name.txt -n -S endpoint,port -U master_user_name -P master_user_password -b 10000
```

前の例を続行するために、マスターユーザー名を `admin`、パスワードを `insecure` とします。DB インスタンスのエンドポイントは `rds.ckz2kqd4qsn1.us-east-1.rds.amazonaws.com` で、ポート 4080 を使用します。コマンドは次のとおりです。

```
bcp store.dbo.customers in C:\customers.txt -n -S rds.ckz2kqd4qsn1.us-east-1.rds.amazonaws.com,4080 -U admin -P insecure -b 10000 
```

**注記**  
セキュリティ上のベストプラクティスとして、ここに示されているプロンプト以外のパスワードを指定してください。

## RDS for SQL Server からのデータのエクスポート
<a name="SQLServer.Procedural.Exporting"></a>

次のいずれかのオプションを選択して、RDS for SQL Server DB インスタンスからデータをエクスポートします。
+ **完全バックアップファイル (.bak) を使用したネイティブデータベースのバックアップ** – .bak ファイルを使用したデータベースのバックアップはかなり最適化されているため、通常はデータを最もすばやくエクスポートできます。詳細については、「[ネイティブバックアップと復元を使用した SQL Server データベースのインポートとエクスポート](SQLServer.Procedural.Importing.md)」を参照してください。
+ **SQL Server のインポートとエクスポートウィザード** – 詳細については、「[SQL Server インポートおよびエクスポートウィザード](#SQLServer.Procedural.Exporting.SSIEW)」を参照してください。
+ **SQL Server のスクリプトの生成とパブリッシュウィザードおよび bcp ユーティリティ** – 詳細については、「[SQL Server のスクリプトの生成とパブリッシュウィザードおよび bcp ユーティリティ](#SQLServer.Procedural.Exporting.SSGPSW)」を参照してください。

### SQL Server インポートおよびエクスポートウィザード
<a name="SQLServer.Procedural.Exporting.SSIEW"></a>

SQL Server インポートおよびエクスポートウィザードを使用して、RDS for SQL Server DB インスタンスから別のデータストアに 1 つ以上のテーブル、ビュー、クエリをコピーできます。この選択は、ターゲットデータストアが SQL Server でない場合に最適です。詳細については、SQL Server のドキュメントの「[SQL Server インポートおよびエクスポートウィザード](http://msdn.microsoft.com/en-us/library/ms141209%28v=sql.110%29.aspx)」を参照してください。

SQL Server のインポートおよびエクスポートウィザードは、Microsoft SQL Server Management Studio の一部として使用できます。このグラフィカル SQL Server クライエントは、Express エディションを除くすべての Microsoft SQL Server エディションに含まれます。SQL Server Management Studio は、Windows ベースのアプリケーションとしてのみ使用できます。SQL Server Management Studio Express は、Microsoft から無料でダウンロードできます。このダウンロードを確認するには、「[Microsoft ウェブサイト](http://www.microsoft.com/en-us/search/Results.aspx?q=sql%20server%20management%20studio)」を参照してください。

**SQL Server インポートおよびエクスポートウィザードを使用してデータをエクスポートするには**

1. SQL Server Management Studio で、RDS for SQL Server DB インスタンスに接続します。この操作の詳細については、「[SQL Server DB インスタンスへの接続](USER_ConnectToMicrosoftSQLServerInstance.md)」を参照してください。

1. [**Object Explorer**] で、[**Databases**] を展開し、ソースデータベースのコンテクスト (右クリック) メニューを開き、[**Tasks**] を選択してから、[**Export Data**] を選択します。ウィザードが表示されます。

1. [**Choose a Data Source**] ページで、次の作業を行います。

   1. [**Data source**] で、[**SQL Server Native Client 11.0**] を選択します。

   1. [**Server name**] ボックスに、RDS for SQL Server DB インスタンスのエンドポイントが表示されていることを確認します。

   1. [**Use SQL Server Authentication**] を選択します。[**User name**] および [**Password**] で、マスターユーザーの名前と DB インスタンスのパスワードを入力します。

   1. [**Database**] ボックスに、データのエクスポート元のデータベースが表示されていることを確認します。

   1. [**次へ**] を選択します。

1. [**Choose a Destination**] ページで、次の作業を行います。

   1. [**Destination**] で、[**SQL Server Native Client 11.0**] を選択します。
**注記**  
他のターゲットデータソースも使用できます。例えば、.NET Framework データプロバイダー、OLE DB プロバイダー、SQL Server Native Client プロバイダー、ADO.NET プロバイダー、Microsoft Office Excel、Microsoft Office Access、フラットファイルソースを使用できます。これらのデータソースのいずれかをターゲットとして選択する場合、リマインダーの手順 4 は省略してください。次の接続状態の詳細は、SQL Server ドキュメントの [[変換先の選択](http://msdn.microsoft.com/en-us/library/ms178430%28v=sql.110%29.aspx)] を参照してください。

   1. [**Server name**] で、ターゲット SQL Server DB インスタンスのサーバー名を入力します。

   1. 適切な認証タイプを選択します。必要に応じてユーザー名とパスワードを入力します。

   1. [**Database**] でターゲットデータベース名を選択するか、[**New**] を選択して、エクスポートされたデータを格納する新しいデータベースを作成します。

      [**新規作成**] を選択した場合は、SQL Server ドキュメントの「[データベースの作成](http://msdn.microsoft.com/en-us/library/ms183323%28v=sql.110%29.aspx)」で、指定するデータベース情報の詳細を確認してください。

   1. [**次へ**] を選択します。

1. [**Table Copy or Query**] ページで、[**Copy data from one or more tables or views**] または [**Write a query to specify the data to transfer**] を選択します。[**次へ**] を選択します。

1. [**Write a query to specify the data to transfer**] を選択した場合は、[**Provide a Source Query**] ページが表示されます。SQL クエリを入力するか、貼り付けた後、[**Parse**] を選択してクエリを検証します。クエリを検証したら、[**Next**] を選択します。

1. [**Select Source Tables and Views**] ページで、次の作業を行います。

   1. エクスポートするテーブルやビューを選択するか、指定したクエリが選択されていることを確認します。

   1. [**Edit Mappings**] を選択し、データベースと列のマッピング情報を指定します。詳細については、SQL Server ドキュメントの「[列マッピング](http://msdn.microsoft.com/en-us/library/ms189660%28v=sql.110%29.aspx)」を参照してください。

   1. (オプション) エクスポートされるデータのプレビューを表示するには、テーブル、ビュー、またはクエリを選択し、[**Preview**] を選択します。

   1. [**次へ**] を選択します。

1. [**Run Package**] ページで、[**Run immediately**] が選択されていることを確認します。[**次へ**] を選択します。

1. [**Complete the Wizard**] ページで、データのエクスポートの詳細が想定したとおりになっていることを確認します。[**Finish**] を選択してください。

1. [**The execution was successful**] ページで、[**Close**] を選択します。

### SQL Server のスクリプトの生成とパブリッシュウィザードおよび bcp ユーティリティ
<a name="SQLServer.Procedural.Exporting.SSGPSW"></a>

SQL Server のスクリプトの生成とパブリッシュウィザードを使用すると、データベース全体のスクリプトまたは選択したオブジェクトのみのスクリプトを作成できます。ターゲット SQL Server DB インスタンスにこれらのスクリプトを実行して、スクリプト化されたオブジェクトを再作成できます。次に、bcp ユーティリティを使用して、選択したオブジェクトのデータをターゲット DB インスタンスに一括エクスポートすることができます。この選択肢は、データベース全体 (テーブル以外のオブジェクトを含む) または大量のデータを、2 つの SQL Server DB インスタンス間で移動する場合に最適です。bcp のコマンドライン構文の詳細については、Microsoft SQL Server ドキュメントの「[bcp ユーティリティ](http://msdn.microsoft.com/en-us/library/ms162802%28v=sql.110%29.aspx)」を参照してください。

SQL Server スクリプトの生成とパブリッシュウィザードは、Microsoft SQL Server Management Studio の一部として使用できます。このグラフィカル SQL Server クライエントは、Express エディションを除くすべての Microsoft SQL Server エディションに含まれます。SQL Server Management Studio は、Windows ベースのアプリケーションとしてのみ使用できます。SQL Server Management Studio Express は、Microsoft から[無料でダウンロード](http://www.microsoft.com/en-us/search/Results.aspx?q=sql%20server%20management%20studio)できます。

**SQL Server のスクリプトの生成とパブリッシュウィザードおよび bcp ユーティリティを使用してデータをエクスポートするには**

1. SQL Server Management Studio で、RDS for SQL Server DB インスタンスに接続します。この操作の詳細については、「[SQL Server DB インスタンスへの接続](USER_ConnectToMicrosoftSQLServerInstance.md)」を参照してください。

1. [**Object Explorer**] で、[**Databases**] ノードを展開し、スクリプト化するデータベースを選択します。

1. SQL Server ドキュメントの「[スクリプトの生成とパブリッシュウィザード](http://msdn.microsoft.com/en-us/library/bb895179%28v=sql.110%29.aspx)」の手順に従ってスクリプトファイルを作成します。

1. SQL Server Management Studio で、ターゲット SQL Server DB インスタンスに接続します。

1. **[Object Explorer]** (オブジェクトエクスプローラー) でターゲット SQL Server DB インスタンスが選択された状態で、**[File]** (ファイル) メニューの **[Open]** (開く) を選択します。続いて、**[File]** (ファイル) を選択し、スクリプトファイルを開きます。

1. データベース全体をスクリプトした場合、スクリプト内の CREATE DATABASE ステートメントを見直してください。データベースが希望の場所に希望のパラメータで作成されていることを確認します。詳細については、SQL Server のドキュメントの「[CREATE DATABASE](http://msdn.microsoft.com/en-us/library/ms176061%28v=sql.110%29.aspx)」を参照してください。

1. スクリプトでデータベースユーザーを作成している場合は、それらのユーザーのサーバーログインがターゲット DB インスタンスに存在するかどうかを確認します。作成されていない場合、それらのユーザーのログインを作成します。作成しないと、データベースユーザーを作成するためにスクリプト化したコマンドが失敗します。詳細については、SQL Server ドキュメントの「[ログインの作成](http://msdn.microsoft.com/en-us/library/aa337562%28v=sql.110%29.aspx)」を参照してください。

1. [SQL Editor] メニューの [**\$1Execute**] を選択してスクリプトファイルを実行し、データベースオブジェクトを作成します。スクリプトが終了したら、すべてのデータベースオブジェクトが想定したとおりに存在していることを確認します。

1. bcp ユーティリティを使用して、RDS for SQL Server DB インスタンスからファイルにデータをエクスポートします。コマンドプロンプトを開き、次のコマンドを入力します。

   ```
   bcp database_name.schema_name.table_name out data_file -n -S aws_rds_sql_endpoint -U username -P password
   ```

   前述のコードには、以下のオプションがあります。
   + *table\$1name* は、ターゲットデータベースに再作成し、データを挿入するテーブルの 1 つの名前です。
   + *data\$1file* は、作成されるデータファイルのフルパスと名前です。
   + `-n` 一括コピーではコピーするデータのネイティブデータ型を使用するように指定します。
   + `-S` は、エクスポート元の SQL Server DB インスタンスを指定します。
   + `-U` は、SQL Server DB インスタンスに接続するときに使用するユーザー名を指定します。
   + `-P` で指定したユーザーのパスワードを指定します。`-U`

    コマンドの例を以下に示します。

   ```
   bcp world.dbo.city out C:\Users\JohnDoe\city.dat -n -S sql-jdoe.1234abcd.us-west-2.rds.amazonaws.com,1433 -U JohnDoe -P ClearTextPassword
   ```

   エクスポートするすべてのテーブルのデータファイルが作成されるまで、この手順を繰り返します。

1. SQL Server ドキュメントの「[データの一括インポートの準備](http://msdn.microsoft.com/en-us/library/ms189989%28v=sql.110%29.aspx)」の手順に従って、ターゲット DB インスタンスでデータを一括インポートする準備を行います。

1. SQL Server ドキュメントの「[一括インポート操作と一括エクスポート操作について](http://msdn.microsoft.com/en-us/library/ms187042%28v=sql.105%29.aspx)」で説明されているパフォーマンスやその他の注意点を検討した後で、使用する一括インポートの方法を決定します。

1. bcp ユーティリティを使用して作成したデータファイルから、データを一括インポートします。そのためには、ステップ 11。での決定に応じて、SQL Server ドキュメントの「[bcp ユーティリティを使用した一括データのインポートとエクスポート](http://msdn.microsoft.com/en-us/library/aa337544%28v=sql.110%29.aspx)」または「[BULK INSERT または OPENROWSET(BULK...) を使用した一括データのインポート](http://msdn.microsoft.com/en-us/library/ms175915%28v=sql.110%29.aspx)」手順に従います。

# 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 オプションを使用するか、適切なコードページを指定します。 | 