Willkommen bei Entwickler-Forum.
Ergebnis 1 bis 8 von 8

Thema: DB klonen

  1. #1
    Aufsteiger
    Registriert seit
    03.03.2009
    Beiträge
    90

    Standard 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. #2
    Stammgast
    Registriert seit
    24.10.2011
    Beiträge
    1.264

    Beitrag

    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

  3. #3
    Aufsteiger
    Registriert seit
    03.03.2009
    Beiträge
    90

    Standard

    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
    Geändert von strzata (27.06.2017 um 18:09 Uhr)

  4. #4
    Stammgast
    Registriert seit
    18.07.2008
    Beiträge
    3.036

    Standard

    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.

  5. #5
    Aufsteiger
    Registriert seit
    03.03.2009
    Beiträge
    90

    Standard

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

  6. #6
    Stammgast
    Registriert seit
    26.02.2003
    Beiträge
    4.803

    Standard

    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?

  7. #7
    Stammgast
    Registriert seit
    18.07.2008
    Beiträge
    3.036

    Standard

    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.

  8. #8
    Stammgast
    Registriert seit
    24.10.2011
    Beiträge
    1.264

    Standard

    Zitat Zitat von strzata Beitrag anzeigen
    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

 

 

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •