C -Transferts de données

C.1 - Data pump

exemple d’import

Infos uttiles dans le dictionnaire :

vue DBA_DATAPUMP_JOB :  jobs actifs de DataPump et  statuts
vue DBA_DATAPUMP_SESSIONS :  les sessions d’utilisateurs ayant lancé des jobs  DataPump.

Datapump est un utilitaire qui permet de transférer des données entre une base Oracle…et une base Oracle ! (il correspond aux anciens utilitaires export/import d’Oracle V9 et précédentes)

DataPump export : extrait des données
DataPump import : injecte des données (préalablement exportées)

syntaxe :

expdp KEYWORD=value or KEYWORD=(value1,value2,…,valueN)

Exemples:

expdp scott/tiger DUMPFILE=scott.dmp DIRECTORY=dmpdir SCHEMAS=scott

SQL> create or replace directory dd_dir as ‘/work/pprun/oexp’;
SQL> grant read, write on directory dd_dir to public;
$> impdp system schemas=SCOTT logfile=impSCOTT.log directory=dd_dir dumpfile=expSCOTT.dmp

Quelques différences minimales à connaitre par rapport à l’export / import classique :

  • les executables s’appellent respectivement expdp et impdp (toujours dans $ORACLE_HOME/bin)
  • appelable aussi via un package standard : le package SYS.DBMS_DATAPUMP
  • on peut filtrer des tables (option INCLUDE / EXCLUDE)
  • on  peut exporter les metadonnées seulement
  • le parametre OWNER est remplace par SCHEMA
  • necessite un objet Oracle ‘ directory ‘ pour fonctionner
  • peut être parallelisé
  • peut se passer d’un fichier intermédiaire

Datapump et Directory

Datapump n’accède pas directement au file system et passe par l’intermédiaire d’un DIRECTORY logique oracle.
Cet objet doit exister dans la base. ET donc soit on utilise le DIRECTORY par défaut DATA_PUMP_DIR  (que l’on retrouve par) :

SQL>   select * from dba_directories
where directory_name=’DATA_PUMP_DIR’

OWNER                          DIRECTORY_NAME       DIRECTORY_PATH
—————————— ——————– ——————————
SYS                            DATA_PUMP_DIR        /oracle/10GDB/rdbms/log/

ou alors on la crée par un ‘ CREATE DIRECTORY’.

SQL> CREATE OR REPLACE DIRECTORY ma_dir AS ‘/tmp/’;
SQL> GRANT READ, WRITE ON DIRECTORY ma_dir TO scott;

Datapump sans fichier d’export

Il est possible de ne pas stocker le résultat d’export dans un fichier, amis d’utiliser un flux entre base source et base cible via un DATABASE LINK.. Ceci se fait avec l’otion NETWORK_LINK de impdp.

SQL> CREATE DATABASE LINK …
$> impdp new_scott/tiger DIRECTORY=dmpdir NETWORK_LINK=old_scott remap_schema=scott:new_scott

– Attention : les users destination et cible doivent avoir le même niveau de privilège vis à vis de EXP_FULL_DATABASE et IMP_FULL_DATABASE sinon on obtient une erreur ORA-39149

Options d’export

