MySQL-Tabelle updaten zw. zwei DB-Servern mit Shellscript?

MySQL, PostgreSQL, SQLite
kasi4u
Posts: 116
Joined: 2002-08-12 22:34
Location: Leipzig

MySQL-Tabelle updaten zw. zwei DB-Servern mit Shellscript?

Post by kasi4u » 2003-06-30 13:50

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

captaincrunch
Userprojekt
Userprojekt
Posts: 7066
Joined: 2002-10-09 14:30
Location: Dorsten

Re: MySQL-Tabelle updaten zw. zwei DB-Servern mit Shellscript?

Post by captaincrunch » 2003-06-30 14:24

Code: Select all

update xxx where yyy | mysql -u USER -p PW
Wo ist das Problem ? ;)
DebianHowTo
echo "[q]sa[ln0=aln256%Pln256/snlbx]sb729901041524823122snlbxq"|dc

kasi4u
Posts: 116
Joined: 2002-08-12 22:34
Location: Leipzig

Problem:

Post by kasi4u » 2003-06-30 18:13

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]

captaincrunch
Userprojekt
Userprojekt
Posts: 7066
Joined: 2002-10-09 14:30
Location: Dorsten

Re: MySQL-Tabelle updaten zw. zwei DB-Servern mit Shellscript?

Post by captaincrunch » 2003-06-30 20:46

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.
DebianHowTo
echo "[q]sa[ln0=aln256%Pln256/snlbx]sb729901041524823122snlbxq"|dc

dea
Posts: 532
Joined: 2002-08-13 12:05

Re: MySQL-Tabelle updaten zw. zwei DB-Servern mit Shellscript?

Post by dea » 2003-06-30 21:19

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 :)

kasi4u
Posts: 116
Joined: 2002-08-12 22:34
Location: Leipzig

Lösung, aber leider nicht ganz erfolgreich...

Post by kasi4u » 2003-06-30 23:32

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

bommi
Posts: 6
Joined: 2003-06-09 22:57
Location: Neuss

Mysql Datenbanksichern / -wiederherstellen

Post by bommi » 2003-07-01 16:49

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

kasi4u
Posts: 116
Joined: 2002-08-12 22:34
Location: Leipzig

Es funktioniert :-))))))))))))))))))

Post by kasi4u » 2003-07-01 17:11

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

silv
Posts: 12
Joined: 2003-05-22 00:14

Re: MySQL-Tabelle updaten zw. zwei DB-Servern mit Shellscript?

Post by silv » 2003-07-11 22:22

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

kasi4u
Posts: 116
Joined: 2002-08-12 22:34
Location: Leipzig

...und?

Post by kasi4u » 2003-07-12 06:41

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

silv
Posts: 12
Joined: 2003-05-22 00:14

Re: MySQL-Tabelle updaten zw. zwei DB-Servern mit Shellscript?

Post by silv » 2003-07-12 22:04

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