Tenebrias

~ Ein Spiegel für den Winter meiner Seele ~

Archiv für die Kategorie ‘Arbeit’

Fallstricke bei der 11g Migration

Verfasst von Tenebrias am 13.05.2009 - 08:48

Fallstricke bei der Migration auf 11g Szenario: Unsere 9i Spieldatenbank soll auf 11g migriert werden. Die Vorbereitungen sind weitgehend abgeschlossen, nur der SYSAUX-Tablespace fehlt noch. Diesen erstellen wir noch unter 9i unter Ignoranz der Oracle-Empfehlung einfach mit den Defaultwerten:

create tablespace sysaux datafile 'path/name' SIZE 512M;

Oracle empfiehlt hier Folgendes:

Create the SYSAUX tablespace only if you are upgrading from Oracle Database9i Release 2 (9.2) with the following mandatory attributes:

ONLINE
PERMANENT
READ WRITE
EXTENT MANAGEMENT LOCAL
SEGMENT SPACE MANAGEMENT AUTO

Der Haken liegt bei der letzten Option, die unter 9i nicht default ist – normal wird MANUAL gesetzt. Starten wir das Upgrade dann mit diesem falschem Sysaux, schlägt catupgrd sehr schnell fehl:

SELECT TO_NUMBER ('Not AUTO segment space management') from ts$
                   *
ERROR at line 1:
ORA-01722: invalid number

Disconnected from Oracle Database 11g Enterprise Edition Release 11.1.0.7.0 - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options

Damit stecken wir dann in der Klemme: Wir können den Tablespace unter 11g nicht löschen:

SQL> drop tablespace sysaux;
drop tablespace sysaux
*
ERROR at line 1:
ORA-00600: internal error code, arguments: [kttdtsn-1], [], [], [], [], [], [], [], [], [], [], []

Wir kommen aber auch nicht mehr auf 9i zurück, um das dort zu tun:

SQL> alter database mount;
ORA-00201: controlfile version 9.2.0.0.0 incompatible with ORACLE version 9.2.0.0.0
ORA-00202: controlfile: 'path/file_01.ctl'

Soviel dazu. Gut, dass dies eine Spieldatenbank ist, deren vollständiges Recovery (nicht nur Controlfiles, sondern auch Datenfiles) ganz schnell geht..

Veröffentlicht in Arbeit | Kommentar schreiben »

Grid Control Update von 10.2.0.4 auf 10.2.0.5 schlägt fehl

Verfasst von Tenebrias am 06.04.2009 - 07:53

Zwecks Test des neu erschienenen Grid Control Updates von 10.2.0.4 auf 10.2.0.5 auf Windows erstellte ich eine komplett neue Installation mitsamt Repository in folgender Reihenfolge:

  1. Installation der Datenbanksoftware 10.2.0.1
  2. Erstellung einer Datenbank auf 10.2.0.1 mit passenden Parametern
  3. Installation von Grid Control mit dem Full Installer auf 10.2.0.2
  4. Patch von Grid Control auf 10.2.0.4
  5. Patch der Datenbank auf 10.2.0.4

Ab diesem Punkt entsprach die Software unserem aktuellen produktiven Stand und bis dahin war auch alles problemlos gelaufen. Die Schwierigkeit kam nun beim interessanten Sprung – der Installer brach zwischenzeitlich mit einer Fehlermeldung ab. In den Logs läßt sich dazu Folgendes finden:

Calling updateConfig to notify DCM of new deployments...
failed!
ERROR: Caught exception calling updateConfig: oracle.ias.sysmgmt.exception.ParsingException: Das Plug-In "apache", das von der "OHS"-Komponente zur Verfügung gestellt wird, hat beim Lesen der Konfigurationsdaten eine Exception ausgelöst.
Lösung:
Die Informationen der "OHS"-Komponente in der Basis-Exception sind möglicherweise hilfreich.
Außerdem gibt es folgende allgemeine Problemursachen:
    Falsche Berechtigungen für Dateien
    Konfigurationsdateien fehlen oder sind ungültig
Exception von Plug-In ausgelöst"apache":
oracle.ias.sysmgmt.repository.plugin.advanced.apache.parser.ParserException
parsing e:\oracle\product\oms10g\Apache\Apache\conf\ssl.conf: </ expected at line 39 column 44, but encounter <EOF: END OF FILE>

