

# Trabalhar com bancos de dados MySQL usando a extensão mysql\_fdw
<a name="postgresql-mysql-fdw"></a>

Para acessar um banco de dados compatível com MySQL pela instância de banco de dados RDS para PostgreSQL, você pode instalar e usar a extensão `mysql_fdw`. Esse invólucro de dados externos permite que você trabalhe com o RDS for MySQL, o Aurora MySQL, o MariaDB e outros bancos de dados compatíveis com MySQL. A conexão da instância de bancos de dados do RDS para PostgreSQL ao banco de dados MySQL é criptografada com base no melhor esforço, dependendo das configurações do cliente e do servidor. No entanto, você pode impor a criptografia, se quiser. Para obter mais informações, consulte [Usar criptografia em trânsito com a extensão](#postgresql-mysql-fdw.encryption-in-transit). 

A extensão `mysql_fdw` é compatível com o Amazon RDS para PostgreSQL versão 14.2, 13.6 e posteriores. Ela é compatível com seleções, inserções, atualizações e exclusões de um banco de dados do RDS for PostgreSQL para tabelas em uma instância de banco de dados compatível com MySQL. 

**Topics**
+ [Configurar um banco de dados RDS para PostgreSQL para usar a extensão mysql\_fdw](#postgresql-mysql-fdw.setting-up)
+ [Exemplo: trabalhar com um banco de dados do RDS para MySQL pelo RDS para PostgreSQL](#postgresql-mysql-fdw.using-mysql_fdw)
+ [Usar criptografia em trânsito com a extensão](#postgresql-mysql-fdw.encryption-in-transit)

## Configurar um banco de dados RDS para PostgreSQL para usar a extensão mysql\_fdw
<a name="postgresql-mysql-fdw.setting-up"></a>

Para configurar a extensão `mysql_fdw` na instância de banco de dados do RDS para PostgreSQL, é necessário carregar a extensão na instância de banco de dados e, em seguida, criar o ponto de conexão com a instância de banco de dados do MySQL. Para essa tarefa, você precisa ter os seguintes detalhes sobre a instância de banco de dados do MySQL:
+ Nome de host ou endpoint. Para uma instância de banco de dados do RDS para MySQL, é possível encontrar o endpoint usando o console. Escolha a guia “Connectivity & security” (Conectividade e segurança) e procure na seção “Endpoint and port” (Endpoint e porta). 
+ Número da porta. O número da porta padrão do MySQL é 3306. 
+ O nome do banco de dados. O identificador do banco de dados. 

Você também precisa fornecer acesso no grupo de segurança ou na lista de controle de acesso (ACL) para a porta 3306 do MySQL. Tanto o cluster de MySQL precisam acessar a porta 3306. Se o acesso não estiver configurado corretamente, ao tentar se conectar à tabela compatível com o MySQL, será exibida uma mensagem de erro semelhante à seguinte:

```
ERROR: failed to connect to MySQL: Can't connect to MySQL server on '{{hostname}}.{{aws-region}}.rds.amazonaws.com:3306' (110)
```

No procedimento a seguir, você (como a conta `rds_superuser`) cria o servidor externo. Depois, você concede acesso ao servidor externo a usuários específicos. Em seguida, esses usuários criam seus próprios mapeamentos para as contas de usuário apropriadas do MySQL para trabalhar com a instância de banco de dados do MySQL. 

**Para usar mysql\_fdw a fim de acessar um servidor de banco de dados MySQL**

1. Conecte-se à instância de banco de dados do PostgreSQL usando uma conta que tenha a função `rds_superuser`. Se tiver aceitado os padrões ao criar a instância de banco de dados do RDS para PostgreSQL, o nome de usuário será `postgres` e você poderá se conectar usando a ferramenta da linha de comando `psql` da seguinte forma:

   ```
   psql --host={{your-DB-instance}}.{{aws-region}}.rds.amazonaws.com --port=5432 --username=postgres –-password
   ```

1. Instale a extensão `mysql_fdw` da seguinte forma:

   ```
   postgres=> CREATE EXTENSION mysql_fdw;
   CREATE EXTENSION
   ```

Depois que a extensão é instalada na instância de banco de dados do RDS para PostgreSQL, é possível configurar o servidor externo que fornece a conexão com um banco de dados MySQL.

**Para criar o servidor externo**

Execute essas tarefas na instância de banco de dados do RDS para PostgreSQL. As etapas presumem que você esteja conectado como usuário com privilégios `rds_superuser`, como `postgres`. 

1. Crie um servidor externo na instância de banco de dados do RDS para PostgreSQL:

   ```
   postgres=> CREATE SERVER {{mysql-db}} FOREIGN DATA WRAPPER mysql_fdw OPTIONS (host '{{db-name.111122223333}}.{{aws-region}}.rds.amazonaws.com', port '3306');
   CREATE SERVER
   ```

1. Conceda aos usuários apropriados acesso ao servidor externo. Eles devem ser usuários não administradores, ou seja, usuários sem a função `rds_superuser`.

   ```
   postgres=> GRANT USAGE ON FOREIGN SERVER {{mysql-db}} to {{user1}};
   GRANT
   ```

Os usuários do PostgreSQL criam e gerenciam suas próprias conexões com o banco de dados do MySQL por meio do servidor externo.

## Exemplo: trabalhar com um banco de dados do RDS para MySQL pelo RDS para PostgreSQL
<a name="postgresql-mysql-fdw.using-mysql_fdw"></a>

Suponha que você tenha uma tabela simples em uma instância de banco de dados do RDS para PostgreSQL. Os usuários do RDS para PostgreSQL querem consultar os itens `SELECT`, `INSERT`, `UPDATE` e `DELETE` nessa tabela. Suponha que a extensão `mysql_fdw` foi criada na instância de banco de dados do RDS for PostgreSQL, conforme detalhado no procedimento anterior. Depois de se conectar à instância de banco de dados do RDS for PostgreSQL como um usuário com privilégios `rds_superuser`, é possível prosseguir com as etapas abaixo. 

1. Crie um servidor externo na instância de banco de dados do RDS para PostgreSQL: 

   ```
   test=> CREATE SERVER {{mysqldb}} FOREIGN DATA WRAPPER mysql_fdw OPTIONS (host '{{your-DB}}.{{aws-region}}.rds.amazonaws.com', port '3306');
   CREATE SERVER
   ```

1. Conceda uso a um usuário que não tenha permissões `rds_superuser`; por exemplo, `user1`:

   ```
   test=> GRANT USAGE ON FOREIGN SERVER mysqldb TO user1;
   GRANT
   ```

1. Conecte-se como {{user1}} e, em seguida, crie um mapeamento para o usuário do MySQL: 

   ```
   test=> CREATE USER MAPPING FOR {{user1}} SERVER mysqldb OPTIONS (username '{{myuser}}', password '{{mypassword}}');
   CREATE USER MAPPING
   ```

1. Crie uma tabela externa vinculada a uma tabela do MySQL:

   ```
   test=> CREATE FOREIGN TABLE {{mytab}} (a int, b text) SERVER mysqldb OPTIONS (dbname 'test', table_name '');
   CREATE FOREIGN TABLE
   ```

1. Execute uma consulta simples na tabela externa:

   ```
   test=> SELECT * FROM mytab;
   a |   b
   ---+-------
   1 | apple
   (1 row)
   ```

1. Você pode adicionar, alterar e remover dados da tabela do MySQL. Por exemplo: 

   ```
   test=> INSERT INTO mytab values (2, 'mango');
   INSERT 0 1
   ```

   Execute a consulta `SELECT` novamente para ver os resultados:

   ```
   test=> SELECT * FROM mytab ORDER BY 1;
    a |   b
   ---+-------
   1 | apple
   2 | mango
   (2 rows)
   ```

## Usar criptografia em trânsito com a extensão
<a name="postgresql-mysql-fdw.encryption-in-transit"></a>

A conexão com o MySQL pelo RDS para PostgreSQL usa criptografia em trânsito (TLS/SSL) por padrão. No entanto, a conexão volta para não criptografada quando a configuração do cliente e do servidor é diferente. Você pode impor a criptografia para todas as conexões de saída especificando a opção `REQUIRE SSL` nas contas de usuário do RDS for MySQL. Essa mesma abordagem também funciona para contas de usuário do MariaDB e do Aurora MySQL. 

Para contas de usuário do MySQL configuradas como `REQUIRE SSL`, a tentativa de conexão falhará se não for possível estabelecer uma conexão segura.

Para aplicar criptografia a contas de usuário do banco de dados do MySQL existentes, você pode usar o comando `ALTER USER`. A sintaxe varia, dependendo da versão do MySQL, conforme mostrado na tabela a seguir. Para obter mais informações, consulte [ALTER USER](https://dev.mysql.com/doc/refman/8.0/en/alter-user.html) no *Manual de referência do MySQL*.


| MySQL 5.7, MySQL 8.0 | MySQL 5.6 | 
| --- | --- | 
| `ALTER USER '{{user}}'@'%' REQUIRE SSL;` | `GRANT USAGE ON *.* to '{{user}}'@'%' REQUIRE SSL;` | 

Para obter mais informações sobre a extensão `mysql_fdw`, consulte a documentação do [mysql\_fdw](https://github.com/EnterpriseDB/mysql_fdw). 