MySQL Abgleich per crontab

traxxus

Semiprofi
Thread Starter
Mitglied seit
23.05.2004
Beiträge
2.564
Ort
CH
Hallo L(in)uxxer

Folgende Situation:
Ich habe hier 3 Joomla Installationen auf dem gleichen Webserver (muss so sein) und verwendet MySQL. Jedes Joomla hat seine eigene Datenbank.

Jetzt gibt es in allen Joomlainstanzen eine Gemeinsamkeit; die "News" Meldungen.
Diese Meldung wird auf einer bestimmten Joomlainstanz erstellt und soll danach per crontab automatisch in die anderen Joomla DB's geklont werden.
Wichtig dabei ist, dass nur die EInträge kopiert werden, welche die "catid" 7 haben (siehe Bild)

Es geht darum auf allen Joomla Installationen die gleichen Meldungen zu haben. Und darum, nicht alles 3x zu erfassen.

Webserver ist debian (6.0) Squeeze.
 

Anhänge

  • mysql.png
    mysql.png
    15,8 KB · Aufrufe: 41
Zuletzt bearbeitet:
Wenn Du diese Anzeige nicht sehen willst, registriere Dich und/oder logge Dich ein.
Dazu solltest du bei allen Joomla-Installationen darauf achten, dass es eine "News"-Kategorie für neue Beiträge gibt.
Anschließend musst du die Kategorie-ID für jedes Joomla aus der Datenbank unter "Joomla.jos_content" herausfinden.

Anschließend kannst du deine News-Einträge wie folgt dumpen:

Joomla 1:
Code:
 mysqldump -u[I]USER[/I] -p[I]PASS[/I] --databases joomla1 --tables jos_content -w catid=[I]CATID1[/I] > news1.sql

Joomla 2:
Code:
 mysqldump -u[I]USER[/I] -p[I]PASS[/I] --databases joomla2 --tables jos_content -w catid=[I]CATID2[/I] > news2.sql

Joomla 3:
Code:
 mysqldump -u[I]USER[/I] -p[I]PASS[/I] --databases joomla3 --tables jos_content -w catid=[I]CATID3[/I] > news3.sql

Der "-w catid=ID" ist ein WHERE-Parameter, somit kannst du nur die Beiträge deiner News-Kategorie herausfiltern.
Die 3 verschiedenen Abfragen sind nötig, da es nicht zwingend der Fall sein muss, dass die neue News-Kategorie auf allen Joomla-Installationen die gleiche Kategorie-ID hat ;)

Somit kannst du die News von allen 3 Installation dumpen, und musst jeden Dump noch in die jeweils anderen beiden Installationen wieder einfügen, das geht dann analog wie mit dump:
Code:
mysqlimport < news.sql
(User, PW, etc. natürlich auch angeben ;) )


Grundsätzlich würde ich dir zunächst raten, die 3 vorhandenen Joomla-DBs zunächst zu klonen, und mit den Kopien der Datenbanken zu experimentieren, da Datenverlust beim Testen nicht unbedingt ausgeschlossen ist.
Funktioniert alles wie du es brauchst, kannst du ja die Befehle auf die "echten" DBs anpassen.

mfg
foxxx :wink:

PS: Alle Angaben ohne Gewähr! Ich bin für eventuelle Schäden oder Datenverlust nicht verantwortlich, das tust du alles auf eigene Gefahr. Davon muss ich mich hier absichern ;)
 
Zuletzt bearbeitet:
Danke sehr für die Hilfe foxx. Backup ist kein Problem, mache häufig Snapshots der VM.