ERROR! DEPLOY TOOL CANNOT CONTINUE DEPLOYMENTS: could not update DCM repository with newly deployed applications - ALL APPLICATIONS WILL BE UNDEPLOYED.

Undeploying application 'portletapp' from OC4J instance 'home'.

Application 'portletapp' successfully undeployed.
Stopping OC4J instance 'home'...
done.
Terminating DCM...
done.
Copying e:\oracle\product\oms10g/j2ee/deploy.ini to e:\oracle\product\oms10g/j2ee/deploy.ini.1238741828013.bak.
Writing any undeployed entries back to e:\oracle\product\oms10g/j2ee/deploy.ini.

Oc4jDeploy tool completed, but with errors.

Mhm. Ein Blick in die bemängelte ssl.conf zeigt den Fehler: Zum IfDefine SSL gibt es schlicht und einfach kein schließendes Tag. Das kann nun als </IfDefine> einfach ergänzt werden .. und schon läuft alles hübsch durch.

Ein Blick in die Konfiguration unseres produktiven OMS enthüllte übrigens, dass dort alle Tags brav geschlossen sind ..

Update 09.05.2009:

Man soll den Tag ja nicht vor dem Abend loben .. beim Versuch den produktiven OMS zu patchen, gab es genau diesen Fehler. Offenbar wird zwischendurch die alte ssl.conf überschrieben.

Update 02.06.2009:

Es gibt eine Bugbeschreibung von Oracle dazu: 8339545

Das Vorgehen wird dort wie folgt beschrieben:

1) Keep the installer session active at the failure point.
2) Navigate to .../oms10g/Apache/Apache/conf/ and archive the existing ssl.conf file (verify it is only 2kB in size, exemplary of the problem).
3) Copy the ssl.conf.smibak (should be about 7kb in size) to ssl.conf.
4) Select "Retry" in the failed installer session.
5) Watch the 10.2.0.5.0 patchset installation complete successfully.

Veröffentlicht in Arbeit | Verschlagwortet mit : , , , , , | 3 Kommentare »

Grid Control und die Sommerzeit

Verfasst von Tenebrias am 30.03.2009 - 08:04

Wie bereits befürchtet, hat uns die Zeitumstellung am gestrigen Sonntag bei Grid Control Probleme bereitet. Ganz knapp: Nahezu alle unsere Datenbanken hatten den Status Pending und konnten nicht mehr überwacht werden.

Stoppen und Starten des Agenten via emctl ist genausowenig hilfreich wie die Erneuerung der Grid Control Konfiguration.

Das Internet brachte einmal mehr die Lösung:

1. Stoppen des Agenten

oraadmin@deerlf0vl1 [AGENT]  /opt/oracle/oraadmin/admin/AGENT
> emctl stop agent
Oracle Enterprise Manager 10g Release 4 Grid Control 10.2.0.4.0.
Copyright (c) 1996, 2007 Oracle Corporation.  All rights reserved.
Stopping agent ... stopped.

2.  Zurücksetzen der Zeitzone

oraadmin@deerlf0vl1 [AGENT]  /opt/oracle/oraadmin/admin/AGENT
> emctl resetTZ agent
Oracle Enterprise Manager 10g Release 4 Grid Control 10.2.0.4.0.
Copyright (c) 1996, 2007 Oracle Corporation.  All rights reserved.
Updating /opt/oracle/oraadmin/product/10.2.0.4/initial/agent10g//sysman/config/emd.properties...
Successfully updated /opt/oracle/oraadmin/product/10.2.0.4/initial/agent10g//sysman/config/emd.properties.
Login as the em repository user and run the  script:
exec mgmt_target.set_agent_tzrgn('deerlf0vl1.erlf.siemens.de:3872','Europe/Berlin')
and commit the changes
This can be done for example by logging into sqlplus and doing
SQL> exec mgmt_target.set_agent_tzrgn('deerlf0vl1.erlf.siemens.de:3872','Europe/Berlin')
SQL> commit

3. Verbindung mit sqlplus wie gefordert

SQL> exec mgmt_target.set_agent_tzrgn('deerlf0vl1.erlf.siemens.de:3872','Europe/Berlin')
SQL> commit;

4. Agent neu starten
emctl start agent

Et voila .. unser Ziel schaltet in der Ansicht von Grid Control wieder auf verfügbar um.

