Todos los productos
Search
Centro de documentos

Hologres:COPY

Última actualización: Sep 18, 2026

Utilice COPY FROM STDIN para cargar datos en Hologres y COPY TO STDOUT para exportarlos. Hologres amplía la sintaxis estándar de PostgreSQL COPY con dos parámetros específicos: STREAM_MODE (modo de copia fijo) y ON_CONFLICT (política ante conflictos de clave primaria).

Todas las instrucciones COPY se deben ejecutar en un cliente de PostgreSQL. Para conocer los detalles de conexión, consulte PostgreSQL client.

Para supervisar las operaciones COPY, consulte hologres.hg_query_log. En Hologres V3.0 y versiones posteriores, cada operación genera dos registros: uno para el comando COPY y otro para la instrucción INSERT subyacente. Ambos se vinculan mediante el identificador de transacción. Consulte Registro de consultas para obtener más información.

Limitaciones

  • COPY FROM escribe únicamente en tablas particionadas secundarias, no en las tablas primarias.

  • COPY FROM STDIN es compatible con tablas que tienen una restricción DEFAULT o columnas SERIAL a partir de Hologres V1.1.43. Las versiones anteriores no admiten estos tipos de tabla.

Sintaxis

/* Import data */
COPY table_name [ ( column_name [, ...] ) ]
    FROM STDIN
    [ [ WITH ] ( option [, ...] ) ]

/* Export data */
COPY { ( query ) }
    TO STDOUT
    [ [ WITH ] ( option [, ...] ) ]

El option puede ser uno de los siguientes:

FORMAT format_name                        -- TEXT (default), CSV, or BINARY
DELIMITER 'delimiter_character'
NULL 'null_string'
HEADER [ boolean ]                        -- CSV only
QUOTE 'quote_character'                   -- CSV only
ESCAPE 'escape_character'                 -- CSV only
FORCE_QUOTE { ( column_name [, ...] ) | * }  -- CSV, COPY TO only
FORCE_NOT_NULL ( column_name [, ...] )    -- CSV, COPY FROM only
ENCODING 'encoding_name'
STREAM_MODE [ boolean ]                   -- Hologres-specific; COPY FROM only
ON_CONFLICT 'none|ignore|update'          -- Hologres-specific; COPY FROM only

Parámetros

Parámetro

Descripción

table_name

Tabla de Hologres donde se importarán los datos.

query

Instrucción SELECT cuyos resultados se exportan.

STDIN

Lee la entrada desde la entrada estándar del cliente.

STDOUT

Escribe la salida en la salida estándar del cliente.

FORMAT

Formato del archivo: TEXT (predeterminado), CSV o BINARY. La importación en formato BINARY solo se admite en el modo de copia fijo (STREAM_MODE TRUE).

DELIMITER

Separador de columnas. Valor predeterminado: tabulación (\t) para TEXT y coma (,) para CSV. Ejemplo: DELIMITER AS ','.

NULL

Cadena que representa un valor nulo. Valor predeterminado: \N para TEXT y cadena vacía sin comillas para CSV. No es compatible con BINARY.

HEADER

Indica si el archivo incluye una fila de encabezado. Solo para CSV.

QUOTE

Carácter de un byte que delimita los valores de campo. Solo para CSV. Valor predeterminado: ".

ESCAPE

Carácter de un byte que precede a una coincidencia de QUOTE. Solo para CSV. Valor predeterminado: el mismo que QUOTE.

FORCE_QUOTE

Fuerza el uso de comillas en todos los valores distintos de NULL de las columnas especificadas. Solo para CSV y COPY TO.

FORCE_NOT_NULL

Trata las cadenas que representan valores nulos como cadenas de longitud cero en lugar de NULL. Solo para CSV y COPY FROM.

ENCODING

Codificación del archivo. Valor predeterminado: la codificación del cliente.

STREAM_MODE

Habilita el modo de copia fijo para las importaciones. Valor predeterminado: FALSE. Cuando se establece en TRUE, utiliza un plan de ejecución fijo con un bloqueo a nivel de fila en lugar de un bloqueo a nivel de tabla. Solo para COPY FROM.

ON_CONFLICT

