Πώς εισάγουμε μαζικά δεδομένα στη βάση δεδομένων με τη χρήση Oracle Data Pump (impdp)

Πώς εισάγουμε μαζικά δεδομένα στη βάση δεδομένων με τη χρήση Oracle Data Pump (impdp)
Πώς εισάγουμε μαζικά δεδομένα στη βάση δεδομένων με τη χρήση Oracle Data Pump (impdp)

Πολλές φορές θα χρειαστεί να κρατήσουμε τα δεδομένα πινάκων και των metadata (packages, procedures, function κ.τ.λ.) τους ώστε να τις εισάγουμε έπειτα στο ίδιο ή και σε διαφορετικό σύστημα.

Σε προηγούμενο άρθρο είχαμε δει τη χρήση του Oracle Data Pump Export (expdp) ώστε να εξάγουμε dump file με τα δεδομένα αυτά. Σε αυτό το άρθρο θα αναλύσουμε το εργαλείο που τα εισάγει αυτά τα δεδομένα στη βάση δεδομένων το Oracle Data Pump Import (impdp).

Πώς λειτουργεί το Oracle Data Pump Import (impdp)

Καλώντας το Data Pump Import (impdp) δημιουργείται και ξεκινάει να εκτελείται ένα job που η δουλειά του είναι να διαβάζει dump files και να τα εισάγει στην βάση δεδομένων.

Μπορούμε να καθαρίσουμε το τι θα εισαχθεί και με ποιον τρόπο με τη χρήση παραμέτρων. Αυτές οι παράμετροι μπορούνε να είναι δηλωμένες είτε στη γραμμή εντολών είτε σε ένα ξεχωριστό αρχείο με παραμέτρους.

Η προεργασία

Για αρχή θα χρειαστούμε έναν χρήστη που να έχει τον ρόλο DATAPUMP_IMP_FULL_DATABASE. Εναλλακτικά μπορούμε να χρησιμοποιήσουμε χρήστη που έχει οριστεί SYSDBA αν και δεν προτείνεται.

grant DATAPUMP_IMP_FULL_DATABASE to stratos;

Θα χρειαστούμε και ένα logical directory το οποίο θα δείχνει σε physical directory πάνω στον server που βρίσκονται τα dump files.

create directory fakelos as '/home/oracle/Documents';

Για να δούμε τα directory που υπάρχουν:

select owner,directory_name,directory_path from all_directories;
Πώς εισάγουμε μαζικά δεδομένα στη βάση δεδομένων με τη χρήση Oracle Data Pump (impdp)

Για να δούμε τα tablespaces που υπάρχουν και τους πίνακες που περιέχουν:

select tablespace_name,status,max_size from dba_tablespaces;

select owner,segment_name,tablespace_name,bytes from dba_segments where tablespace_name = 'USERS' and segment_type = 'TABLE';
Πώς εισάγουμε μαζικά δεδομένα στη βάση δεδομένων με τη χρήση Oracle Data Pump (impdp)

Προαιρετικά

Καθώς μπορεί να εισάγουμε πίνακα που συσχετίζετε με κάποιον άλλον πίνακα μπορεί να χρειάζεται να κάνουμε disable τα constraints.

SELECT * FROM user_cons_columns where OWNER = 'SCOTT' TABLE_NAME ='DEPT'

ALTER TABLE SCOTT.DEPT DISABLE CONSTRAINT fk_dname;

Μπορεί να θέλουμε να περάσουμε ένα schema ολόκληρο οπότε θα είναι πιο εύκολη η διαδικασία αν το κάνουμε πρώτα drop.

drop user SCOTT cascade; 

Επίσης μπορεί να θέλουμε να διαγράψουμε το tablespace ώστε να το εισάγουμε π.χ. με άλλο όνομα κατά τη διαδικασία του import.

DROP TABLESPACE USERS INCLUDING CONTENTS AND DATAFILES;

Το παράδειγμα

Το πιο απλό παράδειγμα που μπορούμε να δοκιμάσουμε είναι να εισάγουμε έναν μικρό πίνακα. Χρειάζονται οι παράμετροι που χρειάζονται είναι το logical directory που φτιάξαμε προηγουμένως, το όνομα του dumpfile και το όνομα του πίνακα (έχουμε ορίσει metrics και logfile να εξαχθούν επίσης στο ίδιο directory). Επειδή όμως ο πίνακας υπάρχει ήδη μπορούμε να τον εισάγουμε με άλλο όνομα με τη παράμετρο REMAP_TABLE.

[opc@dp-gr ~]$ impdp stratos/stratos directory=FAKELOS dumpfile=pinakas_dept.DMP logfile=import.log metrics=y TABLES=SCOTT.DEPT REMAP_TABLE=SCOTT.DEPT:DEPT_TEST 

