A extensão oss_fdw é um foreign data wrapper (FDW) para o PolarDB for PostgreSQL que mapeia objetos do Object Storage Service (OSS) para tabelas externas. Com a oss_fdw, leia e grave dados no OSS por meio de SQL padrão. Esse recurso é ideal para arquivar dados históricos, dados somente leitura e dados frios, reduzindo custos de armazenamento.
O OSS é um serviço de armazenamento em nuvem seguro, econômico e altamente confiável, com 99,995% de disponibilidade de dados.
Pré-requisitos
Ative o OSS e crie um bucket. O que é o OSS?
-
O cluster do PolarDB for PostgreSQL deve executar uma das seguintes versões do mecanismo:
PostgreSQL 16 (versão de revisão 2.0.16.6.2.0 ou posterior)
PostgreSQL 14 (versão de revisão 2.0.14.5.3.0 ou posterior)
PostgreSQL 11 (versão de revisão 2.0.11.2.1.0 ou posterior)
Visualize a versão de revisão no console ou execute SHOW polardb_version; para consultá-la. Para atualizar, consulte Gerenciamento de versões.
Limitações
As tabelas externas da oss_fdw suportam apenas SELECT, INSERT e TRUNCATE. Não há suporte para UPDATE e DELETE. Após a gravação no OSS, os dados podem ser lidos, mas não modificados no local.
Referência de opções de tabela externa
Use estas opções ao criar uma tabela externa do OSS:
|
Opção |
Descrição |
Valor de exemplo |
|
|
Mapeia a tabela externa para um diretório do OSS. Cada comando |
|
|
|
Mapeia a tabela externa para um prefixo de nome de arquivo. Cada comando |
|
|
|
Formato dos dados. Padrão: |
|
|
|
Algoritmo de compactação. Padrão: nenhum. Valores válidos: |
|
|
|
Nível de compactação. Níveis mais altos geram arquivos menores, mas consomem mais CPU. |
|
Especifique dir ou prefix para definir o caminho do OSS da tabela externa.
Instale a extensão
CREATE EXTENSION oss_fdw;
Crie um servidor de dados externo
Defina a conexão entre o cluster do PolarDB e um bucket do OSS.
CREATE SERVER ossserver
FOREIGN DATA WRAPPER oss_fdw
OPTIONS (
host 'oss-cn-xxx.aliyuncs.com',
bucket 'mybucket',
id 'xxx',
key 'xxx'
);
As opções do servidor são:
|
Parâmetro |
Descrição |
|
|
Endpoint do OSS |
|
|
Nome do bucket do OSS |
|
|
AccessKey ID da sua conta Alibaba Cloud |
|
|
AccessKey secret da sua conta Alibaba Cloud |
Mapeie uma tabela externa para um diretório do OSS
-
Crie uma tabela externa do OSS mapeada para um diretório.
CREATE FOREIGN TABLE t1_oss ( id INT, f FLOAT, txt TEXT ) SERVER ossserver OPTIONS (dir 'archive/'); -
Insira dados. A gravação ocorre no diretório
archive/. Consulte a tabela para verificar:INSERT INTO t1_oss VALUES (generate_series(1,100), 0.1, 'hello');EXPLAIN SELECT COUNT(*) FROM t1_oss; QUERY PLAN ----------------------------------------------------------------- Aggregate (cost=6.54..6.54 rows=1 width=8) -> Foreign Scan on t1_oss (cost=0.00..6.40 rows=54 width=0) Directory on OSS: archive/ Number Of OSS file: 1 Total size of OSS file: 1292 bytes (5 rows) SELECT COUNT(*) FROM t1_oss; count ------- 100 (1 row) -
Cada comando
INSERTsubsequente cria um novo arquivo no mesmo diretório do OSS.INSERT INTO t1_oss VALUES (generate_series(1,100), 0.1, 'hello'); EXPLAIN SELECT COUNT(*) FROM t1_oss; QUERY PLAN ------------------------------------------------------------------- Aggregate (cost=12.07..12.08 rows=1 width=8) -> Foreign Scan on t1_oss (cost=0.00..11.80 rows=108 width=0) Directory on OSS: archive/ Number Of OSS file: 2 Total size of OSS file: 2584 bytes (5 rows) SELECT COUNT(*) FROM t1_oss; count ------- 200 (1 row) -
Execute
TRUNCATEpara remover todos os arquivos do OSS mapeados para a tabela externa.TRUNCATE t1_oss; SELECT COUNT(*) FROM t1_oss; WARNING: does not match any file in oss count ------- 0 (1 row)
Mapeie uma tabela externa para um prefixo de diretório
-
Crie uma tabela externa com a opção
prefix.CREATE FOREIGN TABLE t2_oss ( id INT, f FLOAT, txt TEXT ) SERVER ossserver OPTIONS (prefix 'prefix/file_'); -
Cada comando
INSERTgera um novo arquivo com o prefixo especificado.INSERT INTO t2_oss VALUES (generate_series(1,100), 0.1, 'hello'); INSERT INTO t2_oss VALUES (generate_series(1,100), 0.1, 'hello'); EXPLAIN SELECT COUNT(*) FROM t2_oss; QUERY PLAN ------------------------------------------------------------------- Aggregate (cost=12.07..12.08 rows=1 width=8) -> Foreign Scan on t2_oss (cost=0.00..11.80 rows=108 width=0) Directory on OSS: prefix/file_ Number Of OSS file: 2 Total size of OSS file: 2584 bytes (5 rows) SELECT COUNT(*) FROM t2_oss; count ------- 200 (1 row)
Especifique o formato de armazenamento
Por padrão, a oss_fdw armazena dados no formato CSV. Use a opção format para definir outro formato. Cada comando INSERT grava os dados no formato especificado em um arquivo do OSS.
CREATE FOREIGN TABLE t3_oss (
id INT,
f FLOAT,
txt TEXT
)
SERVER ossserver
OPTIONS (dir 'archive_csv/', format 'csv');
Liste os arquivos de uma tabela externa do OSS
-
Crie uma tabela externa e execute três comandos
INSERTpara gravar dados em três arquivos do OSS.CREATE FOREIGN TABLE t4_oss ( id INT, f FLOAT, txt TEXT ) SERVER ossserver OPTIONS (dir 'archive_file_list/'); INSERT INTO t4_oss VALUES (generate_series(1,10000), 0.1, 'hello'); INSERT INTO t4_oss VALUES (generate_series(1,10000), 0.1, 'hello'); INSERT INTO t4_oss VALUES (generate_series(1,10000), 0.1, 'hello'); -
Chame
oss_fdw_list_file()para listar os arquivos associados a uma tabela externa. Opcionalmente, passe o nome do schema (o padrão épublic).SELECT * FROM oss_fdw_list_file('t4_oss'); name | size -------------------------------------------+-------- archive_file_list/_t4_oss_783053364762580 | 148894 archive_file_list/_t4_oss_783053364849053 | 148894 archive_file_list/_t4_oss_783053366496328 | 148894 (3 rows) SELECT * FROM oss_fdw_list_file('t4_oss', 'public'); name | size -------------------------------------------+-------- archive_file_list/_t4_oss_783053364762580 | 148894 archive_file_list/_t4_oss_783053364849053 | 148894 archive_file_list/_t4_oss_783053366496328 | 148894 (3 rows)
Compacte dados com gzip ou Zstandard
A opção compressiontype define o algoritmo de compactação. Padrão: nenhum. Valores válidos: gzip e zstd.
A opção compressionlevel controla o equilíbrio entre tamanho do arquivo e uso da CPU. Níveis mais altos produzem arquivos menores e reduzem o volume de transferência de rede, mas exigem mais processamento.
|
Algoritmo |
Faixa de nível de compactação |
Nível padrão |
Requisito de versão |
|
gzip |
1 a 9 |
6 |
Todas as versões de mecanismo suportadas |
|
Zstandard (zstd) |
-7 a 22 |
6 |
PostgreSQL 14 (versão de revisão 14.9.13.0 ou posterior) |
Compactação gzip
Os níveis de compactação gzip variam de 1 a 9, com padrão 6.
CREATE FOREIGN TABLE t5_oss (
id INT,
f FLOAT,
txt TEXT
)
SERVER ossserver
OPTIONS (
dir 'archive_file_compression/',
compressiontype 'gzip',
compressionlevel '9'
);
INSERT INTO t5_oss VALUES (generate_series(1,10000), 0.1, 'hello');
INSERT INTO t5_oss VALUES (generate_series(1,10000), 0.1, 'hello');
INSERT INTO t5_oss VALUES (generate_series(1,10000), 0.1, 'hello');
Compare os tamanhos dos arquivos compactados e não compactados:
SELECT * FROM oss_fdw_list_file('t4_oss');
name | size
-------------------------------------------+--------
archive_file_list/_t4_oss_741147680906121 | 148894
archive_file_list/_t4_oss_741147680965631 | 148894
archive_file_list/_t4_oss_741147681201236 | 148894
(3 rows)
SELECT * FROM oss_fdw_list_file('t5_oss');
name | size
-----------------------------------------------------+-------
archive_file_compression/_t5_oss_741147752563794.gz | 23654
archive_file_compression/_t5_oss_741147752633713.gz | 23654
archive_file_compression/_t5_oss_741147752828680.gz | 23654
(3 rows)
Compactação Zstandard
A compactação Zstandard (zstd) tem suporte apenas em clusters com PostgreSQL 14 (versão de revisão 14.9.13.0 ou posterior).
Os níveis de compactação Zstandard variam de -7 a 22, com padrão 6.
CREATE FOREIGN TABLE t6_oss (
id INT,
f FLOAT,
txt TEXT
)
SERVER ossserver
OPTIONS (
dir 'archive_file_zstd/',
compressiontype 'zstd',
compressionlevel '9'
);
INSERT INTO t6_oss VALUES (generate_series(1,10000), 0.1, 'hello');
INSERT INTO t6_oss VALUES (generate_series(1,10000), 0.1, 'hello');
INSERT INTO t6_oss VALUES (generate_series(1,10000), 0.1, 'hello');
Compare os tamanhos dos arquivos compactados e não compactados:
SELECT * FROM oss_fdw_list_file('t4_oss');
name | size
-------------------------------------------+--------
archive_file_list/_t4_oss_741147680906121 | 148894
archive_file_list/_t4_oss_741147680965631 | 148894
archive_file_list/_t4_oss_741147681201236 | 148894
(3 rows)
SELECT * FROM oss_fdw_list_file('t6_oss');
name | size
-----------------------------------------------+------
archive_file_zstd/_t6_oss_748106174612293.zst | 6710
archive_file_zstd/_t6_oss_748106174700206.zst | 6710
archive_file_zstd/_t6_oss_748106174866829.zst | 6710
(3 rows)
Comparação de tamanho de compactação
Tamanhos de arquivo para 10.000 linhas (3 colunas) no nível de compactação 9:
|
Compactação |
Tamanho por arquivo |
Extensão do arquivo |
Redução |
|
Nenhuma |
148.894 bytes |
(nenhuma) |
-- |
|
gzip (nível 9) |
23.654 bytes |
|
~84% |
|
Zstandard (nível 9) |
6.710 bytes |
|
~95% |
Remova a extensão
DROP EXTENSION oss_fdw;