Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Synchronizacja tabeli pomiędzy dwiema bazami MYSQL i PGSQL
Forum PHP.pl > Forum > Bazy danych > PostgreSQL
rumpelek
Witam serdecznie... Problem z jakim uderzam do was jest jak sądzę nietypowy... podpowiedzcie proszę jak najprościej wykonać operację przeniesienia danych z tabeli x na serwerze z PostgreSQL do serwera MySQL... Chodzi o to by dodać takie polecenie do Cron'a by się dane synchronizowały np. codziennie po 15:00...
elektrrrus
Przejżyj czy pola synchronizowanych danych są ze sobą kompatybilne, jeśli tak to zwykły mysqdump i psql.
rumpelek
Pola sa kompatybilne, bo aktualnie zrobilem to recznym eksportem/importem, ale duzo zabawy ze zmiana kodowania mialem... przy csv. Pytanie jest jeszcze takie.... z tabeli x na serwerze x chce wyeksportowac tylko czesc kolumn do tabeli x na sdrwerze y... to tez da rade mysqldump?
cojack
Jeżeli można mu podać zakres od do to pewnie tak, sprawdź, czemu się pytasz a nie sprawdzisz sam?
rumpelek
bo wiem tylko CO, ale nie wiem Jak... tylko mniej więcej się oriętuje co do zasady, ale polecenia to czarna magia... aczkolwiek jesli ktoś mnie nakierowuje to już sobie przeważnie radzę... poprostu chodzi o pokazanie przykładu...
cojack
Aaaaa Ty to robisz w drugą stronę, mimo wszystko w postgresie nie da się wybrać rekordów przy dumpie jakie mają zostać zdumpowane, można ewentualnie całą tabelę. Albo sobie napisać skrypt który sam to za Ciebie zrobi.

Np wybierze wszystkie rekordy z postgresa, wybierze wszystkie rekordy z mysql, później zrobisz array_unique na samych idkach oczywiście, pobierzesz wszystkie unikalne rekordy z postgresa których nie ma w mysql i je wrzucisz. Amen wink.gif
rumpelek
Noo.. Myślałem, że wyłuszczyłem, że nie chcę tego ręcznie robić, tylko skryptem ... smile.gif ale cieszę się, że zaczyna mnie ktoś rozumieć...

ja chcę, aby zawsze rano kasował wszystkie dane w tabeli na serwerze Y... i kopiował w to miejsce wszystkie dane z tabeli z serwera X... już bez sprawdzania unikalności bo nie połączy się serwer Y z X... jedyna możliwość to taka, że połączy się serwer X z serwerem Y... (zwyczajnie serwer X ma ustawione mac adresy z którymi pozwala na połączenia... natomiast sam może połączyć się z całym internetem.

no i jak już wracamy do tematu smile.gif to jak miałby dokładnie wygladać taki skrypt ?
cojack
No jak to jak masz pseudo kod, napisz sobie na podstawie jego swój własny:

Kod
DELETE FROM tabela; - na serwerze Y
$wyniki = "SELECT * FROM tabela;" - z serwera X

dla kazdego $wyniku zrób:
  $zapytanie = "INSERT INTO tabela VALUES ( $wynik['cos'], $wynik->cos2, $wynik... )"; - na serwerze Y
koniec;


wink.gif
mkozak
Cytat(cojack @ 24.02.2011, 09:33:07 ) *
Kod
DELETE FROM tabela; - na serwerze Y


Tak to nigdy nie rób, bo strzelisz sobie w kolano.
Zawsze Truncate jeżeli wywalasz wszystko. Później oczyszczenie miejsca na dysku.

Może tak:
Kod
psql -U username -d test -q -c "truncate table tabelka"
vacuumdb -U username -d test
mysqldump -u username --password='123456' --skip-quote-names --no-create-info --no-create-db --skip-opt --skip-set-charset --skip-comments test tabelka > a.sql
psql -U username -d test < a.sql


Przy czym to nie jest najlepszy sposób ładowania danych.
Powinno się skorzystać z polecenia LOAD DATA (ale tutaj dump musi być w formie np. csv).
cojack
Cytat
TRUNCATE TABLE empties a table completely. Logically, this is equivalent to a DELETE statement that deletes all rows, but there are practical differences under some circumstances.


http://dev.mysql.com/doc/refman/5.0/en/truncate-table.html

mkozak - strzelasz ślepakami.
mkozak
Truncate na Postgresie.

Widzę, że u ciebie nawet ślepaków brak - niewypał.
Między tymi bazami jest jednak różnica. Odsyłam do lektury.
cojack
Wróć się do podstawówki, i naucz się czytać tekst z zrozumieniem. On przenosi dane z PostgreSQL do MySQL. Więc serwer Y to MySQL, po jaką cholerę ma pierw kasować dane z PostgreSQL, które chce przenieść? Po pierwsze, jeżeli już się tak upierasz że to taka wielka różnica pomiędzy bazami, to Ci powiem jak to wygląda w Postgresie bo widzę że masz zerowe pojęcie. Tak jak w MySQL w PostgreSQL nie ma zasadniczo żadnej większej różnicy pomiędzy Truncate a DELETE FROM, to po 1, po 2 TRUCATE od razu zwalnia miejsce na dysku, a nie tak jak Ty pisałeś:
Cytat
Później oczyszczenie miejsca na dysku.

Po 3, TRUNCATE, nie skanuje tabel, tylko leci w transakcji i wywala co jak leci, jak się nie spodoba, to rollback i nic nie kasuje.
Po 4, TRUNCATE, nie wyzwala triggerów na ON DELETE
Po 5, TRUNCATE to ANSI SQL, także ma prawo (powinien) działać w każdej bazie tak samo.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2024 Invision Power Services, Inc.