Εναλλακτικά αν θα θέλαμε να χρησιμοποιήσουμε parameter file. Θα φτιάχναμε ένα αρχείο με όνομα π.χ. params.par που θα περιείχε όλες τις παραμέτρους την μια κάτω από την άλλη και θα το ορίζαμε με τη παράμετρο στο impdp parfile.

directory=FAKELOS
dumpfile=pinakas_dept.DMP
logfile=import.log
metrics=y 
TABLES = SCOTT.DEPT
REMAP_TABLE=SCOTT.DEPT:DEPT_TEST 
[opc@dp-gr ~]$ impdp stratos/stratos parfile=/home/oracle/Documents/params.par
[opc@dp-gr ~]$ impdp stratos/stratos directory=FAKELOS dumpfile=pinakas_dept.DMP logfile=import.log REMAP_TABLE=SCOTT.DEPT:DEPT_TEST metrics=y
...
Connected to: Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 - 64bit Production
With the Partitioning, OLAP, Advanced Analytics and Real 
Processing object type TABLE_EXPORT/TABLE/TABLE
     Completed 1 TABLE objects in 1 seconds
Processing object type TABLE_EXPORT/TABLE/TABLE_DATA
. . imported "SCOTT"."DEPT_TEST"                         6.023 KB       4 rows in 1 seconds
Processing object type TABLE_EXPORT/TABLE/INDEX/INDEX
     Completed 1 INDEX objects in 0 seconds
Processing object type TABLE_EXPORT/TABLE/CONSTRAINT/CONSTRAINT
ORA-31684: Object type CONSTRAINT:"SCOTT"."PK_DEPT" already exists
     Completed 1 CONSTRAINT objects in 1 seconds
Processing object type TABLE_EXPORT/TABLE/INDEX/STATISTICS/INDEX_STATISTICS
     Completed 1 INDEX_STATISTICS objects in 0 seconds
Processing object type TABLE_EXPORT/TABLE/STATISTICS/TABLE_STATISTICS
     Completed 1 TABLE_STATISTICS objects in 0 seconds
Processing object type TABLE_EXPORT/TABLE/STATISTICS/MARKER
     Completed 1 MARKER objects in 43 seconds
     Completed 1 TABLE_EXPORT/TABLE/TABLE_DATA objects in 1 seconds
Job "STRATOS"."SYS_IMPORT_FULL_01" completed with 1 error(s) 

Για να δούμε τις εργασίες Data Pump που είναι σε εξέλιξη.

select * from dba_datapump_jobs 
Πώς εισάγουμε μαζικά δεδομένα στη βάση δεδομένων με τη χρήση Oracle Data Pump (impdp)

Έχουμε και τη δυνατότητα έχοντας το όνομα του job (με τη χρήση του προηγούμενου query) να το κάνουμε attach σε ένα άλλο παράθυρο και να βλέπουμε πολλές χρήσιμες πληροφορίες όπως το ποσοστό ολοκλήρωσης και τα bytes που έχουν γραφτεί.

[opc@dp-gr ~]$ impdp stratos/stratos attach=SYS_IMPORT_TABLE_01

Εναλλακτικά αν χρησιμοποιούμε τον λογαριασμό sysdba.

[oracle@dp-gr opc]$ impdp "'/as sysdba'" attach=SYS_IMPORT_TABLE_01
Import> status

Job: SYS_IMPORT_TABLE_01
  Owner: STRATOS
  Operation: IMPORT
  Mode: TABLE
  Instance: ORCL
  Max Parallelism: 1
  NLS character set: AL32UTF8
  NLS NCHAR character set: AL16UTF16
  Dump File: /home/oracle/Documents/pinakas_dept.DMP

Worker 1 Status:
  Instance ID: 1
  Instance name: ORCL
  Host name: dp-gr
  Process Name: DW00
  State: UNDEFINED
  Object Schema: SYS
  Object Type: TABLE_EXPORT/TABLE/STATISTICS/MARKER
  Total Objects: 1
  Completed Bytes: 18,160
  Worker Parallelism: 1

Η πληροφορία αυτή ανανεώνεται γράφοντας την εντολή status.

Αν για κάποιο λόγο σταματήσει το job π.χ. δεν υπάρχει αρκετός χώρος θα εμφανιστεί μήνυμα και στο παρακάτω dynamic view. Αν το διορθώσουμε σε ένα εύλογο διάστημα θα συνεχιστεί αυτόματα.

select name,status,timeout,error_number,error_msg from DBA_RESUMABLE;

Το αποτέλεσμα

Αφου ολοκληρώθηκε η εργασία θα δούμε ότι δημιουργήθηκε ο πίνακας SCOTT.DEPT_TEST.

select count(*) from SCOTT.DEPT_TEST;
4

Χρήσιμες παράμετροι

Ας δούμε και μερικές χρήσιμες παραμέτρους που μπορούμε να έχουμε ορίσει στο Data Pump Import ώστε να έχουμε καλύτερο έλεγχο στα δεδομένα που θα εισάγουμε.

