PLS-00553 beim Restore mit RMAN

01. September 2010 von Michael Brust

Es geht hier um ein Problem des fehlenden bzw. falschen default charaterset des RMAN-Cataloges.
Dies ist in Metalink durch hinlänglich viele Bug’s beschrieben für die Versionen 8.1 über 9 bis hin zu 10.2.0.5.

Mein Problem:

Beim Erstellen eines Klones (ich verwende das Backup einer anderen DB für das Recovery) der Produktion in eine Abnahmeumgebung tritt folgender Fehler auf und RMAN beendet sich:

RMAN-06900: WARNING: unable to generate V$RMAN_STATUS or V$RMAN_OUTPUT row
RMAN-06901: WARNING: disabling update of the V$RMAN_STATUS and V$RMAN_OUTPUT rows
RMAN-06003: ORACLE error from target database:
ORA-06550: line 1, column 152:
PLS-00553: character set name is not recognized
ORA-06550: line 0, column 0:
PL/SQL: Compilation unit analysis terminated

und

RMAN-00571: ===========================================================
RMAN-00569: =============== ERROR MESSAGE STACK FOLLOWS ===============
RMAN-00571: ===========================================================
RMAN-03002: failure of restore command at 09/01/2010 15:09:59
ORA-06550: line 1, column 43:
PLS-00553: character set name is not recognized
ORA-06550: line 0, column 0:
PL/SQL: Compilation unit analysis terminated

Was bis dahin erfolgreich durchgeführt wurde, war der Restore der Controlfiles und die Ausführung verschiedener SQL-Statements (z.b. Löschen der Standby Logs und Deaktivieren von Flashback). Der Fehler tritt auf bei dem eigentlichen RESTORE-Kommando.

Der Workaround

Ein schneller Workaround für dieses Problem sieht folgendermassen aus:

  1. Im RMAN-Template wird alles auskommentiert was bis dato erfolgreich ausgeführt wurde
  2. Neustart des RMAN und alles funktioniert.

Das RMAN-Template

Das Template für den 2.ten Versuch:

run {
   allocate channel t1 type 'sbt_tape' parms 'ENV=(TDPO_OPTFILE=/var/opt/oracle/conf/tdpo.opt),BLKSIZE=524288';
   #
#   restore controlfile;
#   alter database mount;
   #
#   SQL "alter database flashback off";
#   SQL "alter database set standby database to maximize  performance";
#   SQL "alter database disable block change tracking";
#   SQL "alter database drop standby logfile group     11";
   #
   restore database FORCE CHECK READONLY;
   #
   recover database delete archivelog;
}

its-people Vorträge auf der DOAG Konferenz 2010

30. Juli 2010 von Robert Marz

Die DOAG Konferenz, die dieses Jahr im November  in Nürnberg stattfindet, ist seit vielen Jahren schon die  die größte und umfangreichste  Veranstaltung zum Networking, Erfahrungsaustausch und Weiterbildungsveranstaltung für Anwender und Entwickler aus der Oracle-Welt in Deutschland.

Logo der DOAG Konferenz 2010

its-people ist schon seit ihrem Bestehen jedes Jahr mit Vorträgen in der Konferenz vertreten. Dieses Jahr sind wir gleich mit fünf Vorträgen dabei:

Im Stream Strategie & Management:

“Bezwingen Sie das Technologiemonster”

und

“Cloud Computing – seine Chancen, seine Risiken und seine Zukunft”

beide Jörg Osarek.

Im Stream Oracle Datenbank:

“kleine Helferlein” über hilfreiche aber selten genutzte Funktionen in er Datenbank”

von Jens Behring

Im Stream Data Warehouse & Business Intelligence

“Advanced Monitoring von ETL-Prozessen”

von Sven Bosinger

und schließlich im Stream Development

“Formatierte Berichte: Excel-Dateien mittels PL/SQL erzeugen”

von Robert Marz

Ich freue mich auf eine informative Konferenz mit vielen spannenden Gesprächen…

SQL Zeilengenerator

19. Juli 2010 von Robert Marz

Letzte Woche bin ich während eines Vortrages über folgenden Code-Schnipsel gestolpert:

select rownum ident
  from dba_objects
 where rownum <=500;

Mal eben ein paar Zeilen erzeugen ist eine Standardanforderung, der sich jeder SQL-Entwickler von Zeit zu Zeit stellen muss. Egal ob ein paar Demo-Zeilen erzeugt werden müssen oder für die Basis eines Outerjoins die vollständige Liste aller Tage in einem Zeitraum benötigt werden, Anwendungsmöglichkeiten gibt es viele.

Erschreckend häufig werden zu diesem Zweck Abfragen auf System-Views durchgeführt.

Schauen wir es uns einmal genauer an:
Dieses Statement liefert 500 Zeilen zurück. Das ist aber auch schon alles, was man ihm positives unterstellen kann.

Zunächst einmal wird hier auf eine DBA-View zugegriffen, auf die ein normales Schema ohne DBA-Berechtigungen gar keinen Zugriff hat. Das Verwenden von ALL_OBJECTS hilft dem zwar ab, aber kann man sich immer sicher sein, dass jeder Benutzer mehr als 500 Objekte im Zugriff hat?

Außerdem ist DBA_OBJECTS eine System-View, die auf verschiedene andere Views und Tabellen zugreift. Wenn man mal nachschaut, was man der Datenbank für diese einfache Aufgabe abverlangt, bekommt man das bestätigt:

select rownum id
  from dba_objects
 where rownum <=500;
