Page 1 of 1
MySQL-Tabelle updaten zw. zwei DB-Servern mit Shellscript?
Posted: 2003-06-30 13:50
by kasi4u
Hallo,
ich will gern eine Tabelle mit einer anderen Nacht-für-Nacht updaten bzw. immer nur von der einen zu anderen die Daten aktualisieren. Das würde ich gern mit einem Shellscript realisieren und dann via Cronjob einsetzen.
Wie kann ich das realisieren? Geht es überhaupt?
Ich habe zwar schon viel mit Shell gemacht, aber Shell und MySQL habe ich noch nicht erfolgreich verknüpfen bzw. verwenden können.
Danke für eure Hilfe,
Karsten
Re: MySQL-Tabelle updaten zw. zwei DB-Servern mit Shellscript?
Posted: 2003-06-30 14:24
by captaincrunch
Code: Select all
update xxx where yyy | mysql -u USER -p PW
Wo ist das Problem ? ;)
Problem:
Posted: 2003-06-30 18:13
by kasi4u
Hi,
ist damit sichergestellt, dass die ganze Tabelle mit allem drum und dran geupdated wird, oder nur Teilbereiche? Das Script muss ja erst einmal die Daten aus der Haupttabelle von Server1 holen und dann, dann muss das Script die Daten in die neue Tabelle auf Server2 einfügen...
Ist es mit deiner Angabe schon damit getan? Ich hoffe, ich verkompliziere es nicht...!?
Noch mal:
Server1, Tabelle1 auf Datenbank1 diese Daten sollen in einen anderen
DB-Server: Server2, Tabelle1 auf Datenbank1.
Gruß und danke für deine Mühe,
Karsten
[/code]
Re: MySQL-Tabelle updaten zw. zwei DB-Servern mit Shellscript?
Posted: 2003-06-30 20:46
by captaincrunch
Ich wollte dir nur demonstrieren, wie du über Pipes Daten aus MySQL raus, und auch wieder (per Shell) reinbekommen kannst. SQL ist weder mein Spezielgebiet, noch weiß ich, was du genau rausziehen, und weiterverarbeiten möchtest.
Nimm den Codeschnipsel als Beispiel, versuch's mal weiter, wenn du nicht weiterkommst : noch mal melden.
Re: MySQL-Tabelle updaten zw. zwei DB-Servern mit Shellscript?
Posted: 2003-06-30 21:19
by dea
Schau mal nach 'mysqldump' - iirc ist das ein "Befehl" mit dem man Tabellen, ganze Datenbanken etc. exportieren kann.
Du erhältst dadurch ein ASCII-File mit den Daten und der Struktur. Das kannst Du dann z.B. via scp auf den zweiten Rechner Transferieren und in die DB dort einspielen.
Also in etwa so:
Code: Select all
# DB exportieren, keine Ahnung wie die Kommandozeile wirklich heißt ;) Also besser nachlesen:
mysqldump -Parameter >Dump.Datei
scp Dump.Datei user@zweiterserver:/pafd/wo/dump/abgelegt/werden/soll/Dump.Datei
ssh user@zweiterserver mysql -wiedersonparameterumdasdumpeinzulesen <Dump.Datei >> Einspiel.log
Wie gesagt - so in etwa :)
Lösung, aber leider nicht ganz erfolgreich...
Posted: 2003-06-30 23:32
by kasi4u
Hallo,
okay, ich habe mich schlau gemacht und es funktioniert, fast... Ich kann die Daten erfolgreich exportieren, aber wenn ich sie importieren will, dann schreibt mysqlimport nur "leere Zeilen" in meine DB, was ich absolut nicht verstehen kann... :-(((((
Könnt ihr mir helfen? Was mache ich falsch?
So sieht mein Datenexport aus. (er funktioniert prima!)
export.sh auf meinem server1
Code: Select all
#!/bin/sh
mysqldump -uuser -ppassword --add-drop-table --complete-insert dbname dbtable > dbtable.txt
# Sende die Datei auf den server2:
#
ftp -n <<+
open 217.160.XXX.XXX
user XXXX XXXXXXX
cd /html/
binary
put dbtable.txt
bye
+
# Ende
#
So sieht die import.sh auf meinem Server2 aus:
Code: Select all
#!/bin/sh
#
# Importieren der Daten in die Datenbank:
#
mysqlimport -uuser -ppassword --delete --force dbname dbtable.txt
Ausführung der import.sh
Code: Select all
p1234566:# ./import.sh
dbname.dbtable: Records: 33 Deleted: 0 Skipped: 0 Warnings: 297
Wenn ihr eine Lösung wisst, dann wäre ich euch dankbar...
Gruß, Karsten
Mysql Datenbanksichern / -wiederherstellen
Posted: 2003-07-01 16:49
by bommi
wie wäre es denn hiermit:
Sichern einer Datenbank:
mysqldump -u [user] -p[passwd] -h localhost [Datenbankname] >/.[Datenbankname]_dump.sql
wobei der Name frei wählbar wäre
Nun kann dieses File übertragen werden (z.B. FTP oder scp)
Zurücksichern bzw. auf anderen Server übertragen
mysql -u [user] -p[passwd] [Datenbankname] <[Datenbankname]_dump.sql
so sollte es funktionieren, bei mir jedenfalls. Vielleicht gibt es ja ein Feedback.
Grüsse aus Düsseldorf
Bommi
Es funktioniert :-))))))))))))))))))
Posted: 2003-07-01 17:11
by kasi4u
Hallo Bommi,
super-lieben Dank an dich... es funktioniert. Meine Probleme sind gelöst und nun lässt mich mein Chef auch wieder aus dem Büro heraus :-))))
Alles Gute weiterhin,
Karsten
Re: MySQL-Tabelle updaten zw. zwei DB-Servern mit Shellscript?
Posted: 2003-07-11 22:22
by silv
mal als kleiner denkanstoss falls ihr nicht selber drüber stolpert ..
1. mysql unterstützt replikation !
2. mysql tools unterstützen -hostname angaben .. d.h. es ist möglich ( sofern die jeweils anzusprechende backupdatenbank extern erreichbar ist ) diese über nen einzeler aus db1 auszulesen und in db2 reinzupipen
3. im zweifelsfall kann ssh auch -execute .. also um nicht auf 10 servern 10 scripte zu installieren .. ein script auf db1 was die db dumped .. per scp auf db2 transfered .. nen ssh auf db2 aufmacht und nen execute für das import absetzt ...
alle 3 varianten erleichtern die arbeit von 1(ungemein) bis 3(immer noch sehr) :)
.. silv
...und?
Posted: 2003-07-12 06:41
by kasi4u
Hallo silv,
wenn du magst, so kannst du ja mal einen konkreten Vorschlag machen. Dass, was du schreibst, macht Sinn, aber ich steige nicht ganz durch. Ich habe, wie du schon gesagt hast, mehrere Scripte auf zwei Servern laufen, wegen dieser einen Datenbank, was mir natürlich nicht ganz so recht ist, aber es funktioniert.
Wenn es eine bessere Lösung gibt, dann wäre ich dir für einen Vorschlag sehr dankbar...
Gruß, Karsten
Re: MySQL-Tabelle updaten zw. zwei DB-Servern mit Shellscript?
Posted: 2003-07-12 22:04
by silv
ok .. also .. einfach mal in der reihenfolge wie ich es schon kurz angerissen hab ..
1.
das technisch stressfreiste ( was mysql angeht ) ist die mysql interne replikation
>
http://www.mysql.com/doc/de/Replication.html
.. du deklarierst einen DB Server als Master und einen ( oder x-beliebig viele ) als Slave .. der Master schreibt ein sogenanntes "BinLog" worauf die eigentliche Replikation aufbaut .. alle Slaves holen sich über eine Permanente Verbindung die Daten zum Zeitpunkt der Ã?nderung vom Master Server .. d.h. du hast 2 gleiche Datenbanken mit minimalem Zeitversatz .. der vorteil ist .. du musst dich um quasi nix kümmern ..
der Nachteil .. du brauchst halt diese permanente Verbindung zwischen den Servern .. aber im Endeffekt ist das zumindest von Trafficseiten relativ egal .. ob du nun die Daten einmal Nachts kopierst oder tagsüber in der Replikation noch die Queries mit dranhängen ist ja wurst ... :)
2.
mysql tools ..
alle mysql tools also zb. die in deinem Fall notwendigen können via --hostname auch einen Server ansprechen der nicht lokal läuft .. somit könntest du via cronjob in von dir gewünschen Abständen die DB dumpen
( mysqldump datenbankname --add-drop-table ) und gleich wieder einspielen ( in die 2te Datenbank )
folgender Befehl macht das flink :)
"mysqldump -h hostnameDBServer1 --add-drop-table -uusername -ppassword datenbankname | mysql -h hostnameDBServer2 -uusername -ppassword datenbankname"
mit dem --add-drop-table wird beim einspielen des Dumps die ZielDB quasi gecleaned sonst gibts ggf. Duplicate Entry Fehler ... gibt noch mehr sinnige mysql options .. zb. kannst du compression anschalten oder auch alle Datenbanken auf einmal dumpen oder nur einzelne Tabellen und und und .. einfach in die jeweilige Manpage schauen
3.
erklär ich nicht so ausführlich da es eigentlich selbsterklärend ist ..
lass ein Script folgendes machen
- erzeuge den Dump mit mysqldump wie oben ( alles vor dem Pipe ( | ) mysqldump --add-drop-table -uusername -ppassword datenbankname )
- transferiere den Dump per FTP,SCP,SFTP oder wie auch immer
- ssh nutzer@zielsystem -s "mysql -uusername -ppassword datenbankname < /pfad/zu/übertragender/datei/dateiname"
führt den Mysqlimport auf dem Remotesystem aus .. wenn du RSA Keys ohne Passwort nutzt halt auch ohne Userinteraktion ..
.. hoffe auf den richtigen Weg geholfen zu haben .. bei Problemen .. einfach nochmal fragen :)
gruß,
silv