

# Federación de Amazon RDS para Db2
<a name="db2-federation"></a>

Puede usar su base de datos de Amazon RDS para Db2 como base de datos federada. Tras configurar la federación de RDS para Db2, podrá acceder a los datos de varias bases de datos de su base de datos de RDS para Db2 y consultarlos. La federación evita tener que migrar datos a su base de datos de RDS para Db2 o consolidar los datos en una única base de datos. 

Al utilizar la base de datos de RDS para Db2 como base de datos federada, puede seguir accediendo a todas las características de RDS para Db2 y aprovechar varios Servicios de AWS, al mismo tiempo que mantiene los datos en distintas bases de datos. Puede configurar tanto una federación homogénea, que conecta diferentes bases de datos del mismo tipo, como una federación heterogénea, que conecta diferentes bases de datos de diferentes tipos.

Primero debe conectar la base de datos de Db2 de RDS para Db2 a bases de datos remotas. A continuación, puede ejecutar consultas en todas las bases de datos conectadas. Por ejemplo, puede ejecutar una instrucción JOIN de SQL que combine las tablas de la base de datos de RDS para Db2 con las tablas de una base de datos remota de Db2 en z/OS. 

**Topics**
+ [Federación homogénea](#db2-federation-homogeneous)
+ [Federación heterogénea](#db2-federation-heterogeneous)

## Federación homogénea
<a name="db2-federation-homogeneous"></a>

Puede configurar una federación homogénea entre su base de datos de RDS para Db2 y la siguiente familia de productos de Db2:
+ Db2 para Linux, UNIX y Windows (LUW)
+ Db2 iSeries
+ Db2 para z/OS

La federación homogénea de RDS para Db2 no admite las siguientes acciones:
+ Ejecución de comandos `CATALOG` para configurar un directorio de nodos y una base de datos remota en una base de datos de host de RDS para Db2
+ Configuración del equilibrio de carga de trabajo (WLB) al federarse a Db2 en z/OS
+ Configuración del archivo de configuración del controlador del servidor de datos de IBM (`db2dsdriver.cfg`)

La federación homogénea de RDS para Db2 tiene los siguientes requisitos:
+ Debe crear el contenedor DRDA en el modo `UNFENCED`. Si no lo hace, la federación no funcionará en RDS para Db2.
+ Debe permitir que el tráfico entrante y saliente de su base de datos de host de RDS para Db2 llegue a sus bases de datos de host remotas. Para obtener más información, consulte [Proporcionar acceso a la instancia de base de datos en la VPC mediante la creación de un grupo de seguridad](CHAP_SettingUp.md#CHAP_SettingUp.SecurityGroup).

**Topics**
+ [Paso 1: creación de un contenedor de DRDA y un servidor federado](#db2-federation-homogeneous-create)
+ [Paso 2: creación de un mapeo de usuario](#db2-federation-homogeneous-map)
+ [Paso 3: comprobación de la conexión](#db2-federation-homogeneous-check)

### Paso 1: creación de un contenedor de DRDA y un servidor federado
<a name="db2-federation-homogeneous-create"></a>

Para una federación homogénea, cree un contenedor DRDA y un servidor federado. La conexión al host remoto utiliza `HOST`, `PORT` y `DBNAME`. 

Elija uno de los siguientes métodos según el tipo de base de datos de Db2 remota:
+ **Base de datos Db2 para Linux, UNIX y Windows (LUX)**: ejecute los siguientes comandos de SQL. En el siguiente ejemplo, sustituya *server\$1name* por el nombre del servidor que utilizará para la federación. Sustituya *db2\$1version* por la versión de la base de datos de Db2 remota. Sustituya *username* y *password* por las credenciales de la base de datos remota de Db2 a la que desee conectarse. Sustituya *db\$1name*, *dns\$1name* y *port* por los valores correspondientes para la base de datos de Db2 remota a la que desee conectarse.

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

  **Ejemplo**

  ```
  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**: ejecute los siguientes comandos de SQL. En el siguiente ejemplo, sustituya *wrapper\$1name* y *library\$1name* por un nombre para el contenedor DRDA y el [archivo de biblioteca del contenedor](https://www.ibm.com/docs/en/db2/11.5?topic=wrapper-db2-library-files). Sustituya *server\$1name* por el nombre del servidor que usará para la federación. Sustituya *db2\$1version* por la versión de la base de datos de Db2 remota. Sustituya *username* y *password* por las credenciales de la base de datos remota de Db2 a la que desee conectarse. Sustituya *dns\$1name*, *port* y *db\$1name* por los valores correspondientes para la base de datos de Db2 remota a la que desee conectarse.

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

  **Ejemplo**

  ```
  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 para z/OS**: ejecute los siguientes comandos de SQL. En el siguiente ejemplo, sustituya *wrapper\$1name* y *library\$1name* por un nombre para el contenedor DRDA y el [archivo de biblioteca del contenedor](https://www.ibm.com/docs/en/db2/11.5?topic=wrapper-db2-library-files). Sustituya *server\$1name* por el nombre del servidor que usará para la federación. Sustituya *db2\$1version* por la versión de la base de datos de Db2 remota. Sustituya *username* y *password* por las credenciales de la base de datos remota de Db2 a la que desee conectarse. Sustituya *dns\$1name*, *port* y *db\$1name* por los valores correspondientes para la base de datos de Db2 remota a la que desee conectarse.

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

  **Ejemplo**

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

### Paso 2: creación de un mapeo de usuario
<a name="db2-federation-homogeneous-map"></a>

Cree un mapeo de usuario para asociar su servidor federado a su servidor de origen de datos ejecutando el siguiente comando de SQL. En el siguiente ejemplo, sustituya *server\$1name* por el nombre del servidor remoto en el que desee realizar las operaciones. Este es el servidor que creó en el [paso 1](#db2-federation-homogeneous-create). Sustituya *username* y *password* por sus credenciales para este servidor remoto.

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

Para obtener más información, consulte [User mappings](https://www.ibm.com/docs/en/db2/11.5?topic=systems-user-mappings) en la documentación de IBM Db2.

### Paso 3: comprobación de la conexión
<a name="db2-federation-homogeneous-check"></a>

Compruebe la conexión para confirmar que la configuración de la federación se ha realizado correctamente. Abra una sesión para enviar comandos de SQL nativos a su origen de datos remoto mediante el comando SET PASSTHRU y, a continuación, cree una tabla en el servidor de datos remoto.

1. Abra y cierre una sesión para enviar SQL a un origen de datos. En el siguiente ejemplo, sustituya *server\$1name* por el nombre del servidor que creó para la federación en el paso 1.

   ```
   set passthru server_name;
   ```

1. Cree una nueva tabla. En el siguiente ejemplo, sustituya *column\$1name*, *data\$1type* y *value* por los elementos correspondientes de la tabla.

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

    Para obtener más información, consulte [CREATE TABLE statement](https://www.ibm.com/docs/en/db2-event-store/2.0.0?topic=statements-create-table) en la documentación de IBM Db2.

1. Cree un índice, inserte los valores de las filas en la tabla y restablezca la conexión. Al restablecer la conexión, se pierde la conexión, pero se conservan los procesos de backend. En el siguiente ejemplo, sustituya *index\$1name*, *table\$1name*, *column\$1name* y *columnx\$1value* por su información. 

   ```
   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. Conéctese a su base de datos de Db2 remota, cree un apodo para su servidor remoto y realice operaciones. Cuando haya terminado de acceder a los datos de la base de datos remota de Db2, restablezca y, a continuación, finalice la conexión. En el ejemplo siguiente, sustituya *database\$1name* por el nombre de su base de datos de Db2 remota. Sustituya *nickname* por un nombre. Sustituya *server\$1name* y *table\$1name* por el nombre del servidor remoto y la tabla de ese servidor en los que quiera realizar operaciones. Sustituya *username* por la información de su servidor remoto. Sustituya *sql\$1command* por la operación que se va a realizar en el servidor remoto.

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

**Ejemplo**

El siguiente ejemplo crea una sesión de transferencia para permitir las operaciones en el servidor federado de `testdb10`. 

Después, crea la tabla `t1` con tres columnas con distintos tipos de datos. 

A continuación, el ejemplo crea el índice `i1_t1` en tres columnas de la tabla `t1`. Después, inserta dos filas con los valores de estas tres columnas y, a continuación, se desconecta.

Por último, el ejemplo se conecta a la base de datos remota de Db2 `testdb2` y se crea un apodo para la tabla ` t1` en el servidor federado `testdb10`. Crea el apodo con el nombre de usuario `TESTUSER` de ese origen de datos. Un comando de SQL genera todos los datos de la tabla `t1`. El ejemplo desconecta y finaliza la sesión.

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

## Federación heterogénea
<a name="db2-federation-heterogeneous"></a>

Puede configurar una federación heterogénea entre la base de datos de RDS para Db2 y otros orígenes de datos, como Oracle y Microsoft SQL Server. Para obtener una lista completa de los orígenes de datos compatibles con Db2 LUW, consulte [Data Source Support Matrix of Federation Bundled in Db2 LUW V11.5](https://www.ibm.com/support/pages/data-source-support-matrix-federation-bundled-db2-luw-v115) el sitio de soporte de IBM.

La federación heterogénea de RDS para Db2 no admite los siguientes elementos:
+ Contenedores nativos para los demás orígenes de datos
+ Contenedores JDBC para los demás orígenes de datos
+ Federación a orígenes de datos de Sybase, Informix y Teradata, porque estos orígenes de datos requieren la instalación del software cliente en RDS para Db2

La federación heterogénea de RDS para Db2 tiene los siguientes requisitos:
+ RDS para Db2 solo admite el método de contenedor de ODBC.
+ Si crea una definición explícita de un contenedor, debe establecer la opción `DB2_FENCED` en `'N'`. Para obtener una lista de las opciones de contenedor válidas para ODBC, consulte [ODBC options](https://www.ibm.com/docs/en/db2/11.5?topic=options-odbc) en la documentación de IBM Db2.
+ Debe permitir que el tráfico entrante y saliente de su base de datos de host de RDS para Db2 llegue a su base de datos de host remota. Para obtener más información, consulte [Proporcionar acceso a la instancia de base de datos en la VPC mediante la creación de un grupo de seguridad](CHAP_SettingUp.md#CHAP_SettingUp.SecurityGroup).

Para obtener información sobre la federación a Oracle, consulte [How to query Oracle by using Db2 Federation and the ODBC driver?](https://www.ibm.com/support/pages/node/6431133) en el sitio de soporte de IBM.

Para obtener información sobre los orígenes de datos compatibles con la federación, consulte [Data Source Support Matrix of Federation Bundled in Db2 LUW V11.5](https://www.ibm.com/support/pages/node/957245) el sitio de soporte de IBM.

**Topics**
+ [Paso 1: creación de un contenedor de ODBC](#db2-federation-heteogenous-define-wrapper)
+ [Paso 2: creación de un servidor federado](#db2-federation-heterogeneous-create)
+ [Paso 3: creación de un mapeo de usuario](#db2-federation-heterogeneous-map)
+ [Paso 4: comprobación de la conexión](#db2-federation-heterogeneous-check)

### Paso 1: creación de un contenedor de ODBC
<a name="db2-federation-heteogenous-define-wrapper"></a>

Cree un contenedor ejecutando el siguiente comando:

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

### Paso 2: creación de un servidor federado
<a name="db2-federation-heterogeneous-create"></a>

Cree un servidor federado ejecutando el siguiente comando. En el siguiente ejemplo, sustituya *server\$1name* por el nombre del servidor que utilizará para la federación. Sustituya *wrapper\$1type* por el contenedor apropiado. Sustituya *db\$1version* por la versión de la base de datos remota. Sustituya *dns\$1name*, *port* y *db\$1name* por los valores correspondientes para la base de datos remota a la que desee conectarse. 

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

Para obtener información sobre los tipos de contenedores, consulte [Data Source Support Matrix of Federation Bundled in Db2 LUW V11.5](https://www.ibm.com/support/pages/node/957245) el sitio de soporte de IBM.

**Ejemplo**

El siguiente ejemplo crea un servidor federado para una base de datos de Oracle remota.

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

### Paso 3: creación de un mapeo de usuario
<a name="db2-federation-heterogeneous-map"></a>

Cree un mapeo de usuario para asociar su servidor federado a su servidor de origen de datos ejecutando el siguiente comando de SQL. En el siguiente ejemplo, sustituya *server\$1name* por el nombre del servidor remoto en el que desee realizar las operaciones. Este es el servidor que creó en el [paso 2](#db2-federation-heterogeneous-create). Sustituya *username* y *password* por sus credenciales para este servidor remoto.

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

Para obtener más información, consulte [User mappings](https://www.ibm.com/docs/en/db2/11.5?topic=systems-user-mappings) en la documentación de IBM Db2.

### Paso 4: comprobación de la conexión
<a name="db2-federation-heterogeneous-check"></a>

Compruebe la conexión para confirmar que la configuración de la federación se ha realizado correctamente. Abra una sesión para enviar comandos de SQL nativos a su origen de datos remoto mediante el comando SET PASSTHRU y, a continuación, cree una tabla en el servidor de datos remoto.

1. Abra y cierre una sesión para enviar SQL a un origen de datos. En el siguiente ejemplo, sustituya *server\$1name* por el nombre del servidor que creó para la federación en el [paso 2](#db2-federation-heterogeneous-create).

   ```
   set passthru server_name;
   ```

1. Cree una nueva tabla. En el siguiente ejemplo, sustituya *column\$1name*, *data\$1type* y *value* por los elementos correspondientes de la tabla.

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

    Para obtener más información, consulte [CREATE TABLE statement](https://www.ibm.com/docs/en/db2-event-store/2.0.0?topic=statements-create-table) en la documentación de IBM Db2.

1. Cree un índice, inserte los valores de las filas en la tabla y restablezca la conexión. Al restablecer la conexión, se pierde la conexión, pero se conservan los procesos de backend. En el siguiente ejemplo, sustituya *index\$1name*, *table\$1name*, *column\$1name* y *columnx\$1value* por su información. 

   ```
   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. Conéctese a su base de datos de Db2 remota, cree un apodo para su servidor remoto y realice operaciones. Cuando haya terminado de acceder a los datos de la base de datos remota de Db2, restablezca y, a continuación, finalice la conexión. En el ejemplo siguiente, sustituya *database\$1name* por el nombre de su base de datos de Db2 remota. Sustituya *nickname* por un nombre. Sustituya *server\$1name* y *table\$1name* por el nombre del servidor remoto y la tabla de ese servidor en los que quiera realizar operaciones. Sustituya *username* por la información de su servidor remoto. Sustituya *sql\$1command* por la operación que se va a realizar en el servidor remoto.

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

**Ejemplo**

El siguiente ejemplo crea una sesión de transferencia para permitir las operaciones en el servidor federado de `testdb10`. 

Después, crea la tabla `t1` con tres columnas con distintos tipos de datos. 

A continuación, el ejemplo crea el índice `i1_t1` en tres columnas de la tabla `t1`. Después, inserta dos filas con los valores de estas tres columnas y, a continuación, se desconecta.

Por último, el ejemplo se conecta a la base de datos remota de Db2 `testdb2` y se crea un apodo para la tabla ` t1` en el servidor federado `testdb10`. Crea el apodo con el nombre de usuario `TESTUSER` de ese origen de datos. Un comando de SQL genera todos los datos de la tabla `t1`. El ejemplo desconecta y finaliza la sesión.

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