Keyword Description (Default)
————— ———————————————————-
ATTACH Attach to existing job, e.g. ATTACH [=job name].
CONTENT Specifies data to unload where the valid keywords are:
(ALL), DATA_ONLY, and METADATA_ONLY.
DIRECTORY Directory object to be used for dumpfiles and logfiles.
DUMPFILE List of destination dump files (expdat.dmp),
e.g. DUMPFILE=scott1.dmp, scott2.dmp, dmpdir:scott3.dmp.
ESTIMATE Calculate job estimates where the valid keywords are:
(BLOCKS) and STATISTICS.
ESTIMATE_ONLY Calculate job estimates without performing the export.
EXCLUDE Exclude specific object types, e.g. EXCLUDE=TABLE:EMP.
FILESIZE Specify the size of each dumpfile in units of bytes.
FLASHBACK_SCN SCN used to set session snapshot back to.
FLASHBACK_TIME Time used to get the SCN closest to the specified time.
FULL Export entire database (N).
HELP Display Help messages (N).
INCLUDE Include specific object types, e.g. INCLUDE=TABLE_DATA.
JOB_NAME Name of export job to create.
LOGFILE Log file name (export.log).
NETWORK_LINK Name of remote database link to the source system.
NOLOGFILE Do not write logfile (N).
PARALLEL Change the number of active workers for current job.
PARFILE Specify parameter file.
QUERY Predicate clause used to export a subset of a table.
SCHEMAS List of schemas to export (login schema).
STATUS Frequency (secs) job status is to be monitored where
the default (0) will show new status when available.
TABLES Identifies a list of tables to export - one schema only.
TABLESPACES Identifies a list of tablespaces to export.
TRANSPORT_FULL_CHECK Verify storage segments of all tables (N).
TRANSPORT_TABLESPACES List of tablespaces from which metadata will be unloaded.
COMPRESSION Réduction de la taille du contenu du fichier de vidage, les mots-clés valides étant : (METADATA_ONLY) et NONE.
ENCRYPTION_PASSWORD Clé de mot de passe pour la création de données de colonne cryptées.
VERSION Version of objects to export where valid keywords are:
(COMPATIBLE), LATEST, or any valid database version.

Options d’import

Keyword Description (Default)
——————————————————————————
ATTACH Attach to existing job, e.g. ATTACH [=job name].
CONTENT Specifies data to load where the valid keywords are:
(ALL), DATA_ONLY, and METADATA_ONLY.
DIRECTORY Directory object to be used for dump, log, and sql files.
DUMPFILE List of dumpfiles to import from (expdat.dmp),
e.g. DUMPFILE=scott1.dmp, scott2.dmp, dmpdir:scott3.dmp.
ESTIMATE Calculate job estimates where the valid keywords are:
(BLOCKS) and STATISTICS.
EXCLUDE Exclude specific object types, e.g. EXCLUDE=TABLE:EMP.
FLASHBACK_SCN SCN used to set session snapshot back to.
FLASHBACK_TIME Time used to get the SCN closest to the specified time.
FULL Import everything from source (Y).
HELP Display help messages (N).
INCLUDE Include specific object types, e.g. INCLUDE=TABLE_DATA.
JOB_NAME Name of import job to create.
LOGFILE Log file name (import.log).
NETWORK_LINK Name of remote database link to the source system.
NOLOGFILE Do not write logfile.
PARALLEL Change the number of active workers for current job.
PARFILE Specify parameter file.
QUERY Predicate clause used to import a subset of a table.
REMAP_DATAFILE Redefine datafile references in all DDL statements.
REMAP_SCHEMA Objects from one schema are loaded into another schema.
REMAP_TABLESPACE Tablespace object are remapped to another tablespace.
REUSE_DATAFILES Tablespace will be initialized if it already exists (N).
SCHEMAS List of schemas to import.
SKIP_UNUSABLE_INDEXES Skip indexes that were set to the Index Unusable state.
SQLFILE Write all the SQL DDL to a specified file.
STATUS Frequency (secs) job status is to be monitored where
the default (0) will show new status when available.
STREAMS_CONFIGURATION Enable the loading of Streams metadata
TABLE_EXISTS_ACTION Action to take if imported object already exists.
Valid keywords: (SKIP), APPEND, REPLACE and TRUNCATE.
TABLES Identifies a list of tables to import.
TABLESPACES Identifies a list of tablespaces to import.
TRANSFORM Metadata transform to apply (Y/N) to specific objects.
Valid transform keywords: SEGMENT_ATTRIBUTES and STORAGE.
ex. TRANSFORM=SEGMENT_ATTRIBUTES:N:TABLE.
TRANSPORT_DATAFILES List of datafiles to be imported by transportable mode.
TRANSPORT_FULL_CHECK Verify storage segments of all tables (N).
TRANSPORT_TABLESPACES List of tablespaces from which metadata will be loaded.
Only valid in NETWORK_LINK mode import operations.
VERSION Version of objects to export where valid keywords are:
(COMPATIBLE), LATEST, or any valid database version.
Only valid for NETWORK_LINK and SQLFILE.

Datapump et PLSQL