Interessanterweise trat dieses Problem nicht bei allen Datenbanken auf – warum kann ich im Moment noch nicht sagen.

Ergänzung: Es ist wichtig die Schritte in der absolut richtigen Reihenfolge auszuführen:

  1. emctl stop agent
  2. emctl resetTZ agent
  3. SQL set_agent_tzrgn
  4. emctl start agent

Update: Eine interessante Entwicklung: Ich stieß ein Script an, welches eben diese vier Schritte auf allen Solaris-Zonen ausführen sollte. Nachdem das geschehen war, kamen die entsprechenden Datenbanken wie gewünscht wieder online .. und dazu auch alle anderen Datenbanken. O_o

Das heisst: Tatsächlich muss das Problem an einem mir nicht bekannten Agenten gehangen haben und dessen Sauberstellung sorgte dann dafür, dass sich überall – sogar bei den Windowsmaschinen – die Klemme von allein löste. Faszinierend. :/

Veröffentlicht in Arbeit | Kommentar schreiben »

Controlfiles bei 11.1.0.7

Verfasst von Tenebrias am 27.03.2009 - 13:43

Ein für mich neues Feature von 11.1.0.7 (ich habs bei 11.1.0.6 nicht getestet): Offenbar werden die Controlfiles nur noch zum starten und stoppen der Datenbank benötigt.

Der Entdeckung ging ein „klassisches“ Recovery-Szenario zur Übung voraus: Verlust sämtlicher Kontrolfiles der Datenbank.

Bei 9.2.0.8 und 10.2.0.4 ergibt der Versuch etwas über die DB-Struktur zu erfahren folgenden Fehler:

SQL> select name from v$tempfile;
select name from v$tempfile
                 *
ERROR at line 1:
ORA-00210: cannot open the specified control file
ORA-00202: control file: '/opt/oracle/orarman/oradata/RAPOS/control_1/RAPOS_01.ctl'
ORA-27041: unable to open file
SVR4 Error: 2: No such file or directory
Additional information: 3

Bei 11.1.0.7 habe ich dagegen überhaupt kein Problem: Brav wird mir die Struktur angezeigt, ich kann Änderungen vornehmen (Datenfiles adden beispielsweise) und schliesslich sogar ein alter database backup controlfile to trace durchführen.

Erst wenn ich versuche die Datenbank immediate herunterzufahren bekomme ich einen Fehler – und sobald ich sie mit abort in den Sand gesetzt habe, kann sie natürlich nachher nicht mehr starten.

Das Recovery ist jedoch denkbar einfach: Solange die Datenbank noch läuft, wird mit alter database backup controlfile to trace ein Trace erzeugt und anschließend benutzt. Sogar die noresetlogs-Version funktioniert tadellos.

Veröffentlicht in Arbeit | Verschlagwortet mit : , , , , , , | Kommentar schreiben »

Waitevents beim Erstellen eines OMS

Verfasst von Tenebrias am 26.03.2009 - 11:53

Nachdem nun seit einigen Tagen Grid Control in Version 10.2.0.5 für Windows und Linux verfügbar ist, habe ich mich entschlossen einen ersten Test durchzuführen. Dafür sollte die brav laufende OMS-Landschaft (Repository auf 10.2.0.4, ein OMS auf Windows, ein OMS auf Solaris) nicht angetastet werden.

Also installierte ich auf einer freien Maschine zuerst eine 10.2.0.1 DB-Software samt Datenbank in Defaulteinstellung und schob dann die Installation des OMS in Version 10.2.0.2 an.

Dabei waren an der Datenbank noch ein paar Extraeinstellungen notwendig:

  • session_cached_cursors auf mindestens 200
  • aq_tm_processes auf mindestens 1
  • DBMS_SHARED_POOL erstellen: @?/rdbms/admin/dbmspool

Danach lief der Installer brav an .. und lief .. und lief .. und lief …

2 Stunden später begann ich mich ernstlich zu fragen, was da eigentlich noch passierte.

Ein Blick in v$session_wait zeigte mir knapp 20 sehr lange andauernde Waits der wait_class <b>Scheduler</b> mit dem Even: <b>resmgr:become active</b>.

Mhm. Noch nie gesehen. Danach schaute ich in v$sql um zu sehen, ob überhaupt etwas neues kommt – Fehlanzeige.

Google hilft weiter:

resmgr:become active (Oracle 10g and higher)

* Meaning: Preventing database connections due to an active QUIESCE session
* Optimization steps:

Generally, this wait situation occurs when you execute certain EMCA operations such as the operation for creating the EM repository. As a result of these operations, the systems implicity switches to QUIESCE mode. Therefore, all database connections (except users SYS and SYSTEM) must wait for „resmgr:become active“. In this case, refer to Note 1044758 and execute the following command if necessary:

ALTER SYSTEM UNQUIESCE;

Nach diesem schönen Statement verschwanden die Waits augenblicklich, v$sql wurde mit neuen Anweisungen geflutet .. alles lief weiter.

Wunderhübsch.

Veröffentlicht in Arbeit | Verschlagwortet mit : , , , , | Kommentar schreiben »

ORA-00600: internal error code, arguments: [510]

Verfasst von Tenebrias am 21.04.2008 - 13:58

Der Montag fängt gut an. Nachdem es einige Probleme mit der Produktivierung unserer ersten 11g-Datenbank gab, haben wir auf einer anderen 10.2.0.3 Datenbank seit heute massiv auftretende ORA-00600.

Im alert.log sieht das wie folgt aus:

Mon Apr 21 11:44:55 2008
Errors in file /opt/erlf0vl0v1/home/oracob/oracle_base/diag/rdbms/COBP/COBP/bdump/cobp_mmon_12039.trc:
ORA-00600: internal error code, arguments: [510], [0x3800245E8], [threshold alerts latch], [], [], [], [], []

Bevor nun jemandem die Augen rausfallen: Ja, das ist eine 10gR2, die eine 11g-Struktur faked. Aber zur Sache.
Im Call-Stack-Trace wird es hübsch:

*** SERVICE NAME:(SYS$BACKGROUND) 2008-04-21 11:44:55.097
*** SESSION ID:(491.11629) 2008-04-21 11:44:55.097
*** 2008-04-21 11:44:55.097
ksedmp: internal or fatal error
ORA-00600: internal error code, arguments: [510], [0x3800245E8], [threshold alerts latch], [], [], [], [], []
----- Call Stack Trace -----
calling              call     entry                argument values in hex
location             type     point                (? means dubious value)
-------------------- -------- -------------------- ----------------------------
ksedmp()+744         CALL     ksedst()             000000840 ?
FFFFFFFF7FFFC44C ?
000000000 ?
FFFFFFFF7FFF8F40 ?
FFFFFFFF7FFF7CA8 ?
FFFFFFFF7FFF86A8 ?
kgeriv()+220         PTR_CALL 0000000000000000     000106400 ? 106532264 ?
106532000 ? 000106532 ?
000106400 ? 106532264 ?
kgesiv()+112         CALL     kgeriv()             10652CC18 ? 000000000 ?
0000001FE ? 000000002 ?
FFFFFFFF7FFFC9A8 ?
000001430 ?
ksesic2()+96         CALL     kgesiv()             10652CC18 ?
FFFFFFFF79820040 ?
0000001FE ? 000000002 ?
FFFFFFFF7FFFC9A8 ?
000001420 ?
kslfre()+1040        CALL     ksesic2()            0000001FE ? 00010652C ?
106532258 ? 000106400 ?
106532000 ? 000106532 ?
ktte_check_threshol  CALL     kslfre()             3800245E8 ? 000106400 ?
d()+1404                                           000000000 ? 00000000A ?
000106400 ? 10574DE84 ?
ktte_check_undo_tbs  CALL     ktte_check_threshol  000000001 ? 000280000 ?
()+300                        d()                  000280000 ? 0001FC048 ?
000000000 ? 000000000 ?
ktte_monitor_tsth()  CALL     ktte_check_undo_tbs  00000077B ? 380017DC4 ?
+1744                         ()                   000000CC0 ? 000000001 ?
000000000 ? 0001FC048 ?

Eine kurze Suche auf Metalink führt zu DocId 395380.1: ORA-00600: [510], [], [threshold alerts latch] is being reported by MMON process und der Aussage: Problem was likely introduced after adding alerts for threshold values on tablespaces.

Öh. Ja, das kommt mir bekannt vor. Da hatte ich doch heute erst ein paar Schwellwerte für den UNDO-Tablespace eingeführt. Die schöne Aussage der Note ist: Gefixt in 11g, Workaround: Abschalten der Metric.

