In articolele trecute am prezentat mai multe soluții pentru a migra datele dintr-o bază de date Oracle, fiecare dintre aceste metode avand particularitățile ei, de aceea înainte de implementare trebuie analizat care variantă este cea mai potrivită.

„Transportable tablespace” este una dintre aceste solutii care a fost introdusă în versiunea Oracle 8i și a fost îmbunătățită cu fiecare nouă versiune, iar din Oracle 11g se pot transporta tablespace-uri care provin de pe o platformă cu endian diferit. Avantajul acestei metode este că se poate muta rapid un volum mare de date iar dezavantajul este că tablespace-ul sursă trebuie să fie read-only, iar în majoritatea cazurilor asta se traduce printr-o perioadă de nefuncționare a sistemului sursă, însă acest neajuns a fost rezolvat cu ajutorul utilitarului RMAN.

Astăzi voi povesti despre variantă prin care putem migra unul sau mai multe tablespace-uri fără utilitarul RMAN urmănd ca într-unul din articolele viitoare să prezint un exemplu prin care se poate folosi „transportable tablespace” fără a pune tablespace-ul in READ ONLY.

Prima parte presupune câteva verificări înainte de a rula exportul efectiv. Cu ajutorul celor două select-uri verific  numele tablespace-ului sau tablespace-urilor in cazul in care sunt mai multe și schemele care vor trebui create pe baza destinație.

SQL> select distinct tablespace_name from dba_segments where owner='OE';

TABLESPACE_NAME
 ------------------------------
 EXAMPLE

SQL> select distinct owner from dba_segments where tablespace_name='EXAMPLE';

OWNER
 -----------------------------
 OE

In acest exemplu este o singură schemă căreia ii număr toate obiectele care vor trebui să se regăsească în baza de date destinație la final.

SQL> select count(*),status from dba_objects where owner='OE' group by status,owner;

COUNT(*) STATUS
 ---------- -------
 134 VALID
 8 INVALID

Creez un export al metadatelor schemei „OE” care îmi va folosi mai târziu:

expdp  \"/ as sysdba\"  directory=DATA_PUMP_DIR CONTENT=METADATA_ONLY dumpfile=ddl.dmp schemas=OE logfile=exp_ddl.log

In acest caz atât sistemul sursă cat și destinație sunt Linux x64 care folosește endian format „Little” altfel se poate verifica folosind view-ul V$TRANSPORTABLE_PLATFORM dacă există compatibilitate intre sisteme.

dbms_tts.transport_set_check  este o procedură prin care se verifică dacă tablespace-ul poate fi transportat cu ajutorul lui transportable tablespace.

SQL> exec dbms_tts.transport_set_check('EXAMPLE', TRUE);

PL/SQL procedure successfully completed.

SQL> SELECT * FROM transport_set_violations;

no rows selected

Pentru ca nu există nici o eroare putem continua trecând tablespace-ul pe care dorim sa-l exportăm in „READ ONLY” și sa rulăm comanda de export

SQL> ALTER TABLESPACE EXAMPLE READ ONLY;

Tablespace altered.

expdp \"/ as sysdba\" DUMPFILE=tts.dmp logfile=tts.log DIRECTORY=DATA_PUMP_DIR TRANSPORT_TABLESPACES=EXAMPLE

Starting "SYS"."SYS_EXPORT_TRANSPORTABLE_01":  "/******** AS SYSDBA" DUMPFILE=tts.dmp logfile=tts.log DIRECTORY=DATA_PUMP_DIR TRANSPORT_TABLESPACES=EXAMPLE
 Processing object type TRANSPORTABLE_EXPORT/PLUGTS_BLK
 Processing object type TRANSPORTABLE_EXPORT/TYPE/TYPE_SPEC
 Processing object type TRANSPORTABLE_EXPORT/TYPE/GRANT/OWNER_GRANT/OBJECT_GRANT
 Processing object type TRANSPORTABLE_EXPORT/TYPE/TYPE_BODY
 Processing object type TRANSPORTABLE_EXPORT/PROCACT_INSTANCE
 Processing object type TRANSPORTABLE_EXPORT/XMLSCHEMA/XMLSCHEMA
 Processing object type TRANSPORTABLE_EXPORT/TABLE
 Processing object type TRANSPORTABLE_EXPORT/GRANT/OWNER_GRANT/OBJECT_GRANT
 Processing object type TRANSPORTABLE_EXPORT/INDEX/INDEX
 Processing object type TRANSPORTABLE_EXPORT/INDEX/FUNCTIONAL_INDEX/INDEX
 Processing object type TRANSPORTABLE_EXPORT/CONSTRAINT/CONSTRAINT
 Processing object type TRANSPORTABLE_EXPORT/INDEX_STATISTICS
 Processing object type TRANSPORTABLE_EXPORT/INDEX/STATISTICS/FUNCTIONAL_INDEX/INDEX_STATISTICS
 Processing object type TRANSPORTABLE_EXPORT/COMMENT
 Processing object type TRANSPORTABLE_EXPORT/CONSTRAINT/REF_CONSTRAINT
 Processing object type TRANSPORTABLE_EXPORT/TRIGGER
 Processing object type TRANSPORTABLE_EXPORT/TABLE_STATISTICS
 Processing object type TRANSPORTABLE_EXPORT/STATISTICS/MARKER
 Processing object type TRANSPORTABLE_EXPORT/POST_INSTANCE/PROCACT_INSTANCE
 Processing object type TRANSPORTABLE_EXPORT/POST_INSTANCE/PLUGTS_BLK
 Master table "SYS"."SYS_EXPORT_TRANSPORTABLE_01" successfully loaded/unloaded
 ******************************************************************************
 Dump file set for SYS.SYS_EXPORT_TRANSPORTABLE_01 is:
 /opt/oracle/admin/orcl/dpdump/tts.dmp
 ******************************************************************************
 Datafiles required for transportable tablespace EXAMPLE:
 /opt/oracle/oradata/orcl/example01.dbf