Política aplicada cuando ocurre una colisión de clave primaria. Los valores no distinguen entre mayúsculas y minúsculas si se escriben sin comillas; si se usan comillas simples, escríbalos en minúsculas (por ejemplo, 'none'). Solo para COPY FROM. Consulte Comportamiento de ON_CONFLICT por versión.

Valores de ON_CONFLICT:

Valor

Comportamiento

Cuándo utilizarlo

NONE

Reporta un error cuando hay conflicto.

Integridad estricta de datos: cada fila debe ser nueva.

IGNORE

Omite la fila en conflicto.

Cargas idempotentes donde se esperan duplicados y se debe conservar el registro existente.

UPDATE

Sobrescribe la fila en conflicto.

Patrones upsert en los que prevalece el valor más reciente.

Comportamiento de ON_CONFLICT por versión

  • Antes de V3.0.4: ON_CONFLICT surte efecto únicamente cuando STREAM_MODE TRUE.

  • V3.0.4 y posteriores: ON_CONFLICT también surte efecto cuando STREAM_MODE FALSE, siempre que el parámetro GUC hg_experimental_copy_enable_on_conflict esté habilitado. Con STREAM_MODE FALSE, UPDATE requiere escribir todas las columnas.

  • V3.1.1 y posteriores: cuando STREAM_MODE FALSE, UPDATE admite importaciones de columnas parciales (hg_experimental_copy_enable_on_conflict está habilitado de forma predeterminada).

Atomicidad

El comando COPY estándar (STREAM_MODE FALSE) garantiza la atomicidad: toda la operación se completa con éxito o se revierte.

El modo de copia fijo (STREAM_MODE TRUE) usa un bloqueo a nivel de fila en lugar de uno a nivel de tabla, por lo que no garantiza la atomicidad. Si una fila contiene datos no válidos, se reporta un error solo para esa fila. Las filas restantes podrían escribirse de forma parcial o no escribirse en absoluto.

Registro de consultas

En Hologres V3.0 y versiones posteriores, cada operación COPY genera dos registros en hologres.hg_query_log: uno para el comando COPY y otro para la instrucción INSERT que se ejecuta internamente. Vincúlelos mediante el identificador de transacción:

SELECT
    query_id,
    query,
    extended_info
FROM
    hologres.hg_query_log
WHERE
    extended_info ->> 'source_trx' = '<transaction_id>'  -- Get the transaction ID from the trans_id field in the COPY log record
ORDER BY
    query_start;

En versiones anteriores a V3.0, cada operación COPY genera un único registro.

Importar datos a Hologres

Importar desde un cliente de PostgreSQL (stdin)

El cliente de PostgreSQL solo puede leer desde stdin. La consola HoloWeb no admite importaciones desde stdin.

Ejemplo 1: importar texto delimitado

-- Create the target table
CREATE TABLE copy_test (
    id    int,
    age   int,
    name  text
);

-- Import data from stdin
COPY copy_test FROM STDIN WITH DELIMITER AS ',' NULL AS '';
53444,24,wangming
55444,38,ligang
55444,38,luyong
\.

-- Verify
SELECT * FROM copy_test;

Ejemplo 2: importar un archivo CSV

-- Create the target table
CREATE TABLE partsupp (
    ps_partkey     integer NOT NULL,
    ps_suppkey     integer NOT NULL,
    ps_availqty    integer NOT NULL,
    ps_supplycost  float   NOT NULL,
    ps_comment     text    NOT NULL
);

-- Import CSV from stdin
COPY partsupp FROM STDIN WITH DELIMITER '|' CSV;
1|2|3325|771.64|final theodolites
1|25002|8076|993.49|ven ideas
\.

-- Verify
SELECT * FROM partsupp;

Ejemplo 3: importar un archivo local con psql

Redirija un archivo local hacia stdin mediante el operador de redirección del shell de psql:

psql -U <username> -p <port> -h <endpoint> -d <databasename> \
    -c "COPY <table> FROM STDIN WITH DELIMITER '|' CSV;" <<filename>;

Parámetro

Descripción

Ejemplo

username