O_O.
Und das ist wahrscheinlich auch noch ernst gemeint.

Ein wenig weitergehende Suche zeigt mir:

  • Die Eintragung der Werte für den Tablespace erscheint nicht in der passenden Metrik Tablespace Free Space (MB)
  • Der händische Eintrag an dieser Stelle bleibt ohne Wirkung
  • Ein äquivalenter Metrikeintrag für einen anderen Tablespace direkt bei Edit Tablespace im Grid bringt keine Fehler.

Und nun wird es interessant. Ich packe wie vorher auch schon mehrfach wieder Tresholds für den crashverursachenden Tablespace rein, ändere aber die Werte und es funktioniert tadellos. Mhm. Doof geguckt, dann probeweise auf den originalen Treshold gestellt, der vorher nach jedem Aktivieren/Deaktivieren Probleme machte – und es geht. Toll.

Veröffentlicht in Arbeit | Verschlagwortet mit : , , | Kommentar schreiben »

Datapump – kleines Script

Verfasst von Tenebrias am 11.04.2008 - 06:36

An der Stelle nun ein vollständiges Script für den Export von Schemata via Datapump.

== Vorraussetzungen ==

  • Die Datenbank muss mindestens Version 10g haben (getestet auf 10.2.0.3)
  • Der verwendete User muss die Rolle EXP_FULL_DATABASE haben

== Installation ==

Die gesamte Installation wird als User SYS durchgeführt

=== Directory erstellen ===

create directory EXPORT_DIR as '/opt/oracle/oracob/oradata/COBP/export';
grant read,write on directory EXPORT_DIR to DBGUARD;

=== Tabelle EXPORT_SCHEMA_LIST erstellen ===

Diese Tabelle hält die Namen der zu exportierenden Schemata. Sie werden vollständig exportiert.

CREATE TABLE dbguard.export_schema_list (schema VARCHAR2(50));
INSERT INTO dbguard.export_schema_list VALUES ('DBGUARD');
INSERT INTO dbguard.export_schema_list VALUES ('NON_VALID_USER');

=== Prozedur EXPORT_SCHEMA erstellen ===

Diese Prozedur ist das eigentliche Herzstück. Hier werden die DBMS_DATAPUMP-Kommandos abgesetzt und hier erfolgt der Aufruf von SIMPLEMAILMESSAGE im Fehlerfall.

Aufgerufen wird sie wie folgt:

execute DBGUARD.EXPORT_SCHEMA(‘ADCRADM’);

Hier ist das DDL:

CREATE OR REPLACE PROCEDURE "DBGUARD"."EXPORT_SCHEMA" (in_schema in varchar2)
as
   job_handle NUMBER;
   job_status VARCHAR2(30);
   schema_name VARCHAR2(30);
   job_name VARCHAR2(40);
   file_name VARCHAR2(60);
   cursor cur1 is select host_name, instance_name from v$instance;
   host_name VARCHAR2(30);
   instance_name VARCHAR2(30);
