

# Federação do Amazon RDS para Db2
<a name="db2-federation"></a>

É possível usar o banco de dados do Amazon RDS para Db2 como um banco de dados federado. Depois de configurar a federação para o RDS para Db2, você poderá acessar e consultar dados em vários bancos de dados do seu banco de dados do RDS para Db2. A federação evita que você precise migrar dados para o banco de dados do RDS para Db2 ou consolidar dados em um único banco de dados. 

Ao usar o banco de dados do RDS para Db2 como um banco de dados federado, é possível continuar acessando todos os recursos do RDS para Db2 e aproveitar vários Serviços da AWS, além de manter os dados em bancos de dados diferentes. É possível configurar a federação homogênea, que conecta diferentes bancos de dados do mesmo tipo, ou a federação heterogênea, que conecta bancos de dados diferentes de tipos diferentes.

Primeiro, é necessário conectar o banco de dados do Db2 no RDS para Db2 aos bancos de dados remotos. Depois, é possível executar consultas em todos os bancos de dados conectados. Por exemplo, é possível executar uma declaração SQL JOIN que una tabelas no banco de dados do RDS para Db2 com tabelas em um banco de dados do Db2 remoto no z/OS. 

**Topics**
+ [Federação homogênea](#db2-federation-homogeneous)
+ [Federação heterogênea](#db2-federation-heterogeneous)

## Federação homogênea
<a name="db2-federation-homogeneous"></a>

É possível configurar uma federação homogênea entre o banco de dados do RDS para Db2 e a seguinte família de produtos Db2:
+ Db2 para Linux, UNIX, Windows (LUW)
+ Db2 iSeries
+ Db2 para z/OS

A federação homogênea do RDS para Db2 não é compatível com as seguintes ações:
+ Executar comandos `CATALOG` para configurar um diretório de nós e um banco de dados remoto em um banco de dados host do RDS para Db2.
+ Configurar o balanceamento de workload (WLB) ao federar para o Db2 no z/OS.
+ Configurar o arquivo de configuração do driver do servidor de dados IBM (`db2dsdriver.cfg`).

A federação homogênea do RDS para Db2 tem os seguintes requisitos:
+ É necessário criar o wrapper DRDA no modo `UNFENCED`. Caso contrário, a federação não funcionará no RDS para Db2.
+ É necessário permitir o tráfego de entrada e de saída do banco de dados host do RDS para Db2 para os bancos de dados host remotos. Para obter mais informações, consulte [Fornecer acesso à instância de banco de dados na VPC criando um grupo de segurança](CHAP_SettingUp.md#CHAP_SettingUp.SecurityGroup).

**Topics**
+ [Etapa 1: Criar um wrapper DRDA e um servidor federado](#db2-federation-homogeneous-create)
+ [Etapa 2: Criar um mapeamento do usuário](#db2-federation-homogeneous-map)
+ [Etapa 3: Conferir a conexão](#db2-federation-homogeneous-check)

### Etapa 1: Criar um wrapper DRDA e um servidor federado
<a name="db2-federation-homogeneous-create"></a>

Em relação a uma federação homogênea, crie um wrapper DRDA e um servidor federado. A conexão com o host remoto usa `HOST`, `PORT` e `DBNAME`. 

Escolha um dos métodos a seguir com base no tipo do banco de dados do Db2 remoto:
+ **Banco de dados do Db2 para Linux, UNIX e Windows (LUX)**: execute os comandos SQL a seguir. No exemplo a seguir, substitua *server\$1name* pelo nome do servidor que você usará para federação. Substitua *db2\$1version* pela versão do banco de dados do Db2 remoto. Substitua *username* e *password* por suas credenciais para o banco de dados do Db2 remoto ao qual você deseja se conectar. Substitua *db\$1name*, *dns\$1name* e *port* pelos valores apropriados para o banco de dados do Db2 remoto ao qual você deseja se conectar.

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

  **Exemplo**

  ```
  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**: execute os comandos SQL a seguir. No exemplo a seguir, substitua *wrapper\$1name* e *library\$1name* por um nome para o wrapper DRDA e o [arquivo de biblioteca de wrapper](https://www.ibm.com/docs/en/db2/11.5?topic=wrapper-db2-library-files). Substitua *server\$1name* pelo nome do servidor que você usará para federação. Substitua *db2\$1version* pela versão do banco de dados do Db2 remoto. Substitua *username* e *password* por suas credenciais para o banco de dados do Db2 remoto ao qual você deseja se conectar. Substitua *dns\$1name*, *port* e *db\$1name* pelos valores apropriados para o banco de dados do Db2 remoto ao qual você deseja se conectar.

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

  **Exemplo**

  ```
  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**: execute os comandos SQL a seguir. No exemplo a seguir, substitua *wrapper\$1name* e *library\$1name* por um nome para o wrapper DRDA e o [arquivo de biblioteca de wrapper](https://www.ibm.com/docs/en/db2/11.5?topic=wrapper-db2-library-files). Substitua *server\$1name* pelo nome do servidor que você usará para federação. Substitua *db2\$1version* pela versão do banco de dados do Db2 remoto. Substitua *username* e *password* por suas credenciais para o banco de dados do Db2 remoto ao qual você deseja se conectar. Substitua *dns\$1name*, *port* e *db\$1name* pelos valores apropriados para o banco de dados do Db2 remoto ao qual você deseja se conectar.

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

  **Exemplo**

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

### Etapa 2: Criar um mapeamento do usuário
<a name="db2-federation-homogeneous-map"></a>

Crie um mapeamento de usuário para associar o servidor federado ao servidor de fonte de dados executando o comando SQL a seguir. No exemplo a seguir, substitua *server\$1name* pelo nome do servidor remoto no qual você deseja realizar as operações. Esse é o servidor que você criou na [etapa 1](#db2-federation-homogeneous-create). Substitua *username* e *password* pelas suas credenciais para esse servidor remoto.

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

Para ter mais informações, consulte [User mappings](https://www.ibm.com/docs/en/db2/11.5?topic=systems-user-mappings) na documentação do IBM Db2.

### Etapa 3: Conferir a conexão
<a name="db2-federation-homogeneous-check"></a>

Confirme se a configuração da federação foi bem-sucedida conferindo a conexão. Abra uma sessão para enviar comandos SQL nativos à sua fonte de dados remota usando o comando SET PASSTHRU e, depois, crie uma tabela no servidor de dados remoto.

1. Abra e feche uma sessão para enviar SQL a uma fonte de dados. No exemplo a seguir, substitua *server\$1name* pelo nome do servidor que você criou para federação na etapa 1.

   ```
   set passthru server_name;
   ```

1. Crie uma tabela. No exemplo a seguir, substitua *column\$1name*, *data\$1type* e *value* pelos itens apropriados para sua tabela.

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

    Para ter mais informações, consulte [CREATE TABLE statement](https://www.ibm.com/docs/en/db2-event-store/2.0.0?topic=statements-create-table) na documentação do IBM Db2.

1. Crie um índice, insira valores para linhas na tabela e redefina a conexão. A redefinição da conexão interrompe a conexão, mas retém os processos de back-end. No exemplo a seguir, substitua *index\$1name*, *table\$1name*, *column\$1value* e *columnx\$1value* por suas informações. 

   ```
   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. Conecte-se ao seu banco de dados do Db2 remoto, crie um apelido para seu servidor remoto e execute operações. Quando terminar de acessar os dados no banco de dados do Db2 remoto, redefina e encerre a conexão. No exemplo a seguir, substitua *database\$1name* pelo nome do banco de dados do Db2 remoto. Substitua *nickname* por um nome. Substitua *server\$1name* e *table\$1name* pelo nome do servidor remoto e da tabela no servidor em que você deseja realizar operações. Substitua *username* pelas informações do seu servidor remoto. Substitua *sql\$1command* pela operação a ser executada no servidor remoto.

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

**Exemplo**

O exemplo a seguir cria uma sessão de passagem para permitir operações no servidor federado `testdb10`. 

Depois, ele cria a tabela `t1` com três colunas com diferentes tipos de dados. 

Depois, o exemplo cria o índice `i1_t1` em três colunas na tabela `t1`. Depois, ele insere duas linhas com valores para essas três colunas e então se desconecta.

Por último, o exemplo se conecta ao banco de dados do Db2 remoto `testdb2` e cria um apelido para a tabela ` t1` no servidor federado `testdb10`. Ele cria o apelido com o nome de usuário `TESTUSER` dessa fonte de dados. Um comando SQL gera todos os dados da tabela `t1`. O exemplo desconecta e encerra a sessão.

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

## Federação heterogênea
<a name="db2-federation-heterogeneous"></a>

É possível configurar uma federação heterogênea entre o banco de dados do RDS para Db2 e outras fontes de dados, como Oracle e Microsoft SQL Server. Para ter uma lista completa das fontes de dados que o Db2 LUW comporta, 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) no site de suporte da IBM.

A federação heterogênea do RDS para Db2 não é compatível com os seguintes itens:
+ Wrappers nativos para as outras fontes de dados.
+ Wrappers JDBC para as outras fontes de dados.
+ Federação para fontes de dados Sybase, Informix e Teradata porque essas fontes de dados exigem instalação de software-cliente no RDS para Db2

A federação heterogênea do RDS para Db2 tem os seguintes requisitos:
+ O RDS para Db2 é compatível com o método de wrapper ODBC.
+ Se você criar uma definição explícita de um wrapper, deverá definir a opção `DB2_FENCED` como `'N'`. Para ter uma lista de opções de wrapper válidas para ODBC, consulte [ODBC options](https://www.ibm.com/docs/en/db2/11.5?topic=options-odbc) na documentação do IBM Db2.
+ É necessário permitir o tráfego de entrada e de saída do banco de dados host do RDS para Db2 para o banco de dados host remoto. Para obter mais informações, consulte [Fornecer acesso à instância de banco de dados na VPC criando um grupo de segurança](CHAP_SettingUp.md#CHAP_SettingUp.SecurityGroup).

Para ter informações sobre federação para Oracle, consulte [How to query Oracle by using Db2 Federation and the ODBC driver?](https://www.ibm.com/support/pages/node/6431133) no site de suporte da IBM.

Para ter mais informações sobre fontes de dados que comportam a federação, consulte [Data Source Support Matrix of Federation Bundled in Db2 LUW V11.5](https://www.ibm.com/support/pages/node/957245) no site de suporte da IBM.

**Topics**
+ [Etapa 1: Criar um wrapper ODBC](#db2-federation-heteogenous-define-wrapper)
+ [Etapa 2: Criar um servidor federado](#db2-federation-heterogeneous-create)
+ [Etapa 3: Criar um mapeamento do usuário](#db2-federation-heterogeneous-map)
+ [Etapa 4: Conferir a conexão](#db2-federation-heterogeneous-check)

### Etapa 1: Criar um wrapper ODBC
<a name="db2-federation-heteogenous-define-wrapper"></a>

Crie um wrapper executando o seguinte comando:

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

### Etapa 2: Criar um servidor federado
<a name="db2-federation-heterogeneous-create"></a>

Crie um servidor federado executando o comando a seguir. No exemplo a seguir, substitua *server\$1name* pelo nome do servidor que você usará para federação. Substitua *wrapper\$1type* pelo wrapper apropriado. Substitua *db\$1version* pela versão do banco de dados remoto. Substitua *dns\$1name*, *port* e *service\$1name* pelos valores apropriados para o banco de dados remoto ao qual você deseja se conectar. 

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

Para ter informações sobre tipos de wrapper, consulte [Data Source Support Matrix of Federation Bundled in Db2 LUW V11.5](https://www.ibm.com/support/pages/node/957245) no site de suporte da IBM.

**Exemplo**

O exemplo a seguir cria um servidor federado para um banco de dados Oracle remoto.

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

### Etapa 3: Criar um mapeamento do usuário
<a name="db2-federation-heterogeneous-map"></a>

Crie um mapeamento de usuário para associar o servidor federado ao servidor de fonte de dados executando o comando SQL a seguir. No exemplo a seguir, substitua *server\$1name* pelo nome do servidor remoto no qual você deseja realizar as operações. Esse é o servidor que você criou na [etapa 2](#db2-federation-heterogeneous-create). Substitua *username* e *password* pelas suas credenciais para esse servidor remoto.

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

Para ter mais informações, consulte [User mappings](https://www.ibm.com/docs/en/db2/11.5?topic=systems-user-mappings) na documentação do IBM Db2.

### Etapa 4: Conferir a conexão
<a name="db2-federation-heterogeneous-check"></a>

Confirme se a configuração da federação foi bem-sucedida conferindo a conexão. Abra uma sessão para enviar comandos SQL nativos à sua fonte de dados remota usando o comando SET PASSTHRU e, depois, crie uma tabela no servidor de dados remoto.

1. Abra e feche uma sessão para enviar SQL a uma fonte de dados. No exemplo a seguir, substitua *server\$1name* pelo nome do servidor que você criou para federação na [etapa 2](#db2-federation-heterogeneous-create).

   ```
   set passthru server_name;
   ```

1. Crie uma tabela. No exemplo a seguir, substitua *column\$1name*, *data\$1type* e *value* pelos itens apropriados para sua tabela.

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

    Para ter mais informações, consulte [CREATE TABLE statement](https://www.ibm.com/docs/en/db2-event-store/2.0.0?topic=statements-create-table) na documentação do IBM Db2.

1. Crie um índice, insira valores para linhas na tabela e redefina a conexão. A redefinição da conexão interrompe a conexão, mas retém os processos de back-end. No exemplo a seguir, substitua *index\$1name*, *table\$1name*, *column\$1value* e *columnx\$1value* por suas informações. 

   ```
   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. Conecte-se ao seu banco de dados do Db2 remoto, crie um apelido para seu servidor remoto e execute operações. Quando terminar de acessar os dados no banco de dados do Db2 remoto, redefina e encerre a conexão. No exemplo a seguir, substitua *database\$1name* pelo nome do banco de dados do Db2 remoto. Substitua *nickname* por um nome. Substitua *server\$1name* e *table\$1name* pelo nome do servidor remoto e da tabela no servidor em que você deseja realizar operações. Substitua *username* pelas informações do seu servidor remoto. Substitua *sql\$1command* pela operação a ser executada no servidor remoto.

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

**Exemplo**

O exemplo a seguir cria uma sessão de passagem para permitir operações no servidor federado `testdb10`. 

Depois, ele cria a tabela `t1` com três colunas com diferentes tipos de dados. 

Depois, o exemplo cria o índice `i1_t1` em três colunas na tabela `t1`. Depois, ele insere duas linhas com valores para essas três colunas e então se desconecta.

Por último, o exemplo se conecta ao banco de dados do Db2 remoto `testdb2` e cria um apelido para a tabela ` t1` no servidor federado `testdb10`. Ele cria o apelido com o nome de usuário `TESTUSER` dessa fonte de dados. Um comando SQL gera todos os dados da tabela `t1`. O exemplo desconecta e encerra a sessão.

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