perl - example - ¿Cómo puedo usar DBI para ejecutar un comando "/ copy from remote table" en Postgres?
perl dbi example (5)
Necesito copiar desde un servidor remoto de postgres a uno local. No puedo usar ninguna herramienta ETL; debe hacerse usando Perl con DBI. Esta información será grande, por lo que no quiero usar "seleccionar de fuente" e "insertar en local". Estaba buscando usar COPY para crear un archivo, pero este archivo se creará en el servidor remoto. No puedo hacer eso tampoco. Quiero usar / COPY en su lugar.
¿Cómo puedo usar DBI para ejecutar un comando "/ copy from remote table" y crear un archivo local usando DBI en Perl?
Gracias
Definitivamente desea utilizar los comandos "copiar desde" y "copiar a" para obtener los datos dentro y fuera de las bases de datos de manera eficiente. Son órdenes de magnitud más rápidos que iterar sobre filas de datos. También es posible que desee desactivar los índices mientras está copiando datos en la tabla de destino, luego habilítelos (y déjelos construir) cuando la copia esté completa.
Suponiendo que simplemente se está conectando a los puertos de escucha de las dos bases de datos, simplemente abra una conexión a la base de datos fuente, copie la (s) tabla (s) a un archivo, abra una conexión a la base de datos de destino y copie el archivo a la tabla de destino.
Lo hice funcionar usando / copy (select * from remote_table) a ''/local/file.txt'' ... luego / copy local_table from ''/local/file.txt'' para cargar el archivo en el db local. Ejecuté el comando / copy desde un script psql.
Aquí está mi script
exportar PGUSER = exportación del usuario remoto PGPASSWORD = remotepwd
/opt/PostgreSQL/8.3/bin/psql -h xx.xx.xx -p 5432 -d remotedb -c "/ COPY (seleccione * de remote_table donde date (reccreationtim e) = date ((current_date - interval ''4 day'') ))) TO ''/local/copied_from_remote.txt'' D ELIMITER ''|'' "
exportar PGUSER = exportación de localizador PGPASSWORD = localpwd
/opt/PostgreSQL/8.3/bin/psql -h xx.xx.xx.xx -p 5432 -d localdb -c "/ COPY local_table FROM ''/local/copied_from_remote.txt'' DELIMITER ''|''"
Podría usar ~ / .pgpass y ahorrarse las cosas de exportación de PGUSER, y mantener la contraseña fuera del entorno ... (siempre es una buena idea desde una perspectiva de seguridad)
Puede hacerlo en perl con DBD :: Pg, los detalles se pueden encontrar aquí:
Hmm. /copy to ...
es una directiva psql
, no SQL, por lo que DBI o el servidor PostgreSQL en el otro extremo no lo entenderán.
Veo que el comando SQL COPY
PostgreSQL tiene opciones FROM STDIN
y TO STDOUT
, pero dudo que DBI tenga una forma de realizar las "lecturas en bruto" necesarias para acceder a los datos del resultado. (Estoy seguro de que TO STDOUT
es cómo psql
implementa internamente /copy to ...
)
Entonces: en tu caso, volvería a montar una carpeta en tu caja de origen en tu caja de destino utilizando, por ejemplo, samba o nfs, y COPY TO ''/full/path/to/mounted/folder/data.txt'' ...
.