lunes, 3 de mayo de 2021

DBMS_FILE_TRANSFER - Copiar archivos binarios en la base de datos y entre bases de datos por medio de DBLINK

Introducido desde la versión 10g DBMS_FILE_TRANSFER es una API que nos permite realizar copiados de archivos binario dentro de la base de datos y/o entre base de datos Oracle si necesidad de comandos del sistema operativo.

Estos nos facilita tarea de copiado de archivos en la base o entre base sin tener que ingresar a un cmd o ssh.

Consideraciones

  • Hay tener en cuenta que cuando digo archivos binarios me refiero a : Datafiles, Controlfiles, Redologs, Archivelogs, Backups, Exports DMP, ect.
  • Los archivos copiado deben de tener tamaño multiple de 512 bytes.
  • El archivo a copiar debe de ser menor o igual a 2Tb.
  • El usuario debe tener privilegios de lectura en el objeto del directorio de origen y privilegios de escritura en el objeto del directorio de destino.
Procedimientos disponible:
  • COPY_FILE (Local a Local)Lee un archivo local y crea una copia del mismo en el sistema de archivos local, es decir en el mimo servidor.
  • GET_FILE(De Remota a Local) Conecta con una base de datos remota por medio de un DBLINK para leer un archivo remoto y luego crea una copia del archivo en el sistema de archivos local.
  • PUT_FILE(De una Local a Remota) Lee un archivo local y contacta con una base de datos remota por medio de un DBLINK para crear una copia del archivo en el sistema de archivos remoto.

Procedimiento COPY_FILE
Copiado de archivos en el mismo servidor.
Sintaxis
DBMS_FILE_TRANSFER.COPY_FILE(
                               source_directory_object       IN  VARCHAR2,
                               source_file_name              IN  VARCHAR2,
                               destination_directory_object  IN  VARCHAR2,
                               destination_file_name         IN  VARCHAR2);

ParámetroDescripción

source_directory_object

El objeto de directorio desde el que se copia el archivo en el sistema

 de archivos local. Este objeto de directorio debe existir.

source_file_name

El nombre del archivo que se copia en el sistema de archivos local. 

Este archivo debe existir en el sistema de archivos local en el

 directorio asociado con el objeto del directorio de origen.

destination_directory_object

El objeto de directorio en el que se coloca el archivo en el sistema de

 archivos local. Este objeto de directorio debe existir en el sistema de

 archivos local.

destination_file_name

El nombre del archivo copiado en el objeto de directorio de destino en

 el sistema de archivos local. Un archivo con el mismo nombre no

 debe existir en el directorio de destino del sistema de archivos local.

Ejemplo
--Copiar EXPFULLDB.DMP de la ruta /u01/oradmp/ a /u02/oradmp/
-- Crear directorios para el copiado de un archivo DMP.
CREATE OR REPLACE DIRECTORY dmp_files_dir1 AS '/u01/oradmp/';
CREATE OR REPLACE DIRECTORY dmp_files_dir2 AS '/u02/oradmp/';

-- Copiar
BEGIN
  DBMS_FILE_TRANSFER.copy_file(
   source_directory_object      => 'DMP_FILES_DIR1',--Directorio Origen
   source_file_name             => 'EXPFULLDB.DMP',--Archivo origen a copiar
   destination_directory_object => 'DMP_FILES_DIR2',--Directorio destino
   destination_file_name        => 'EXPFULLDB.DMP'/*Nombre archivo destino*/);
END; /

Procedimiento GET_FILE
Copiado de archivos desde una base remota hacia la local.
Sintaxis
DBMS_FILE_TRANSFER.GET_FILE(
                           source_directory_object IN VARCHAR2,    
                           source_file_name IN VARCHAR2,  
                           source_database IN VARCHAR2,  
                           destination_directory_object IN VARCHAR2,
                        destination_file_name IN VARCHAR2);
ParámetroDescripción

source_directory_object

El objeto de directorio desde el que se copia el archivo en el sitio de

 origen. Este objeto de directorio debe existir en el sitio de origen.

source_file_name

El nombre del archivo que se copia en el sistema de archivos

 remoto. Este archivo debe existir en el sistema de archivos remoto en

 el directorio asociado con el objeto del directorio de origen.

