T-Rex: Wordpress - "Fehler beim Aufbau einer Datenbankverbindung" temp.

Moin,

nach langer Pause mal wieder ich.
Wir haben bei einem Wordpressprojekt immer häufiger das Problem, dass einige Seiten spontan den Fehler bringen "Fehler beim Aufbau einer Datenbankverbindung". Wird die Seite reloaded, verschwindet der Fehler, kann aber auch wieder auftauchen. Ein Defekt an der Datenbank bzw. inkonsistente Daten schließe ich somit aus.

Dennoch habe ich keinen Anhaltspunkt welches Plugin, welcher Query etc... mir fehlt generell eine Idee woran das liegen könnte bzw. wie ich jetzt weiter vorgehen sollte?

der Neujahrs Gruß
T-Rex

  1. Moin

    Wir haben bei einem Wordpressprojekt immer häufiger das Problem, dass einige Seiten spontan den Fehler bringen "Fehler beim Aufbau einer Datenbankverbindung". Wird die Seite reloaded, verschwindet der Fehler, kann aber auch wieder auftauchen. Ein Defekt an der Datenbank bzw. inkonsistente Daten schließe ich somit aus.

    Moin, es liegt sicher nicht an einem Query, den die Fehlermeldung hat eine dieser 4 Ursachen:

    Die Zugangsdaten zur Datenbank sind falsch (häufigster Fehler)
    Die Datenbank existiert nicht mehr, oder noch nicht (ebenfalls häufiger Fehler)
    Der Datenbankserver ist nicht erreichbar
    Die Datenbank ist beschädigt

    Also hast du wirklich ein Problem mit der Verbindung, welches temporär auftritt. Ich würde zuerst prüfen ob die DB beschädigt ist. Weiter würde ich schauen ob es eine Begrenzung, wie die maximale Useranzahl, gibt. Eventuell sollte man hierzu den Provider zu Rate ziehen sofern man nicht auf einem eigenen Server arbeitet.

    Hier eine Möglichkeit die Tabelle auf Fehler zu prüfen und ggf zu reparieren: http://www.pcnotfallhilfe.de/wordpress-fehler-beim-aufbau-einer-datenbankverbindung/

    Weitere Infos: http://www.terablog.de/2012-01/wordpress-fehler-beim-aufbau-einer-datenbankverbindung

    Bei Google sind hunderte weitere Artikel zu finden. ;)

    Gruß Bobby

    --
    -> Für jedes Problem gibt es eine Lösung, die einfach, sauber und falsch ist! <-
    ### Henry L. Mencken ###
    -> Nicht das Problem macht die Schwierigkeiten, sondern unsere Sichtweise! <-
    ### Viktor Frankl ###
    ie:{ br:> fl:{ va:} ls:< fo:) rl:( n4:( de:> ss:) ch:? js:( mo:} sh:) zu:)
    1. Moin, es liegt sicher nicht an einem Query, den die Fehlermeldung hat eine dieser 4 Ursachen:

      Die Zugangsdaten zur Datenbank sind falsch (häufigster Fehler)
      Die Datenbank existiert nicht mehr, oder noch nicht (ebenfalls häufiger Fehler)

      Auszuschließen, sonst würde das komplette Portal nicht funktionieren. Der Fehler tritt jedoch sporadisch auf.

      Der Datenbankserver ist nicht erreichbar

      Laut Monotoring schnurrt der Server wie ein Kätzchen

      Die Datenbank ist beschädigt

      Möglich...

      Also hast du wirklich ein Problem mit der Verbindung, welches temporär auftritt. Ich würde zuerst prüfen ob die DB beschädigt ist. Weiter würde ich schauen ob es eine Begrenzung, wie die maximale Useranzahl, gibt. Eventuell sollte man hierzu den Provider zu Rate ziehen sofern man nicht auf einem eigenen Server arbeitet.

      Nach einigen Recherchen ist es in der Tat die max_user_connections. Bei Wordpress kann man einen debugging Modus einschalten der hat folgenden Fehler ausgespuckt:

      Warning: mysql_connect(): User 'XY' has exceeded the 'max_user_connections' resource (current value: 30) in *PATH* on line 1138
      Error establishing a database connection

      Wir haben schon geschaut. Der Server lässt leider nur 30 Verbindungen zu. Hab schon Lösungen gefunden die auf PHP Seite die maximale User Zahl nach oben setzen. Das funktioniert hier aber nicht.

      Ein Kollege hat mir die Seite http://php.net/manual/de/mysqlnd-ms.pooling.php empfohlen. Mal gucken...

      Eventuell hat von euch noch eine Idee?

      Gruß
      maximaler User
      T-Rex

      1. Hallo

        Nach einigen Recherchen ist es in der Tat die max_user_connections. Bei Wordpress kann man einen debugging Modus einschalten der hat folgenden Fehler ausgespuckt:

        Warning: mysql_connect(): User 'XY' has exceeded the 'max_user_connections' resource (current value: 30) in *PATH* on line 1138
        Error establishing a database connection

        … Der Server lässt leider nur 30 Verbindungen zu. …

        Eventuell hat von euch noch eine Idee?

        Wird das Portal bzw. seine Bestandteile so oft aufgerufen oder werden evtl. von einer Instanz mehrere Datenbankverbindungen hergestellt, was sich dann zu den 30 Verbindungen aufsummiert? Im letzteren Fall wären vermutlich skriptseitige Optimierungsmöglichkeiten vorhanden.

        Tschö, Auge

        --
        Verschiedene Glocken läuteten in der Stadt, und jede von ihnen vertrat eine ganz persönliche Meinung darüber, wann es Mitternacht war.
        Terry Pratchett, "Wachen! Wachen!"
        ie:{ fl:| br:> va:) ls:[ fo:) rl:( ss:| de:> js:| zu:}
        Veranstaltungsdatenbank Vdb 0.3
        1. Wird das Portal bzw. seine Bestandteile so oft aufgerufen oder werden evtl. von einer Instanz mehrere Datenbankverbindungen hergestellt, was sich dann zu den 30 Verbindungen aufsummiert? Im letzteren Fall wären vermutlich skriptseitige Optimierungsmöglichkeiten vorhanden.

          Es handelt sich um ein Wordpress Dings mit diverse Plugins. Je nachdem wie die Plugins programmiert wurden kann es schon sein, dass eine Instanz mehrere Verbindungen offen hat.

          Das Portal ist aber auch gut besucht. Mehr als 30 Anfragen auf einmal ist realistisch!

          Also meine Ansätze waren:

          1. Anzahl möglicher Verbindungen via ini_set("max_user_connections", 200) auf 200 hochschrauben.
          -> Funktioniert aber nicht, da die Begrenzung von 30 Usern vom Datenbank-Server kommen.

          2. Persistente Datenbankverbindung via mysql_pconnect.
          -> Funktioniert nicht, da es sich um einen Windowsserver handelt und nicht um einen Apache. PHP wird also nicht als Modul ausgeführt, was eine voraussetzung für mysql_pconnect sein soll.

          3. Bleibt noch die verlinkte Seite: http://php.net/manual/de/mysqlnd-ms.pooling.php. Scheint ein Load Balancer zu sein. In wie weit der das Problem beheben soll ist fraglich. Um ehrlich zu sein verstehe ich aber den Text nicht wirklich.

          So oder so ich hab keine Ahnung mehr... Mir gehen langsam die Optionen aus. Den Datenbankserver kann man laut Hoster auch nicht upgraden.

          Gruß
          was steht an der Wand und gibt jedem die Hand?
          T-Rex

          1. SMir gehen langsam die Optionen aus.

            Gewiss nicht:

            http://dev.mysql.com/doc/refman/5.0/en/user-resources.html

            Jörg Reinholz

            1. Moin

              SMir gehen langsam die Optionen aus.

              Gewiss nicht:

              http://dev.mysql.com/doc/refman/5.0/en/user-resources.html

              Naja.. wenn man keine Berechtigung hat (GRANT), nützt einem diese Anleitung auch nix. Er ist nicht auf nem eigenen Server unterwegs sondern bei nem Provider. Da ist in der Regel "GRANT" gesperrt.

              Gruß Bobby

              --
              -> Für jedes Problem gibt es eine Lösung, die einfach, sauber und falsch ist! <-
              ### Henry L. Mencken ###
              -> Nicht das Problem macht die Schwierigkeiten, sondern unsere Sichtweise! <-
              ### Viktor Frankl ###
              ie:{ br:> fl:{ va:} ls:< fo:) rl:( n4:( de:> ss:) ch:? js:( mo:} sh:) zu:)
              1. Naja.. wenn man keine Berechtigung hat (GRANT), nützt einem diese Anleitung auch nix. Er ist nicht auf nem eigenen Server unterwegs sondern bei nem Provider. Da ist in der Regel "GRANT" gesperrt.

                T-Rex hat nichts dazu geschrieben, was für einen Vertrag er da hat. Es kann ja auch ein "root-server" sein. Selbst wenn nicht kann mindestens der von ihm erwähnte Hoster sehr wohl die benötigten Einstellungen vornehmen.

                Jörg Reinholz

                1. Ja und nein:

                  So oder so ich hab keine Ahnung mehr... Mir gehen langsam die Optionen aus. Den Datenbankserver kann man laut Hoster auch nicht upgraden.

                  Laut Hoster kann man ein anderes "Paket" dazu buchen. Dann hat man keine 30 Datenbankverbindungen mehr sondern 40. Kostet aber doppelt soviel. Lohnt sich also auch nicht.

                  Hab gestern Abend noch mit einem Datenbank Spezialisten gesprochen, der meinte uns würde nichts anderes übrig bleiben als nochmal umzuziehen.
                  Tjo...

                  Gruß
                  Datenbankdepp
                  T-Rex

          2. Moin

            So oder so ich hab keine Ahnung mehr... Mir gehen langsam die Optionen aus. Den Datenbankserver kann man laut Hoster auch nicht upgraden.

            Dann wirst du ergründen müssen, wann dieser overload zustande kommt. Welche Module evtl. dafür verantwortlich sind. Eventuell irgendwo eine nicht abgebaute DB-Verbindung oder ein Query was immer ausgeführt wird, bei jedem Aufruf eines Moduls oder ein zu aufwendiges Query oder eine fehlerhafte Tabellenkonfiguration (fehlender Index oder so). Da könnte man mehrere Szenarien konstruieren. Denn die Anfragen sind eigtl so kurz, dass auchg die 30 User genügen sollten.

            Du arbeitest wirklich mit der mysql-erweiterung? Da solltest du über einen Wechsel nachdenken, da als DEPRECATED gekennzeichent. https://wordpress.org/plugins/wp-db-driver/

            Gruß Bobby

            --
            -> Für jedes Problem gibt es eine Lösung, die einfach, sauber und falsch ist! <-
            ### Henry L. Mencken ###
            -> Nicht das Problem macht die Schwierigkeiten, sondern unsere Sichtweise! <-
            ### Viktor Frankl ###
            ie:{ br:> fl:{ va:} ls:< fo:) rl:( n4:( de:> ss:) ch:? js:( mo:} sh:) zu:)
            1. Also erstmal danke für deine Zeit.

              Bei Wordpress ist das alles sehr versteckt. Soweit ich da durchgestiegen bin wird eine Datenbank Verbindung aufgebaut, die aber niemals beendet wird. Es gibt eine Klasse (die hat noch PHP 4 style ohne public etc.. ) die hat ein db_connect (eigene Methode) aber kein db_close. Ergo vermute ich überlässt Wordpress dem Garbage Collector das schliessen der DB Verbindung.

              Da einzelne Requests durchaus etwas länger brauchen können und dürfen ( an die 5 Sekunden da externe Requests), wird das insgesamt betrachtet natürlich zu einem Problem. Ich hab jetzt das Script so geändert, dass vor einem externen Request mittels curl die Datenbank Verbindung geschlossen wird. Gute Idee?

              Gruß
              der immer für alles offene
              T-Rex