ORA-12911 bei IMPDP eines EXPDP einer auf Oracle 12.2/18c upgegradeten Datenbank
Mit Oracle 12.2 führt Oracle das Konzept von LOCAL TEMPORARY TABLESPACES ein. Die Local Temporary Tablespaces sind für Oracle RACs gedacht, damit jede Instanz Ihre eigenen Temp Tablespaces nutzen kann. Diese Temp Tablespaces können auf lokalen HDDs liegen und verschwenden somit keinen Platz auf der Shared Storage.
Soweit so gut, leider hat Oracle bei den Upgrade Scripts nicht genau genug nachgedacht... Die Scripts übernehmen den SYSTEM Tablespace als LOCAL TEMPORARY TABLESPACE - was natürlich aus vielen Gründen nicht sein kann!
Analyse
Hier ein Beispiel, wie die Local Temporary Tablespaces nach einem Upgrade konfiguriert sein können:
select username, default_tablespace, temporary_tablespace, local_temp_tablespace from dba_users order by username;
USERNAME DEFAULT_TABLESPACE TEMPORARY_TABLESPACE LOCAL_TEMP_TABLESPACE
----------- ------------------ -------------------- ---------------------
...
APP1_ADMIN APPDATA1 TEMP TEMP
APP1_OPER APPDATA1 TEMP TEMP
APP2_ADMIN APPDATA1 TEMP
APP2_OPER APPDATA1 TEMP SYSTEM
...
Wie man sieht, gibt es für den LOCAL_TEMP_TABLESPACE drei verschiedene Varianten:
- NULL als Local Temporary Tablespace - das erwartete Verhalten!
- TEMP als Local Temporary Tablespace - solange man keinen RAC einsetzt, ist das OK. Im Falle eines RACs muss man sich der sinnvollen Konfiguration der Local Temporary Tablespaces zuwenden.
- SYSTEM als Local Temporary Tablespace - ganz schlecht, jetzt haben wir ein Problem!
Der SYSTEM Tablespace kann keine Tempfiles / Temporary Segments enthalten (CONTENTS=PERMANENT), was beim Transport der User durch Datapump / Export zu Problemen führt. Man bemerkt diesen Umstand aber vermutlich längere Zeit nicht, da die Datenbank durchaus wie erwartet funktioniert - auch im RAC, solange die entsprechenden DBFs auf einer Shared Storage liegen.
Das Problem mit EXPDP/IMPDP
Auffallen wird einem das Problem erst, wenn man einen EXPORT der Datenbank macht, die man in einer anderen Datenbank wieder importieren möchte. Beim IMPDP wird man folgenden Fehler vorfinden:
ORA-39083: Object type USER:"ABC" failed to create with error:
ORA-12911: permanent tablespace cannot be temporary tablespace
Failing sql is:
ALTER USER "ABC" LOCAL TEMPORARY TABLESPACE "SYSTEM"
Die Lösung
Man muss für alle Benutzer, deren LOCAL TEMPORARY TABLESPACE auf SYSTEM steht, einen anderen Tablespace angeben - hier ein Beispiel, wie man das macht:
select 'alter user '||username||' local temporary tablespace '||temporary_tablespace||';' from dba_users where local_temp_tablespace='SYSTEM';
Dieses Statement erzeugt ALTER USER Statements, die man mit CUT/PAST in der gleichen Session laufen lassen kann (sofern man die entsprechenden Privilegien hat). Dabei wird der LOCAL Temporary Tablespace dem Temporary Tablespace gleichgesetzt, sollte dieser fälschlicherweise auf SYSTEM stehen.
Zu beachten ist, dass in einer Multitenant Umgebung auch den Benutzern in der PDB$SEED potentiell den SYSTEM Tablespace als Local Temporary Tablespace zugewiesen haben können! Man muss daher diese Korrektur auch in der PDB$SEED vornehmen. Wenn Sie hierbei Hilfe benötigen, stehen wir Ihnen gerne zur Verfügung.
Wir empfehlen allen, die Ihre Datenbank auf 12.2/18c upgegradet haben, dies unbedingt durchzuführen. Die fehlerhafte Einstellung kann möglicherweise noch andere Probleme bereiten, die aktuell noch nicht bekannt sind.