Online Table Redefinition Voor Oracle9i was table redefinition alleen mogelijk door het gebruik van export/import hetgeen betekende dat de table offline was gedurende het proces, of de move syntax die alle DML lock-te
gedurende de operatie. Geen van deze methoden is bruikbaar voor grote OLTP tabellen omdat de downtijd aanzienlijk kan zijn. Om dit probleem op te lossen heeft Oracle9i Online Table Redefinitions geïntroduceerd, gebruik makend van de DBMS_REDEFINITION package. Het proces is vergelijkbaar aan de online rebuilds van indexen in de zin van dat de originele tabel online blijft en er een nieuwe kopie van de tabel gebouwd wordt. DML operations op de original table worden opgeslagen in een tijdelijke tabel voor tussentijdse updates. Als de nieuwe table eenmaal klaar is zullen de tussentijdse updates samengevoegd worden met de nieuwe tabel en vervolgens zullen de namen van de originele en de nieuwe tabel gewisseld worden in de data dictionary. Deze stap heeft een DML lock nodig maar is maar kort aanwezig. Vanaf dit moment wordt alle DML tegen de nieuwe tabel uitgevoerd. De interim updates worden automatisch genegeerd maar de originele table met zijn nieuwe naam zal handmatig genegeerd moeten worden. Een voorbeeld van het proces: Check of de tabel redefined kan worden EXEC Dbms_Redefinition. SQL>Can_Redef_Table('SCOTT', 'EMPLOYEES'); Creëer de nieuwe tabel SQL>CREATE TABLE scott.employees2 TABLESPACE tools AS SELECT empno, first_name, salary as sal FROM employees WHERE 1=2; Start Redefinition SQL>EXEC Dbms_Redefinition.Start_Redef_Table('SCOTT', 'EMPLOYEES', 'EMPLOYEES2', 'EMPNO EMPNO, FIRST_NAME FIRST_NAME, SALARY*1.10 SAL); Optioneel synchronizeren van de nieuwe table met de interim data voor de index creatie >SQL>EXEC dbms_redefinition.sync_interim_table( 'SCOTT', 'EMPLOYEES', 'EMPLOYEES2'); Voeg nieuwe keys, FKs en triggers toe SQL>ALTER TABLE employees2 ADD (CONSTRAINT emp_pk2 PRIMARY KEY (empno) USING INDEX TABLESPACE indx); Maak de redefinition af SQL>EXEC Dbms_Redefinition.Finish_Redef_Table( 'SCOTT', 'EMPLOYEES', 'EMPLOYEES2'); Verwijder de originele tabel die nu de naam heeft van de nieuwe tabel SQL>DROP TABLE employees2; Als de column mappings niet worden gedaan zal er van uit gegaan worden dat alle kolommen in de nieuwe tabel overeenkomen met die in de oude tabel. Functies kunnen uitgevoerd worden op de data tijdens de redefinition als ze in de kolom mapping zijn gespecificeerd. Indexen, keys en triggers die tegen de nieuwe tabel worden gemaakt, moeten unieke name hebben. Alle Foreign Keys zullen disabled gecreëerd worden omdat redefinition completion ze zal enabelen. Het redefinition proces kan gestopt worden met: SQL>EXEC Dbms_Redefinition.Abort_Redef_Table('SCOTT', 'EMPLOYEES', 'EMPLOYEES2'); Dit proces maakt het mogelijk de volgende acties uit te voeren zonder impact op DML operaties: * Converteren van een non-partitioned table naar een partitioned table en omgekeerd. * Wisselen van een heap organized table naar een organized table en omgekeerd. * Droppen van non-primary key columns. * Toevoegen van nieuwe new columns. * Toevoegen of verwijderen van parallel support. * Storage parameters aanpasen. Online table redefinition heeft een aantal beperkingen waaronder: * Er moet genoeg ruimte zijn om 2 kopieën van de tabel kwijt te kunnen. * Primary key columns kunnen niet aangepast worden. * Tabellen moeten primary keys hebben. * Redefinition moet uitgevoerd worden in het zelfde schema. * Nieuwe columns die teoegevoegd worden kunnen niet NOT NULL gemaakt worden tot na de redefinition operatie. * Tabellen kunnen geen LONGs, BFILEs of User Defined Types bevatten. * Geclusterde tabellen kunnen niet redefined worden. * Tabellen in het SYS of SYSTEM schema kunnen niet redefined worden. * Tabellen waarop materialized view logs of materialized views op zijn gedefinieerd, kunnen niet worden redefined. * Horizontale subsetting van data kan niet uitgevoerd worden gedurende de redefinition. |