Il existe un package SYS.DBMS_DATAPUMP, fourni avec Oracle 10g, qui offre un certain nombre de procédure pour executer / automatiser les transfert de données en PLSQL.
Voici un tout petit exemple :

DECLARE
hand NUMBER;
BEGIN
hand := Dbms_DataPump.Open(operation => ‘EXPORT’,
job_mode => ‘FULL’,
job_name => ‘FULLEXPJOB’,
version => ‘COMPATIBLE’);
Dbms_DataPump.Add_File(handle => hand,
filename => ‘expdp_plsql.log’,
directory => ‘DMPDIR’,
filetype => 3);
Dbms_DataPump.Add_File(handle => hand,
filename => ‘expdp_plsql.dmp’,
directory => ‘DMPDIR’,
filetype => 1);
– Dbms_DataPump.Set_Parameter(handle => hand,
– name => ‘ESTIMATE’,
– value => ‘STATISTICS’);
Dbms_DataPump.Start_Job(hand);
END;

C.2 - Extraction de données SQL avec Oracle

Bizarrement Oracle nne fournit pas de commande pour transférer des données vers l’extérieur mais vous propose par contre des commandes pour charger des données d’un système extérieur VERS Oracle ;-)

Le plus simplepour produire du SQL  est donc d’utiliser un outil client graphique tiers .

J’en citerai principalement 2, qui permettent d’extraire des données  à partir d’une table ou d’un SELECT en qq clics de souris  :

  • Oracle SQL Developer téléchargeable gratuitement sur otn.oracle.com
  • T.O.A.D l’outil de développement et d’administration de Quest Software

remarque : pour ce qui des ordres DDL (CREATE TABLE, etc…) oracle fournit des moyen  stsandrds comme datapump ou le package PLSQL DBMS_METADATA, mais cela ne concerne pas le contenu des tables ;-((

C.3 - Chargement de données avec SQL*Loader

SQL*Loader est, comme son nom l’indique un utilitaire de chargement spécifique pour les bases Oracle. Il permet d’initialiser une base de données, ou plus précisément une ou plusieurs tables avec des données issues d’un fichier texte.
Ainsi si l’on souhaite migrer des données d’un fichier Mainframe vers Oracle, on pourra extraire les données du fichier d’origine pour produire un fichier texte et ensuite utiliser SQL*loader pour effectuer le chargement automatique de la (ou des) table(s).

Principales caractéristiques

- charge des fichiers texte externes dans Oracle
- format des fichiers d’entrée fixe ou variable (avec séparateur)
- utilisation de fonctions SQL
- génération de clés uniques
- mode “direct” optimisé
- gestion des logs, des erreurs et possibilité de reprise

Principe général

La (ou les) table(s) destination sont créées dans le schéma cible.
On précise le format des entrées et des sorties dans un fichier de paramétrage, appelé fichier de controle, créé avec un éditeur de texte. Un fichier log donnant les résultats du chargement est généré. En cas d’erreur, les enregistrement rejetés sont stockés dans un fichier ‘.bad’, pour être éventuellment retraités.

Commande minimale :
sqlldr nom_user/mot_de_passe@base control=nom_fic.ctl

la structure de la table cible doit être créée avant le chargement, SQL*Loader à la différence d’autres outils ne crée pas la table.

options de la ligne de commandes

option description Defaut
userid username et mot de passe
control nom du fichier de controle du loader
data nom du fichier de données d’entrée
log nom du fichier de trace
bad nom du fichier des enregistrements rejetés
parfile nom du fichier contenant les parametres de la commande…
skip n nombre d’enregistrement logiques à sauter 0
load n nombre à charger all
errors n nombre max d’erreurs autorisées 50
rows n nb de lignes du tableau utilisé pour les entrées 64
bindsize taille du tableau précédent en bytes OSdep
silent n’affiche plus les messages pendant l’execution
direct utilise l’accès direct (direct path) false
parrallel chargement en mode parrallelisé false
file fichier d’allocation pour les chargement parralleles
discard fichier des enregistrements non chargés intentionnellement (saut conditionnel)
discardmax nombre maximums de ces enregistrements non chargés all

Le contenu du fichier de controle, par étapes

spécification des entrées

load data infile nom_fic | *
nom du fichier d’entrée ou * si les datas sont à la suite :
Exemples
1) load data infile c:tempentrees.dat
2) load data *

