Hank: Datenbank über SSH leeren

Hallo,

wie heißt der Befehl, um eine bestimmte Datenbank über SSH zu leeren (nicht löschen)?

ich finde im Netz nur Links, in denen die DB gelöscht wird, das will ich aber gar nicht.

Hank

  1. Servus Hank,

    was ist das für eine DB? mysql? oracle? access?

    mit dieser Info + "ssh truncate database" kannst du bei google sicher einiges finden.

    ciao

    --
    embrace the absurdity
    1. Hallo @henman

      Schön, nach langer Abwesenheit wieder was von Dir zu lesen!

      Herzliche Grüße

      Matthias Scharwies

      --
      Eigentlich hatte ich heute viel vor - jetzt habe ich morgen viel vor!
      1. Servus Matthias,

        danke dir :)

        ciao

        --
        embrace the beauty
    2. Hallo henman,

      was ist das für eine DB? mysql? oracle? access?

      mysql

      mit dieser Info + "ssh truncate database" kannst du bei google sicher einiges finden.

      Habe ich versucht, aber ich finde vieles widersprüchliches.

      Nun habe ich es letztlich mit

      
      /usr/bin/mysqldump -uDBUSER -p'PASS' -hlocalhost --add-drop-table --no-data DBNAME | grep ^DROP | mysql -uDBUSER -p'PASS' DBNAME
      

      Edit: Ich hatte ein falsches Passwort genutzt.

      Ich erhalte:

      
      mysqldump: [Warning] Using a password on the command line interface can be insecure.  
      mysql: [Warning] Using a password on the command line interface can be insecure.  
      mysqldump: Error: 'Access denied; you need (at least one of) the PROCESS privilege(s) for this operation' when trying to dump tablespaces
      

      Die ersten beiden Meldungen verstehe ich.
      Aber was bedeutet denn die error-Meldung?

      Vor allem vor dem Hintergrund, dass die DB tatsächlich geleert wird.

      Hank

      1. Hallo Hank,

        füge die Option --no-tablespaces hinzu und die Forderung nach dem PROCESS Privileg sollte verschwinden. Zumindest deute ich das MYSQL-Handbuch so. Während der mysqldump-Ausführung machen die fehlenden Rechte keine Probleme - hier wird ja nur ein SQL Script generiert. Aber wenn Du das erzeugte Script nachher ausführen willst und --no-tablespaces fehlt, dann will er außer den Tabellen auch Tablespaces anlegen und dafür braucht man entsprechende Rechte.

        Die Frage, die Du Dir aber stellen musst, ist: Wie gehe ich mit den InnoDB Tablespaces meiner Datenbank um? Will ich die löschen? Sollen sie erhalten bleiben?

        Aber grundsätzlich ist das, was Du da machst, ein Schuss von hinten durch die Brust ins Auge.

        • Du lässt mysqldump mit --no-data laufen. Seinen Hauptzweck, nämlich ein Script für eine logische Datensicherung zu erzeugen, erfüllt es damit nicht mehr
        • Statt dessen fügst Du mit --add-drop-table hinzu, dass das generierte Script DROP TABLE statements für jede gesicherte Tabelle hinzu bekommt.
        • Und dann suchst du mit GREP ^DROP alle Zeilen, die mit DROP beginnen, und verfütterst die an die generische MYSQL Batch Engine.

        Ohne --no-tablespace könnte es gut sein, dass da auch noch DROP TABLESPACE Anweisungen im Script verbleiben. Das solltest Du Dir gut anschauen, bevor Du es an das mysql Tool übergibst.

        Andererseits - ein Script, dass blindlings alle Tables einer DB droppt, ist vermutlich einfacher nicht zu erzeugen...

        Rolf

        --
        sumpsi - posui - obstruxi
        1. Hallo Rolf,

          Die Frage, die Du Dir aber stellen musst, ist: Wie gehe ich mit den InnoDB Tablespaces meiner Datenbank um? Will ich die löschen? Sollen sie erhalten bleiben?

          Ich nutze keine Inno-DBs.

          Aber grundsätzlich ist das, was Du da machst, ein Schuss von hinten durch die Brust ins Auge.

          • Du lässt mysqldump mit --no-data laufen. Seinen Hauptzweck, nämlich ein Script für eine logische Datensicherung zu erzeugen, erfüllt es damit nicht mehr

          Kommt davon, wenn man Befehle nachmacht, die man irgendwo ergoogelt hat und die man im Grunde nicht versteht.

          Andererseits - ein Script, dass blindlings alle Tables einer DB droppt, ist vermutlich einfacher nicht zu erzeugen...

          Was ich will, habe ich Raketenwilli geschrieben, daher hier derf Link dort hin. Ich will im Grunde einen Ersatz für mein bisheriges php-Schnipsel.

          Hank

          1. Hallo Hank,

            Ich nutze keine Inno-DBs.

            Hm. Dann ist diese Meldung rein pro forma drin. Aber schon merkwürdig. CREATE TABLE Befehle enthalten doch einen ENGINE-Parameter, und dann müsste er ja wissen, dass kein InnoDB verwendet wird.

            Muss ich mir wohl mal genauer anschauen, was da passiert. Ich habe zwar nur ein Windows-Mariechen, aber das sollte da ja hinreichend kompatibel sein.

            Rolf

            --
            sumpsi - posui - obstruxi
  2. Hi,

    wie heißt der Befehl, um eine bestimmte Datenbank über SSH zu leeren (nicht löschen)?

    willst Du wirklich eine ganze Datenbank leeren, oder geht es um eine einzelne Tabelle?

    cu,
    Andreas a/k/a MudGuard

    1. Hallo Andreas,

      willst Du wirklich eine ganze Datenbank leeren, oder geht es um eine einzelne Tabelle?

      Nein, tatsächlich eine komplette DB.

      Hank

      1. Hm. Definiere mal „leeren“. Was ist mit Tabellen, Views, Funktionen und dergleichen? Sollen die weg oder erhalten bleiben?

        1. Hm. Definiere mal „leeren“. Was ist mit Tabellen, Views, Funktionen und dergleichen? Sollen die weg oder erhalten bleiben?

          Alles soll weg. Nur die DB selber soll erhalten bleiben. Aber der komplette Inhalt soll weg und zwar genau so, als hätte ich im phpmyadmin DB leeren angeklickt.

          Oder über php (so hab ichs zuvor gemacht):

                  $mysqli = new mysqli($db_host,$db_user,$db_pass,$db_name);
          
                  if($mysqli->connect_error) {
                      die('Connect Error ('.$mysqli->connect_errno.') '
                          .$mysqli->connect_error);
                  }
          
                  $result = $mysqli->query("show tables"); 
                  while($table = $result->fetch_array()) {
                      $mysqli->query('DROP TABLE '.$table[0]);
                  }
          

          Aber der Automatismus über das php-script ist mir zu heikel. Da wird geleert, ohne dass ich nochmal einen Blick drüber werfen könnte. Ich hätte das lieber als Konsolenbefehl. Das ist nämlich die Alternative, ich lasse mir Konsolenbefehle generieren und mache dann händisch Schritt für Schritt.

          Hank

          1. Hallo Hank,

            Deine Pipe-Kette von heute gestern mittag macht aber auch einen Durchmarsch.

            In PHP könntest Du, wenn Du vorsichtig rangehen willst, erstmal einen ECHO statt des mysqli->query() Aufrufs machen. Das dünkt mich auf jeden Fall besser als mysqldump zweckzuentfremden…

            Ist eigentlich ein DROP wirklich das, was Du brauchst? Legst Du die Tables nachher wieder an? Dient das zum Löschen der Inhalte, ohne den DB-Log zu belasten (ein DELETE kann bei vielen Sätzen echt dauern)? In dem Fall schau Dir auch mal den TRUNCATE TABLE Befehl an.

            Rolf

            --
            sumpsi - posui - obstruxi
          2. Oder über php (so hab ichs zuvor gemacht):

                    $result = $mysqli->query("show tables"); 
                    while($table = $result->fetch_array()) {
                        $mysqli->query('DROP TABLE '.$table[0]);
                    }
            

            Aber der Automatismus über das php-script ist mir zu heikel. Da wird geleert, ohne dass ich nochmal einen Blick drüber werfen könnte.

            Nun, wenn Du an der Stelle doch alle Tabellen hast, warum baust Du nicht einfach ein kleines HTML-Formular mit einer Checkbox und entfernst dann in nächsten Schritt (also nach dem Absenden) diejenigen Tabellen, welche Du ausgewählt hast?

            Achte auf eine sichere Authentifizierung…

          3. The best way to drop all tables in a database is by executing DROP DATABASE, which will drop the database itself, and all tables in it.

            sagt: https://mariadb.com/kb/en/drop-table/

            → Dropping All Tables in a Database

            Dort steht noch mehr … das trifft dann auch auf VIEWS, FUNCTIONS, FOREIGN_KEY_CHECKS und dergleichen zu.

            Allerdings könnte es sein, dass Du das nicht darfst, und anschauen musst Du Dir die Tabellen auch anderweitig. Nur bist Du bei der Frage „irgendwie widersprüchlich“.