

# Amazon RDS for Db2 フェデレーション
<a name="db2-federation"></a>

Amazon RDS for Db2 データベースをフェデレーテッドデータベースとして使用できます。RDS for Db2 のフェデレーションを設定すると、RDS for Db2 データベースから複数のデータベースのデータにアクセスしてクエリを実行できます。フェデレーションにより、RDS for Db2 データベースにデータを移行したり、データを 1 つのデータベースに統合したりする必要がなくなります。

RDS for Db2 データベースをフェデレーティッドデータベースとして使用することで、データを異なるデータベースに保持しながら、すべての RDS for Db2 機能に引き続きアクセスし、さまざまな AWS のサービス を活用できます。同じタイプの異なるデータベースを接続する同種フェデレーションと、異なるタイプの異なるデータベースを接続する異種フェデレーションの両方を設定できます。

まず、RDS for Db2 の Db2 データベースをリモートデータベースに接続します。その後、接続されているすべてのデータベースに対してクエリを実行できます。例えば、RDS for Db2 データベースのテーブルとリモート Db2 on z/OS データベースのテーブルを結合する SQL JOIN ステートメントを実行できます。

**Topics**
+ [同種フェデレーション](#db2-federation-homogeneous)
+ [異種フェデレーション](#db2-federation-heterogeneous)

## 同種フェデレーション
<a name="db2-federation-homogeneous"></a>

RDS for Db2 データベースと次の Db2 製品ファミリーの間で同種フェデレーションを設定できます。
+ Linux、UNIX、Windows (LUW) 用の Db2 
+ Db2 iSeries
+ Db2 for z/OS

RDS for Db2 同種フェデレーションは、次のアクションをサポートしていません。
+ RDS for Db2 ホストデータベースにノードディレクトリとリモートデータベースをセットアップするための `CATALOG` コマンドの実行
+ z/OS で Db2 にフェデレーションするときにワークロードバランシング (WLB) を設定する
+ IBM データサーバードライバー設定ファイルの設定 (`db2dsdriver.cfg`)

RDS for Db2 同種フェデレーションには、次の要件があります。
+ `UNFENCED` モードで DRDA ラッパーを作成する必要があります。そうしないと、フェデレーションは RDS for Db2 では機能しません。
+ RDS for Db2 ホストデータベースからリモートホストデータベースへの送受信トラフィックを許可する必要があります。詳細については、「[セキュリティグループを作成して VPC 内の DB インスタンスへのアクセスを提供する](CHAP_SettingUp.md#CHAP_SettingUp.SecurityGroup)」を参照してください。

**Topics**
+ [ステップ 1: DRDA ラッパーとフェデレーティッドサーバーを作成する](#db2-federation-homogeneous-create)
+ [ステップ 2: ユーザーマッピングを作成する](#db2-federation-homogeneous-map)
+ [ステップ 3: 接続を確認する](#db2-federation-homogeneous-check)

### ステップ 1: DRDA ラッパーとフェデレーティッドサーバーを作成する
<a name="db2-federation-homogeneous-create"></a>

同種フェデレーションの場合は、DRDA ラッパーとフェデレーテッドサーバーを作成します。リモートホストへの接続では、`HOST`、`PORT`、および `DBNAME` を使用します。

リモート Db2 データベースのタイプに基づいて、次のいずれかの方法を選択します。
+ **Db2 for Linux、UNIX、および Windows (LUX) データベース** – 次の SQL コマンドを実行します。次の例では、{{server\_name}} をフェデレーションに使用するサーバーの名前に置き換えます。{{db2\_version}} をリモート Db2 データベースのバージョンに置き換えます。{{username}} と {{password}} を接続先のリモート Db2 データベースの認証情報に置き換えます。{{db\_name}}、{{dns\_name}}、および {{port}} を、接続先のリモート Db2 データベースの適切な値に置き換えます。

  ```
  create wrapper drda options(DB2_FENCED 'N');
  create server {{server_name}} type DB2/LUW wrapper drda version '{{db2_version}}' authorization "{{master_username}}" password "{{master_password}}" options (add DBNAME '{{db_name}}',add HOST '{{dns_name}}',add PORT '{{port}}');
  ```

  **例**

  ```
  create wrapper drda options(DB2_FENCED 'N');
  create server SERVER1 type DB2/LUW wrapper drda version '11.5' authorization "sysuser" password "******" options (add DBNAME 'TESTDB2',add HOST 'ip-123-45-67-899.us-west-1.compute.internal',add PORT '25010');
  ```
+ **Db2 iSeries** – 次の SQL コマンドを実行します。次の例では、{{rapper\_name}} と {{library\_name}} を DRDA ラッパーの名前と [ラッパーライブラリファイル](https://www.ibm.com/docs/en/db2/11.5?topic=wrapper-db2-library-files)に置き換えます。{{server\_name}} をフェデレーションに使用するサーバーの名前に置き換えます。{{db2\_version}} をリモート Db2 データベースのバージョンに置き換えます。{{username}} と {{password}} を接続先のリモート Db2 データベースの認証情報に置き換えます。{{dns\_name}}、{{port}}、および {{db\_name}} を、接続先のリモート Db2 データベースの適切な値に置き換えます。

  ```
  create wrapper {{wrapper_name}} library '{{library name}}' options(DB2_FENCED 'N');
  create server {{server_name}} type db2/mvs version {{db2_version}} wrapper {{wrapper_name}} authorization "{{sername}}" password "{{password}}" options (HOST '{{dns_name}}', PORT '{{port}}', DBNAME '{{db_name}}');
  ```

  **例**

  ```
  create wrapper WRAPPER1 library 'libdb2drda.so' options(DB2_FENCED 'N');
  create server SERVER1 type db2/mvs version 11 wrapper WRAPPER1 authorization "sysuser" password "******" options (HOST 'test1.123.com', PORT '446', DBNAME 'STLEC1');
  ```
+ **Db2 for z/OS** – 次の SQL コマンドを実行します。次の例では、{{rapper\_name}} と {{library\_name}} を DRDA ラッパーの名前と [ラッパーライブラリファイル](https://www.ibm.com/docs/en/db2/11.5?topic=wrapper-db2-library-files)に置き換えます。{{server\_name}} をフェデレーションに使用するサーバーの名前に置き換えます。{{db2\_version}} をリモート Db2 データベースのバージョンに置き換えます。{{username}} と {{password}} を接続先のリモート Db2 データベースの認証情報に置き換えます。{{dns\_name}}、{{port}}、および {{db\_name}} を、接続先のリモート Db2 データベースの適切な値に置き換えます。

  ```
  create wrapper {{wrapper_name}} library '{{library_name}}' options(DB2_FENCED 'N');
  create server {{server_name}} type db2/mvs version {{db2_version}} wrapper {{wrapper_name}} authorization "{{username}}" password "{{password}}" options (HOST '{{dns_name}}', PORT '{{port}}', DBNAME '{{db_name}}');
  ```

  **例**

  ```
  create wrapper WRAPPER1 library 'libdb2drda.so' OPTIONS(DB2_FENCED 'N');
  create server SERVER1 type db2/mvs version 11 wrapper WRAPPER1 authorization "sysuser" password "******" options (HOST 'test1.123.com', PORT '446', DBNAME 'STLEC1');
  ```

### ステップ 2: ユーザーマッピングを作成する
<a name="db2-federation-homogeneous-map"></a>

次の SQL コマンドを実行することによってユーザーマッピングを作成し、フェデレーテッドサーバーをデータソースサーバーに関連付けます。次の例では、{{server\_name}} を、操作を実行するリモートサーバーの名前に置き換えます。これは、[ステップ 1](#db2-federation-homogeneous-create) で作成したサーバーです。{{username}} と {{password}} をこのリモートサーバーの認証情報に置き換えます。

```
create user mapping for user server {{server_name}} options (REMOTE_AUTHID '{{username}}', REMOTE_PASSWORD '{{password}}');
```

詳細については、IBM Db2 ドキュメントの「[ユーザーマッピング](https://www.ibm.com/docs/en/db2/11.5?topic=systems-user-mappings)」を参照してください。

### ステップ 3: 接続を確認する
<a name="db2-federation-homogeneous-check"></a>

接続を確認することによって、フェデレーションの設定が成功したことを確認します。セッションを開いて、SET PASSTHRU コマンドを使用してネイティブ SQL コマンドをリモートデータソースに送信してから、リモートデータサーバーにテーブルを作成します。

1. セッションを開いたり閉じたりして、SQL をデータソースに送信します。次の例では、{{server\_name}} をステップ 1 でフェデレーションのために作成したサーバーの名前に置き換えます。

   ```
   set passthru {{server_name}};
   ```

1. 新しいテーブルを作成します。次の例では、 {{column\_name}}、{{data\_type}}、{{value}} をテーブルの適切な項目に置き換えます。

   ```
   create table {{table_name}} ( {{column_name}} {{data_type}}({{value}}), {{column_name}} {{data_type}}({{value}});
   ```

    詳細については、IBM Db2 ドキュメントの「[CREATE TABLE statement](https://www.ibm.com/docs/en/db2-event-store/2.0.0?topic=statements-create-table)」を参照してください。

1. インデックスを作成し、行の値をテーブルに挿入して、接続をリセットします。接続をリセットすると、接続は切断されますが、バックエンドプロセスは保持されます。次の例では、{{index\_name}}、{{table\_name}}、{{column\_name}}、および {{columnx\_value}} を情報に置き換えます。

   ```
   create index {{index_name}} on {{table_name}}({{column_name}});
   insert into {{table_name}} values({{column1_value}},{{column2_value}},{{column3_value}});
   insert into {{table_name}} values({{column1_value}},{{column2_value}},{{column3_value}});
   set passthru reset;
   
   connect reset;
   ```

1. リモート Db2 データベースに接続し、リモートサーバーのニックネームを作成し、操作を実行します。リモート Db2 データベースのデータへのアクセスが完了したら、接続をリセットして終了します。次の例では、{{database\_name}} をリモート Db2 データベースの名前に置き換えます。{{nickname}} を名前に置き換えます。{{server\_name}} と {{table\_name}} を、操作を実行するサーバーのリモートサーバーとテーブルの名前に置き換えます。{{username}} をリモートサーバーの情報に置き換えます。{{sql\_command}} を、リモートサーバーで実行する操作に置き換えます。

   ```
   connect to {{database_name}};
   create nickname {{nickname}} for {{server_name}}."{{username}}"."{{table_name}}";
   select {{sql_command}} from {{nickname}};
   connect reset;
   terminate;
   ```

**例**

次の例では、フェデレーテッドサーバー `testdb10` での操作を許可するパススルーセッションを作成します。

次に、データ型が異なる 3 つの列を持つテーブル `t1` を作成します。

次に、この例では、テーブル `t1` の 3 つの列にインデックス `i1_t1` を作成します。その後、これら 3 つの列の値を持つ 2 つの行を挿入し、切断します。

最後に、この例はリモート Db2 データベース `testdb2` に接続し、フェデレーテッドサーバー `testdb10` にテーブル ` t1` のニックネームを作成します。これにより、そのデータソースのユーザー名 `TESTUSER` でニックネームが作成されます。SQL コマンドは、テーブル `t1` からすべてのデータを出力します。この例では、セッションを切断して終了します。

```
set passthru testdbl0;

create table t1 ( c1 decimal(13,0), c2 char(200), c3 int);

create index i1_t1 on t1(c3);
insert into t1 values(1,'Test',1);
insert into t1 values(2,'Test 2',2);
connect reset;

connect to testdb2;
create nickname remote_t1 for testdbl0."TESTUSER"."T1";
select * from remote_t1;
connect reset;
terminate;
```

## 異種フェデレーション
<a name="db2-federation-heterogeneous"></a>

RDS for Db2 データベースと Oracle や Microsoft SQL Server などの他のデータソースとの間で異種フェデレーションを設定できます。Db2 LUW がサポートするデータソースの完全なリストについては、IBM サポートサイトの「[Db2 LUW V11.5 にバンドルされたフェデレーションのデータソースサポートマトリックス](https://www.ibm.com/support/pages/data-source-support-matrix-federation-bundled-db2-luw-v115)」を参照してください。

RDS for Db2 異種フェデレーションは、以下の項目をサポートしていません。
+ 他のデータソースのネイティブラッパー
+ 他のデータソースの JDBC ラッパー
+ これらのデータソースは RDS for Db2 にクライアントソフトウェアをインストールする必要があるため、Sybase、Informix、および Teradata データソースへのフェデレーション

RDS for Db2 異種フェデレーションには、次の要件があります。
+ RDS for Db2 は ODBC ラッパーメソッドのみをサポートしています。
+ ラッパーの明示的な定義を作成する場合は、オプション `DB2_FENCED` を `'N'` に設定する必要があります。ODBC の有効なラッパーオプションのリストについては、IBM Db2 ドキュメントの「[ODBC オプション](https://www.ibm.com/docs/en/db2/11.5?topic=options-odbc)」を参照してください。
+ RDS for Db2 ホストデータベースからリモートホストデータベースへの送受信トラフィックを許可する必要があります。詳細については、「[セキュリティグループを作成して VPC 内の DB インスタンスへのアクセスを提供する](CHAP_SettingUp.md#CHAP_SettingUp.SecurityGroup)」を参照してください。

Oracle へのフェデレーションの詳細については、IBM サポートサイトの「[Db2 フェデレーションと ODBC ドライバーを使用して Oracle にクエリする方法](https://www.ibm.com/support/pages/node/6431133)」を参照してください。

フェデレーションをサポートするデータソースの詳細については、IBM サポートサイトの「[Db2 LUW V11.5 にバンドルされたフェデレーションのデータソースサポートマトリックス](https://www.ibm.com/support/pages/node/957245)」を参照してください。

**Topics**
+ [ステップ 1: ODBC ラッパーを作成する](#db2-federation-heteogenous-define-wrapper)
+ [ステップ 2: フェデレーテッドサーバーを作成する](#db2-federation-heterogeneous-create)
+ [ステップ 3: ユーザーマッピングを作成する](#db2-federation-heterogeneous-map)
+ [ステップ 4: 接続を確認する](#db2-federation-heterogeneous-check)

### ステップ 1: ODBC ラッパーを作成する
<a name="db2-federation-heteogenous-define-wrapper"></a>

次のコマンドを実行してラッパーを作成します。

```
db2 "create wrapper odbc options( module '/home/rdsdb/sqllib/federation/odbc/lib/libodbc.so')"
```

### ステップ 2: フェデレーテッドサーバーを作成する
<a name="db2-federation-heterogeneous-create"></a>

次のコマンドを実行して、ふぇでれ―テッドサーバーを作成します。次の例では、{{server\_name}} をフェデレーションに使用するサーバーの名前に置き換えます。{{wrapper\_type}} を適切なラッパーに置き換えます。{{db\_version}} をリモートデータベースのバージョンに置き換えます。{{dns\_name}}、{{port}}、および {{sservice\_name}} を、接続先のリモートデータベースの適切な値に置き換えます。

```
db2 "create server {{server_name}} type {{wrapper_type}} version {{db_version}} options (HOST '{{dns_name}}', PORT '{{port}}', SERVICE_NAME '{{service_name}}')“
```

ラッパータイプの詳細については、IBM サポートサイトの「[Db2 LUW V11.5 にバンドルされたフェデレーションのデータソースサポートマトリックス](https://www.ibm.com/support/pages/node/957245)」を参照してください。

**例**

次の例では、リモート Oracle データベース用のフェデレーテッドサーバーを作成します。

```
db2 "create server server1 type oracle_odbc version 12.1 options (HOST 'test1.amazon.com', PORT '1521', SERVICE_NAME 'pdborcl.amazon.com')“
```

### ステップ 3: ユーザーマッピングを作成する
<a name="db2-federation-heterogeneous-map"></a>

次の SQL コマンドを実行することによってユーザーマッピングを作成し、フェデレーテッドサーバーをデータソースサーバーに関連付けます。次の例では、{{server\_name}} を、操作を実行するリモートサーバーの名前に置き換えます。これは、[ステップ 2](#db2-federation-heterogeneous-create) で作成したサーバーです。{{username}} と {{password}} をこのリモートサーバーの認証情報に置き換えます。

```
create user mapping for user server {{server_name}} options (REMOTE_AUTHID '{{username}}', REMOTE_PASSWORD '{{password}}');
```

詳細については、IBM Db2 ドキュメントの「[ユーザーマッピング](https://www.ibm.com/docs/en/db2/11.5?topic=systems-user-mappings)」を参照してください。

### ステップ 4: 接続を確認する
<a name="db2-federation-heterogeneous-check"></a>

接続を確認することによって、フェデレーションの設定が成功したことを確認します。セッションを開いて、SET PASSTHRU コマンドを使用してネイティブ SQL コマンドをリモートデータソースに送信してから、リモートデータサーバーにテーブルを作成します。

1. セッションを開いたり閉じたりして、SQL をデータソースに送信します。次の例では、{{server\_name}} を[ステップ 2 ](#db2-federation-heterogeneous-create)でフェデレーション用に作成したサーバーの名前に置き換えます。

   ```
   set passthru {{server_name}};
   ```

1. 新しいテーブルを作成します。次の例では、 {{column\_name}}、{{data\_type}}、{{value}} をテーブルの適切な項目に置き換えます。

   ```
   create table {{table_name}} ( {{column_name}} {{data_type}}({{value}}), {{column_name}} {{data_type}}({{value}});
   ```

    詳細については、IBM Db2 ドキュメントの「[CREATE TABLE statement](https://www.ibm.com/docs/en/db2-event-store/2.0.0?topic=statements-create-table)」を参照してください。

1. インデックスを作成し、行の値をテーブルに挿入して、接続をリセットします。接続をリセットすると、接続は切断されますが、バックエンドプロセスは保持されます。次の例では、{{index\_name}}、{{table\_name}}、{{column\_name}}、および {{columnx\_value}} を情報に置き換えます。

   ```
   create index {{index_name}} on {{table_name}}({{column_name}});
   insert into {{table_name}} values({{column1_value}},{{column2_value}},{{column3_value}});
   insert into {{table_name}} values({{column1_value}},{{column2_value}},{{column3_value}});
   set passthru reset;
   
   connect reset;
   ```

1. リモート Db2 データベースに接続し、リモートサーバーのニックネームを作成し、操作を実行します。リモート Db2 データベースのデータへのアクセスが完了したら、接続をリセットして終了します。次の例では、{{database\_name}} をリモート Db2 データベースの名前に置き換えます。{{nickname}} を名前に置き換えます。{{server\_name}} と {{table\_name}} を、操作を実行するサーバーのリモートサーバーとテーブルの名前に置き換えます。{{username}} をリモートサーバーの情報に置き換えます。{{sql\_command}} を、リモートサーバーで実行する操作に置き換えます。

   ```
   connect to {{database_name}};
   create nickname {{nickname}} for {{server_name}}."{{username}}"."{{table_name}}";
   select {{sql_command}} from {{nickname}};
   connect reset;
   terminate;
   ```

**例**

次の例では、フェデレーテッドサーバー `testdb10` での操作を許可するパススルーセッションを作成します。

次に、データ型が異なる 3 つの列を持つテーブル `t1` を作成します。

次に、この例では、テーブル `t1` の 3 つの列にインデックス `i1_t1` を作成します。その後、これら 3 つの列の値を持つ 2 つの行を挿入し、切断します。

最後に、この例はリモート Db2 データベース `testdb2` に接続し、フェデレーテッドサーバー `testdb10` にテーブル ` t1` のニックネームを作成します。これにより、そのデータソースのユーザー名 `TESTUSER` でニックネームが作成されます。SQL コマンドは、テーブル `t1` からすべてのデータを出力します。この例では、セッションを切断して終了します。

```
set passthru testdbl0;

create table t1 ( c1 decimal(13,0), c2 char(200), c3 int);

create index i1_t1 on t1(c3);
insert into t1 values(1,'Test',1);
insert into t1 values(2,'Test 2',2);
connect reset;

connect to testdb2;
create nickname remote_t1 for testdbl0."TESTUSER"."T1";
select * from remote_t1;
connect reset;
terminate;
```