Πώς εισάγουμε μαζικά δεδομένα στη βάση δεδομένων με τη χρήση Oracle Data Pump (impdp)
- Πώς βρίσκουμε τι δικαιώματα έχει ένας χρήστης σε βάση δεδομένων της Oracle - 1 Νοέμβριος 2024
- Πώς ενεργοποιούμε το Unified Auditing σε Oracle Database - 7 Οκτώβριος 2024
- Τι είναι η PostgreSQL και πως κάνουμε μία πλήρης εγκατάσταση - 2 Σεπτέμβριος 2024
Πολλές φορές θα χρειαστεί να κρατήσουμε τα δεδομένα πινάκων και των 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;
Για να δούμε τα 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';
Προαιρετικά
Καθώς μπορεί να εισάγουμε πίνακα που συσχετίζετε με κάποιον άλλον πίνακα μπορεί να χρειάζεται να κάνουμε 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
Έχουμε και τη δυνατότητα έχοντας το όνομα του 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