Considerações com o uso de extensões e módulos

Este artigo descreve algumas considerações especiais que você deve estar ciente ao usar determinadas extensões ou módulos em uma instância de servidor flexível do Banco de Dados do Azure para PostgreSQL.

Considerações genéricas com extensões

Para usar uma extensão em sua instância de servidor flexível do Banco de Dados do Azure para PostgreSQL, você precisa:

  • Permitir extensão. Se a extensão não for permitida, qualquer tentativa de executar CREATE EXTENSION, ALTER EXTENSION, DROP EXTENSIONou COMMENT ON EXTENSION falhar com um erro indicando que a extensão referida não é permitida.
  • Se a extensão implantar alguma biblioteca binária compartilhada que exija alocação e acesso à memória compartilhada e precisar ser carregada quando o servidor for iniciado, você também deverá seguir as instruções fornecidas em bibliotecas de carga.
  • Crie uma extensão nos bancos de dados nos quais você deseja que a extensão implante os objetos SQL distribuídos com essa extensão.
  • Remover extensão. Quando você deseja remover do banco de dados no qual você executa o comando todos os objetos SQL distribuídos por essa extensão.
  • Atualizar extensões, para atualizar para sua versão mais recente todos os artefatos SQL implantados por uma extensão que já está instalada.
  • Veja as extensões instaladas e suas versões correspondentes.

Se obtiver algum erro ao executar os comandos CREATE EXTENSION, ALTER EXTENSION, DROP EXTENSION ou COMMENT ON EXTENSION na sua instância de servidor flexível do Banco de Dados do Azure para PostgreSQL, consulte a lista de possíveis erros e as possíveis causas de cada um desses erros.

Considerações genéricas sobre módulos

Para usar um módulo em seu Banco de Dados do Azure para instância de servidor flexível do PostgreSQL, você só precisa adicioná-lo ao shared_preload_libraries parâmetro do servidor, conforme descrito em bibliotecas de carga.

Os módulos não precisam estar numa lista de permissões. Esse é um requisito exclusivo para extensões.

Extensões com considerações específicas

A lista a seguir enumera todas as extensões com suporte que exigem considerações específicas quando usadas em uma instância de servidor flexível do Banco de Dados do Azure para PostgreSQL:

  • AGE
  • dblink
  • pg_buffercache
  • pg_cron
  • pg_hint_plan
  • pg_prewarm
  • pg_repack
  • pg_stat_statements
  • pgcrypto
  • postgres_fdw
  • pgstattuple

AGE

A extensão Apache AGE é uma extensão gráfica para PostgreSQL suportada pelo Banco de Dados do Azure para PostgreSQL. Ele fornece funcionalidades de banco de dados gráfico, suporte a consultas cypher abertas e a capacidade de executar consultas complexas em dados gráficos armazenados em PostgreSQL. 'Apache AGE' é um projeto de código aberto lançado sob a Licença Apache 2.0.

Instalar o AGE

Para usar o AGE, certifica-te de colocar na lista de permissões a extensão, carregar a sua biblioteca e instalar a extensão no banco de dados no qual planeias usar a sua funcionalidade.

A extensão dblink permite que você se conecte de uma instância de servidor flexível do Azure Database para PostgreSQL a outra instância ou a outro banco de dados no mesmo servidor. O Banco de Dados do Azure para PostgreSQL dá suporte a conexões de entrada e saída para qualquer servidor PostgreSQL. O servidor de envio precisa permitir conexões de saída com o servidor de recebimento. Da mesma forma, o servidor de recebimento precisa permitir conexões do servidor de envio.

Se você planeja usar essa extensão, recomendamos implantar seus servidores com integração de rede virtual. Por padrão, a integração de rede virtual permite conexões entre servidores na rede virtual. Você também pode optar por usar grupos de segurança de rede de rede virtual para personalizar o acesso.

pg_buffercache

A pg_buffercache extensão pode ser usada para estudar o conteúdo de shared_buffers. Usando essa extensão, você pode saber se uma relação específica está armazenada em cache (em shared_buffers). Essa extensão pode ajudá-lo a solucionar problemas de desempenho (problemas de desempenho relacionados ao cache).