source_database

El nombre de un enlace de base de datos a la base de datos remota

 (DBLINK) donde se encuentra el archivo.

destination_directory_object

El objeto de directorio en el que se coloca el archivo en el sitio de

 destino. Este objeto de directorio debe existir en el sistema de

 archivos local.

destination_file_name

El nombre del archivo copiado en el sistema de archivos local. Un

 archivo con el mismo nombre no debe existir en el directorio de

 destino del sistema de archivos local.


Ejemplo.
Desde la base de datos ORCL01 vamos a traer desde la base de datos Remota ORCL02 instanciada con el DBLINK DBL_ORCL02 el archivo de EXPDP_FULL_ORCL02.DMP. El archivo a traer se encuentra en el directorio DATA_PUMP_DIR y lo vamos a copiar en el mismo directorio directorio de la base de datos local.
- Vamos a copiar un DMP desde una base de datos remota hacia la base de datos Local.
- Consigue el archivo.
BEGIN
  DBMS_FILE_TRANSFER.get_file (
   source_directory_object => 'DATA_PUMP_DIR'/*Directorio origen base remota*/,
   source_file_name => 'EXPDP_FULL_ORCL02.DMP'/*Nombre del DMP remoto a descargar*/,
   source_database => 'DBL_ORCL02' /*DBlink de la base de datos remota*/,
   destination_directory_object  => 'DATA_PUMP_DIR'/*Directorio destino local de la base*/,
destination_file_name => 'EXPDP_FULL_ORCL02.DMP'/*Nombre del DMP destino*/);
END; /

Procedimiento PUT_FILE
Copiado des archivos desde una base local hacia una base de datos remota.
Sintaxis
DBMS_FILE_TRANSFER.PUT_FILE (
                               source_directory_object IN VARCHAR2,   
                               source_file_name IN VARCHAR2,
                               destination_directory_object IN VARCHAR2,
                               destination_file_name IN VARCHAR2,  
                               destination_database IN VARCHAR2);
ParámetroDescripción

source_directory_object

El objeto de directorio desde el que se copia el archivo en el sitio de

 origen local. Este objeto de directorio debe existir en el sitio de

 origen.

source_file_name

El nombre del archivo que se copia del sistema de archivos local. Este

 archivo debe existir en el sistema de archivos local en el directorio

 asociado con el objeto del directorio de origen.

destination_directory_object

El objeto de directorio en el que se coloca el archivo en el sitio de

 destino. Este objeto de directorio debe existir en el sistema de

 archivos remoto.

destination_file_name

El nombre del archivo colocado en el sistema de archivos remoto. Un

 archivo con el mismo nombre no debe existir en el directorio de

 destino del sistema de archivos remoto.

destination_database

El nombre de un enlace de base de datos a la base de datos remota en

 la que se copia el archivo.


Ejemplo
Desde la base de datos ORCL01 vamos a enviar el archivo EXPDP_FULL_ORCL01.DMP a una la base de datos Remota ORCL02 instanciada con el DBLINK DBL_ORCL02 . El archivo a enviar se encuentra en el directorio DATA_PUMP_DIR y lo vamos a copiar en el mismo directorio directorio de la base de datos local.
-- Vamos a copiar desde la base de datos local ORCL01 el archivo EXPDP_FULL_ORCL02.DMP
-- y enviarlo a la base de datos remota ORCL02 por medio del DBLINK DBL_ORCL02.

BEGIN
  DBMS_FILE_TRANSFER.put_file (
   source_directory_object => 'DATA_PUMP_DIR'/*Directorio origen local*/,
   source_file_name => 'EXPDP_FULL_ORCL01.DMP'/*Archivo origen local*/,
destination_directory_object => 'DATA_PUMP_DIR'/*Directorio destino remoto*/,
destination_file_name => 'EXPDP_FULL_ORCL01.DMP'/*Archivo destino remoto*/,
destination_database => 'DBL_ORCL02'/*DBLINK*/); END;/

Listo, ya vimos las tres forma de usar DBMS_FILE_TRANSFER, solo te toca ver cual se adapta a tu necesidad.