begindata
1000;Martin;Essonne
2000;Dupont;Marne

mode de chargement

insert insère les datas dans une table vide
append insère les datas à la suite des données existantes
replace insère les datas en remplaçant les données existantes
truncate insère les datas après un TRUNCATE
table cible

into nom_table (TRAILING NULLCOLS) spécifie la ou les tables (si plusieurs INTO) à charger

description générale des champs
fields spécifie les délimiteurs
exemple : field terminated by ‘;’ optionally enclosed by ‘ ” ‘
specif colonnes

col par défaut de type CHAR
col [POSITION debut:fin | * ] type_col [longueur] [format] [NULLIF col = BLANKS]
exemple
nom CHAR
no INTEGER EXTERNAL

les types numériques (INTEGER, DECIMAL, FLOAT, …) sans EXTERNAl sont des types binaires ! La plupart du temps les numérqiues en entrée sont des caractères !

remarque : le type de colonne peut être un type spécial
- RECNUM : no de ligne du fichier d’entrée
- SYSDATE : la date du jour
- CONSTANT valeur : une constante
- SEQUENCE (debut, increment) : un compteur automatique
clauses spéciales

continueif this permet de fusionner plusieurs enregistrement physique en cas d’incomplétude
exemple : continueif this (1) = ‘*’ concatene la ligne” suivante si la ligne courante a ‘*’ en colonne 1

WHEN condition specif colonne
fichier de contrôle avec entrées au format variable

– param.ctl
LOAD DATA INFILE ‘monfic’ –fichier à charger (.dat)
REPLACE –ecrase la table
INTO TABLE matable
FIELDS TERMINATED BY ‘,’
OPTIONALLY ENCLOSED BY ‘”‘ –car. de séparation
( NUMERO, NOM, PRENOM , DATE_NAISSANCE date “DDMMYY”, SEXE)

fichier de contrôle avec entrées au format fixe

LOAD DATA INFILE ‘monfic.fix’
REPLACE
INTO TABLE matable ( NUMERO position(1-5) char,
– position de début et de fin du champ
NOM position(6-35) char, PRENOM position (36-50) char,
DATE_NAISSANCE position (*) date “DDMMYY”,
–indique la position suivante
SEXE position(*) char
–longueur iimplicite pour char : 1 )

Chargement de 2 tables à partir d’un fichier

Un fichier (3 champs) éclaté dans 2 tables (chacune 2 colonnes) une pour les employes, l’autre pour les projets avec une colonne de jointure sur le no d’employe…
fichier d’entree :

1000-deleglise——-10
2000-martin———-20
3000-dupont———-10

fichier de controle
into table employes
(no_emp position(1:4) integer external,
nom position (6:20) char)
into table projet
(no_emp position (1:4) integer external,
no_projet position (22:25) integer external)

Compte rendu d’execution

sqlldr ch/ch control=param.ctl
SQL*Loader: Release 10.2.0.1.0 - Production on Wed Mar 15 15:52:18 2005 Copyright (c) Oracle Corporation 2005. All rights reserved.
Commit point reached - logical record count 2
Fichier log :
$>more param.log
SQL*Loader: Release 10.2.0.1.0 - Production on Wed Mar 15 15:52:18 2005 Copyright (c) Oracle Corporation 2005. All rights reserved.
Control File: param.ctl Data File: monfic.fix Bad File: monfic.bad Discard File: none specified (Allow all discards)
Number to load: ALL Number to skip: 0 Errors allowed: 50 Bind array: 64 rows, maximum of 65536 bytes
Continuation: none specified Path used: Conventional
Table MATABLE, loaded when SEXE = 0X46(character ‘F’)
Insert option in effect for this table: REPLACE
Column Name Position Len Term Encl Datatype
NUMERO 1:5 5 CHARACTER NOM 6:35 30 CHARACTER PRENOM 36:50 15 CHARACTER DATE_NAISSANCE NEXT 6 DATE DDMMYY SEXE NEXT 1 CHARACTER Table TATABLE, loaded when 57:57 = 0X4d(character ‘M’) Insert option in effect for this table: REPLACE Column Name Position Len Term Encl Datatype
NUMERO 1:5 5 CHARACTER NOM 6:35 30 CHARACTER PRENOM 36:50 15 CHARACTER DATE_NAISSANCE NEXT 6 DATE DDMMYY Table MATABLE:
1 Row successfully loaded. 0 Rows not loaded due to data errors.
1 Row not loaded because all WHEN clauses were failed.
0 Rows not loaded because all fields were null

