Przesyłanie informacji z bazy do bazy przez aplikacje

0

Witam, mam trochę złożony problem (jak większość tutaj). Mam 2 bazy, oracle i mysql, chciałbym "synchronizować" dane między nimi, żeby było w miarę online. Na oracle stoi system ERP, a na mysql strona php. Bazy są zupełnie inne (inne tabele, inne kolumny), na mysql są funkcje php, które będą wrzucać informacje w odpowiednie kolumny/tabele. Mój pomysł jest taki: na triggerze np. after insert przesyłać po TCP/IP informacje z oracla do aplikacji php, a potem funkcje php insertuja w mysql. Czy takie podejście ma sens? Czy jest jakieś łatwiejsze rozwiązanie?

0

ja miałem podobny problem z tym, że oracle <-> mssql i po analizie skończyło się na osobnej aplikacji, która co 30s. aktualizuje dane w obie strony. Głównym za było to, że trzeba było dość mocno logować co się dzieje, w szczególności błędy - jedna z baz to "obcy" system, który nie do końca chciał współpracować. Dodatkowo niepowodzenie aktualizacji danych nie mogło blokować wprowadzania danych do któregokolwiek systemu oraz jeśli w danej chwili baza nie odpowiada to jak już się pojawi trzeba było zsynchronizować nie tylko nowe dane ale i stare. Wiąże się to z dodatkowymi kolumnami w synchronizowanych tabelach ale masz pełną kontrolę nad tym co i kiedy się dzieje

0

Nie rób tego na triggerze bo po pierwsze przyblokuje Ci to insert do jednej bazy, po drugie może spowodować, że np brak komunikacji spowoduje błąd inserta i brak danych w obu bazach. Znacznie lepszym rozwiązaniem jest dodatkowa aplikacja jak podał @abrakadaber ale jeśli nie chcesz tego robić w ten sposób to możesz użyć pakietu dbms_jobs (lub w nowszych wersjach oracl schedulera) do ustawienia zadania cyklicznego na oracle. Wtedy na triggerze robisz sobie tylko insert do jakiejś dodatkowej tabeli, a w jobie tylko odczytujesz tabelę i przenosisz dane do nowej bazy.

0

Dzięki za odpowiedz. Rzeczywiście na triggerze może być awaryjne, ale job da mi tylko cykliczność, a jak to przesłać. W oracle można dodać procedurę w javie i odpalić jako funkcję, teoretycznie to mogłoby przesyłać.

1

Widzę kilka rozwiązań:

  1. enterprajzowe - Oracle Gateway Products (DG4ODBC - od 11g, HSODBC poprzednie wersje), Oracle Goldengate
  2. narzędzia ETLowe (Pentaho Data Integrator, Talend, Clover, ... ) - Extract z jednego źródła, Transformacja do innego modelu, Load tam gdzie chcesz
  3. crontab + kilka skryptów
    crontab wykonujący export z oracle do pliku csv + kopiujący plik csv na maszynę z mysql
    crontab na maszynie mysql, który sprawdza czy jest nowy plik, importuje do mysql, usuwa plik

Istotny problem to jak wyłapywać interesujące zmiany. Trrigery + tabelka logująca rodzaj operacji: INSERT/UPDATE/DELETE? LogMiner na oracle? inne?

  1. własna appka w ulubionym języku programowania
  2. modyfikacja procesu, który wstawia dane do Oracle ;)
  3. Trigger w oracle + UTL_HTTP do wywołania jakiegoś web servisu, który wstawi dane do MySQLa

Ciężko powiedzieć, które rozwiązanie jest "lepsze" w Twoim przypadku.

0

W takim wypadku dobrze powinno się narzędzie typu ETL (jeśli ma być darmowe i obsługiwać różne bazy to polecam Pentaho). Jest trochę wysiłku żeby to zrobić i przetestować, ale w zamian masz proces szybki, niezawodny i dobrym logowaniem

0

To już mam pole do przemyśleń (a przede wszystkim do douczenia się). Ogarnę trochę bardziej temat i ewentualnie jeszcze dopytam. Dzięki

1 użytkowników online, w tym zalogowanych: 0, gości: 1