Ankündigung

Einklappen
Keine Ankündigung bisher.

Abfrage der DB-Größe

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Abfrage der DB-Größe

    Hallo zusammen,

    ich habe bei 1&1 mehrere Datenbanken angelegt.
    Jetzt möchte ich auf einer Webseite ausgeben, wie voll (also wieviel MB) die jeweiligen die Datenbanken sind.

    Wenn ich das richtig sehe, muss ich zu jeder DB eine Verbindung aufbauen, die Größe auslesen und dann die Verbindung zur DB schließen.
    Für die erste DB funktioniert das auch. doch bei den anderen kommt nur noch die information_scheme der ersten DB zurück.
    Kann mir bitte jemand von euch einen Tipp geben, wo mein Fehler / Denkfehler ist?
    vielen DAnk!

    Wenn ich mir die Werte ausgeben lasse dich zur Datenbankverbindungs-Aufbau benutze, sind es jedes Mal die richtigen. (also die Unterschiedlichen für die versch. Datenbanken)
    Die Variblen mit dem Zähler hatte ich zuerst als "normale" Varible ohne Zähler. Da das nicht funktioniert hat, dachte ich mir, vielleicht geht es ja, wenn die Variblen unterschiedlich heißen. Hat aber leider auch nichts geändert.

    Hier noch die Skripte:

    PHP-Code:
     ////////////////////////////
            //Datenbanken aus DB holen
            ////////////////////////////
            
    $databases=new dba($dbDsn$user$passw$dbOptions);
            
    $datab=$databases->selectDBs();


        
    //////////////////////
        //ermittelt DB-Größen
        ////////////////////
        
    $dbs=new dba($dbDsn$user$passw$dbOptions);
        
    $i=1;
        foreach(
    $datab as $data) {

            
    //neue Verbindung aufbauen
            
    $pwdb=constant('PASSW'.$data->id);        
            
    $dbDsndb="mysql:host=".$data->host.";dbname=".$data->db.";charset=utf8";    

            ${
    'dbconsize'.$i}=new dba($dbDsndb$data->user$pwdb$dbOptions);    

            
    $dbsizeall[]=${'dbconsize'.$i}->DBsizeall('dbconsize'.$i);

            ${
    'dbconsize'.$i}=NULL;
            
    $i++;
        } 
    Funktion in meiner Datenbankklasse:
    PHP-Code:
     public function DBsizeall($wert){
          
    $stmt $this->prepare("SELECT table_schema '$wert', SUM( data_length + index_length) / 1024 / 1024 'db_size_in_mb' FROM information_schema.TABLES GROUP BY table_schema ;");

            try{
                
    $res=$stmt->execute();
                
    $erg=$stmt->fetch();

                return 
    $erg;
            }catch(
    Exception $ex)
            {
               return 
    "Es konnten keine Dbs gefunden werden";
            }
     }
    //Ende DBsizeall 
    Danke für eure Hilfe
    lg Nadja

  • #2
    PHP-Code:
    $dbs=new dba($dbDsn$user$passw$dbOptions); 
    Was ist dba für eine Klasse?


    PHP-Code:
    ${'dbconsize'.$i
    Sowas ist ganz, ganz hässlich und ganz ungut zu lesen. Warum nutzt du nicht einfach Arrays? Die sind genau für sowas da. Der Code ist generell für die Kürze sehr unleserlich und unüblich.. Diese Konstanten und Variablen-Stückelei ist echt eklig.

    Siehst du die Größe der DB nicht im Plesk etc? Also in dem Tool vom Webhoster wo du den Webspace verwalten kannst.
    The string "()()" is not palindrom but the String "())(" is.

    Debugging: Finde DEINE Fehler selbst! | Gegen Probleme beim E-Mail-Versand | Sicheres Passwort-Hashing | Includes niemals ohne __DIR__
    PHP.de Wissenssammlung | Kein Support per PN

    Kommentar


    • #3
      dba heißt meine Klasse für die Datenbankabfragen.

      Warum ich den Namen so eklig aufgebaut hab, hab ich versucht zu erklären. War ein "Notversuch".
      Aber auch wenn ich das in ein Array umbau, löst das doch mein Problem nicht oder doch?
      Es sollte doch eigentlich auch funktionieren, wenn ich eine Verbindung aufbau, die Größe auslese und dann die Verbindung wieder schließe. Dann kann ich auch einen Variblennamen verwenden und muss nicht mit Arrays oder mit den zusammengestückelten Namen arbeiten. Oder sehe ich das falsch?

      Ja, ich seh die Größe der DB schon bei 1&1. Allerdings soll sie auch auf der Webseite zu sehen sein ( es geht darum, dass neue Tabellen in den jeweiligen DBs angelegt werden, und man wenn diese zu voll werden, die nächste auswählt. In die Tabellen werden Daten eines Messgerätes geschrieben.)

      Was ist denn noch an dem Code unüblich und unleserlich? (damit ich für das nächtse Mal lerne...)

      lg Nadja

      Kommentar


      • #4
        Zitat von nadjak Beitrag anzeigen
        Was ist denn noch an dem Code unüblich und unleserlich? (damit ich für das nächtse Mal lerne...)
        Der populärste Coding Standard für PHP ist PSR http://www.php-fig.org/psr/

        Zu deinem Problem:

        Das SQL-Query in der von dir angegebenen Funktion ermittelt bereits die Informationen für alle DBs.
        Da du das Resultat aber nur mit der Methode fetch behandelst, erhälst du bei jedem Aufruf der Funktion immer nur das erste Ergebnis zurück.

        Kommentar


        • #5
          Vielen Dank für den link. Schau ich mir an.
          mit fetchall() bekomme ich leider das gleiche Ergebnis zurück.
          Lg nadja

          Kommentar


          • #6
            Die Größe einer Tabelle ist von Seiten des DBMS normalerweise nicht begrenzt.
            Das heißt im Umkehrschluss, dass dein Vorhaben gar nicht notwendig ist.

            Wenn Dein Hoster dir Restriktionen hinsichtlich der DB-Größe und anderer Dinge auferlegt, dann wechsele ihn. Oder beschaff dir einen eigenen Server.

            Wenn du permanent Daten in die DB reinschreibst und dadurch eine hohe Last zustande kommt, dann machen die wohl auch zu.

            Das Limit wirst du wohl auch mit mehreren DBs nicht umgehen können, sonst wäre es ja nutzlos.

            Kommentar


            • #7
              Zitat von nadjak Beitrag anzeigen
              mit fetchall() bekomme ich leider das gleiche Ergebnis zurück.
              Nun kann ich nicht sagen, was du genau umgesetzt hast, aber der folgende Codeschnipsel ist alles was ausgeführt werden muss, um die Namen aller DBs einer SQL-Installation samt der Größer der DBs zu erhalten.

              PHP-Code:
              $databases=new dba($dbDsn$user$passw$dbOptions);
              $r $db->query("SELECT table_schema 'db_name', ROUND(SUM( data_length + index_length) / 1024 / 1024, 2) 'db_size_in_mb' FROM information_schema.TABLES GROUP BY table_schema ;");
              $erg $r->fetchAll();
              var_dump($erg); // Testausgabe 

              Kommentar


              • #8
                Vielen Dank für eure Tipps.
                Ich habe den "Fehler" gefunden: Wenn noch keine Tabellen in dieser DB vorhanden sind wird false zurückgeliefert und dann kann natürlich auch nichts angezeigt werden...
                Aber ich hab noch ein anderes "Problem". In der ersten DB sind laut der Anzeige bei 1&1 61.23 MB. Wenn ich mir das allerdings auslese und anzeigen lasse kommt 38.063 MB. Die information_schema-Tabelle ist recht klein. Die erklärt den Unterschied auch nicht.

                Ach ja, ich habe bei der Datenbankabfrage noch ein WHERE hinzugefügt, dass die information_schema nicht auch noch mit ausgelesen wird.
                Die Abfrage sieht jetzt so aus:
                Code:
                SELECT table_schema 'dbsize', SUM( data_length + index_length) / 1024 / 1024 'db_size_in_mb' FROM information_schema.TABLES WHERE table_schema = 'Tabellen_Name'   GROUP BY table_schema ;
                lg Nadja

                Kommentar


                • #9
                  Wenn du die ausliest, dann hast du die Grösse des Inhalts, aber ohne index-Dateien, die ja auch angelegt werden und Platz verbrauchen.

                  Kommentar


                  • #10
                    Danke. Hm, gibt es eine Möglichkeit auch deren Größe auszulesen? Oder gibt es eine "Durchschnittsgröße" die so eine Indexdatei hat?
                    Danke und lg Nadja

                    Kommentar


                    • #11
                      Das kommt drauf an wie 1und1 die größe ermittelt. Die werden die größe sicherlich übers Dateisystem bestimmen, da kommt immer ein Stück mehr raus. Was bei dir aber feht ist data_free. Wenn du etwas aus einer Tabelle löschst (DELETE FROM), wird der Speicher nicht automatisch wieder freigegeben, sondern Mysql markiert diesen nur als frei und fügt dort später neue Datensätze ein. Wenn du viele Daten aus einer Tabelle löschst, dann kannst du mit OPTIMIZE TABLE Mysql dazu bringen den Speicher wieder frei zugeben.

                      SUM( data_length + index_length) -> SUM( data_length + index_length + data_free)

                      Kommentar


                      • #12
                        Lies dir noch mal meinen Beitrag #6 durch.
                        Du willst 1und1 überlisten in dem du mehrere Datenbanken anlegst, das geht aber nicht, weil für die maximal zur Verfügung gestellte Grösse, alle Mysql Datenbanken herangezogen werden.

                        Wenn du also das Limit von 1 GB erreicht hast ist Schluss, dann kannst auch keine weitere Datenbank erstellen.
                        Hast du 2 Datenbanken die im Dateisystem 1 GB belegen ist auch wieder Schluss.

                        Wechsel zu einem Hoster, der dir diese Beschränkungen nicht auferlegt oder miete einen Server.


                        Kommentar


                        • #13
                          @erc: Danke für den Hinweis! Das bau ich gleich noch ein.
                          @protestix: ich will 1&1 nicht überlisten. Außerdem versteh ich das anders.
                          Ich kann bis zu 10 Datenbanken anlegen. Eine davon ist schon recht alt. Dort steht bei Speicherplatz: 61.22 MB von 100 MB frei.
                          Bei den ganz neuen, die noch keine Tabellen haben steht 1024 MB von 1024 MB frei.
                          Ich interpretiere das so, dass das der Speicherbedarf pro DB ist. Und die Anzeige auf der Webseite wie viel in der DB ist, soll nur zeigen, ob es sinnvoll ist, das neue Gerät in einer neuen DB anzulegen.

                          lg Nadja

                          Kommentar

                          Lädt...
                          X