C.4 - Les tablespaces transportables

Les tablespaces transportables sont une nouvelle fonctionnalité apparue avec la 10g.
Ils permettent comme leur nom l’indique de déplacer physiquement un ou plusieurs fichier d’une base à une autre (et éventuellement d’une machine à une autre)
Ils s’appuient sur datapump (pour les meta données) et une copie de fichier physique.

Contraintes :

  • source et cible doivent être sur le me OS
  • le schéma doit être isolé (des objets liés , table de vue matérialisées, segments de blobs ne doivent pas appartenir a des fichiers externes au tablespace
  • ne pas contenir de XML (sinon on utilisera un export au lieu de datapump

“L’isolement” du tablespace  (Self contained tablespace) peut être testé par une option du datapump ( TRANSPORT_FULL_CHECK=y ) ou par un package standard :

SQL> begin
2    sys.dbms_tts.transport_set_check(‘STAGING’, TRUE);
3  end;
4  /

SQL> alter tablespace mon_tbs read only;

–rem pas oblige d’etre SYSTEM ici mais il faut le privilège  exp_full_database…

$> expdp system DUMPFILE=mon_appli.dmp DIRECTORY=DATA_PUMP_DIR TRANSPORT_TABLESPACES=mon_tbs TRANSPORT_FULL_CHECK=y

…******************************************************************************

Dump file set for SYSTEM.SYS_EXPORT_TRANSPORTABLE_01 is:
/tmp/mon_appli.dmp

******************************************************************************

Datafiles required for transportable tablespace MON_TBS:

/oradata/orcl/mon_tbs.dbfJob “SYSTEM”.”SYS_EXPORT_TRANSPORTABLE_01″ successfully completed at 21:22:36

rem : dp indique quel est le fichier nécessaire a copier !!

$> cp mon_tbs.dbf ../test/mon_tbs.dbf

– creation d’un user cible identique si necessaire (sinon REMAP_SCHEMA)

– pas de droit particulier, un create session to mon_appli peut suffire(les objets sont recréés dans le tbs indeendamment des privs et quota du user cible…)

$> impdp system DUMPFILE=mon_appli.dmp DIRECTORY=DATA_PUMP_DIR TRANSPORT_DATAFILES=’/oradata/test/mon_tbs.dbf’

C.5 - Transfert avec les tables externes (external tables)

Les ‘tables externes’ sont des structures Oracle qui pointent sur un fichier externe a la base et sur lesquelles on peut faire du SQL
Voici un exemple de script de chargement de emp a partir d’un fichier externe CSV
– creer un repertoire oracle de travail
– associe au repertoire ou se trouve le fichier d’entree

create or replace directory dossier_temp as ‘/tmp’
/

drop table table_externe_emp
/

– creer une ‘table’ externe attachee au fichier d’entree

create table table_externe_emp
(EMPNO NUMBER(4) ,
ENAME VARCHAR2(10),
JOB VARCHAR2(9),
MGR NUMBER(4),
HIREDATE DATE,
SAL NUMBER(7, 2),
COMM NUMBER(7, 2),
DEPTNO NUMBER(2)
)
ORGANIZATION EXTERNAL
( type oracle_loader
default directory dossier_temp
access parameters
( records delimited by newline
badfile   ‘charge_emp.bad’
logfile   ‘charge_emp.log’
fields terminated by ‘;’
)
location (’emp.csv’)
)
– attention c’est important sinon ca marche moins bien !
reject limit unlimited
/

– et on insere dans la table destination si elle existe
insert into mon_emp
select * from table_externe_emp
/
commit