La extensión oss_fdw es un contenedor de datos externos (FDW) para ApsaraDB RDS for PostgreSQL que asigna buckets de Object Storage Service (OSS) a tablas externas de PostgreSQL. Úsela para consultar archivos CSV en OSS sin importarlos previamente, cargar grandes conjuntos de datos en su instancia de RDS o exportar datos de tablas a OSS para archivarlos y procesarlos posteriormente.
Requisitos previos
Antes de empezar, asegúrese de contar con lo siguiente:
Una instancia de RDS que ejecute PostgreSQL 10 o posterior
Si su instancia ejecuta PostgreSQL 14: una versión menor del motor 20220830 o posterior. Para actualizar, consulte Update the minor engine version
Un bucket de OSS en la misma región que su instancia de RDS (recomendado por rendimiento). Consulte Activate OSS y Create a bucket
Un AccessKey ID y un AccessKey Secret con acceso de lectura y escritura al bucket. Consulte Obtain an AccessKey pair
Funcionamiento
oss_fdw asigna uno o más objetos de OSS a una tabla externa de PostgreSQL. Las consultas sobre la tabla externa desencadenan un escaneo de los objetos coincidentes en OSS; no se copian datos a su instancia de RDS hasta que los inserta explícitamente. Todos los objetos de OSS deben estar en formato CSV, con compresión gzip opcional.
Para usar oss_fdw:
Instale la extensión.
Cree un servidor que almacene las credenciales de conexión a OSS.
Cree una tabla externa que se asigne a los objetos de OSS que desea leer o escribir.
Consulte o escriba datos a través de la tabla externa.
Configuración de oss_fdw
Paso 1: Instalar la extensión
CREATE EXTENSION oss_fdw;
Paso 2: Crear un servidor
El servidor almacena el endpoint de OSS, las credenciales y el nombre del bucket. Todas las conexiones desde la tabla externa pasan por este 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>'
);
|
Marcador |
Descripción |
|
|
Su AccessKey ID |
|
|
Su AccessKey Secret |
|
|
El nombre de su bucket de OSS |
Utilice el endpoint interno de su región para evitar tráfico por la red pública. Para encontrar el endpoint: inicie sesión en la OSS console, abra el bucket y revise el valor de Endpoint en la página de Overview.
Para consultar todos los parámetros de CREATE SERVER, incluido el ajuste de tolerancia a fallos, consulte Parámetros del servidor.
Paso 3: Crear una tabla externa
Defina una tabla externa cuyo esquema de columnas coincida con la estructura de los archivos CSV en 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'
);
El esquema de columnas debe coincidir exactamente con la estructura de los objetos de OSS. Una discrepancia provoca errores de importación.
La opción dir apunta a una carpeta de OSS. Se incluye todo el contenido de esa carpeta (excluyendo subcarpetas). Para dirigirse a archivos específicos, utilice filepath, pero tenga en cuenta que filepath solo admite importación, mientras que dir admite tanto importación como exportación.
Para consultar todos los parámetros de CREATE FOREIGN TABLE, consulte Parámetros de la tabla externa.
Importar datos desde OSS
Lea directamente desde OSS sin cargar datos en su instancia de RDS:
SELECT * FROM ossexample;
Cargue datos en una tabla local para acelerar las consultas posteriores:
-
Cree una tabla local con el mismo esquema:
CREATE TABLE example ( date text, time text, open float, high float, low float, volume int ); -
Inserte datos desde la tabla externa:
INSERT INTO example SELECT * FROM ossexample;
Antes de importar, ejecute EXPLAIN para estimar la cantidad de objetos de OSS coincidentes y obtener el plan de consulta:
EXPLAIN INSERT INTO example SELECT * FROM ossexample;
Salida 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 datos a OSS
Escriba datos de una tabla local hacia OSS:
INSERT INTO ossexample SELECT * FROM example;
Para la exportación, la tabla externa debe usar la opción dir (no filepath). Cada exportación escribe objetos en la carpeta de OSS especificada.
Para controlar el tamaño del archivo de salida y el paralelismo, utilice los parámetros específicos de escritura en Parámetros de la tabla externa.
Parámetros del servidor
Utilice estos parámetros en la cláusula OPTIONS de CREATE SERVER.
Parámetros de conexión
|
Parámetro |
Descripción |
|
|
El endpoint interno de OSS para su región. Encuéntrelo en la página de Overview del bucket en la consola de OSS. |
|
|
Su AccessKey ID. |
|
|
Su AccessKey Secret. |
|
|
El nombre de su bucket de OSS. |
Parámetros de tolerancia a fallos
Si experimenta problemas de conectividad de red, ajuste estos parámetros para evitar errores de tiempo de espera prematuros.
|
Parámetro |
Predeterminado |
Unidad |
Descripción |
|
|
10 |
segundos |
Tiempo de espera de conexión. |
|
|
60 |
segundos |
Tiempo de espera de la caché de registros DNS. |
|
|
1024 |
bit/s |
Tasa de transmisión mínima aceptable (equivalente a 1 Kbit/s). |
|
|
15 |
segundos |
Tiempo máximo que la tasa de transmisión puede permanecer por debajo de |
Con los valores predeterminados, ocurre un error de tiempo de espera si la tasa de transferencia se mantiene por debajo de 1 Kbit/s durante 15 segundos consecutivos.
Parámetros de la tabla externa
Utilice estos parámetros en la cláusula OPTIONS de CREATE FOREIGN TABLE.
Parámetros de selección de archivos
Especifique exactamente uno de los siguientes: filepath, dir o prefix.
|
Parámetro |
Compatible con |
Descripción |
|
|
Solo importación |
El nombre del objeto o patrón de prefijo a coincidir. No incluye el nombre del bucket. Coincide con objetos llamados |
|
|
Importación y exportación |
La carpeta de OSS desde la cual leer o hacia la cual escribir. Debe terminar con |
|
|
— |
Un prefijo de ruta para coincidir con objetos. No admite expresiones regulares. |
Parámetros de formato
|
Parámetro |
Descripción |
|
|
Formato de archivo. Solo se admite |
|
|
Codificación de caracteres. Admite codificaciones comunes de PostgreSQL, incluida |
|
|
Carácter delimitador de columnas. |
|
|
Carácter de comillas para valores de campo. |
|
|
Carácter de escape. |
|
|
Cadena a interpretar como NULL. Por ejemplo, |
|
|
Nombre de columna cuyos valores vacíos se leen como cadenas vacías en lugar de NULL. Por ejemplo, |
Parámetros de compresión
|
Parámetro |
Predeterminado |
Descripción |
|
|
|
Formato de compresión. Utilice |
|
|
6 |
Nivel de compresión solo para operaciones de escritura. Valores válidos: 1–9. |
Parámetros de tolerancia a fallos
|
Parámetro |
Descripción |
|
|
Cantidad de errores de análisis sintáctico a nivel de fila que se tolerarán durante la importación. Las filas que no se puedan analizar se omiten silenciosamente. No es compatible con exportación; no configure este parámetro al escribir en OSS. |
Parámetros específicos de escritura
Estos parámetros aplican únicamente al escribir datos en OSS.
|
Parámetro |
Predeterminado |
Rango |
Unidad |
Descripción |
|
|
32 |
1–128 |
MB |
Tamaño del búfer para cada escritura en OSS. |
|
|
1024 |
8–4000 |
MB |
Tamaño máximo de un solo objeto de salida en OSS. Al alcanzar este límite, los datos continúan en un nuevo objeto. |
|
|
3 |
1–8 |
hilos |
Cantidad de hilos paralelos utilizados para comprimir datos durante la escritura. |
Herramientas auxiliares
Listar objetos coincidentes
oss_fdw_list_file devuelve el nombre y el tamaño de cada objeto de OSS que coincide con una tabla externa determinada.
Firma:
oss_fdw_list_file(relname text, schema text DEFAULT 'public')
Parámetros:
|
Parámetro |
Tipo |
Descripción |
|
|
text |
El nombre de la tabla externa. |
|
|
text |
El esquema que contiene la tabla externa. El valor predeterminado es |
Columnas de retorno:
|
Columna |
Tipo |
Descripción |
|
|
text |
La ruta completa del objeto de OSS, relativa a la raíz del bucket. |
|
|
bigint |
Tamaño del objeto en bytes. |
Ejemplo:
SELECT * FROM oss_fdw_list_file('ossexample');
Salida:
name | size
--------------------------------+-----------
osstest/test.gz.1 | 739698350
osstest/test.gz.2 | 739413041
osstest/test.gz.3 | 739562048
(3 rows)
Leer un solo objeto
oss_fdw.rds_read_one_file limita el escaneo de una tabla externa a un objeto específico. Aplica solo a importación.
SET oss_fdw.rds_read_one_file = 'osstest/test.gz.2';
SELECT * FROM oss_fdw_list_file('ossexample');
Salida:
name | size
--------------------------------+-----------
oss_test/test.gz.2 | 739413041
(1 rows)
Restablezca este parámetro para reanudar el escaneo normal de múltiples objetos.
Proteja sus credenciales
Si los valores de id y key en CREATE SERVER se almacenan en texto plano, cualquier usuario de la base de datos con acceso a pg_foreign_server podrá leer su par de AccessKey:
SELECT * FROM pg_foreign_server;
Para proteger sus credenciales, utilice cifrado simétrico en los valores de id y key al crear el servidor. Utilice una clave de cifrado diferente para cada instancia de RDS. Cuando están cifrados, los valores aparecen como MD5**** en pg_foreign_server:
ossserver | 10 | 16390 | | | | {host=oss-cn-hangzhou-zmf.aliyuncs.com,id=MD5****,key=MD5****,bucket=067862}
Cada valor cifrado comienza con MD5, y la longitud total dividida entre 8 es igual a 3. Una vez exportados los valores cifrados, no se vuelven a cifrar. No se pueden crear AccessKey IDs ni secrets que comiencen con MD5, ya que el prefijo de cifrado está reservado.
A diferencia de Greenplum, oss_fdw no admite agregar tipos de datos durante el cifrado, lo cual preserva la compatibilidad con versiones anteriores de PostgreSQL.
Notas de uso
Ubique su instancia de RDS y su bucket de OSS en la misma región para maximizar el rendimiento de importación y exportación. Consulte OSS domain names para obtener detalles sobre los endpoints.
oss_fdwlee y escribe únicamente en formato CSV, incluido CSV comprimido con gzip.El rendimiento de la importación depende de la CPU, la E/S y la memoria disponibles en su instancia de RDS.
parse_errorssolo es compatible con operaciones de lectura. No se permite configurarlo en una tabla externa de exportación.filepathes solo para importación. Para exportación, utilicedir.Las opciones
filepathydirson mutuamente excluyentes. Especifique exactamente una.
Solución de problemas
Error: oss endpoint not in allow list
Si ve el error ERROR: oss endpoint userendpoint not in aliyun white list al consultar una tabla externa, cambie al endpoint público de OSS para su región. Consulte Regions and endpoints.
Fallos de importación o exportación
Cuando una operación falla, OSS devuelve detalles del error en el registro de PostgreSQL:
|
Campo |
Descripción |
|
|
Código de estado HTTP de la solicitud con errores. |
|
|
Código de error devuelto por OSS. |
|
|
Mensaje de error devuelto por OSS. |
|
|
UUID de la solicitud con errores. Incluya este valor al enviar un ticket de soporte. |
Para obtener una lista completa de códigos de error de OSS, consulte:
Los errores de tiempo de espera también pueden resolverse ajustando los parámetros de tolerancia a fallos en Parámetros del servidor.