Esta extensão é integrada com a instalação principal do PostgreSQL, e é fácil de instalar.

CREATE EXTENSION pg_buffercache;

pg_cron

A pg_cron extensão é um agendador de tarefas simples e baseado em cron para PostgreSQL que é executado dentro do banco de dados como uma extensão. A pg_cron extensão pode executar tarefas de manutenção agendadas dentro de um banco de dados PostgreSQL. Por exemplo, você pode executar um vácuo periódico de uma tabela ou remover trabalhos de dados antigos.

A pg_cron extensão pode executar vários trabalhos em paralelo, mas executa no máximo uma instância de um trabalho de cada vez. Se se supõe que uma segunda execução comece antes de a primeira terminar, então a segunda execução é colocada em fila e iniciada assim que a primeira for concluída. Dessa forma, ele garante que os trabalhos sejam executados exatamente quantas vezes forem programadas e não sejam executados simultaneamente com eles mesmos.

Certifique-se de que o valor para o qual shared_preload_libraries está definido, inclui pg_cron. Esta extensão não suporta o carregamento da biblioteca como o efeito da execução de CREATE EXTENSION. Qualquer tentativa de executar CREATE EXTENSION se a extensão não foi adicionada ao shared_preload_libraries, ou o servidor não tenha sido reiniciado depois de ser adicionado, resulta num erro cujo texto indica pg_cron can only be loaded via shared_preload_libraries, e cuja sugestão é Add pg_cron to the shared_preload_libraries configuration variable in postgresql.conf.

Para usar pg_cron, certifique-se de carregar sua biblioteca compartilhada ao iniciar o servidor, ela está na lista de permissões e está instalada em qualquer banco de dados a partir do qual você deseja utilizar sua funcionalidade, usando os artefatos SQL que ele cria.

Examples

  1. Para apagar dados antigos no sábado às 3:30 am (GMT).

    SELECT cron.schedule('30 3 * * 6', $$DELETE FROM events WHERE event_time < now() - interval '1 week'$$);
    
  2. Para executar o processo de limpeza todos os dias às 10:00 (GMT) no banco de dados padrão postgres.

    SELECT cron.schedule('0 10 * * *', 'VACUUM');
    
  3. Para anular o agendamento de todas as tarefas de pg_cron.

    SELECT cron.unschedule(jobid) FROM cron.job;
    
  4. Para ver todos os trabalhos atualmente agendados com pg_cron.

    SELECT * FROM cron.job;
    
  5. Para executar o vacuum todos os dias às 10:00 (GMT) no banco de dados test cron sob a função da conta azure_pg_admin.

    SELECT cron.schedule_in_database('VACUUM',' 0 10 * * * ', 'VACUUM', 'testcron',null,TRUE);
    

Mais exemplos

A partir da pg_cron versão 1.4, você pode usar as cron.schedule_in_database funções e cron.alter_job para agendar seu trabalho em um banco de dados específico e atualizar uma agenda existente, respectivamente.

A cron_schedule_in_database função permite o nome de usuário como um parâmetro opcional. Definir o nome de usuário para um valor não nulo requer privilégio de superusuário PostgreSQL e não é suportado para uma instância de servidor flexível do Banco de Dados do Azure para PostgreSQL. Exemplos anteriores mostram a execução dessa função com um parâmetro de nome de usuário opcional omitido ou definido como null, que executa o trabalho no contexto do usuário agendando o trabalho, que deve ter azure_pg_admin privilégios de função.

  1. Para apagar dados antigos na base de dados DBName no sábado às 3:30 da manhã (GMT).

    SELECT cron.schedule_in_database('JobName', '30 3 * * 6', $$DELETE FROM events WHERE event_time < now() - interval '1 week'$$,'DBName');
    
  2. Para atualizar ou alterar o nome da base de dados no agendamento existente

    SELECT cron.alter_job(job_id:=MyJobID,database:='NewDBName');
    

pg_hint_plan

A pg_hint_plan extensão torna possível ajustar os planos de execução do PostgreSQL usando as chamadas "dicas" nos comentários SQL, como:

/*+ SeqScan(a) */

