Oracle Datapump : désactiver l’option Advanced Compression

L’import Datapump d’un fichier généré avec l’option COMPRESSION avec la valeur ALL ou DATA_ONLY active l’option Advanced Compression sur la base cible.
Pour éviter cette opération couteuse (en licence ou en temps de reconstruction de la base), il est possible de vérifier les caractéristiques du fichier généré avant l’import.

Pour cela, il suffit d’utiliser la fonction GET_DUMPFILE_INFO du package DBMS_DATAPUMP.

Les constantes associées au caractéristique d’un DUMP sont les suivantes :

   DBMS_DATAPUMP.KU$_DFHDR_FILE_VERSION         CONSTANT NUMBER := 1;
   DBMS_DATAPUMP.KU$_DFHDR_MASTER_PRESENT       CONSTANT NUMBER := 2;
   DBMS_DATAPUMP.KU$_DFHDR_GUID                 CONSTANT NUMBER := 3;
   DBMS_DATAPUMP.KU$_DFHDR_FILE_NUMBER          CONSTANT NUMBER := 4;
   DBMS_DATAPUMP.KU$_DFHDR_CHARSET_ID           CONSTANT NUMBER := 5;
   DBMS_DATAPUMP.KU$_DFHDR_CREATION_DATE        CONSTANT NUMBER := 6;
   DBMS_DATAPUMP.KU$_DFHDR_FLAGS                CONSTANT NUMBER := 7;
   DBMS_DATAPUMP.KU$_DFHDR_JOB_NAME             CONSTANT NUMBER := 8;
   DBMS_DATAPUMP.KU$_DFHDR_PLATFORM             CONSTANT NUMBER := 9;
   DBMS_DATAPUMP.KU$_DFHDR_INSTANCE             CONSTANT NUMBER := 10;
   DBMS_DATAPUMP.KU$_DFHDR_LANGUAGE             CONSTANT NUMBER := 11;
   DBMS_DATAPUMP.KU$_DFHDR_BLOCKSIZE            CONSTANT NUMBER := 12;
   DBMS_DATAPUMP.KU$_DFHDR_DIRPATH              CONSTANT NUMBER := 13;
   DBMS_DATAPUMP.KU$_DFHDR_METADATA_COMPRESSED  CONSTANT NUMBER := 14;
   DBMS_DATAPUMP.KU$_DFHDR_DB_VERSION           CONSTANT NUMBER := 15;
   -- Oracle11gR1:   
   DBMS_DATAPUMP.KU$_DFHDR_MASTER_PIECE_COUNT   CONSTANT NUMBER := 16;
   DBMS_DATAPUMP.KU$_DFHDR_MASTER_PIECE_NUMBER  CONSTANT NUMBER := 17;
   DBMS_DATAPUMP.KU$_DFHDR_DATA_COMPRESSED      CONSTANT NUMBER := 18;
   DBMS_DATAPUMP.KU$_DFHDR_METADATA_ENCRYPTED   CONSTANT NUMBER := 19;
   DBMS_DATAPUMP.KU$_DFHDR_DATA_ENCRYPTED       CONSTANT NUMBER := 20;
   -- Oracle11gR2:   
   DBMS_DATAPUMP.KU$_DFHDR_COLUMNS_ENCRYPTED    CONSTANT NUMBER := 21;
   DBMS_DATAPUMP.KU$_DFHDR_ENCRIPTION_MODE      CONSTANT NUMBER := 22;
   -- Oracle12cR1:   
   DBMS_DATAPUMP.KU$_DFHDR_COMPRESSION_ALG      CONSTANT NUMBER := 23;

Le code PL/SQL suivant permet de vérifier si le fichier DUMP utilise l’option Advanced Compression sur les données et/ou les méta-données :

SET SERVEROUTPUT ON LINES 200 PAGES 200
DECLARE
   v_dir                   VARCHAR2(30)  := '';
   v_file                  VARCHAR2(100) := '';
   n_index                 PLS_INTEGER;
   n_file_type             NUMBER;
   v_value                 VARCHAR2(2048);
   tab_dumpfile_info       KU$_DUMPFILE_INFO := KU$_DUMPFILE_INFO();
BEGIN
   DECLARE
     no_file_found            EXCEPTION;
     PRAGMA                   EXCEPTION_INIT(no_file_found, -39211);
   BEGIN
      DBMS_DATAPUMP.GET_DUMPFILE_INFO(v_file, v_dir, tab_dumpfile_info, n_file_type);
   EXCEPTION
      WHEN no_data_found THEN
         DBMS_OUTPUT.PUT_LINE('ERROR....: Directory Object does not exist.');
         n_file_type := 0;
      WHEN no_file_found THEN
         DBMS_OUTPUT.PUT_LINE('ERROR....: File does not exist.');
         n_file_type := 0;
      WHEN OTHERS THEN
         DBMS_OUTPUT.PUT_LINE('ERROR....: Error retrieving information for file.');
         DBMS_OUTPUT.PUT_LINE(SQLERRM);
         n_file_type := 0;
   END;
   DECLARE
      data_compression        EXCEPTION;
      PRAGMA                  EXCEPTION_INIT (data_compression, -20000);
      metadata_compression    EXCEPTION;
      PRAGMA                  EXCEPTION_INIT (metadata_compression, -20001);
   BEGIN
      IF n_file_type > 0 THEN
         n_index := tab_dumpfile_info.FIRST;
         WHILE n_index IS NOT NULL
         LOOP
            v_value := NVL(tab_dumpfile_info(n_index).value, 'NULL');
            IF v_value = '1' THEN
               IF tab_dumpfile_info(n_index).item_code = DBMS_DATAPUMP.KU$_DFHDR_METADATA_COMPRESSED THEN
                  RAISE_APPLICATION_ERROR(-20000, 'Metadata is compressed.');
               ELSIF tab_dumpfile_info(n_index).item_code = DBMS_DATAPUMP.KU$_DFHDR_DATA_COMPRESSED THEN
                  RAISE_APPLICATION_ERROR(-20001, 'Data is compressed.');
               END IF;
            END IF;
            n_index := tab_dumpfile_info.NEXT(n_index);
         END LOOP;
      END IF;
      DBMS_OUTPUT.PUT_LINE('Metadata and data not compressed.');
   END;
END;
/

Ce code affiche le message « Metadata and data not compressed. » en cas de non utilisation de la compression soumise à licence dans tous les autres cas une erreur est retournée. L’intégration de ce code dans un script SHELL permet d’annuler l’import en cas d’erreur.
Il est possible d’effectuer un contrôle identique sur le chiffrement des données.