REMAP_TABLE

Με αυτή τη παράμετρο μπορούμε να εισάγουμε τον πίνακα με διαφορετικό όνομα καθώς μπορεί να υπάρχει ήδη.

REMAP_TABLE =SCOTT.DEPT:DEPT_NEW;
REMAP_SCHEMA

Με αυτή τη παράμετρο μπορούμε να εισάγουμε το schema σε διαφορετικό.

REMAP_SCHEMA=SCOTT:STRATOS
REMAPS_TABLESPACE

Με αυτή τη παράμετρο μπορούμε να εισάγουμε τα δεδομένα σε διαφορετικό tablespace.

REMAPS_TABLESPACE=USERS:TABLESPACE_ARCHIVE
TABLE_EXISTS_ACTION

Αυτή τη παράμετρο τη χρησιμοποιούμε όταν θέλουμε να εισάγουμε πίνακες που υπάρχουν ήδη και δέχεται 3 επιλογές:

Με το append γράφει τις εγγραφές στην συνέχεια των προηγούμενων.

TABLE_EXISTS_ACTION=APPEND

Με το replace κάνει αντικατάσταση τον πίνακα μαζί με τα metadata του.

TABLE_EXISTS_ACTION=REPLACE

Με το truncate διαγράφει όσες εγγραφές έχει ήδη ο πίνακας χωρίς να πειράξει τα metadata του και κρατόντας την αύξων αρίθμηση σε ένα κλειδί αν υπήρχε ως έχει.

TABLE_EXISTS_ACTION=TRUNCATE
CONTENT

Αυτή τη παράμετρο την χρησιμοποιούμε όταν θέλουμε να εισάγουμε μόνο τα δεδομένα ή μόνο metadata.

content=data_only 

content=metadata_only 
TRANSFORM

Αν δεν μας ενδιαφέρει η πληροφορία να καταγράφεται στο redo log και δεν είναι ενεργοποιημένο το force_logging μπορούμε να μην καταγράφεται η πληροφορία του import ώστε να κερδίσουμε σε ταχύτητα της διαδικασίας.

TRANSFORM=DISABLE_ARCHIVE_LOGGING:Y
TABLESPACES

Με αυτή τη παράμετρο μπορούμε να εισάγουμε επιλεγμένα tablespaces.

TABLESPACES=USERS
TABLES

Με αυτή τη παράμετρο μπορούμε να εισάγουμε επιλεγμένους πίνακες.

TABLES=SCOTT.DEPT,SCOTT.SALGRADE
SCHEMAS

Με αυτή την παράμετρο μπορούμε να εισάγουμε ολόκληρο συγκεκριμένο χρήστη.

schemas=SCOTT 
DUMPFILE

Με αυτή τη παράμετρο μπορούμε να δώσουμε ένα όνομα στο dumpfile που θα παράγει το Data Pump Export. Μπορούμε όμως με τους χαρακτήρες “%u” να φτιαχτούν πολλά αρχεία με αύξων αρίθμηση (έως 99).

dumpfile=export_pinaka%u.DMP 
EXCLUDE

Με αυτή τη παράμετρο μπορούμε να εξαιρέσουμε συγκεκριμένα objects όπως schema, πίνακες κ.τ.λ.

EXCLUDE=SCHEMA:"=SYS"
INCLUDE

Αντίστοιχα με αυτή τη παράμετρο μπορούμε να προσθέσουμε συγκεκριμένα objects όπως schema, πίνακες κ.τ.λ.

INCLUDE=SCHEMA:"=SCOTT"

INCLUDE=TABLE:"IN (select table_name from dba_tables where table_name like 'DEP%')"
QUERY

Με τη παράμετρο αυτή μπορούμε να γράψουμε query ώστε να εισάγουμε συγκεκριμένα δεδομένα μόνο από έναν πίνακα.

query=SCOTT.SALGRADE:"where HISAL > '2000'"
PARALLEL

Με τη παράμετρο αυτή ορίζουμε τα ταυτόχρονα παράλληλα κανάλια που θα εκτελέσουν την εργασία. Συνήθως ορίζουμε τον αριθμό CPU cores διά δύο.

Parallel=8
LOGFILES

Στη παράμετρο αυτή ορίζουμε το όνομα του logfile που θα περιέχει πληροφορίες για την διεργασία.

METRICS

Με αυτή τη παράμετρο μας εμφανίζονται επιπλέον πληροφορίες στο log file.

metrics=y
SQLFILE

Αν θέλουμε να δούμε τι περιέχουν τα dump files (dmp) χωρίς να κάνουμε όμως το import, μπορούμε με τη παράμετρο SQLFILE να εξάγουμε τα metadata μόνο με τα DDL (Data Definition Language) σε ένα αρχείο.

SQLFILE=expfull.sql

Πηγές:

Μοιράσου το

Αφήστε μία απάντηση