A extensão pg_hint_plan lê frases de sugestão em um comentário da forma especial fornecida com a consulta SQL alvo. A forma particular começa com a sequência de caracteres "/*+" e termina com "*/". Frases de dica consistem em nomes de dicas e os seguintes parâmetros entre parênteses e delimitados por espaços. Novas linhas para legibilidade podem delimitar cada frase de sugestão.

Example:

/*+
 HashJoin(a b)
 SeqScan(a)
 */
    SELECT *
    FROM pgbench_branches b
    JOIN pgbench_accounts an ON b.bid = a.bid
    ORDER BY a.aid;

O exemplo anterior faz com que o planeador use os resultados de um seqscan na tabela a para combinar com a tabela b como um hashjoin.

Para usar pg_hint_plan a extensão, certifique-se de incluir na lista de permissões a extensão, carregar a sua biblioteca e instalar a extensão no banco de dados na qual planeia usar a sua funcionalidade.

pg_prewarm

A pg_prewarm extensão carrega dados relacionais no cache. Pré-aquecer seus caches significa que suas consultas têm melhores tempos de resposta na primeira execução após uma reinicialização. A funcionalidade de pré-aquecimento automático para o PostgreSQL não está atualmente disponível no Banco de Dados do Azure.

pg_repack

Os utilizadores que usam pela primeira vez a extensão pg_repack geralmente fazem a seguinte pergunta: É pg_repack uma extensão ou um executável do lado do cliente, como psql ou pg_dump?

pg_repack na verdade é ambas as coisas. pg_repack/lib tem o código para a extensão, incluindo o esquema e os artefatos SQL que ele cria, e a biblioteca C implementando o código de várias dessas funções.

Por outro lado, pg_repack/bin tem o código para o aplicativo cliente, que sabe como interagir com os elementos de programação implementados na extensão. Esta aplicação cliente visa reduzir a complexidade da interação com as diferentes interfaces apresentadas pela extensão no lado do servidor. Ele oferece ao usuário algumas opções de linha de comando que são mais fáceis de entender. O aplicativo cliente é inútil sem a extensão criada no banco de dados para o qual está sendo apontado. A extensão do lado do servidor por si só seria totalmente funcional, mas exigiria que o usuário entendesse um padrão de interação complicado. Esse padrão consistiria na execução de consultas para recuperar dados que são usados como entrada para funções implementadas pela extensão, etc.

Permissão negada para reestruturação de esquema

Atualmente, como concedemos permissões para o esquema de reempacotamento criado por essa extensão, oferecemos suporte apenas à funcionalidade de execução pg_repack a partir do contexto do azure_pg_admin.

Você pode notar que, se o proprietário de uma tabela, que não seja azure_pg_admin, tentar executar pg_repack, acabará recebendo o seguinte erro:

NOTICE: Setting up workers.conns
ERROR: pg_repack failed with error: ERROR:  permission denied for schema repack
LINE 1: select repack.version(), repack.version_sql()

Para evitar esse erro, execute pg_repack a partir do contexto de azure_pg_admin.

pg_stat_statements

A extensão pg_stat_statements oferece uma visão de todas as consultas executadas em seu banco de dados. Essas informações são úteis para entender o desempenho da carga de trabalho de consulta em um sistema de produção.

A extensão pg_stat_statements é pré-carregada em shared_preload_libraries todas as instâncias de servidor flexível do Base de Dados do Azure para PostgreSQL para fornecer um meio de monitorizar as estatísticas de execução de declarações SQL.

Por motivos de segurança, você deve incluir na lista de permissões a extensão pg_stat_statements e instalar usando o comando CREATE EXTENSION.

A configuração pg_stat_statements.track, que controla quais instruções a extensão rastreia, assume top como padrão, o que significa que todas as instruções emitidas diretamente pelos clientes são rastreadas. Os outros dois níveis de rastreamento são none e all. Esta definição é configurável como parâmetro do servidor.

Há uma compensação entre as informações de execução de consulta que a pg_stat_statements extensão fornece no desempenho do servidor à medida que registra cada instrução SQL. Se você não estiver usando ativamente a pg_stat_statements extensão, recomendamos que defina pg_stat_statements.track como none. Alguns serviços de monitorização de terceiros podem se basear em pg_stat_statements para fornecer informações sobre o desempenho da consulta, por isso, confirme se isto se aplica ao seu caso.

