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.