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.
1 comentariu