Ankündigung

Einklappen
Keine Ankündigung bisher.

Daten kopieren von Datenbank 1 zu Datenbank 2

Einklappen

Neue Werbung 2019

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

  • Daten kopieren von Datenbank 1 zu Datenbank 2

    Hallo,

    ich hatte schon mal ein Eintrag aber mir wurde empfohlen ein eigenes Thema zu eröffnen da ich leider nicht weiter komme.

    Hier noch mal die kurze Erklärung zu mein Problem.
    Ich habe eine große Tabelle mit sehr vielen Einträgen. Um die Geschwindigkeit der Datenbank bischen besser zu machen wollte ich Daten in eine andere Datenbank auszulagern.

    Es soll aber möglich sein die Daten von der einen Datenbank in die andere wieder zurückzuschieben.

    Hier nun mein jetztiger Code

    Code:
    $dbeins=new mysqli($hostname_kalender, $username_kalender, $password_kalender, $database_kalender );
    $dbzwei=new mysqli($hostname_kalender, $username_kalender, $password_kalender, $database_archiv );
    
    
    $id = '111894';
    
    
    $query = "INSERT INTO '$dbeins'.'zts_ticket' SELECT * FROM '$dbzwei'.'zts_ticket' WHERE id = '$id'";
    Das ganze läuft unter PHP 7 deswegen mysqli

    Da bekomme ich folgende Fehlermeldung:

    HTML-Code:
    Catchable fatal error: Object of class mysqli could not be converted to string in ....

    Dann habe ich den Code versucht.

    Code:
    $dbeins=new mysqli($hostname_kalender, $username_kalender, $password_kalender, $database_kalender );
    $dbzwei=new mysqli($hostname_kalender, $username_kalender, $password_kalender, $database_archiv );
    
    
    $id = '111894';
    
    
    $addClient_n = "INSERT INTO $database_kalender.zts_ticket SELECT * FROM $database_archiv.zts_ticket WHERE id = '$id'";
    
    $dbeins->query($addClient_n) or die($dbeins->error);
    Da bekomme ich aber auch eine Fehlermeldung.

    HTML-Code:
    Column count doesn't match value count at row 1
    Ich denke ich bin kurz davor.
    Hat da noch jemand ein Tipp für mich??

    Grüße

  • #2
    Naja, Fehlermeldung mal lesen?

    "Column count doesn't match value count" ist doch ziemlich klar.

    Davon abgesehen sollte kein SELECT * verwendet werden. Das führt nur zu unklaren und fehleranfälligen Code.

    Und die Herumschieberei von Daten zur Performanceoptimierung klingt nach einer wackeligen undurchdachten Bastellösung. Hast du schon alle anderen Möglichkeiten (mehr Indexe, Partitionierung, usw. usf.) ausgeschöpft?

    Kommentar


    • #3
      Hallo vielen Dank für die Info...
      Ich habe schon alles optimiert was zu machen ist.

      Ich mache das aktuell manuell. über Navicat (Datensatz suchen --> Copy als Insert Statment)
      Der weg ist sehr umständlich und ich dachte es ist so einfacher...

      Habe eben das noch mal versucht

      $dbeins=new mysqli($hostname_kalender, $username_kalender, $password_kalender, $database_kalender );
      $dbzwei=new mysqli($hostname_kalender, $username_kalender, $password_kalender, $database_archiv );


      $id = '111894';


      $addClient_n = "INSERT INTO $database_kalender.zts_ticket SELECT id, beginn_am, ticket_art FROM $database_archiv.zts_ticket WHERE id = '$id'";

      $dbeins->query($addClient_n) or die($dbeins->error);
      aber immer noch das gleiche

      HTML-Code:
      Column count doesn't match value count at row 1
      Ich benötige denke ich so was was mir Navicat gibt als Insert

      Code:
      insert into `usr_pxxxxxx`.`zts_ticket` ( `re_nummer_1`, `bezahlt_am_2`, `as_kosten3`, `lng`) values ( 'x', 'x', 'x', '9.647416');
      wollte aber nicht jeden Wert einzeln auslesen den ich dann per Insert in die Datenbank schreiben kann.

      Kommentar


      • #4
        Wieviele Millionen Datensätze hast du denn, dass es so große Probleme macht? Und wenn du jeden Datensatz einzeln mit ID kopierst, wurst du ja in hundert Jahre nicht fertig damit. Ich frage mich, was der Sinn von dem Ganzen sein soll.

        Ich stelle mir gerade bildlich vor da geht irgendwo eine Berglawine ab und du sitzt daneben mit der Spielzeugsandschaufel und schaufelst ein Kieselstein nach den andern weg.

        Kommentar


        • #5
          Sorry vielleicht habe ich mich falsch ausgedrückt.

          Ich habe ein Dump erstellt mit den aktuellen Daten ( eine Spieglung der Daten)
          Dann habe ich die Daten vom Produktiv Datenbank gelöscht.

          Wenn ich ein Datensatz nun aber von der Archiv Datenbank haben will soll es automatisch verschoben werden. Halt eine kleine Copy Befehl von Datenbank Archiv ins Produktiv Datenbank.

          Die Datenbank ist ca. 9 GB groß
          Das muss nicht sein!!!!

          Deswegen die Aktion....

          Kommentar


          • #6
            Du msst hinter dem INSERT INTO auch die Spaltennamen mit angeben, siehe Handbuch: https://dev.mysql.com/doc/refman/8.0...rt-select.html
            Ich würde das aber auch nicht unbedingt mit PHP machen sondern eher mit einer StoredProcedure direkt auf dem Datenbankserver.

            Dass man alte Datensätze nach einiger Zeit aus der Live-Datenbank in ein Archiv-Schema verschiebt finde ich jetzt nicht so abwegig wie hellbringer
            In vielen großen Datenbankanwendungen die ich kenne ist das auch gängige Praxis.
            sorry, shift-taste kaputt

            Kommentar


            • #7
              Ja danke für den Tipp.

              jetzt hat es funktioniert.


              Für alle die es noch mal nachsehen wollen
              hier der Code

              Code:
              $dbeins=new mysqli($hostname_kalender, $username_kalender, $password_kalender, $database_kalender );
              $dbzwei=new mysqli($hostname_kalender, $username_kalender, $password_kalender, $database_archiv );
              
              
              $id = '111894';
              
              $addClient_n = "INSERT INTO $database_kalender.zts_verlauf (id, datum, gesprochen_mit, wer, tel_fax_mail, absprachen, id_intern, sichtbar, timestamp, art, id_zts, aufgabe_verlauf, ruckfragen_id) SELECT id, datum, gesprochen_mit, wer, tel_fax_mail, absprachen, id_intern, sichtbar, timestamp, art, id_zts, aufgabe_verlauf, ruckfragen_id FROM $database_archiv.zts_verlauf WHERE id_zts = '$id'";
              
              $dbeins->query($addClient_n) or die($dbeins->error);

              Kommentar


              • #8
                Zitat von Powerburning Beitrag anzeigen

                Die Datenbank ist ca. 9 GB groß
                Whow! 9GB! Hätte nie gedacht, daß das mit MySQL geht ...


                SCNR.

                Andreas

                PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

                Kommentar


                • #9
                  Zitat von Powerburning Beitrag anzeigen
                  Ja danke für den Tipp.

                  jetzt hat es funktioniert.

                  Code:
                  INSERT INTO $database_kalender.zts_verlauf
                         (id, datum, gesprochen_mit, wer, tel_fax_mail, ..
                  SELECT
                          id, datum, gesprochen_mit, wer, tel_fax_mail, ..
                  ~"9 GB, das muss nicht sein..."

                  Wenn Du Dich darüber wunderst, dass genau die Anweisung oben funktioniert, könnte das vielleicht auch ein Erklärungsansatz für die Größe der DB sein. Offenbar weiß die linke Hand nicht, was die rechte tut.
                  Deine erfolglosen Insert Versuche sind an der unterschiedlichen Tabellenstruktur zwischen einer Produktiv und einer Archivtabelle gescheitert. Geht da nicht eine rote Lampe an?
                  Hast Du Dich nie gefragt, welche Felder wo mehr oder weniger sind und warum?
                  Ist mit dem fehlerfreie Insert nun tatsächlich das Problem gelöst?
                  Oder schaut man lieber nicht genauer hin, weil man weiß, dass ein Monster in der Tiefe lauert?

                  Kommentar

                  Lädt...
                  X