BEGIN
   open cur1;
   fetch cur1 into host_name, instance_name;
   close cur1;
   dbms_output.put_line (host_name);
   schema_name := in_schema;
   job_name := schema_name||'_EXPORT_SCHEMA';
   file_name := schema_name||'_'||to_char(sysdate, 'YYYYMMDD-HH24MI');
   job_handle := DBMS_DATAPUMP.open(operation=>'EXPORT',job_mode=>'SCHEMA',job_name=>job_name);
   DBMS_DATAPUMP.add_file(handle=>job_handle,filename=>file_name||'_%U.dmp',directory=> 'EXPORT_DIR',filetype=>1);
   DBMS_DATAPUMP.add_file(handle=>job_handle,filename=>file_name||'.log',directory=> 'EXPORT_DIR',filetype=>3);
   DBMS_DATAPUMP.metadata_filter(handle => job_handle,name=>'SCHEMA_EXPR',value=>'IN ('''||schema_name||''')');
   DBMS_DATAPUMP.start_job (job_handle);
   DBMS_DATAPUMP.wait_for_job (handle => job_handle, job_state => job_status);
   DBMS_OUTPUT.put_line ('DataPump Export - '||to_char(sysdate,'DD/MM/YYYY HH24:MI:SS')||' Status '||job_status);
   DBMS_DATAPUMP.detach (handle => job_handle);
END;
/

=== Procedure EXPORT_SCHEMA_FROM_LIST erstellen ===

Diese Prozedur ist der Rahmen, das, was wir aufrufen. EXPORT_SCHEMA_FROM_LIST liest die zu exportierende Schemata aus der Tabelle EXPORT_SCHEMA_LIST und ruft dann die Prozedur EXPORT_SCHEMA für jedes dieser Schemata auf.

execute DBGUARD.EXPORT_SCHEMA_FROM_LIST;

Hier das DDL:

CREATE OR REPLACE PROCEDURE DBGUARD.EXPORT_SCHEMA_FROM_LIST
as
   list_schema VARCHAR2(30);
   list_table VARCHAR2(30);
   cursor cur is select * from DBGUARD.EXPORT_SCHEMA_LIST;
BEGIN
   for r in cur
   loop
      DBGUARD.EXPORT_SCHEMA(r.schema);
   end loop;
END;
/

== Aufruf ==

Die beiden Teile des Gesamtpaketes können einzeln aufgerufen werden.

-- Export eines benannten Schemas
execute DBGUARD.EXPORT_SCHEMA('ADCRADM');
-- Export aller Schemata in der Tabelle
execute DBGUARD.EXPORT_SCHEMA_FROM_LIST;

Veröffentlicht in Arbeit | Verschlagwortet mit : , , , | Kommentar schreiben »

Stored Procedures und Datapump

Verfasst von Tenebrias am 07.04.2008 - 07:42

Seit Oracle 10gR2 ist Datapump das Werkzeug der Wahl für Export/Import.

Was liegt also näher, als sich auch einmal damit zu beschäftigen – der Gedanke entsprechende Jobs direkt in der Datenbank laufen zu lassen und damit von der Shellebene wegzugehen war zumindest sehr behaglich.

Wie immer sieht es in der Realität nicht so einfach aus.

Grundsätzlich war ich rasch in der Lage einen passenden anonymen plsql-Block aufzubauen, der genau das tut, was ich möchte.

DECLARE
    job_handle NUMBER;
    job_status VARCHAR2(30);
    schema_name VARCHAR2(30);
    job_name VARCHAR2(40);
    file_name VARCHAR2(60);
BEGIN
    schema_name := 'DBGUARD';
    job_name := schema_name||'_EXPORT_SCHEMA';
    file_name := job_name||'_'||to_char(sysdate, 'YYYYMMDD-HH24MI');
    job_handle := DBMS_DATAPUMP.open(operation=>'EXPORT',job_mode=>'SCHEMA',job_name=>job_name);
    DBMS_DATAPUMP.add_file(handle=>job_handle,filename=>file_name||'_%U.DMP',directory=> 'EXPORT_DIR',filetype=>1);
    DBMS_DATAPUMP.add_file(handle=>job_handle,filename=>file_name||'.LOG',directory=> 'EXPORT_DIR',filetype=>3);
    DBMS_DATAPUMP.metadata_filter(handle => job_handle,name=>'SCHEMA_EXPR',value=>'IN ('''||schema_name||''')');
    /*
    DBMS_DATAPUMP.metadata_filter(handle => job_handle,name=>'SCHEMA_EXPR',value=>'IN ('''||schema||''')');
    */
    dbms_datapump.start_job (job_handle);
    dbms_datapump.wait_for_job (handle => job_handle, job_state => job_status);
    dbms_output.put_line ('DataPump Export - '||to_char(sysdate,'DD/MM/YYYY HH24:MI:SS')||' Status '||job_status);
    dbms_datapump.detach (handle => job_handle);
END;
/

Soweit, sogut. Lasse ich das laufen, werden im EXPORT_DIR auch brav das Dumpfile und das Logfile angelegt – alles super.

Es lag nahe zu versuchen diesen Block nun in eine Stored Procedure zu verpacken.

Nach minimalen Änderungen sah das dann so aus:

CREATE OR REPLACE PROCEDURE SYSTEM.EXPORT_SCHEMA (schema in varchar2)
as
    job_handle NUMBER;
    job_status VARCHAR2(30);
    schema_name VARCHAR2(30);
    job_name VARCHAR2(40);
    file_name VARCHAR2(60);
BEGIN
    schema_name := 'DBGUARD';
    job_name := schema_name||'_EXPORT_SCHEMA';
    file_name := job_name||'_'||to_char(sysdate, 'YYYYMMDD-HH24MI');
    job_handle := DBMS_DATAPUMP.open(operation=>'EXPORT',job_mode=>'SCHEMA',job_name=>job_name);
    DBMS_DATAPUMP.add_file(handle=>job_handle,filename=>file_name||'_%U.DMP',directory=> 'EXPORT_DIR',filetype=>1);
    DBMS_DATAPUMP.add_file(handle=>job_handle,filename=>file_name||'.LOG',directory=> 'EXPORT_DIR',filetype=>3);
    DBMS_DATAPUMP.metadata_filter(handle => job_handle,name=>'SCHEMA_EXPR',value=>'IN ('''||schema_name||''')');
    /*
    DBMS_DATAPUMP.metadata_filter(handle => job_handle,name=>'SCHEMA_EXPR',value=>'IN ('''||schema||''')');
    */
    dbms_datapump.start_job (job_handle);
    dbms_datapump.wait_for_job (handle => job_handle, job_state => job_status);
    dbms_output.put_line ('DataPump Export - '||to_char(sysdate,'DD/MM/YYYY HH24:MI:SS')||' Status '||job_status);
    dbms_datapump.detach (handle => job_handle);
END;
/

Die Änderung beschränkt sich letztlich darauf, dass beim Aufruf der Procedure das zu exportierende Schema als Parameter mitgegeben wird.

execute SYSTEM.EXPORT_SCHEMA('DBGUARD');

Wunderbar – läuft – zumindest beim ersten Mal.

Der nächste Aufruf präsentiert mir einen wunderschönen Fehler:

ORA-31634: job already exists
ORA-06512: at "SYS.DBMS_SYS_ERROR", line 79
ORA-06512: at "SYS.DBMS_DATAPUMP", line 911
ORA-06512: at "SYS.DBMS_DATAPUMP", line 4354
ORA-06512: at "SYSTEM.EXPORT_SCHEMA", line 12
ORA-06512: at line 1

Mhm. MHM.

Gucken wir mal.

SQL> select * from dba_datapump_jobs;
OWNER_NAME JOB_NAME                       OPERATION            JOB_MODE        STATE          DEGREE ATTACHED_SESSIONS DATAPUMP_SESSIONS
---------- ------------------------------ -------------------- --------------- ---------- ---------- ----------------- -----------------
SYSTEM     DBGUARD_EXPORT_SCHEMA          EXPORT               SCHEMA          DEFINING            1                 1                 2

Ok, wir haben meinen Job und zwar mit einer attached Session im Status „DEFINING“. Das heisst, es müßte auch die Master-Tabelle noch geben.

SQL> SELECT o.status, o.object_id, o.object_type,
o.owner||'.'||object_name "OWNER.OBJECT"
FROM dba_objects o, dba_datapump_jobs j
WHERE o.owner=j.owner_name AND o.object_name=j.job_name ;  2    3    4
STATUS           OBJECT_ID OBJECT_TYP OWNER.OBJECT
--------------- ---------- ---------- ----------------------------------------
VALID                80524 TABLE      SYSTEM.DBGUARD_EXPORT_SCHEMA
1 row selected.

Offenbar räumt sich dieser Job nicht mehr von allein weg.

Dann tue ich das eben:

SQL> drop table SYSTEM.DBGUARD_EXPORT_SCHEMA;
Table dropped.

Der neuerliche Job-Aufruf bringt aber den gleichen Fehler.

Ist die Session zur gedropten Mastertabelle etwa noch da?

SQL> select username,program,status,logon_time, 'alter system kill session '''||sid||','||serial#||''';' befehl from v$session where program like '%DM0%';
USERNAME    PROGRAM                        STATUS          LOGON_TIME                BEFEHL
----------- ------------------------------ --------------- ------------------------- ------------------------------------
SYSTEM      oracle@deerlf0vl1 (DM00)       ACTIVE          07.04.2008 - 08:22:42     alter system kill session '79,3658';

Ist sie. Dann mal auch mit ihr weg.

SQL> alter system kill session '79,3658';
System altered.

Und wie sieht es nun aus?

SQL> execute SYSTEM.EXPORT_SCHEMA('DBGUARD');
PL/SQL procedure successfully completed.

Toll. Ein rascher Blick zeigt, dass diesmal auch keinerlei Reste zurückgeblieben sind: Keine Mastertabelle, keine Session. Es müßte also eigentlich auch ein weiteres Mal funktionieren.

Die Probe ergibt: Jawohl, es geht. Ein weiterer Test zeigt: Nein, es geht mit den alten Problemen nicht. wtf?

Die Erleuchtung kommt ein wenig später: Auch nachdem der Export durchgelaufen ist, scheint noch einige Zeit zu vergehen, bis die internen Aufräumarbeiten abgeschlossen sind. Ruft man in dieser Zeit die Stored Procedure noch einmal auf, verhakt sich das Ganze und muss anschließend von Hand aufgeräumt werden.

Update: Dieses Problem tritt bei 11g nicht mehr auf.

Veröffentlicht in Arbeit | Verschlagwortet mit : , , , , | Kommentar schreiben »

Error 45 initializing SQL*Plus

Verfasst von Tenebrias am 02.04.2008 - 07:49

Einer unserer Kunden läßt SQL-Scripte für Jobs gegen die Datenbank laufen, diese Scripte liegen auf einem Share im SAN. Normalerweise ist das kein Problem, teilweise laufen diese Jobs im 5 Minutentakt und das seit jeher ohne das geringste Problem.

Vor einigen Tagen trat dann einmal ein Fehler auf:

Error 45 initializing SQL*Plus

Eine Suche bei Metalink führte mich zu Note 281450.1: Error 45 Initializing In SQL*Plus When Running A Sql Script From OCFS

Ok, wir haben kein Oracle-Clusterfilesystem, aber die generelle Beschreibung des Bugs passt dennoch nahezu vollständig auf unser Problem, mit einer häßlichen Ausnahme: Der Fehler wird als „durchgängig auftretend“ beschrieben und das ist bei uns nicht der Fall.

Eine weitere Suche machte nur klar, dass durch diese Initialisierungsfehler tatsächlich keine Verbindung zur Datenbank aufgebaut wird. Da nur ein einziger Job fehlgeschlagen war, ansonsten aber alles normal funktionierte, blieb es erst einmal dabei.

Gestern kam es dann zum Crash: Ab einem Zeitpunkt X liefen plötzlich überhaupt keine der definierten Jobs mehr, sie alle kamen mit dem Fehler „Error 45 initializing SQL*Plus“ zurück.

Da lacht das Herz, besonders wenn es Zeit für Feierabend ist.

Eine Untersuchung ergab

  • Es wird weiterhin keine Verbindung zur Datenbank aufgebaut.
  • Benutze ich das Script im SAN und rufe es von A aus auf, geht es nicht.
  • Kopiere ich das Script auf die lokale Platte von A und rufe es von A aus auf, läuft es problemlos.
  • Lege ich das Script auf die lokale Platte von B und rufe es von A aus auf, läuft es problemlos.
  • Benutze ich das Script im SAN und rufe es von B aus auf, läuft es problemlos.

Das Problem scheint also weniger der SAN, als etwas am zugreifenden Rechner A zu sein. Die Bugbeschreibung von Oracle passt zwar halbwegs auf die Symptome, erklärt aber nicht, warum es von B aus funktioniert.

Nachdem A mit Clientversion 9.2.0.1 läuft und B mit Clientversion 11.1.0.6 (die Datenbank selbst ist auf 9.2.0.8)  zog ich das Patchen auf eine höhere Version in Betracht – man angelt eben nach Strohhalmen. :/

Dazu kam es dann doch nicht – nach einem simplen Reboot von A funktionierte wieder alles tadellos. Ich muss nicht erwähnen, dass weder die Leute von Netz- noch Storageteam irgendetwas geändert hatten oder gar Fehler fanden.

Veröffentlicht in Arbeit | Verschlagwortet mit : , | 1 Kommentar »

Dumme Angewohnheiten, die ich loswerden muss

Verfasst von Tenebrias am 15.02.2008 - 13:51

Vorhaben: Einen Statpack-Report generieren (@?/rdbms/admin/spreport)
Tatsächlich tun: komplettes durchkompilieren invalider Objekte (@?/rdbms/admin/utlrp)

Typisches Beispiel zu schneller Finger, aber irgendwann wird es mal peinlich. :/

Veröffentlicht in Arbeit | Verschlagwortet mit : | Kommentar schreiben »