Datenbankverbindungen bleiben persistent offen

Hilfe zu Znuny Problemen aller Art
Locked
hoffmann
Znuny newbie
Posts: 8
Joined: 03 Sep 2009, 13:42
Znuny Version: 2.4.3

Datenbankverbindungen bleiben persistent offen

Post by hoffmann »

Hallo,

habe zu dem Thema leider nichts in diesem Forum gefunden. Habe derzeit ein gravierendes Problem, weiß allerdings nicht ob es an OTRS oder am Apache2 liegt.

Die Maschine auf der ich das OTRS aufgesetzt habe ist eine VM mit folgenden Daten:

OS: Debian 5 Lenny
Kernel: Linux 2.6.26-2-686 i686 GNU/Linux
Webserver: Apache/2.2.9 (Debian) mod_perl/2.0.4
Interpreter: Perl/v5.10.0

Ich habe das System folgendermaßen aufgesetzt:
1. Alle wichtigen Pakete installiert (Apache, MySQL, Perl, etc.)
2. Oracle Instant Client entpackt und $ORACLE_HOME, $LD_LIBRARY_PATH angepasst
3. über die CPAN shell habe ich dann folgende Module kompiliert: YAML, PDF:API2, DBI, DBD::Oracle
4. OTRS 2.4.3 entpackt (/opt/otrs) und Config.pm für das externe Backend folgendermaßen angepasst:
4.1 SetPermission.sh ausgeführt.

Code: Select all

 . . .
# (customer user database backend and settings)
    $Self->{CustomerUser} = {
        Name => ' xxxxxx ',
        Module => 'Kernel::System::CustomerUser::DB',
       # Konfigurationsparameter um auf View zuzugreifen
       Params => {
            # if you want to use an external database, add the required settings
            DSN => 'DBI:Oracle:host=192.168.10.8;port=1521;sid=xxxx',
            User => 'xxxxx',
            Password => 'xxxxxx',
            Table => 'xxxxxxx',
        },
. . . 
5. Apache2 config erstellt (/etc/apache2/conf.d/otrs2):

Code: Select all

ScriptAlias /otrs "/opt/otrs/bin/cgi-bin/"
Alias /otrs-web/ "/opt/otrs/var/httpd/htdocs/"

<IfModule mod_perl.c>
    Perlrequire /opt/otrs/scripts/apache2-perl-startup.pl

    <IfModule Apache2/Reload.pm>
        PerlModule Apache2::Reload
        PerlInitHandler Apache2::Reload
    </IfModule>

    PerlModule Apache2::RequestRec

    <Location /otrs>
        ErrorDocument 403 /otrs/index.pl
        ErrorDocument 404 /otrs/index.pl
        SetHandler  perl-script
        PerlResponseHandler ModPerl::Registry
        Options +ExecCGI +FollowSymLinks
        PerlOptions +ParseHeaders
        PerlOptions +SetupEnv
        Order allow,deny
        Allow from all
    </Location>

</IfModule>

<Directory "/opt/otrs/bin/cgi-bin/">
    AllowOverride None
    Options +ExecCGI -Includes
    Order allow,deny
    Allow from all
</Directory>

<Directory "/opt/otrs/var/httpd/htdocs/">
    AllowOverride None
    Order allow,deny
    Allow from all
</Directory>
6. Per installer.pl die Datenbank eingerichtet.
6. Apache neu gestartet und alles lief zufriedenstellend bis auf mein Problem.

Mein Problem ist, dass jedesmal wenn die index.pl aufgerufen wird eine Verbindung zur Backend Datenbank aufgebaut wird (Oracle DB 10.2) und diese Verbindung dann stetig offen bleibt. Nach kurzer Zeit hat der Oracle Listener natürlich keine Ressourcen mehr und verweigert jede weitere Verbindung. Starte ich den Apache neu, läuft wieder alles super bis zum nächsten Überlauf. Lasse ich mir per netstat die verbindungen anzeigen, sehe ich die DB Verbindungen ohne irgend einen Timeout, als ob diese bei jedem Aufruf der index.pl erneut persistent geöffnet werden.

Code: Select all

Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name Timer
. . . 
tcp        0      0 ticketing.tvo.loc:49354 192.168.10.8:1521       VERBUNDEN   12416/apache2    aus (0.00/0/0)
tcp        0      0 ticketing.tvo.loc:49358 192.168.10.8:1521       VERBUNDEN   12419/apache2    aus (0.00/0/0)
" " "
tcp        0      0 ticketing.tvo.loc:49361 192.168.10.8:1521       VERBUNDEN   12419/apache2    aus (0.00/0/0)
tcp        0      0 ticketing.tvo.loc:49363 192.168.10.8:1521       VERBUNDEN   12416/apache2    aus (0.00/0/0)
. . . 
Durchforste ich das OTRS log finde ich nicht wirklich was, außer der ORA Errormeldung wenn der Listener mal wieder voll ist.

Code: Select all

 . . 
[Thu Sep  3 13:27:52 2009][Error][Kernel::System::DB::new][188] ORA-12519: TNS:no appropriate service handler found (DBD ERROR: OCIServerAttach)
. . .
[Thu Sep  3 13:27:54 2009][Error][Kernel::System::DB::new][188] ORA-12519: TNS:no appropriate service handler found (DBD ERROR: OCIServerAttach)
. . .
Schau ich mir das Apache-Log an, dann sehe ich nur den Traceback, der mir sagt, dass der Listener nicht erreichbar ist:

Code: Select all

[Thu Sep 03 13:27:54 2009] [error] Can't connect to database! at /opt/otrs//Kernel/System/CustomerUser/DB.pm line 97.\n
[Thu Sep  3 13:27:54 2009] -e: DBI connect('host=192.168.10.8;port=1521;sid=xxx','xxxxx',...) failed: ORA-12519: TNS:no appropriate service handler found (DBD ERROR: OCIServerAttach) at /opt/otrs//Kernel/
System/DB.pm line 214
ERROR: OTRS-CGI-10 Perl: 5.10.0 OS: linux Time: Thu Sep  3 13:27:54 2009

 Message: ORA-12519: TNS:no appropriate service handler found (DBD ERROR: OCIServerAttach)

 Traceback (11694):
   Module: Kernel::System::DB::new (v1.105) Line: 188
   Module: Kernel::System::CustomerUser::DB::new (v1.77) Line: 97
   Module: Kernel::System::CustomerUser::new (v1.54) Line: 105
   Module: Kernel::System::Ticket::new (v1.410) Line: 136
   Module: Kernel::System::Web::InterfaceAgent::Run (v1.43) Line: 162
   Module: ModPerl::ROOT::ModPerl::Registry::opt_otrs_bin_cgi_2dbin_index_2epl::handler (unknown version) Line: 48
   Module: (eval) (v1.88) Line: 204
   Module: ModPerl::RegistryCooker::run (v1.88) Line: 204
   Module: ModPerl::RegistryCooker::default_handler (v1.88) Line: 170
   Module: ModPerl::Registry::handler (v1.99) Line: 31
Ich habe leider nicht viel Erfahrung mit Perl Scripten, allerdings sollten sich Perl Scripte am Ende ihrer Laufzeit ähnlich den PHP-Scripten vehalten (d.h. sämtliche DB-Verbindungen werden automatisch getrennt). Oder irre ich mich da?

Kann es sein, dass der Apache das Script nicht wirklich beendet und die Verbindungen deshalb aktiv bleiben? Dann sollte allerdings der Speicher langsam aber stetig immer voller werden, was er nicht wird.

Hat jemand evtl. schon Erfahrungen mit diesem Problem sammeln können?

(Sollte ich das falsche Forum für dieses Thema erwischt haben, bitte ich um Entschuldigung :) )
hoffmann
Znuny newbie
Posts: 8
Joined: 03 Sep 2009, 13:42
Znuny Version: 2.4.3