Cuenta de Alibaba Cloud: AccessKey ID. Cuenta personalizada: nombre de usuario (por ejemplo, BASIC$abc). Almacene el AccessKey ID en una variable de entorno para evitar exponerlo en los comandos.

—

port

Puerto público de la instancia de Hologres.

80

endpoint

Endpoint público de la instancia de Hologres.

xxx-cn-hangzhou.hologres.aliyuncs.com

databasename

Nombre de la base de datos de Hologres.

mydb

table

Nombre de la tabla de destino.

—

filename

Ruta del archivo local.

D:\tmp\copy_test.csv

A continuación se muestra un ejemplo que importa el archivo local copy_test mediante este comando:

11212

El archivo contiene lo siguiente:

01,01,name1
02,01,name2
03,01,name3
04,01,name4

Una vez finalizada la importación, consulte los resultados en psql:

查询结果

Importar desde un cliente JDBC con CopyManager

Los clientes Java Database Connectivity (JDBC) pueden usar CopyManager para transmitir archivos hacia Hologres. Esta clase es el contenedor API del controlador JDBC de PostgreSQL para el comando COPY.

package com.aliyun.hologram.test.jdbc;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.sql.*;
import java.util.Properties;

import org.postgresql.copy.CopyManager;
import org.postgresql.core.BaseConnection;

public class jdbcCopyFile {

    public static void main(String args[]) throws Exception {
        System.out.println(copyFromFile(getConnection(), "/Users/feng/Workspace/region.tbl", "region"));
    }

    public static Connection getConnection() throws Exception {
        Class.forName("org.postgresql.Driver");
        String url = "jdbc:postgresql://endpoint:port/dbname";
        Properties props = new Properties();
        // Store credentials in environment variables to avoid hardcoding them
        props.setProperty("user", "AAA");     // AccessKey ID
        props.setProperty("password", "BBB"); // AccessKey secret
        return DriverManager.getConnection(url, props);
    }

