Bis zur Version9i waren nur folgende Operationen zum Reorganisieren von Tabellen möglich:
Ab Version 9i kann nun die Tabelle online reorganisiert werden, auch Schreibzugriffe währen der
Reorganisation sind hier möglich
Mit dem neuen Package DBMS_REDEFINITION können Tabellen mit einer minimalen Sperrzeit online reorganisiert werden.
Folgende Änderungen sollen an einer Tabelle emp durchgeführt werden:
Spalte ENAME soll umbenannt werden in NAME,
Spalte SAL soll umbenannt werden in VERDIENST und um den Faktor 1,5 erhöht,
die Spalten MGR, HIREDATE, COMM sollen gelöscht werden.
Tabelle EMP2
Name Null? Typ
-------------- --------------- ------------
EMPNO NOT NULL NUMBER(4)
ENAME VARCHAR2(10)
JOB VARCHAR2(9)
MGR NUMBER(4)
HIREDATE DATE
SAL NUMBER(7,2)
COMM NUMBER(7,2)
DEPTNO NUMBER(2)
Überprüfen, ob EMP zu reorganisieren ist:
SQL> exec dbms_redefinition.can_redef_table('SCOTT','EMP');
PL/SQL-Prozedur wurde erfolgreich abgeschlossen.
Erstellen Sie eine vorläufige Tabelle mit den gewünschten Änderungen
SQL> CREATE TABLE scott.vor_emp (
empno, name, verdienst, deptno)
AS SELECT empno,ename,sal,deptno FROM scott.emp
WHERE 1=2;
Start der Reorganisation:
SQL> BEGIN
dbms_redefinition.start_redef_table(
'SCOTT','EMP','VOR_EMP',
'EMPNO EMPNO,ENAME NAME,SAL*1.5 VERDIENST');
END;
/
Erstellen Sie den Primärschlüssel auf empno:
SQL> ALTER TABLE scott.vor_emp ADD
CONSTRAINT pk_voremp2
PRIMARY KEY (empno);
Erstellen Sie einen Fremdschlüssel auf der Spalte deptno der auf die Spalte deptno der Tabelle DEPT verweist:
SQL> ALTER TABLE scott.vor_emp ADD(
CONSTRAINT fk_emp
FOREIGN KEY (deptno)
REFERENCES scott.dept (deptno));
Der FK muss ausgeschaltet werden. Dieser wird dann am Ende der Reorganisation automatisch aktiviert.
SQL> ALTER TABLE scott.vor_emp DISABLE CONSTRAINT fk_emp;
Wenn nötig, synchronisieren Sie die Tabellen zwischendurch:
SQL> BEGIN
dbms_redefinition.sync_interim_table(
'SCOTT', 'EMP', 'VOR_EMP');
END;
/
PL/SQL-Prozedur wurde erfolgreich abgeschlossen.
Beenden Sie die Redefinition:
SQL> BEGIN
dbms_redefinition.finish_redef_table(
'SCOTT', 'EMP', 'VOR_EMP');
END;
/
Löschen der alten Tabelle:
SQL> DROP TABLE vor_emp;
Der Redefinitions Vorgang kann abgebrochen werden mit:
exec dbms_redefinition.abort_redef_table('SCOTT', 'EMP', 'EMP');
Neuerungen ab Version 10.2:
Bevor die Reorg abgeschlossen ist, können noch diverse Objekte (wie Cosntraints, Trigger, Indizes, u.w.) mit übernommen werden.
Neuerungen ab Version 11.x:
Nun können auch abhängige Materialized Views beim Reorg-Prozess mit übernommen werden.
VARIABLE num_err NUMBER
SET SERVEROUTPUT ON SIZE 200000
BEGIN
DBMS_REDEFINITION.COPY_TABLE_DEPENDENTS(
uname=>'SCOTT',
orig_table=>'EMP',
int_table=>'VOR_EMP',
copy_indexes=>dbms_redefinition.cons_orig_params,
copy_triggers=>TRUE,
copy_constraints=>TRUE,
copy_privileges=>TRUE,
copy_statistics=>TRUE,
--copy_mvlog=>TRUE, /* Ab 11g*/
ignore_errors=>FALSE,
num_errors=>:num_err);
dbms_output.put_line('Anzahl Fehler bei Übernahme:'||:num_err);
END;
/
Weitere Informationen zum Thema Reorganisation erhalten Sie in unseren Tuning und Monitoring Kursen. Unser spezialisiertes Consulting-Team hilft gerne beim Reorganisieren Ihrer Objekte.
In unserer Know-How Datenbank finden Sie mehr als 300 ausführliche Beiträge zu den
Oracle-Themen wie DBA, SQL, PL/SQL, APEX und vielem mehr.
Hier erhalten Sie Antworten auf Ihre Fragen.