Datenbankverbindungen bleiben persistent offen

Post by hoffmann »

Habe jetzt im Apache log folgende Einträge gefunden, wenn man ein neues PhoneTicket eröffnet und die Kundennummer im "Von:" Feld eingibt.

Code: Select all

[Wed Sep  9 14:36:39 2009] -e: Use of uninitialized value $Row[0] in hash element at /opt/otrs//Kernel/System/CustomerUser/DB.pm line 276.
[Wed Sep  9 14:36:39 2009] -e: Use of uninitialized value $Row[0] in hash element at /opt/otrs//Kernel/System/CustomerUser/DB.pm line 279.
[Wed Sep  9 14:36:39 2009] -e: Use of uninitialized value $Row[0] in hash element at /opt/otrs//Kernel/System/CustomerUser/DB.pm line 279.
[Wed Sep  9 14:36:39 2009] -e: Use of uninitialized value $Row[0] in hash element at /opt/otrs//Kernel/System/CustomerUser/DB.pm line 282.
Er löst aber den Kunden ohne Problem auf. Ich habe auch nichts an der Source der DB.pm geändert. Die einzigsten Sourceänderungen die ich gemacht habe waren unter:

var/httpd/htdocs/css/Standard/agent.css
Kernel/Output/HTML/Standard/AgentTicketOverviewMedium.dtl
Kernel/Output/HTML/Standard/AgentTicketOverviewPreview.dtl
Kernel/Output/HTML/Standard/AgentTicketZoom.dtl

Was die DB.pm allerdings nicht beeinflussen sollte.

Kann es sein, dass wegen diesem Fehler die Datenbankverbindungen offen bleiben?
Hat noch wer die gleichen Fehler im Apache log?
Kann mich wer in die richtige Richtung zur Lösung des Problems stoßen?
hoffmann
Znuny newbie
Posts: 8
Joined: 03 Sep 2009, 13:42
Znuny Version: 2.4.3

Datenbankverbindungen bleiben persistent offen

Post by hoffmann »

Ich habe nun endlich den Fehler gefunden. Ich habe das falsche Perl Module installiert gehabt.
Ich hatte zwar über die cpan das Module DBI installiert, aber nicht das Module Apache::DBI.

Folgende Schritte musste ich durchführen

1. Das korrekte Modul installieren

Code: Select all

cpan> install Apache::DBI
2. die startup.pl umschreiben, damit das Apache::DBI Modul verwendet wird

/opt/otrs/scripts/apache2-perl-startup.pl

Code: Select all

# die naechsten beiden Zeilen auskommentieren
use Apache::DBI ();
Apache::DBI->connect_on_init('DBI:mysql:otrs', 'xxxx', 'xxxx' );
use DBI ();
Inwiefern diese Umstellung nun das externe Backend betrifft kann ich nicht sagen. Allerdings baut das OTRS nun nur noch 2 persistente Verbindungen auf und belässt es dabei.

Ich bin dank des Support Pakets, welches ich über den OTRS Paketmanager installiert hab darauf gestoßen. Super Modul :)
Locked