Laden...

MySQL Export auf anderen Server

Erstellt von partywelt vor 11 Jahren Letzter Beitrag vor 11 Jahren 5.879 Views
P
partywelt Themenstarter:in
77 Beiträge seit 2011
vor 11 Jahren
MySQL Export auf anderen Server

verwendetes Datenbanksystem: MySQL

Hallo zusammen,

ich habe folgendes Problem. Wir eine interne Datenbank im Netzwerk, in der zur Zeit etwa 55.000 Daten gespeichert sind. Diese sollen auf einen externen MySQL Server exportiert werden, damit eine öffentliche Webanwendung darauf zugriff hat.

Wenn ich die Daten mittels HeidiSQL exportiere dauert dies etwa 20 Sekunden. Leider habe ich keien Möglichkeit gefunden, den HeidiSQL Export zu automatisieren. Ich habe versucht mit einem CSharp Skript die Daten mittels MySQLDataReader auszulesen und diese in die externe Datenbank zu aktualisieren bzw. neu hinzuzufügen, wenn die Daten noch nicht vorhanden sind. Es handelt sich dabei um 3 Tabellen, die exportiert werden sollen.

Der Export mittels CSharp Skript dauert für die erste Tabelle (41.000 Datensätze) etwa 25 Minuten. Bei der 2. Tabelle wird immer abgebrochen und es wir eine IO Exception geworfen, weil angeblich die Verbindung geschlossen wurde nach 900 Datensätze (1 Minute), obwohl der MySQLCommand.CommandTimeOut auf 1 Stunde gesetzt wurde.

Gibt es eine Möglichkeit eine komplette Tabelle von Server A nach Server B zu exportieren, ohne jeden Datensatz zu prüfen.

Auf beiden DB-Servern sollen die gleichen Daten liegen, sprich die Daten von Server A zu Server B exportiert werden.

Wie gesagt mit HeidiSQL ist dies sehr komfortabel lösbar, aber nicht automatisierbar. Ich habe keine Lust alle 30 Minuten einen manuellen Export zu machen.

Kennt jemand eine Lösung zum Export ganzer Tabellen?

D
496 Beiträge seit 2005
vor 11 Jahren

Mysql kann doch Replication, warum verwendest du das nicht?

"Programming is similar to sex. If you make a mistake, you have to support it for the rest of your life."

P
partywelt Themenstarter:in
77 Beiträge seit 2011
vor 11 Jahren

Danke für deine Antwort. Wie funktioniert die MySQL-Repklikation. Hab ich noch nichts von gehört.

D
496 Beiträge seit 2005
vor 11 Jahren

Du kannst quasi einen Server als Master und einen als Slave konfigurieren. Alle Daten von Server A werden dann auf Server B Repliziert.

Genaue Informationen findest du hier: http://dev.mysql.com/doc/refman/5.1/de/replication.html

"Programming is similar to sex. If you make a mistake, you have to support it for the rest of your life."

P
partywelt Themenstarter:in
77 Beiträge seit 2011
vor 11 Jahren

Kann ich das mit csharp machen? würde das gerne rechner unabhängig über ein seperates csharp programm machen.

D
496 Beiträge seit 2005
vor 11 Jahren

Da brauchst du nichts zu Programmieren, das kann die DB selbst, du musst nur die Server entsprechend per MySQL-Administrator konfigurieren und fertig.

"Programming is similar to sex. If you make a mistake, you have to support it for the rest of your life."

P
partywelt Themenstarter:in
77 Beiträge seit 2011
vor 11 Jahren

geht das auch automatisiert? wir haben einen mysql server auf einen windows server installiert znd greifen über heidisql auf die db zu. im mysqlmanager hab ich nichts gefunden. ein csharp programm dass jede std die daten eyportiert wäre schon ganz gut

D
496 Beiträge seit 2005
vor 11 Jahren

Das musst du einmal einrichten, ab dem Zeitpunkt an dem die Replikation gestartet wird werden alle Anweisungen auch auf dem Slave ausgeführt, somit sind automatisch beide Server synchron.

"Programming is similar to sex. If you make a mistake, you have to support it for the rest of your life."

P
partywelt Themenstarter:in
77 Beiträge seit 2011
vor 11 Jahren

ich möchte nicht alle anweisungen auf beiden server ausführen, sondern nur den stand von dem einen auf den anderen exportieren. die daten werden mittels eines java programms gepflegt auf das ich keine einflussmöglichkeiten habe

D
496 Beiträge seit 2005
vor 11 Jahren

Also nochmal:

falls du den Weg über Replikation gehen sollten, musst du beide Server entsprechen konfigurieren und einmal "Start drücken" ab dem Zeitpunkt wird jede Änderung automatisch auf den Server B übertragen. Du hast dann immer sofort auf Server B die gleichen Daten wie auf Server A.

