Oracle

Hallo,
ich bin oracle-entwickler. mit db-administration habe ich wenig erfahrungen.
bei unserer anwendung habe ich das folgende problem:
ich habe eine neue tabele angelegt, in die alle änderungen, die durch die anwender an datensätzen durchgeführt werden, protokolliert wird. das heißt, es wird bei einer änderung untersucht, ob der datensatz schon einen eintrag in der tabelle hat, falls ja, wird der eintrag korregiert und falls nicht , wird ein insert-kommando durchführt.
*************************
if :global.NE 4 and :global.NE 3 and :global.NE 214 and :global.NE 2141 then
select count(*) into flag_count
from tb_modi_flag
where nid=:ANSPRECHPARTNER.OBJE_ID and aid=:GLOBAL.USEL_OBJR_A_ID ;

if flag_count = 0 then
insert into TB_MODI_FLAG
(nid,aid,flag,username,gruopname,datum,adrsid)
values
(:ANSPRECHPARTNER.OBJE_ID,:FIRMA.OBJE_ID,‚M‘,USER,:global.akt_gruppe,sysdate,:ADRESSE.ADRS_ID);
silent_commit;
end if;
if flag_count > 0 then
update TB_MODI_FLAG
set nid = :ANSPRECHPARTNER.OBJE_ID,
aid = :FIRMA.OBJE_ID,
flag = ‚M‘,
username = USER,
gruopname = :global.akt_gruppe,
datum = sysdate,
adrsid = :ADRESSE.ADRS_ID
where nid = :ANSPRECHPARTNER.OBJE_ID and
aid = :GLOBAL.USEL_OBJR_A_ID;
silent_commit;
end if;
end if;
*******************************
das ist von mir komplett getestet worden und es funktioniert alles ganz gut, solange ich oder wenigere leute die routine nutzen.
nach der version-freigabe für alle anwender habe ich festgestellt, daß es probleme mit der datenbank gibt. das äußerst sich so, daß man sich nicht erneut einloggen kann bzw. man hat probleme mit speichern. um weiter zu arbeiten, muß ich die danbank neu starten. das problem taucht nicht immer auf, sondern manchaml täglich, manchmal alle 2 tage. zur zeit ist das modul, das die aufgabe hat, die änderungen der datensätze zu protokolieren, ausgeschlatet.
in einer log-datei habe ich eine fehlermeldung entdeckt (deadlock detected), die besagt, daß der user sich nicht anmelden kann, denn die fehlermeldung deutet darauf hin, daß ein problem mit einem sql-kommando gibt, das die anmeldungen in eine tabelle protokolliert. wie gesagt, es handet sich dabei um einen folge-fehler.
was allerdings den folgefehler auslöst, ist mir noch nicht bekannt.
ich habe die werte in initdin.ora angeschaut und höher gesetzt, aber es half auch nicht weiter. die datei sieht wie folgt aus:
************************

individuelle DB-Parameter (Name, Control-Files, etc)

ifile = /products/oracle/OraHome1/dbs/configdin.ora

#rollback_segments = (rbs01, rbs02, rbs03, rbs04, rbs05, rbs06, rbs
07, rbs08)
rollback_segments = (rbs01, rbs02, rbs03, rbs04, rbs05, rbs06, rbs
07)

audit_trail = db

#db_block_buffers = 20000
db_block_buffers = 32767
db_file_multiblock_read_count = 16
db_files = 100
#sort_area_size = 2000000

jb 23.05.2000 Werte laut Tuning-Buch und Test auf Test-DB

sort_area_size = 1000000
sort_area_retained_size = 1000000

dml_locks = 200

global_names = TRUE

log_buffer = 163840
log_checkpoint_interval = 10000
log_checkpoint_timeout = 3600

max_dump_file_size = 10240

open_cursors = 650

os_authent_prefix = ‚OPS$‘

processes = 200

remote_os_authent = TRUE

#sequence_cache_entries = 50
#sequence_cache_hash_buckets = 25

shared_pool_size = 240000000

timed_statistics = FALSE

transactions = 225
transactions_per_rollback_segment = 16
************************

Hat jemand eine idee, was ich zu machen habe. ich arbeite mit oracle 8i, forms 4.5.

danke und gruß

Mahlzeit,

zunächst einmal möchte ich dir ans Herz legen, den PRE-Tag zu verwenden, wenn du Code postest. Sonst kann das keine Sau lesen ist das nur schwer lesbar.

ich bin oracle-entwickler. mit db-administration habe ich
wenig erfahrungen.

bei unserer anwendung habe ich das folgende problem:
ich habe eine neue tabele angelegt, in die alle änderungen,
die durch die anwender an datensätzen durchgeführt werden,
protokolliert wird. das heißt, es wird bei einer änderung
untersucht, ob der datensatz schon einen eintrag in der
tabelle hat, falls ja, wird der eintrag korregiert und falls
nicht , wird ein insert-kommando durchführt.
*************************

Zunächst mal finde ich, daß du einen ziemlichen Spaghetti-Code erzeugt hast - statt „if [Bedingung] - end if - if [not Bedingung]“ sollte man if - then - else verwenden. Dein Test kostet wesentliche Zeit (count(*) statt exists), außerdem kann man das Ziel direkter erreichen, indem man immer einen Insert macht, und die Exception DUP_VAL_ON_INDEX abfängt.

in einer log-datei habe ich eine fehlermeldung entdeckt
(deadlock detected), die besagt, daß der user sich nicht
anmelden kann, denn die fehlermeldung deutet darauf hin, daß
ein problem mit einem sql-kommando gibt, das die anmeldungen
in eine tabelle protokolliert. wie gesagt, es handet sich
dabei um einen folge-fehler.

Hmmm… wird die Logtabelle genauso behandelt? Das könnte eine Ursache sein.

Der klassische Deadlock wird hier erläutert: http://www.orafaq.com/faq/RDBMS_Server/Internals/faq…
bzw. auch hier:
http://www.zanthan.com/itymbi/archives/001548.html

Die Datenbank muß normalerweise nicht runtergefahren werden - die betreffende Session killen sollte ausreichen.

ich habe die werte in initdin.ora angeschaut und höher
gesetzt, aber es half auch nicht weiter. die datei sieht wie
folgt aus:

*hgrmpf* Da schweige ich lieber darüber (Werte erhöhen - viel hilft viel?)

Hat jemand eine idee, was ich zu machen habe. ich arbeite mit
oracle 8i, forms 4.5.

Welche Version genau? Es ist in diesem Fall wahrscheinlich nicht relevant, aber es gibt deutliche Unterschiede zwischen den Versionen.

Gruß

Sancho

Hallo,

hast Du dir mal die Sperren angesehen. Normalerweise muss man eine DB nie runterfahren. (Lach) Jedenfalls nicht deshalb. In der Enterprise Manager Console kannst Du die Sessions anschauen und was für ein SQL gerade ausgeführt wird. Und Du solltest die Sperren anschauen, ob Dir dabei etwas auffällt und die CPU Auslastung.
Lass doch einfach mal mitprotokollieren, was passiert und schau Dir das TKPROF File an. Da müssten die Statements doch auffallen.

Gruß

Peter

Hallo,
danke für die Antwort. Habe Enterprise Manager Console vor den Augen.
Wo kann ich die Sperren sehen. Muß ich doch wahrscheinlich was einstellen oder?
Mein Enterprise Manager ist Version 1.6.0.
wo finde ich TKPROF File?

Gruß

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]