A extensão oss_fdw é um wrapper de dados externos (FDW) para o ApsaraDB RDS for PostgreSQL que mapeia buckets do Object Storage Service (OSS) a tabelas externas do PostgreSQL. Use-a para consultar arquivos CSV no OSS sem importação prévia, carregar grandes conjuntos de dados na instância RDS ou exportar dados de tabelas para o OSS para arquivamento e processamento posterior.
Pré-requisitos
Antes de começar, verifique se você tem:
Uma instância RDS com PostgreSQL 10 ou superior
Se a instância executar o PostgreSQL 14: versão secundária do mecanismo 20220830 ou posterior. Para atualize, consulte Atualizar a versão secundária do mecanismo
Um bucket do OSS na mesma região da instância RDS (recomendado para melhor desempenho). Consulte Ativar o OSS e Crie um bucket
Um AccessKey ID e AccessKey Secret com permissões de leitura e gravação no bucket. Consulte Obter um par de AccessKey
Como funciona
O oss_fdw mapeia um ou mais objetos do OSS a uma tabela externa do PostgreSQL. Consultas nessa tabela externa acionam uma varredura nos objetos correspondentes no OSS. Nenhum dado é copiado para a instância RDS até que você o insira explicitamente. Todos os objetos do OSS devem estar no formato CSV, com compressão gzip opcional.
Para usar o oss_fdw:
Instale a extensão.
Crie um servidor para armazenar as credenciais de conexão do OSS.
Crie uma tabela externa mapeada para os objetos do OSS que deseja ler ou gravar.
Consulte ou grave dados pela tabela externa.
Configurar o oss_fdw
Etapa 1: Instale a extensão
CREATE EXTENSION oss_fdw;
Etapa 2: Crie um servidor
O servidor armazena o endpoint do OSS, as credenciais e o nome do bucket. Todas as conexões da tabela externa passam por esse servidor.
CREATE SERVER ossserver FOREIGN DATA WRAPPER oss_fdw OPTIONS (
host 'oss-cn-hangzhou-internal.aliyuncs.com',
id '<your-access-key-id>',
key '<your-access-key-secret>',
bucket '<your-bucket-name>'
);
|
Espaço reservado |
Descrição |
|
|
Seu AccessKey ID |
|
|
Seu AccessKey Secret |
|
|
Nome do bucket do OSS |
Use o endpoint interno da região para evitar tráfego pela rede pública. Para encontrar o endpoint, faça login no console do OSS, abra o bucket e verifique o valor de Endpoint na página Overview.
Para todos os parâmetros de CREATE SERVER, incluindo ajustes de tolerância a falhas, consulte Parâmetros do servidor.
Etapa 3: Crie uma tabela externa
Defina uma tabela externa cujo esquema de colunas corresponda à estrutura dos arquivos CSV no OSS.
CREATE FOREIGN TABLE ossexample (
date text,
time text,
open float,
high float,
low float,
volume int
)
SERVER ossserver
OPTIONS (
dir 'osstest/',
delimiter ',',
format 'csv',
encoding 'utf8'
);
O esquema de colunas deve corresponder exatamente à estrutura dos objetos do OSS. Incompatibilidades causam erros de importação.
A opção dir aponta para uma pasta do OSS. Todo o conteúdo dessa pasta (exceto subpastas) é incluído. Para direcionar arquivos específicos, use filepath. Observe que filepath suporta apenas importação, enquanto dir suporta importação e exportação.
Para todos os parâmetros de CREATE FOREIGN TABLE, consulte Parâmetros da tabela externa.
Importar dados do OSS
Leia diretamente do OSS sem carregar dados na instância RDS:
SELECT * FROM ossexample;
Carregue dados em uma tabela local para acelerar consultas subsequentes:
-
Crie uma tabela local com o mesmo esquema:
CREATE TABLE example ( date text, time text, open float, high float, low float, volume int ); -
Insira os dados da tabela externa:
INSERT INTO example SELECT * FROM ossexample;
Antes de importar, execute EXPLAIN para estimar a quantidade de objetos do OSS correspondentes e obter o plano de consulta:
EXPLAIN INSERT INTO example SELECT * FROM ossexample;
Saída esperada:
QUERY PLAN
----------------------------------------------------------------------
Insert on example (cost=0.00..1.10 rows=0 width=0)
-> Foreign Scan on ossexample (cost=0.00..1.10 rows=1 width=998)
Foreign OssDir: osstest/
Number Of Ossfile: 2
Exportar dados para o OSS
Grave dados de uma tabela local no OSS:
INSERT INTO ossexample SELECT * FROM example;
Na exportação, a tabela externa deve usar a opção dir (não filepath). Cada operação de exportação grava objetos na pasta especificada do OSS.
Para controlar o tamanho do arquivo de saída e o paralelismo, use os parâmetros específicos de gravação em Parâmetros da tabela externa.
Parâmetros do servidor
Use estes parâmetros na cláusula OPTIONS do comando CREATE SERVER.
Parâmetros de conexão
|
Parâmetro |
Descrição |
|
|
Endpoint interno do OSS para sua região. Encontre-o na página Overview do bucket no console do OSS. |
|
|
Seu AccessKey ID. |
|
|
Seu AccessKey Secret. |
|
|
Nome do bucket do OSS. |
Parâmetros de tolerância a falhas
Em caso de problemas de conectividade de rede, ajuste estes parâmetros para evitar erros de timeout prematuros.
|
Parâmetro |
Padrão |
Unidade |
Descrição |
|
|
10 |
segundos |
Timeout de conexão. |
|
|
60 |
segundos |
Timeout do cache de registros DNS. |
|
|
1024 |
bit/s |
Taxa mínima aceitável de transmissão (equivalente a 1 Kbit/s). |
|
|
15 |
segundos |
Tempo máximo em que a taxa de transmissão pode permanecer abaixo de |
Com as configurações padrão, ocorre um erro de timeout se a taxa de transferência permanecer abaixo de 1 Kbit/s por 15 segundos consecutivos.
Parâmetros da tabela externa
Use estes parâmetros na cláusula OPTIONS do comando CREATE FOREIGN TABLE.
Parâmetros de seleção de arquivos
Especifique exatamente um entre filepath, dir ou prefix.
|
Parâmetro |
Suporte |
Descrição |
|
|
Apenas importação |
Nome do objeto ou padrão de prefixo para correspondência. Não inclui o nome do bucket. Corresponde a objetos chamados |
|
|
Importação e exportação |
Pasta do OSS para leitura ou gravação. Deve terminar com |
|
|
— |
Prefixo de caminho para corresponder a objetos. Não suporta expressões regulares. |
Parâmetros de formato
|
Parâmetro |
Descrição |
|
|
Formato do arquivo. Apenas |
|
|
Codificação de caracteres. Suporta codificações comuns do PostgreSQL, incluindo |
|
|
Caractere delimitador de colunas. |
|
|
Caractere de aspas para valores de campo. |
|
|
Caractere de escape. |
|
|
String a ser interpretada como NULL. Por exemplo, |
|
|
Nome da coluna cujos valores vazios são lidos como strings vazias em vez de NULL. Por exemplo, |
Parâmetros de compressão
|
Parâmetro |
Padrão |
Descrição |
|
|
|
Formato de compressão. Use |
|
|
6 |
Nível de compressão apenas para operações de gravação. Valores válidos: 1–9. |
Parâmetros de tolerância a falhas
|
Parâmetro |
Descrição |
|
|
Número de erros de análise no nível de linha tolerados durante a importação. Linhas com falha na análise são ignoradas silenciosamente. Não suportado para exportação — não defina este parâmetro ao gravar no OSS. |
Parâmetros específicos de gravação
Estes parâmetros aplicam-se apenas à gravação de dados no OSS.
|
Parâmetro |
Padrão |
Intervalo |
Unidade |
Descrição |
|
|
32 |
1–128 |
MB |
Tamanho do buffer para cada gravação no OSS. |
|
|
1024 |
8–4000 |
MB |
Tamanho máximo de um único objeto de saída no OSS. Ao atingir esse limite, os dados continuam em um novo objeto. |
|
|
3 |
1–8 |
threads |
Número de threads paralelas usadas para comprimir dados durante a gravação. |
Ferramentas auxiliares
Listar objetos correspondentes
A função oss_fdw_list_file retorna o nome e o tamanho de cada objeto do OSS correspondente a uma determinada tabela externa.
Assinatura:
oss_fdw_list_file(relname text, schema text DEFAULT 'public')
Parâmetros:
|
Parâmetro |
Tipo |
Descrição |
|
|
text |
Nome da tabela externa. |
|
|
text |
Esquema que contém a tabela externa. O padrão é |
Colunas de retorno:
|
Coluna |
Tipo |
Descrição |
|
|
text |
Caminho completo do objeto OSS, relativo à raiz do bucket. |
|
|
bigint |
Tamanho do objeto em bytes. |
Exemplo:
SELECT * FROM oss_fdw_list_file('ossexample');
Saída:
name | size
--------------------------------+-----------
osstest/test.gz.1 | 739698350
osstest/test.gz.2 | 739413041
osstest/test.gz.3 | 739562048
(3 rows)
Ler um único objeto
O parâmetro oss_fdw.rds_read_one_file limita a varredura da tabela externa a um objeto específico. Aplica-se apenas à importação.
SET oss_fdw.rds_read_one_file = 'osstest/test.gz.2';
SELECT * FROM oss_fdw_list_file('ossexample');
Saída:
name | size
--------------------------------+-----------
oss_test/test.gz.2 | 739413041
(1 rows)
Redefina este parâmetro para retomar a varredura normal de múltiplos objetos.
Proteger suas credenciais
Se os valores de id e key em CREATE SERVER forem armazenados em texto simples, qualquer usuário de banco de dados com acesso a pg_foreign_server poderá ler seu par de AccessKey:
SELECT * FROM pg_foreign_server;
Para proteger suas credenciais, use criptografia simétrica nos valores de id e key ao criar o servidor. Use uma chave de criptografia diferente para cada instância RDS. Quando criptografados, os valores aparecem como MD5**** em pg_foreign_server:
ossserver | 10 | 16390 | | | | {host=oss-cn-hangzhou-zmf.aliyuncs.com,id=MD5****,key=MD5****,bucket=067862}
Cada valor criptografado começa com MD5, e o comprimento total dividido por 8 resulta em 3. Após a exportação, os valores criptografados não são recriptografados. Não é possível criar AccessKey IDs e secrets que comecem com MD5 — o prefixo de criptografia é reservado.
Diferentemente do Greenplum, o oss_fdw não suporta a adição de tipos de dados durante a criptografia, o que preserva a compatibilidade com versões anteriores do PostgreSQL.
Observações de uso
Mantenha a instância RDS e o bucket do OSS na mesma região para maximizar o throughput de importação e exportação. Consulte Nomes de domínio do OSS para detalhes sobre endpoints.
O
oss_fdwlê e grava apenas no formato CSV, incluindo CSV comprimido com gzip.O desempenho da importação depende da CPU, I/O e memória disponíveis na instância RDS.
O parâmetro
parse_errorsé suportado apenas para leituras. Sua definição em uma tabela externa de exportação não é permitida.O parâmetro
filepathdestina-se apenas à importação. Para exportação, usedir.As opções
filepathedirsão mutuamente exclusivas. Especifique exatamente uma.
Solução de problemas
Erro: oss endpoint not in allow list
Se você visualizar o erro ERROR: oss endpoint userendpoint not in aliyun white list ao consultar uma tabela externa, alterne para o endpoint público do OSS da sua região. Consulte Regiões e endpoints.
Falhas de importação ou exportação
Quando uma operação falha, o OSS retorna detalhes do erro no log do PostgreSQL:
|
Campo |
Descrição |
|
|
Código de status HTTP da solicitação com falha. |
|
|
Código de erro retornado pelo OSS. |
|
|
Mensagem de erro retornada pelo OSS. |
|
|
UUID da solicitação com falha. Inclua este valor ao enviar um ticket de suporte. |
Para obter uma lista completa de códigos de erro do OSS, consulte:
Erros de timeout também podem ser resolvidos ajustando os parâmetros de tolerância a falhas em Parâmetros do servidor.