    /**
     * Streams a local file into Hologres via COPY FROM STDIN.
     *
     * @param connection  Active JDBC connection
     * @param filePath    Path to the local file
     * @param tableName   Target Hologres table
     * @return Number of rows imported
     */
    public static long copyFromFile(Connection connection, String filePath, String tableName)
            throws SQLException, IOException {
        long count = 0;
        FileInputStream fileInputStream = null;

        try {
            CopyManager copyManager = new CopyManager((BaseConnection) connection);
            fileInputStream = new FileInputStream(filePath);
            count = copyManager.copyIn("COPY " + tableName + " FROM STDIN delimiter '|' csv", fileInputStream);
        } finally {
            if (fileInputStream != null) {
                try {
                    fileInputStream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
        return count;
    }
}

Modo de copia fijo

El modo de copia fijo (STREAM_MODE TRUE) utiliza planes de ejecución fijos precompilados para acelerar las importaciones repetidas con COPY. Se trata de una optimización específica de Hologres, disponible desde la versión V1.3.17, que aplica exclusivamente a las importaciones. Para comparar este método con otros modos de escritura por lotes, consulte Comparison of batch write modes. Para conocer el mecanismo subyacente, consulte Accelerate SQL execution with fixed plan.

Escritura en un subconjunto de columnas: actualización parcial

Cuando se configura ON_CONFLICT UPDATE y el comando COPY escribe solo en algunas columnas, las columnas excluidas de la lista no se modifican:

CREATE TABLE t0 (id int NOT NULL, name text, age int, primary key(id));

COPY t0(id, name) FROM STDIN
WITH (
    STREAM_MODE TRUE,
    ON_CONFLICT UPDATE
);

-- Equivalent INSERT INTO statement:
INSERT INTO t0(id, name) VALUES(?, ?)
ON CONFLICT(id) DO UPDATE SET
    id = excluded.id, name = excluded.name;

Escritura en un subconjunto de columnas: columnas con valores predeterminados

Si una columna fuera de la lista de COPY tiene un valor DEFAULT, Hologres aplica dicho valor solo a las filas nuevas. Las filas existentes que coincidan por clave primaria no se actualizan en esa columna:

CREATE TABLE t0 (id int NOT NULL, name text, age int DEFAULT 0, primary key(id));

COPY t0(id, name) FROM STDIN
WITH (
    STREAM_MODE TRUE,
    ON_CONFLICT UPDATE
);

-- Equivalent INSERT INTO statement:
-- For a new row (no matching id), age is set to its default value.
-- For an existing row (matching id), age is not updated.
INSERT INTO t0(id, name, age) VALUES(?, ?, DEFAULT)
ON CONFLICT(id) DO UPDATE SET
    id = excluded.id, name = excluded.name;

Exportar datos desde Hologres

Exportar a un archivo local

Los dos métodos descritos a continuación están disponibles únicamente en el cliente de PostgreSQL.

Con el metacomando \copy (psql)

-- Create and populate a table
CREATE TABLE copy_to_local (
    id    int,
    age   int,
    name  text
);

INSERT INTO copy_to_local VALUES
    (1, 1, 'a'),
    (1, 2, 'b'),
    (1, 3, 'c'),
    (1, 4, 'd');

-- Export to a local file
\COPY (SELECT * FROM copy_to_local) TO '/root/localfile.txt';

Mediante la redirección de stdout (psql)

psql -U <username> -p <port> -h <endpoint> -d <databasename> \
    -c "COPY (SELECT * FROM <tablename>) TO STDOUT WITH DELIMITER '|' CSV;" > <filename>

Exportar a Object Storage Service (OSS)

Utilice el programa hg_dump_to_oss junto con COPY TO PROGRAM para exportar datos de Hologres a un bucket de OSS. Cada exportación tiene un límite de 5 GB.

Requisitos previos

Solo los superusuarios y los usuarios con el rol pg_execute_server_program pueden ejecutar hg_dump_to_oss. Otorgue el rol de la siguiente manera:

-- Simple permission model (SPM)
CALL spm_grant('pg_execute_server_program', '<Alibaba Cloud account ID, email address, or RAM user account>');

-- Standard PostgreSQL authorization model
GRANT pg_execute_server_program TO <account>;

Sintaxis

COPY (query) TO PROGRAM 'hg_dump_to_oss
    --AccessKeyId <access_key_id>
    --AccessKeySecret <access_key_secret>
    --Endpoint <oss_classic_network_endpoint>
    --BucketName <bucket_name>
    --DirName <directory>
    [--FileName <file_name>]
    [--BatchSize <n>]'
(DELIMITER ',', HEADER true, FORMAT CSV);
Importante

DirName no puede comenzar con / ni con \.

Parámetros

Parámetro

Descripción

Ejemplo

query

Instrucción SELECT cuyos resultados se exportan.

SELECT * FROM dual;

AccessKeyId

AccessKey ID. Almacénelo en una variable de entorno para evitar exponer las credenciales.

—

AccessKeySecret

Secreto del AccessKey. Almacénelo en una variable de entorno.

—

Endpoint

Endpoint de red clásica del bucket de OSS. Utilice el endpoint de red clásica, no el público ni el de VPC. Encuéntrelo en la página de detalles del bucket o en Regions and OSS endpoints.

oss-cn-beijing-internal.aliyuncs.com

BucketName

Nombre del bucket de OSS.

dummy_bucket

DirName

Ruta del directorio en OSS. No puede comenzar con / ni con \.

testdemo/

FileName

(Opcional) Nombre del archivo de salida. No puede contener los siguientes caracteres: `` ; # '

? ~ < ( ) " $ \ { } [ ] & * \n \r ``.

file_name

BatchSize

Número de filas procesadas por lote. Valor predeterminado: 1000.

5000

DELIMITER

Separador de campos en el archivo de salida. Valor predeterminado: tabulación (\t).

,

Ejemplos

-- Export from a Hologres internal table to OSS
COPY (SELECT * FROM holo_test LIMIT 2)
TO PROGRAM 'hg_dump_to_oss
    --AccessKeyId <access_id>
    --AccessKeySecret <access_key>
    --Endpoint oss-cn-hangzhou-internal.aliyuncs.com
    --BucketName hologres-demo
    --DirName holotest/
    --FileName file_name
    --BatchSize 3000'
DELIMITER ',';

-- Export from a Hologres foreign table to OSS
COPY (SELECT * FROM foreign_holo_test LIMIT 20)
TO PROGRAM 'hg_dump_to_oss
    --AccessKeyId <access_id>
    --AccessKeySecret <access_key>
    --Endpoint oss-cn-hangzhou-internal.aliyuncs.com
    --BucketName hologres-demo
    --DirName holotest/
    --FileName file_name
    --BatchSize 3000'
(DELIMITER ',', HEADER true);

-- Export to an OSS bucket in a different region
-- (e.g., from a Hologres instance in China (Hangzhou) to an OSS bucket in China (Beijing))
COPY (SELECT * FROM holo_test_1 LIMIT 20)
TO PROGRAM 'hg_dump_to_oss
    --AccessKeyId <access_id>
    --AccessKeySecret <access_key>
    --Endpoint oss-cn-beijing-internal.aliyuncs.com
    --BucketName hologres-demo
    --DirName holotest/
    --FileName file_name
    --BatchSize 3000'
(DELIMITER ',', HEADER true, FORMAT CSV);

Solución de problemas

Error

Causa

Solución

ERROR: syntax error at or near ")" LINE 1: COPY (select 1,2,3 from ) TO PROGRAM 'hg_dump_to_oss2 --Acce...

El parámetro query contiene una instrucción SQL no válida.

Corrija la sintaxis de la consulta.

DETAIL: child process exited with exit code 255

El endpoint de OSS utiliza un tipo de red incorrecto.

Utilice el endpoint de red clásica del bucket de OSS.

DETAIL: command not found

El argumento PROGRAM no está configurado como hg_dump_to_oss.

Corrija el nombre del programa.

DETAIL: child process exited with exit code 101

El valor de AccessKeyId no es válido.

Utilice un AccessKey ID válido.

DETAIL: child process exited with exit code 102

El valor de AccessKeySecret no es válido.

Utilice el secreto de AccessKey correcto.

DETAIL: child process exited with exit code 103

El valor de Endpoint no es válido.

Utilice el endpoint de red clásica del bucket de OSS.

DETAIL: child process exited with exit code 104

El valor de BucketName no es válido.

Compruebe el nombre del bucket.

DETAIL: child process exited with exit code 105

Falta un parámetro obligatorio.

Compruebe que se hayan especificado todos los parámetros obligatorios.

ERROR: program "hg_dump_to_oss ..." failed DETAIL: child process exited with exit code 255

La instancia de Hologres no puede alcanzar la red de OSS.

Cambie al endpoint de red clásica. Para conocer los detalles de los endpoints, consulte OSS regions and endpoints.

Exportar desde un cliente JDBC con CopyManager

import org.postgresql.copy.CopyManager;
import org.postgresql.core.BaseConnection;

import java.io.FileOutputStream;
import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.Properties;

public class copy_to_local_file {

    public static void main(String args[]) throws Exception {
        System.out.println(copyToFile(getConnection(), "/Users/feng/Workspace/region.tbl", "select * from region"));
    }

    public static Connection getConnection() throws Exception {
        Class.forName("org.postgresql.Driver");
        String url = "jdbc:postgresql://endpoint:port/dbname";
        Properties props = new Properties();
        // Store credentials in environment variables to avoid hardcoding them
        props.setProperty("user", "AAA");     // AccessKey ID
        props.setProperty("password", "BBB"); // AccessKey secret
        return DriverManager.getConnection(url, props);
    }

    /**
     * Streams a Hologres query result into a local file via COPY TO STDOUT.
     *
     * @param connection  Active JDBC connection
     * @param filePath    Destination file path
     * @param SQL_Query   SELECT statement to export
     * @return Path of the written file
     */
    public static String copyToFile(Connection connection, String filePath, String SQL_Query)
            throws SQLException, IOException {

        FileOutputStream fileOutputStream = null;

        try {
            CopyManager copyManager = new CopyManager((BaseConnection) connection);
            fileOutputStream = new FileOutputStream(filePath);
            copyManager.copyOut("COPY (" + SQL_Query + ") TO STDOUT DELIMITER '|' csv", fileOutputStream);
        } finally {
            if (fileOutputStream != null) {
                try {
                    fileOutputStream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
        return filePath;
    }
}

Pasos siguientes