Ich klemme leider schon bei Zugriffsprobleme :(
Debian wirft mir folgendes vor:
mysqldump: Got error: 1045: Access denied for user 'root'@'localhost' (Using password: YES) when trying to connect.

EDIT & gelöst: Habe Sonderzeichen im Passwort. Dann muss man es in Hochkommas setzen.

---------- Beitrag hinzugefügt um 12:09 ---------- Vorheriger Beitrag war um 11:55 ----------

Wie geb ich denn nun an, in welche Datenbank der Dump importiert werden soll? Da steig ich noch nicht durch.
 
Zuletzt bearbeitet:
alternativ geht auch folgendes:
Code:
echo "INSERT INTO ziel1db.tabelle SELECT * FROM quelldb.tabelle where catid=7;" | mysql -uUSER -pPASSWORD
echo "INSERT INTO ziel2db.tabelle SELECT * FROM quelldb.tabelle where catid=7;" | mysql -uUSER -pPASSWORD
echo "INSERT INTO ziel3db.tabelle SELECT * FROM quelldb.tabelle where catid=7;" | mysql -uUSER -pPASSWORD


---------- Beitrag hinzugefügt um 13:09 ---------- Vorheriger Beitrag war um 13:07 ----------

Die Zieldb gibst du einfach so an. Die Tabelle steht bereits im Dump drin.

mysqlimport ZIELDB < news.sql
 
Habe deine Lösung versucht, Nascar. Sieht vielversprechend aus. So müsste ich nicht mit Dumps arbeiten.

Leider strauchle ich auch da. Meine EIngabe sieht so aus;

Code:
echo "INSERT INTO intern.xxxx.com.pemt1_content SELECT * FROM xxxx.com.pemt1_content where catid=7;" | mysql -uroot -ppasswort
Ja, die DBs heissen wie die Domains.

Ergibt:

Code:
ERROR 1064 (42000) at line 1: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '.com.pemt1_content SELECT * FROM xxxx.com.pemt1_content where catid=7' at line 1

EDIT:
LAut Google gibt's "WHERE" nicht beim INSERT Kommando.
 
Zuletzt bearbeitet:
Dein Problem ist der Punkt im Datenbanknamen. Versuch das ganze mal einzugrenzen, in dem du das ganzes nach folgenden Schema folgendes Tippst:

`daten.bank.name`.`tabellen.name`
 
Bevor ich das mache;

Bei der Spalte "id" ist eine fortlaufende Nummer drin. Wird diese 1:1 übernommen? Denn die sollte "generiert" werden. Sonst haben plötzlich 2 die gleiche "id"
 
du kannst das Feld "id" beim select-query noch wieder rauslöschen, sodass wirklich nur die restlichen daten eingefügt werden, so würden die nummern dann neu erzeugt, allerdings fällt mir bei dem vorhaben auf, dass du dadurch etliche einträge doppelt haben wirst :hmm:
 
Der Querie, welchen ich gepostet habe, würde die Id übernehmen, da alle Spalten übertragen werden. Wenn du die ID generiert haben möchtest, musst du alle Spalten selecten, ausser die ID.

In meinem Querie würde das in etwa so ausschauen:

INSERT INTO ziel1db.tabelle (spalte1, spalte2, spalte3, spalte4, spalte4) SELECT spalte1, spalte2, spalte3, spalte4, spalte4 FROM quelldb.tabelle where catid=7;
Das macht den Querie leider sehr lang, da du wirklich jede Spalte angeben musst...
 
und er bekommt nen haufen doppelte einträge, da die IDs der bereits abgeglichenen Beiträge in den DBs nicht gleich sind, würde man in kurzer Zeit alles mehrfach vorhanden haben, das wäre sehr unpraktisch, dazu müsstest du noch die "created"-Spalte nutzen, und das Datum vergleichen um nur neuere Einträge zu synchronisieren, und nicht gleich alles.

dazu wäre es ggfs. deutlich sinnvoller, eine neue DB anzulegen, welche alle news enthält, und dann irgendwie mit den catid's der jeweiligen tabellen verlinkt ist, eine solche lösung sollte machbar sein, würde einen haufen arbeit ersparen und ist deutlich einfacher zu überblicken ;)
 
Hmmm ... Stimmt :d Daran hab ich garnicht gedacht. Ist zwar nicht elegant. Aber spricht was dagegen, erstmal alle News mit CatId 7 zu löschen in den DBs und dann neu zu syncen? :d
 
Danke sehr für eure rege Hilfe. Werde morgen wieder ein Auge drauf werfen.
 
noch eine idee: du könntest über den "alias" filtern, das dürfte das einfachste werden, sofern ein eintrag mit gleichem alias schon vorhanden ist, wird der nicht mitgesynct, jeder alias dürfte normalerweise nur 1x vorkommen ;)
 
Hardwareluxx setzt keine externen Werbe- und Tracking-Cookies ein. Auf unserer Webseite finden Sie nur noch Cookies nach berechtigtem Interesse (Art. 6 Abs. 1 Satz 1 lit. f DSGVO) oder eigene funktionelle Cookies. Durch die Nutzung unserer Webseite erklären Sie sich damit einverstanden, dass wir diese Cookies setzen. Mehr Informationen und Möglichkeiten zur Einstellung unserer Cookies finden Sie in unserer Datenschutzerklärung.


Zurück
Oben Unten refresh