

# 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\$1name* をフェデレーションに使用するサーバーの名前に置き換えます。*db2\$1version* をリモート Db2 データベースのバージョンに置き換えます。*username* と *password* を接続先のリモート Db2 データベースの認証情報に置き換えます。*db\$1name*、*dns\$1name*、および *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\$1name* と *library\$1name* を DRDA ラッパーの名前と [ラッパーライブラリファイル](https://www.ibm.com/docs/en/db2/11.5?topic=wrapper-db2-library-files)に置き換えます。*server\$1name* をフェデレーションに使用するサーバーの名前に置き換えます。*db2\$1version* をリモート Db2 データベースのバージョンに置き換えます。*username* と *password* を接続先のリモート Db2 データベースの認証情報に置き換えます。*dns\$1name*、*port*、および *db\$1name* を、接続先のリモート 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\$1name* と *library\$1name* を DRDA ラッパーの名前と [ラッパーライブラリファイル](https://www.ibm.com/docs/en/db2/11.5?topic=wrapper-db2-library-files)に置き換えます。*server\$1name* をフェデレーションに使用するサーバーの名前に置き換えます。*db2\$1version* をリモート Db2 データベースのバージョンに置き換えます。*username* と *password* を接続先のリモート Db2 データベースの認証情報に置き換えます。*dns\$1name*、*port*、および *db\$1name* を、接続先のリモート 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\$1name* を、操作を実行するリモートサーバーの名前に置き換えます。これは、[ステップ 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\$1name* をステップ 1 でフェデレーションのために作成したサーバーの名前に置き換えます。

   ```
   set passthru server_name;
   ```

1. 新しいテーブルを作成します。次の例では、 *column\$1name*、*data\$1type*、*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\$1name*、*table\$1name*、*column\$1name*、および *columnx\$1value* を情報に置き換えます。

   ```
   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\$1name* をリモート Db2 データベースの名前に置き換えます。*nickname* を名前に置き換えます。*server\$1name* と *table\$1name* を、操作を実行するサーバーのリモートサーバーとテーブルの名前に置き換えます。*username* をリモートサーバーの情報に置き換えます。*sql\$1command* を、リモートサーバーで実行する操作に置き換えます。

   ```
   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\$1name* をフェデレーションに使用するサーバーの名前に置き換えます。*wrapper\$1type* を適切なラッパーに置き換えます。*db\$1version* をリモートデータベースのバージョンに置き換えます。*dns\$1name*、*port*、および *sservice\$1name* を、接続先のリモートデータベースの適切な値に置き換えます。

```
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\$1name* を、操作を実行するリモートサーバーの名前に置き換えます。これは、[ステップ 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\$1name* を[ステップ 2 ](#db2-federation-heterogeneous-create)でフェデレーション用に作成したサーバーの名前に置き換えます。

   ```
   set passthru server_name;
   ```

1. 新しいテーブルを作成します。次の例では、 *column\$1name*、*data\$1type*、*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\$1name*、*table\$1name*、*column\$1name*、および *columnx\$1value* を情報に置き換えます。

   ```
   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\$1name* をリモート Db2 データベースの名前に置き換えます。*nickname* を名前に置き換えます。*server\$1name* と *table\$1name* を、操作を実行するサーバーのリモートサーバーとテーブルの名前に置き換えます。*username* をリモートサーバーの情報に置き換えます。*sql\$1command* を、リモートサーバーで実行する操作に置き換えます。

   ```
   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;
```