PGPcrypto

Base de Dados do Azure para PostgreSQL suporta encriptação ao nível da aplicação e ao nível das colunas através da extensão PostgreSQL pgcrypto. A extensão pgcrypto permite que aplicações invoquem explicitamente funções criptográficas em instruções SQL do PostgreSQL para encriptar ou fazer hash dos valores das colunas usando algoritmos criptográficos fornecidos pela biblioteca OpenSSL subjacente.

A partir do Azure Linux 3.0, o sistema operativo utiliza o OpenSSL 3.0, que transfere vários algoritmos criptográficos mais antigos e mais fracos e APIs de baixo nível para um fornecedor legado separado que não é carregado por defeito. Esta alteração incentiva o uso de algoritmos criptográficos modernos e mais seguros e das APIs EVP (Envelope) OpenSSL de alto nível.

Como resultado, algoritmos criptográficos classificados como legados no OpenSSL 3.0 não estão disponíveis por padrão para uso pelo pgcrypto em servidores Base de Dados do Azure para PostgreSQL, executando Azure Linux 3.0.

Algoritmos criptográficos obsoletos

Os seguintes algoritmos criptográficos herdados estão colocados no fornecedor legado OpenSSL 3.0 e não estão disponíveis por defeito nos servidores Base de Dados do Azure para PostgreSQL a executar Azure Linux 3.0. Estes algoritmos podem ter sido utilizáveis através do pgcrypto em versões anteriores da plataforma, mas já não são suportados no Azure Linux 3.0.

Algoritmos de encriptação simétrica (cifras)

  • Blowfish (BF-CBC)
  • CAST
  • DES (DES simples; não 3DES)
  • IDEIA
  • RC2
  • RC4
  • RC5
  • SEED

Algoritmos de digestão e hash de mensagens

  • MD2
  • MD4
  • MDC2
  • RIPEMD-160
  • SHA-1 (obsoleto para assinaturas digitais, mas pode ainda ser permitido para cenários HMAC específicos dependendo da configuração)
  • Whirlpool

As atualizações do Base de Dados do Azure para PostgreSQL para Azure Linux 3.0 fazem parte de melhorias contínuas na plataforma. As aplicações que dependem do pgcrypto devem garantir que utilizam algoritmos criptográficos modernos e suportados ao realizar encriptação ao nível da aplicação e ao nível das colunas.

postgres_fdw

A extensão postgres_fdw permite que você se conecte de uma instância de servidor flexível do Azure Database para PostgreSQL a outra instância ou a outro banco de dados no mesmo servidor. O Banco de Dados do Azure para PostgreSQL dá suporte a conexões de entrada e saída para qualquer servidor PostgreSQL. O servidor de envio precisa permitir conexões de saída com o servidor de recebimento. Da mesma forma, o servidor de recebimento precisa permitir conexões do servidor de envio.

Se você planeja usar essa extensão, recomendamos implantar seus servidores com integração de rede virtual. Por padrão, a integração de rede virtual permite conexões entre servidores na rede virtual. Você também pode optar por usar grupos de segurança de rede de rede virtual para personalizar o acesso.

pgstattuple

Ao usar a extensão pgstattuple para tentar obter estatísticas de tupla de objetos mantidos no esquema pg_toast em versões do Postgres 11 a 13, recebe-se um erro "permissão negada para esquema pg_toast".

Permissão negada para o esquema pg_toast

Os clientes que usam as versões 11 a 13 do PostgreSQL na instância de servidor flexível do Banco de Dados do Azure para PostgreSQL não podem usar a pgstattuple extensão em objetos dentro do pg_toast esquema.

No PostgreSQL 16 e 17, a pg_read_all_data função é concedida automaticamente ao azure_pg_admin, permitindo pgstattuple funcionar corretamente. No PostgreSQL 14 e 15, os clientes podem conceder manualmente o pg_read_all_data papel a azure_pg_admin para obter o mesmo resultado. No entanto, no PostgreSQL 11 a 13, a pg_read_all_data função não existe.

Os clientes não podem conceder diretamente as permissões necessárias. Se precisar ser capaz de executar pgstattuple para acessar objetos no esquema pg_toast, prossiga para criar um pedido de suporte do Azure .

timescaleDB

A timescaleDB extensão é um banco de dados de séries temporais empacotado como uma extensão para PostgreSQL. Ele fornece funções analíticas orientadas ao tempo e otimizações e dimensiona o Postgres para cargas de trabalho de séries temporais. Saiba mais sobre TimescaleDB, uma marca registada da Timescale, Inc. O Azure Database para PostgreSQL oferece a edição Apache-2 do TimescaleDB.

Instalar o TimescaleDB

Para usar timescaleDB, certifique-se de incluir na lista de permissões a extensão, carregar a sua biblioteca e instalar a extensão no banco de dados no qual você planeja usar a sua funcionalidade.

Agora você pode criar uma hipertabela TimescaleDB do zero ou migrar dados de séries cronológicas existentes no PostgreSQL.

Para obter mais informações sobre como restaurar um banco de dados Timescale usando pg_dump e pg_restore, consulte a documentação Timescale.

Restaurar um banco de dados Timescale usando timescaledb-backup

Ao executar o procedimento SELECT timescaledb_post_restore(), poderá ocorrer uma recusa de permissões ao atualizar o sinalizador timescaledb.restoring. A razão pela qual você recebe esse erro é devido à permissão limitada ALTER DATABASE nos serviços de banco de dados Cloud PaaS. Nesse caso, você pode executar um método alternativo usando a timescaledb-backup ferramenta para fazer backup e restaurar o banco de dados Timescale. Timescaledb-backup é um programa que torna o despejo e a restauração de um banco de dados TimescaleDB mais simples, menos propenso a erros e mais eficiente.

Para o fazer, siga estes passos:

  1. Instale as ferramentas conforme detalhado aqui.

  2. Crie um Banco de Dados do Azure de destino para instância de servidor flexível e banco de dados PostgreSQL.

  3. Habilite a extensão Timescale.

  4. Conceda a azure_pg_admin função ao usuário que é usada pelo ts-restore.

  5. Execute ts-restore para restaurar o banco de dados.

Mais detalhes sobre esses utilitários podem ser encontrados aqui.

Extensões e atualização da versão principal

Azure Database para PostgreSQL oferece um recurso de atualização principal no local que executa uma atualização no local da instância de servidor flexível do Azure Database para PostgreSQL, com apenas uma interação simples por parte do usuário. A atualização no local da versão major simplifica o processo de atualização do Base de Dados do Azure para PostgreSQL, minimizando a interrupção para usuários e aplicativos que acessam o servidor. As atualizações de versão principal in situ não suportam extensões específicas, e há algumas limitações para atualizar certas extensões.

As extensões anon, Apache AGE, dblink, orafce, postgres_fdw e timescaledb não têm suporte para todas as versões de servidor flexível do Banco de Dados do Azure para PostgreSQL ao usar o recurso de atualização de versão principal in-place.

Módulos com considerações específicas

A lista a seguir enumera todos os módulos com suporte que exigem considerações específicas quando usados em uma instância de servidor flexível do Banco de Dados do Azure para PostgreSQL:

  • pg_failover_slots

pg_failover_slots

O pg_failover_slots módulo aprimora o Banco de Dados do Azure para PostgreSQL ao operar com servidores habilitados para replicação lógica e alta disponibilidade. Ele efetivamente aborda o desafio dentro do mecanismo PostgreSQL padrão que não preserva slots de replicação lógica após um failover. A manutenção desses slots é fundamental para evitar pausas de replicação ou incompatibilidades de dados durante alterações na função de servidor principal, garantindo a continuidade operacional e a integridade dos dados.

A extensão simplifica o processo de failover gerenciando a transferência, a limpeza e a sincronização necessárias dos slots de replicação, proporcionando assim uma transição perfeita durante as alterações de função de servidor.

Você pode encontrar mais informações e instruções sobre como usar o pg_failover_slots módulo em sua página no GitHub.

Para usar o pg_failover_slots módulo, certifique-se de que sua biblioteca foi carregada quando o servidor foi iniciado.