Ist das nicht genau das was du möchtest?

"Programming is similar to sex. If you make a mistake, you have to support it for the rest of your life."

P
partywelt Themenstarter:in
77 Beiträge seit 2011
vor 11 Jahren

mit welcher software richte ich das ein? da ich keinen vollzugriff auf den externen server habe, sondern nur auf die db z.b. über heidisql habe, kann ich das nicht auf dem externen server direkt einrichten

D
496 Beiträge seit 2005
vor 11 Jahren

Installier einfach mysql-administrator, mittlerweile heist das workbench:

http://www.mysql.de/downloads/workbench/

Damit kannst du dich auf die Server verbinden und einrichten.

"Programming is similar to sex. If you make a mistake, you have to support it for the rest of your life."

P
partywelt Themenstarter:in
77 Beiträge seit 2011
vor 11 Jahren

vielen dank. werde ich nachher probieren und dann rückmeldung geben.

D
496 Beiträge seit 2005
vor 11 Jahren

Ok, die Einrichtung ist recht gut erklärt, dauert vielleicht ein bischen das einzurichten, und auch zu verstehen, aber wenn das einmal läuft brauchst du dich im Grunde nicht mehr drum zu kümmern.

"Programming is similar to sex. If you make a mistake, you have to support it for the rest of your life."

P
partywelt Themenstarter:in
77 Beiträge seit 2011
vor 11 Jahren

Hallo,

leider habe ich über den MySQL Workbench zwar Zugriff auf die Datenbank, aber wenn ich Manage Security auswähle, kann ich nichts machen. Da sind meine Rechte wohl doch zu eingeschränkt.

Gibts denn keine Möglichkeit mit CSharp den Inhalt einer DB-Tabelle in ein Feld zu schreiben und dieses Feld in eine eine Datenbank?

F
10.010 Beiträge seit 2004
vor 11 Jahren

Doch, aber Du müsstest dazu anfangen dich mal mit den Grundlagen zu beschäftigen.

MySql hat z.b. extra den Insert .. On Duplicate Update Befehl.
Wenn du den dann noch in eine Transaction packst geht so ein bisschen datantransfer ( << 100.000 Zeilen ist nicht der rede wert ) in sekunden.

P
partywelt Themenstarter:in
77 Beiträge seit 2011
vor 11 Jahren

Danke für deinen Link. Leider komme ich damit nicht wirklich klar, weil ich nicht verstehe was mit a, b, c und 1, 2, 3 gemeint ist.

Hier ist der Code den ich zur Zeit verwende.


string strSQL = "SELECT * FROM wort";
                        MySqlCommand cmd = new MySqlCommand(strSQL, law);
                        cmd.CommandTimeout = 3600;
                        MySqlDataReader dr = cmd.ExecuteReader();
                        while (dr.Read())
                        {

                            bool exist = false;
                            strSQL = "SELECT * FROM wort WHERE ID = " + Convert.ToInt32(dr["ID"].ToString());
                            MySqlCommand cmd1 = new MySqlCommand(strSQL, con);
                            MySqlDataReader dr1 = cmd1.ExecuteReader();
                            while (dr1.Read())
                            {
                                exist = true;
                            }
                            dr1.Close();

                            if (exist)
                            {
                                //Update wort
                                strSQL = "UPDATE wort SET " + 
                                    "begriffid = " + Convert.ToInt32(dr["begriffid"].ToString()) + ", " +
                                    "sprachid = " + Convert.ToInt32(dr["sprachid"].ToString()) + ", " +
                                    "worttext = '" + dr["worttext"].ToString() + "', " +
                                    "arabdictdesc = '" + dr["arabdictdesc"].ToString() + "', " +
                                    "geloescht = " + Convert.ToInt32(dr["geloescht"].ToString()) + ", " +
                                    "dokverweis = '" + dr["dokverweis"].ToString() + "', " +
                                    "description = '" + dr["description"].ToString() + "', " +
                                    "genum = " + Convert.ToInt32(dr["genum"].ToString()) + " " +
                                    "WHERE ID = " + Convert.ToInt32(dr["ID"].ToString());
                                update++;
                            }
                            else
                            {
                                //Insert in wort
                                strSQL = "INSERT INTO wort " +
                                    "(begriffid, " +
                                    "sprachid, " +
                                    "worttext, " +
                                    "arabdictdesc, " +
                                    "geloescht, " +
                                    "dokverweis, " +
                                    "description, " +
                                    "genum) VALUES (" +
                                    Convert.ToInt32(dr["begriffid"].ToString()) + ", " +
                                    Convert.ToInt32(dr["sprachid"].ToString()) + ", " +
                                    "'" + dr["worttext"].ToString() + "', " +
                                    "'" + dr["arabdictdesc"].ToString() + "', " +
                                    Convert.ToInt32(dr["geloescht"].ToString()) + ", " +
                                    "'" + dr["dokverweis"].ToString() + "', " +
                                    "'" + dr["description"].ToString() + "', " +
                                    Convert.ToInt32(dr["genum"].ToString()) + ")";
                                add++;
                            }
                            cmd1 = new MySqlCommand(strSQL, con);
                            cmd1.ExecuteNonQuery();
                        }
                        dr.Close();

