După cum am mai scris în unul din articolele precedente există si alte variante de a migra datele folosind „transportable tablespace”. Soluția se numește RMAN „transportable tablespace” iar avantajul este de a nu mai fi nevoiți să punem în READ ONLY tablespace-urile pe care dorim sa le transportăm, în schimb avem nevoie de un backupset care se va restaura într-o destinație auxiliară iar de acolo vor fi generate Transportable Tablespace Set (TTS) împreună cu metadatele care se vor importa în baza de date destinație.
În rândurile ce urmează doresc sa migrez datele din tablespace-urile ‘USERS’ și ‘EXAMPLE’ unde baza de date sursă este Oracle 11.2.0.4 iar baza de date destinație este Oracle 12.2.0.1. Pașii sunt următorii:
- Export metadata userilor din baza sursa
- Se creează un backup al bazei de date sursă folosind tool-ul RMAN
- Se pregătește un director auxiliar pentru generarea exportului și fișierelor de import
- Executarea scriptului RMAN
- Copierea TTS-ului pe mașina destinație
- Pregătirea bazei de date destinație
- Executarea scriptului de import
Pe baza de date sursă extrag metadatele userilor care mai târziu vor trebui creați pe baza de date destinație.
set heading off set long 1000 set linesize 200 select distinct to_char(dbms_metadata.get_ddl('USER',owner))||';' from dba_segments where tablespace_name in ('USERS','EXAMPLE');
Generez un backupset tot pe baza sursă:
RMAN> backup as compressed backupset full database plus archivelog;
Înainte de a rula scriptul trebuie să ne asigurăm că valoarea parametrului until time (sau until SCN după caz) are minim valoarea ultimului archivelog generat de baza de date sursă.
RMAN>run { transport tablespace USERS,EXAMPLE auxiliary destination '/opt/oracle/admin/auxiliary' tablespace destination '/opt/oracle/admin/auxiliary' datapump directory DATA_PUMP_DIR dump file 'tbs_dump.dmp' export log 'tbs_log.log' import script 'tbs_script.sql' until time 'sysdate - 30/(24*60)'; }
Mai departe scriptul va restaura baza de date din backupset-uile catalogate iar ca destinație de restaurare va folosi valoarea parametrului „auxiliary destination”, înainte trebuie să ne asigurăm că file system-ul sau diskgroup-ul de ASM poate susține mărimea bazei de date restaurate. După restaurare se va face recover pană la valoarea until time/until SCN, dacă nu sunt găsite archivelog-urile atunci exportul va eșua. În destinația specificată la valoarea parametrului „tablespace destination” vor fi copiate datafile-urile tablespace-urilor USERS, EXAMPLE, tot în aceeași destinație va fi generat și scriptul de import care va trebui rulat pe baza destinație. Iar dump file-ul se va regăsi în datapump directory.
După ce scriptul s-a finalizat cu succes conținutul generat se va copia pe mașina destinație unde se afla baza de date.
În acest exemplu situația este puțin mai complicata deoarece doresc sa import doua tablespace-uri care exista în baza de date destinație iar tablespace-ul USERS este default tablespace, de aceea voi crea un alt tablespace pe care îl voi seta de default pe destinație.
SQL> CREATE TABLESPACE "USERS2" DATAFILE '/opt/oracle/oradata/ORCL/users201.dbf' SIZE 50M AUTOEXTEND ON NEXT 1310720 MAXSIZE 32767M LOGGING ONLINE PERMANENT BLOCKSIZE 8192 EXTENT MANAGEMENT LOCAL AUTOALLOCATE DEFAULT NOCOMPRESS SEGMENT SPACE MANAGEMENT AUTO 2 3 4 5 6 ; Tablespace created. SQL> ALTER DATABASE DEFAULT TABLESPACE USERS2; Database altered.
În final șterg cele doua tablespace-uri cat și conținutul acestora.
SQL> select distinct 'drop user '||owner||' cascade;' from dba_segments where tablespace_name in ('USERS','EXAMPLE'); SQL> drop tablespace EXAMPLE including contents and datafiles; Tablespace dropped. SQL> drop tablespace USERS including contents and datafiles; Tablespace dropped.
Ultimul pas este importul tablespace-urilor după ce datafile-urile au fost copiate în locația potrivita:
impdp \"/ as sysdba \" directory=DATA_PUMP_DIR dumpfile=tbs_dump.dmp logfile=imp_tbs_dump.log transport_datafiles=/opt/oracle/admin/auxiliary/users01.dbf, /opt/oracle/admin/auxiliary/example01.dbf