-----------------------------------------------------------------------------------------------
| Id  | Operation                       | Name        | Rows  | Bytes | Cost (%CPU)| Time     |
-----------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT                |             |   500 |       |     8  (13)| 00:00:01 |
|*  1 |  COUNT STOPKEY                  |             |       |       |            |          |
|   2 |   VIEW                          | DBA_OBJECTS |   500 |       |     8  (13)| 00:00:01 |
|   3 |    UNION-ALL                    |             |       |       |            |          |
|*  4 |     FILTER                      |             |       |       |            |          |
|*  5 |      HASH JOIN                  |             |   533 |   154K|     7  (15)| 00:00:01 |
|   6 |       INDEX FULL SCAN           | I_USER2     |    87 |   348 |     1   (0)| 00:00:01 |
|*  7 |       HASH JOIN                 |             |   533 |    97K|     6  (17)| 00:00:01 |
|   8 |        INDEX FULL SCAN          | I_USER2     |    87 |  1914 |     1   (0)| 00:00:01 |
|*  9 |        TABLE ACCESS FULL        | OBJ$        |   534 | 44322 |     4   (0)| 00:00:01 |
|* 10 |      TABLE ACCESS BY INDEX ROWID| IND$        |     1 |     8 |     2   (0)| 00:00:01 |
|* 11 |       INDEX UNIQUE SCAN         | I_IND1      |     1 |       |     1   (0)| 00:00:01 |
|  12 |      NESTED LOOPS               |             |     1 |    29 |     2   (0)| 00:00:01 |
|* 13 |       INDEX FULL SCAN           | I_USER2     |     1 |    20 |     1   (0)| 00:00:01 |
|* 14 |       INDEX RANGE SCAN          | I_OBJ4      |     1 |     9 |     1   (0)| 00:00:01 |
|  15 |     NESTED LOOPS                |             |     1 |    17 |     1   (0)| 00:00:01 |
|  16 |      INDEX FULL SCAN            | I_LINK1     |     1 |    13 |     0   (0)| 00:00:01 |
|* 17 |      INDEX RANGE SCAN           | I_USER2     |     1 |     4 |     1   (0)| 00:00:01 |
-----------------------------------------------------------------------------------------------

Dabei liefert Oracle-SQL doch einen eigenen Generator mit:

select rownum id
  from dual
connect by rownum <= 500;

------------------------------------------------------------------------------
| Id  | Operation                     | Name | Rows  | Cost (%CPU)| Time     |
------------------------------------------------------------------------------
|   0 | SELECT STATEMENT              |      |     1 |     2   (0)| 00:00:01 |
|   1 |  COUNT                        |      |       |            |          |
|*  2 |   CONNECT BY WITHOUT FILTERING|      |       |            |          |
|   3 |    FAST DUAL                  |      |     1 |     2   (0)| 00:00:01 |
------------------------------------------------------------------------------

Diese wenig bekannte Anwendung der hierarchischen Abfrage ist schlank, schön und vor allem viel billiger.
Funktionieren tut das seit mindestens Oracle 9i – frühere Datenbankversionen zum Überprüfen habe ich leider zur Zeit nicht zur Hand.

Leider hat es die Oracle-Schreibweise für hierarchische Abfragen nicht in den ANSI-Standard geschafft, sodass man diese Art Abfragen in den meisten anderen Datenbanken nicht ausführen kann.

Für hierarchische Abfragen sieht ANSI SQL-99 rekursives “subquery refactoring with with-clause” vor.

Komplexe SQL-Abfragen durch with-Blöcke zu vereinfachen, beherrscht Oracle schon seit mindestens Oracle 9i. Die rekursive Aufruf-Erweiterung ist ein neues Feature der 11gR2, sodass man hierarchische Abfragen jetzt auch ANSI-konform formulieren kann:

with
 generator (id)
 as ( select 1 id from dual
      union all
      select id+1 from generator
      where id < 500 )
select id from generator;

--------------------------------------------------------------------------------------------------
| Id  | Operation                                 | Name | Rows  | Bytes | Cost (%CPU)| Time     |
--------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT                          |      |     2 |    26 |     4   (0)| 00:00:01 |
|   1 |  VIEW                                     |      |     2 |    26 |     4   (0)| 00:00:01 |
|   2 |   UNION ALL (RECURSIVE WITH) BREADTH FIRST|      |       |       |            |          |
|   3 |    FAST DUAL                              |      |     1 |       |     2   (0)| 00:00:01 |
|*  4 |    RECURSIVE WITH PUMP                    |      |       |       |            |          |
--------------------------------------------------------------------------------------------------

Das ist fast so billig und beinahe genauso schön wie die Connect-by-Variante.

Durch das für die Rekursion nötige UNION ALL schränkt man bei dieser Variante auf “< 500″ ein, im Gegensatz zu den “<= 500″ bei dem Connect-by

Der its-people Portfolio Blog

14. Juli 2010 von Robert Marz

Herzlich Willkommen.

Mit unserem neuen Oracle-Portfolio-Blog wollen wir – intern und extern – zum Diskutieren anregen, zum anderen freuen wir uns über Beiträge, die kategorisiert zu den Portfolio-Themen im Blog zu finden sein werden.

its-people ist ein bundesweit agierender, innovativer Verbund vontechnologiennahen IT-Dienstleistungsunternehmen, welcher seit mehreren Jahren erfolgreich im Markt etabliert ist. its-people steht für einen unternehmerisch geführten Verbund von selbständigen IT-Beratern, die ihre Kompetenz und Kundenorientierung unter einem einheitlichen Marktauftritt organisieren .Wir begleiten und unterstützen unsere Kunden zu den Themen ORACLE, SAP, Business Intelligence/Data Warehouse und IT-Management Services. Von der Planung über die Entwicklung zur Integration und Inbetriebnahme bis hin zum dauerhaften Support.