16.807 Beiträge seit 2008
vor 11 Jahren

[Artikelserie] SQL: Parameter von Befehlen

Leider komme ich damit nicht wirklich klar, weil ich nicht verstehe was mit a, b, c und 1, 2, 3 gemeint ist.

Dann solltest Du Dich sehr sehr dringend mit den Grundlagen beschäftigen und nicht uns Deine Arbeit machen lassen.

D
496 Beiträge seit 2005
vor 11 Jahren

a,b,c sind in dem beispiel die Columns und 1,2,3 sind Vaules...
Wenn ich mir den von dir geposteten Code ansehe dann stimme ich zu das
du dich erstmal mit den Grundlagen beschäftigen solltest, das sieht alles
ziemlich "suboptimal" aus.

Du hast mitlerweile alle Stichwörte die die bräuchtest um dein Vorhaben umzusetzten.
Meiner Meinung wäre Replikation der beste Weg um dein Problem zu lösen,
falls du keine root Rechte hast solltest du vielleicht mal mit dem DB-Admin
sprechen. Ansonsten kannst du mit dem genannten INSERT ... ON DUPLICATE KEY UPDATE
Befehl auf selbst Tabellen "aktualisieren".

"Programming is similar to sex. If you make a mistake, you have to support it for the rest of your life."

P
partywelt Themenstarter:in
77 Beiträge seit 2011
vor 11 Jahren

Hallo zusammen,

bisher haben meine Kenntnisse, was Datenbanken angeht vollkommen ausgereicht, ich finde der Export von ganzen Tabellen geht schon ein wenig weiter, als Grundkenntnisse. Naja nichts desto trotz habe ich bemerkt, dass MySQL in diesem Fall nicht die Geschwindigkeit bringt die ich brauche. Eine Abfrage von etwa 36.000 Datensätzen mit direkter Bindung an eine GridView dauert mehrere Minuten, sodass ich die Daten in eine Access-Datei gepackt habe, wo die gleiche Abfrage mit der gleichen Bindung an die GridView nur wenige Sekunden dauert, sodass sich der Export der MySQL-Daten erledigt hat.

Nun muss ich schauen, wie ich die Daten automatisiert in die Access-DB bekomme, aber das ist an anderes Thema. Ich hoffe, dass ich dies mit der Erlernung der "Grundkenntnisse, die ich anscheinend nicht besitze" hinbekomme.

Der Thread kann geschlossen werden.

D
496 Beiträge seit 2005
vor 11 Jahren

Das mit den Grundlagen war erstens nicht böse gemeint und zweitens nicht auf die Datenbankkenntnisse bezogen sondern hauptsächlich darauf wie du die SQL-Befehle
zusammenstringst besonders bezogen auf die Parameter.

MySQL ist zwar bestimmt nicht die performanteste Datenbank aber das ein
Select mit nur 36000 Rows mehrere Minuten dauert kann nicht sein, das sollte
in, wenn überhaupt, ein paar sekunden gehen. Da muss etwas anderes nicht stimmen.

Access ist Meiner Meinung nach eine deutlich schlechtere Wahl, das ist streng genommen
auch gar keine Datenbank. Warum das in deinem Fall preformanter ist ist mir ein Rätsel.

Verstehe das aber bitte nicht als Angriff, das sind halt (nicht nur) meine Erfahrungen.

"Programming is similar to sex. If you make a mistake, you have to support it for the rest of your life."

F
10.010 Beiträge seit 2004
vor 11 Jahren

@partywelt:
Du hast Dir also nicht mal die Mühe gemacht den Link von Abt durchzulesen?
Das hat nichts mit fehlenden Grundlagen sondern eher mit Fahrlässigkeit zu tun.

Und genauso wie Du das hier oben schon suboptimal machst, wird auch deine Abfrage und Bindung schlecht sein.

Fehlende Grundlagen sorgen dafür das man häufig schlechteren und damit auch langsameren Code schreibt.
Und beim Hinweis darauf zu schmollen wird deine Arbeit in der Zukunft auch nicht einfacher machen.