

# Gerenciar objetos grandes com o módulo lo
<a name="PostgreSQL_large_objects_lo_extension"></a>

O módulo lo (extensão) é para usuários de banco de dados e desenvolvedores que trabalham com bancos de dados PostgreSQL por meio de drivers JDBC ou ODBC. Tanto no caso do JDBC quanto no caso do ODBC, é esperado que o banco de dados processe a exclusão de objetos grandes quando as referências a eles mudam. No entanto, o PostgreSQL não funciona dessa maneira. No PostgreSQL, não se espera que um objeto seja excluído quando sua referência é alterada. O resultado é que os objetos permanecem no disco, sem referência. A extensão lo inclui uma função usada para acionar alterações de referência para excluir objetos, se necessário.

**dica**  
Para determinar se seu banco de dados pode se beneficiar da extensão lo, use o utilitário `vacuumlo` para verificar se há objetos grandes órfãos. Para obter contagens de objetos grandes órfãos sem realizar nenhuma ação, execute o utilitário com a opção `-n` (no-op). Para saber como, consulte [vacuumlo utility](#vacuumlo-utility) a seguir. 

O módulo lo está disponível para Aurora PostgreSQL 13.7, 12.11, 11.16, 10.21 e versões secundárias superiores.

Para instalar o módulo (extensão), você precisa de privilégios `rds_superuser`. Instalar a extensão lo adiciona o seguinte ao seu banco de dados:
+ `lo`: é um tipo de dados de objeto grande (lo) que você pode usar para objetos grandes binários (BLOBs) e outros objetos grandes. O tipo de dados `lo` é um domínio do tipo de dados `oid`. Em outras palavras, é um identificador de objeto com restrições opcionais. Para saber mais, consulte [Identificadores de objeto](https://www.postgresql.org/docs/14/datatype-oid.html) na documentação do PostgreSQL. Em termos simples, você pode usar o tipo de dados `lo` para distinguir suas colunas de banco de dados que contêm referências de objetos grandes de outros identificadores de objeto (OIDs). 
+ `lo_manage`: é uma função que você pode usar em gatilhos em colunas de tabela que contêm referências a objetos grandes. Sempre que você excluir ou modificar um valor que faça referência a um objeto grande, o gatilho desvincula o objeto (`lo_unlink`) de sua referência. Use o gatilho em uma coluna somente se a coluna for a única referência de banco de dados ao objeto grande. 

Para obter mais informações sobre o módulo de objetos grandes, consulte [lo](https://www.postgresql.org/docs/current/lo.html) na documentação do PostgreSQL.

## Instalar a extensão lo
<a name="PostgreSQL_large_objects_lo_extension.install"></a>

Antes de instalar a extensão lo, verifique se você tem privilégios `rds_superuser`. 

**Como instalar a extensão lo**

1. Use o `psql` para conectar-se à instância de banco de dados primária do cluster de banco de dados Aurora PostgreSQL.

   ```
   psql --host=your-cluster-instance-1.666666666666.aws-region.rds.amazonaws.com --port=5432 --username=postgres --password
   ```

   Insira sua senha quando for solicitado. O cliente `psql` conecta-se e exibe o banco de dados de conexão administrativa padrão, `postgres=>`, como o prompt.

1. Instale a extensão da forma a seguir.

   ```
   postgres=> CREATE EXTENSION lo;
   CREATE EXTENSION
   ```

Agora é possível usar o tipo de dados `lo` para definir colunas em suas tabelas. Por exemplo, você pode criar uma tabela (`images`) que contém dados de imagem raster. Você pode usar o tipo de dados `lo` para uma coluna `raster`, conforme mostrado no exemplo a seguir, que cria uma tabela.

```
postgres=> CREATE TABLE images (image_name text, raster lo);
```

## Usar a função de gatilho lo\$1manage para excluir objetos
<a name="PostgreSQL_large_objects_lo_extension.using"></a>

É possível usar a função `lo_manage` em um gatilho em uma `lo` ou outras colunas de objetos grandes para limpar (e evitar objetos órfãos) quando a `lo` é atualizada ou excluída. 

**Como configurar gatilhos em colunas que fazem referência a objetos grandes**
+ Execute um destes procedimentos:
  + Crie um gatilho BEFORE UPDATE OR DELETE em cada coluna para conter referências exclusivas a objetos grandes, usando o nome da coluna como argumento.

    ```
    postgres=> CREATE TRIGGER t_raster BEFORE UPDATE OR DELETE ON images
        FOR EACH ROW EXECUTE FUNCTION lo_manage(raster);
    ```
  + Aplique um gatilho somente quando a coluna estiver sendo atualizada.

    ```
    postgres=> CREATE TRIGGER t_raster BEFORE UPDATE OF images
        FOR EACH ROW EXECUTE FUNCTION lo_manage(raster);
    ```

A função de gatilho `lo_manage` funciona apenas no contexto de inserção ou exclusão de dados de colunas, dependendo de como você define o gatilho. Isso não tem efeito quando você executa uma operação `DROP` ou `TRUNCATE`em um banco de dados. Isso significa que é necessário excluir colunas de objeto de qualquer tabela antes de soltá-las, para evitar a criação de objetos órfãos.

Por exemplo, suponha que você queira descartar o banco de dados que contém a tabela `images`. Exclua a coluna da maneira a seguir. 

```
postgres=> DELETE FROM images COLUMN raster
```

Supondo que a função `lo_manage` seja definida nessa coluna para lidar com exclusões, agora você pode descartar a tabela com segurança.

## Remoção de objetos grandes órfãos usando o `vacuumlo`
<a name="PostgreSQL_large_objects_lo_extension.vacuumlo-utility"></a>

O utilitário  `vacuumlo` identifica e remove objetos grandes órfãos dos bancos de dados. Esse utilitário está disponível desde o PostgreSQL 9.1.24. Se os usuários do banco de dados trabalham rotineiramente com objetos grandes, recomendamos executar o `vacuumlo` ocasionalmente para limpar objetos grandes órfãos.

Antes de instalar a extensão lo, você pode usar o `vacuumlo` para avaliar se o cluster de banco de dados do Aurora PostgreSQL pode se beneficiar. Para isso, execute `vacuumlo` com a opção `-n` (no-op) para mostrar o que seria removido, conforme mostrado no seguinte: 

```
$ vacuumlo -v -n -h your-cluster-instance-1.666666666666.aws-region.rds.amazonaws.com -p 5433 -U postgres docs-lab-spatial-db
Password:*****
Connected to database "docs-lab-spatial-db"
Test run: no large objects will be removed!
Would remove 0 large objects from database "docs-lab-spatial-db".
```

Como mostra a saída, objetos grandes órfãos não são um problema para esse banco de dados específico. 

Para obter mais informações sobre esse utilitário, consulte [https://www.postgresql.org/docs/current/vacuumlo.html](https://www.postgresql.org/docs/current/vacuumlo.html) na documentação do PostgreSQL.

## Como funciona o `vacuumlo`
<a name="PostgreSQL_large_objects_lo_extension.vacuumlo-remove"></a>

 O comando `vacuumlo` remove objetos grandes órfãos (LOs) do seu banco de dados PostgreSQL sem afetar ou entrar em conflito com suas tabelas de usuário.

O comando funciona assim:

1. `vacuumlo` começa criando uma tabela temporária contendo todos os IDs de objeto (OIDs) dos objetos grandes em seu banco de dados.

1. Depois, o `vacuumlo` examina todas as colunas do banco de dados que usam os tipos de dados `oid` ou `lo`. Se o `vacuumlo` encontrar um OID correspondente nessas colunas, ele removerá o OID da tabela temporária. O `vacuumlo` verifica somente colunas com os nomes específicos `oid` ou `lo`, não domínios com base nesses tipos.

1. As entradas restantes na tabela temporária representam LOs órfãos, que o `vacuumlo` remove com segurança.

## Aprimorar a performance do `vacuumlo`
<a name="PostgreSQL_large_objects_lo_extension.vacuumlo-improve"></a>

 Você pode melhorar o desempenho do `vacuumlo` aumentando o tamanho do lote usando a opção `-l`. Isso permite que o `vacuumlo` processe mais LOs de uma só vez. 

 Se o sistema tiver memória suficiente e você puder acomodar a tabela temporária completamente na memória, aumentar a configuração `temp_buffers` no nível do banco de dados poderá melhorar o desempenho. Isso permite que a tabela resida inteiramente na memória, o que pode melhorar o desempenho geral. 

A consulta a seguir estima o tamanho da tabela temporária:

```
SELECT
    pg_size_pretty(SUM(pg_column_size(oid))) estimated_lo_temp_table_size
FROM
    pg_largeobject_metadata;
```

## Considerações para objetos grandes
<a name="PostgreSQL_large_objects_lo_extension.vacuumlo-consider"></a>

A seguir, você encontrará algumas considerações importantes a serem observadas ao trabalhar com objetos grandes:
+ `Vacuumlo` é a única solução, pois atualmente não há outro método para remover LOs órfãos.
+ Ferramentas como pglogical, replicação lógica nativa e AWS DMS que usam tecnologias de replicação não oferecem suporte à replicação de objetos grandes.
+ Ao projetar seu esquema de banco de dados, evite usar objetos grandes sempre que possível e considere usar tipos de dados alternativos, como `bytea`.
+ Execute o `vacuumlo` regularmente, pelo menos semanalmente, para evitar problemas com LOs órfãos.
+ Use um gatilho com a função `lo_manage` em tabelas que armazenam objetos grandes para ajudar a evitar a criação de LOs órfãos.