Exportul s-a terminat cu succes iar la final este indicată locația fișierului dump cat si datafile-ul tablespace-ului exportat.  Acum tablespace-ul de pe baza sursă poate fi făcut din nou READ WRITE.

Pe mașina destinație după ce s-au copiat cele trei fisiere: tts.dmp, example01.dbf si  ddl.dmp, trebuie executată comanda de import de mai jos care nu va importa nimic în baza de date în schimb va genera un fișier metaddl.sql.

impdp \"/ as sysdba\"  directory=DATA_PUMP_DIR dumpfile=ddl.dmp logfile=imp_ddl.log sqlfile=metaddl.sql

Fișierul generat mai sus se editează astfel încât să nu rămână decât comanda de „create user” (fără default tablespace!) și granturile aferente userului. După rularea scriptului vom avem o schemă care nu conține nici un obiect iar la acest moment tablespace-ul EXAMPLE nu există în baza de date destinație:

SQL> select username from dba_users where username='OE';

USERNAME
 --------------------------------------------------------------------------------
 OE

SQL> select file_name from dba_data_files where tablespace_name='EXAMPLE';

no rows selected

Ultimul pas este importul tablespace-ului:

impdp \"/ as sysdba\"DUMPFILE=tts.dmp logfile=imp_tts.log DIRECTORY=DATA_PUMP_DIR TRANSPORT_DATAFILES='/opt/oracle/oradata/orcl/example01.dbf'

Master table "SYS"."SYS_IMPORT_TRANSPORTABLE_01" successfully loaded/unloaded
 Starting "SYS"."SYS_IMPORT_TRANSPORTABLE_01":  "/******** AS SYSDBA" logfile=imp_tts.log DIRECTORY=DATA_PUMP_DIR TRANSPORT_DATAFILES=/opt/oracle/oradata/orcl/example01.dbf
 Processing object type TRANSPORTABLE_EXPORT/PLUGTS_BLK
 Processing object type TRANSPORTABLE_EXPORT/TYPE/TYPE_SPEC
 Processing object type TRANSPORTABLE_EXPORT/TYPE/GRANT/OWNER_GRANT/OBJECT_GRANT
 Processing object type TRANSPORTABLE_EXPORT/TYPE/TYPE_BODY
 Processing object type TRANSPORTABLE_EXPORT/PROCACT_INSTANCE
 Processing object type TRANSPORTABLE_EXPORT/XMLSCHEMA/XMLSCHEMA
 Processing object type TRANSPORTABLE_EXPORT/TABLE
Processing object type TRANSPORTABLE_EXPORT/GRANT/OWNER_GRANT/OBJECT_GRANT
 Processing object type TRANSPORTABLE_EXPORT/INDEX/INDEX
 Processing object type TRANSPORTABLE_EXPORT/INDEX/FUNCTIONAL_INDEX/INDEX
 Processing object type TRANSPORTABLE_EXPORT/CONSTRAINT/CONSTRAINT
 Processing object type TRANSPORTABLE_EXPORT/INDEX_STATISTICS
 Processing object type TRANSPORTABLE_EXPORT/INDEX/STATISTICS/FUNCTIONAL_INDEX/INDEX_STATISTICS
 Processing object type TRANSPORTABLE_EXPORT/COMMENT
 Processing object type TRANSPORTABLE_EXPORT/CONSTRAINT/REF_CONSTRAINT
 Processing object type TRANSPORTABLE_EXPORT/TRIGGER
 Processing object type TRANSPORTABLE_EXPORT/TABLE_STATISTICS
 Processing object type TRANSPORTABLE_EXPORT/STATISTICS/MARKER
Processing object type TRANSPORTABLE_EXPORT/POST_INSTANCE/PROCACT_INSTANCE
 Processing object type TRANSPORTABLE_EXPORT/POST_INSTANCE/PLUGTS_BLK

Importul s-a finalizat cu succes deci nu mai rămâne decât sa îl facem READ WRITE:

SQL> select count(*),status from dba_objects where owner='OE' group by status,owner;

COUNT(*) STATUS
 ---------- -------
 134 VALID
 8 INVALID

SQL> SELECT tablespace_name, contents, status
 FROM dba_tablespaces
 ORDER BY 1;  2    3

TABLESPACE_NAME                CONTENTS  STATUS
 ------------------------------ --------- ---------
 EXAMPLE                        PERMANENT READ ONLY
 SYSAUX                         PERMANENT ONLINE
 SYSTEM                         PERMANENT ONLINE
 TEMP                           TEMPORARY ONLINE
 UNDOTBS1                       UNDO      ONLINE
 USERS                          PERMANENT ONLINE

6 rows selected.

SQL> ALTER TABLESPACE EXAMPLE READ write;

Tablespace altered.

Un comentariu

Lasă un răspuns

Completează mai jos detaliile tale sau dă clic pe un icon pentru a te autentifica:

Logo WordPress.com

Comentezi folosind contul tău WordPress.com. Dezautentificare / Schimbă )

Poză Twitter

Comentezi folosind contul tău Twitter. Dezautentificare / Schimbă )

Fotografie Facebook

Comentezi folosind contul tău Facebook. Dezautentificare / Schimbă )

Fotografie Google+

Comentezi folosind contul tău Google+. Dezautentificare / Schimbă )

Conectare la %s