Announcement

Collapse
No announcement yet.

DB klonen

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • DB klonen

    Hallo,
    nach tagelangen ergebnislosen Versuchen entschliesse ich mich jetzt doch, die Experten um Hilfe zu bitten.
    Ziel ist es, auf einem kleinen LENOVO (Tablet PC) die wichtigsten Daten von unserem Linux-Mysql-Server zu spiegeln, um sie bei Patienten-Hausbesuchen parat zu haben. Der Abgleich muss auf Knopfdruck erfolgen, mehr kann ich meinen Mitarbeiterinnen nicht zumuten.

    1. Replikation
    geht nicht (sagt der Server-Admin), da schon eine Master to Master zu einem anderen Ort läuft

    2. natives MySql
    in etwa INSERT INTO ... WHERE NOT IN (SELECT ...
    dazu müsste die Engine FEDERATED eingerichtet werden, da zwei unterschiedliche Hosts -> verworfen

    3. VB.Net
    sah anfangs ganz einfach aus: zwei Connections - zwei DataTables - Merge
    Test: Tabelle mit 10000 Datensätze 1500 millisec
    Ich hatte angenommen, dass ich über den MySqlDataAdapter und CommandBuilder die gemergte Tabelle ruckzuck wieder auf dem localhost updaten kann. Aber das geht nicht, weil der RowStatus nicht auf added oder modified gesetzt wird. Nun wird das Ganze wieder ungeheuer aufwändig.

    Könnt ihr mir einen Tipp geben? Bin schon fast am Verzweifeln.
    Grüße Norbert

  • #2
    Also vielleicht kannst Du mal kurz klar stellen, was Du da machen willst.
    Ein PC Datenbank auf ein Tablet clonen, die (geänderten?) Tabletdaten aber doch wieder zurück auf den PC spielen? (Der ebenfalls bereits in einer Replication hängt?)

    Wenn es so ungefähr ist, ist es nicht trivial.
    Was mir als erstes einfällt:
    Wenn der PC selbst bereits repliziert wird, dann genau das gleiche mit dem Tablet machen.

    Also nicht:
    (Remote)Master<=>PC<=>Tablet

    sondern
    (Remote)Master<=>PC
    und "parallel"
    (Remote)Master<=>Tablet
    Gruß, defo

    Comment


    • #3
      Vielen Dank defo für die schnelle Antwort. Ich stelle klar: ;-)
      Nicht die gesamte DB von unserem Linux-Server (er heisst obelix) soll auf das Tablet sondern nur bestimmet Tabellen (ca. 30 von 200). Auf dem Tablet wird nur gelesen, kein UPDATE, INSERT oder DELETE. Es gibt keinen Rückweg von localhost zu obelix.

      Hab eine Lösung gefunden, wo beim Synchronisieren einer lokalen mit einer obelix-Tabelle der RowStatus gesetzt wird. Und zwar über DataTable.Load mit einem DataTableReader (statt mit Merge):
      Code:
              Dim tObelix As New DataTable
              Dim tLocalhost As New DataTable
              Dim command As String = "SELECT * FROM t500"
              Dim daObelix As New MySqlDataAdapter(command, connObelix)
              Dim daLocalhost As New MySqlDataAdapter(command, connLocal)
              Dim cb As New MySqlCommandBuilder(daLocalhost)
      
              daObelix.Fill(tObelix)
              daLocalhost.Fill(tLocalhost)
              tObelix.PrimaryKey = New DataColumn() {tObelix.Columns("T500_ID")}
              tLocalhost.PrimaryKey = New DataColumn() {tLocalhost.Columns("T500_ID")}
      
              tLocalhost.Load(New DataTableReader(tObelix), LoadOption.Upsert)
              daLocalhost.Update(tLocalhost)
      Das geht auch sehr fix (in diesem Fall der t500 sind es rund 300 000 Rows und es dauert 5 Sekunden). Nun knabbere ich an dem Problem, dass die PrimaryKeys versaut werden. Die meisten Tabellen haben eine automatische Nummerierung für die ID (in Zweierschritten - gerade der eine Master, ungerade der andere Master, VPN, 5 km weit weg). Existiert local (Tablet) eine ID nicht, wird nicht die ID von obelix geschrieben, sondern eine neue hochgezählt. Da ist die Konsistenz hinüber. Ich möchte aber möglichst, dass die lokale DB dieselbe Structure hat wie obelix. Hast Du da einen Tipp?

      Mit meinem Server-Admin hab ich gesprochen und er meint, die eingerichtete MasterToMaster Repliklation erlaubt keine weitere Replikation, da dann drei Hosts involviert sind. Bei MasterSlave ginge es wohl.

      Grüße Norbert
      Zuletzt editiert von strzata; 27.06.2017, 18:09.

      Comment


      • #4
        Du kopierst ja über Quellcode die Daten. Da Du am Ziel sowieso nur lesen möchtest kannst Du eventuell anstatt eine neue primary key Spalte anzulegen, eine normale Spalte erzeugen und den Wert des primary keys kopieren. Ich bin nicht der große MySQL Guru, aber nicht jede Tabelle braucht immer auf Biegen und Brechen einen primary key Falls es Dir beim Lesen dann zu langsam wird, kannst Du immer noch einen Index auf die Spalte legen in der der Wert des pimary keys steht.

        Comment


        • #5
          Danke fanderlf! Habs nicht ausprobiert, aber ich denke das Load und der Reader brauchen PrimaryKeys in den beiden Tabellen.

          Comment


          • #6
            Ich sehe nicht wo der Zusammenhang zwischen PrimaryKey und Autoincrement Verhalten dessen hier liegt? Das sind zwei verschiedene Konzepte die man oft zusammen benutz aber nicht muss.
            Lass doch das Autoincrement für die PrimaryKeys in deiner lokalen DB einfach weg?

            Comment


            • #7
              Genau das meinte ich Ralf.

              @Threadersteller: Nein sollten sie eigentlich nicht brauchen. Wenn das Teil die Datenbank richtig benutzt, dann macht es ein "SELECT * FROM <Tabelle>". Wenn Du nichts in der WHERE Klausel hast, dann ist der "primary key" nicht nötig. Recht viel mehr als eine Kombination aus einem NOT NULL check und einem Index auf dieser Spalte ist ein primary key technisch gesehen nicht. Und ich bin mir ziemlich sicher, dass man in MySQL auch Tabellen ohne primary key anlegen kann.

              Comment


              • #8
                Originally posted by strzata View Post
                Code:
                        tObelix.PrimaryKey = New DataColumn() {tObelix.Columns("T500_ID")}
                        tLocalhost.PrimaryKey = New DataColumn() {tLocalhost.Columns("T500_ID")}
                Bist du sicher, dass das notwendig ist?

                M.E. macht es keinen Sinn, dass die lokale Tabelle nach einem anderen Schema die Primärschlüssel bildet- so wie es weiter unten geschildert ist. An den Primärschlüsseln dürfte sich ja der Abgleich ausrichten. Ich kenne diese Komponenten nicht, aber es sieht so aus, dass man sie eher vollständig einsetzen sollte, statt das lokale Schema manuell zu "optimieren". Ich würde nach best practice / turorials für das Verfahren suchen.
                Gruß, defo

                Comment

                Working...
                X