Oracle. DBlink. Prośba o pomoc.

0

Witaj.

Mam spory problem nad którym głowie się już dłuższy czas, ale zupełnie nie mogę sobie z nim poradzić. Dlatego proszę Cię o pomoc.

Zadanie:
Zaprezentować możliwość kopiowania cyklicznego (np. co 5 minut) danych z jednej bazy danych do drugiej za pomocą DBLINKa.

Opis problemu:
Mam dwie bazy danych. (nie jestem tego pewny bo korzystam z darmowej wersji XE) Mam po prostu dwóch użytkowników. Mini i Lukas. Mam też połączenie dblink miedzy nimi z użytkownika mini o nazwie mini_lukas. DBLINK chyba działa bo mogę spokojnie dostać się z użytkownika mini do tabel użytkownika lukas. Nie mam jednak żadnego pojęcia jak skopiować z tabel użytkownika lukas danych do tabel użytkownika mini. Zwłaszcza cyklicznie co 5 minut.

I tutaj proszę o pomoc. Bo już nawet nie wiem gdzie o tym szukać jakichś informacji czy przykładów. Może znacie jakieś dobre kursy lub przykłady takich działań, z których można się tego nauczyć, a może ktoś umie mi to rozpisać i na podstawi tego przykładu zrozumiem jak to działa.

Tylko jest jeszcze jeden haczyk. W wymaganiach projektu mam poradzić sobie z konfliktami typów danych. Chodzi o to, że schematy baz danych nie są identyczne. Na przykład w tabeli użytkownika lukas mam imie i nazwisko (np. Jan Kowalski-Nowak), a w tabeli docelowej użytkownika mini mam tylko kolumnę osoba gdzie zapisuje jedynie pierwsza literę imienia, kropkę lub podkreślenie _ i nazwisko do 10 znaków. W tym przypadku j.kowalski-n.

Chce się tego nauczyć a po prostu nie wiem gdzie szukać. Włóczyłem się po internecie, ale większość przykładów czy kursów nie zawiera tak zaawansowanych przykładów z dobrym objaśnieniem.

Bardzo proszę o możliwe szybka i obszerną pomoc.
Z góry dziękuję
Łukasz

0

Dwie bazy to musiałbyś zainstalować Oracle XE na oddzielnych komputerach lub jedną bazę postawić na wirtualnej maszynie. Dwóch użytkowników tworzy dwa "schema", jeśli jest to na jednym komputerze i tu databse link jest Ci nie potrzebny. Ale nieważne.

  1. Twoje zadanie oprze się o procedurę, czyli musiałbyś poznać jak tworzyć procedury
  2. kopiowanie z tabeli do tabeli: insert into tabela@dblink (kol1, kol2) select * from lokalna_tabela (oczywiście zależy skąd dokąd kopiujesz)
  3. cyklicznie co 5 minut, tu z pewnością będzie potrzebny "scheduler" szukaj materiałów na temat Oracle Scheduler
  4. obcinanie i łączenie stringów tu musiałbym sam sobie przypomnieć, ale materiałów w necie jest od cholery.

pozdrawiam

0
szymon7500 napisał(a):
  1. kopiowanie z tabeli do tabeli: insert into tabela@dblink (kol1, kol2) select * from lokalna_tabela (oczywiście zależy skąd dokąd kopiujesz)
    pozdrawiam

To jest faktycznie najlepsze moim zdaniem rozwiązanie, tyle że musisz zrobić kilka dodatkowych rzeczy. Jeżeli chcesz za każdym razem odświeżać wszystkie dane (w niektórych przypadkach jest to dobre), najpierw musisz zrobić truncate nowej tabeli, dopiero potem insert (inaczej albo co chwilę rekordy będą się duplikowały, albo się wysypie ze względu na unique constraint). W takim przypadku warto dodać do swojego rozwiązania mechanizm EXCHANGE PARTITION:

http://www.oracle-base.com/articles/misc/partitioning-an-existing-table-using-exchange-partition.php

Tworzysz pośrednią tabelę, do której importujesz dane, po zakończeniu wykonujesz EXCHANGE PARTITION ze swoją docelową tabelą. Dzięki temu czas niedostępności danych skraca się do kilku sekund nawet dla ogromnych tabel. Jeśli tak nie zrobisz, użytkownicy w czasie odświeżania danych będą widzieli pustą tabelę.

Zamiast odświeżać całą tabelę, zazwyczaj jednak lepiej jest robić to przyrostowo (importujesz tylko nowe/zmienione dane) - najczęściej większość danych pozostaje niezmieniona, zwłaszcza w ciągu 5 minut. Tutaj też masz kilka wariantów:

http://www.oracle.com/technetwork/issue-archive/2008/08-mar/o28plsql-095155.html

i robisz update zmienionych rekordów. To jest dużo szybsze niż merge, ale gra nie warta świeczki jeśli nie masz dużo danych.

Możesz też zastosować rozwiązanie Oracla z pudełka - widoki zmaterializowane:

http://en.wikipedia.org/wiki/Materialized_view

Dla każdego widoku możesz ustawić częstotliwość odświeżania, które Oracle już za Ciebie obsłuży (ale nie polecam tego rozwiązania, tracisz kontrolę i łatwo się pogubić, jeśli masz dużo widoków - lepiej napisać własny mechanizm oparty na jobie, który będzie sterował odświeżaniem).
Do dyspozycji masz dwie główne metody odświeżania widoków:

  • refresh complete - za każdym razem cały widok jest w całości odświeżany (wszystkie dane są przerzucane)
  • refresh fast - tutaj musisz na źródłowej tabeli założyć materialized view log:
CREATE MATERIALIZED VIEW LOG ON nazwa_tabeli;

W stworzonym logu Oracle w sobie tylko znany sposób odkłada zmiany na tabeli źródłowej, a przy odświeżeniu zrzucane są tylko zmiany, nie cała tabela. To dobre rozwiązanie jeśli chcesz często odświeżać widok (co 5 minut), zmian pewnie będzie stosunkowo niewiele.

0

@Hrypa proszę komentarz jeśli masz uwagi do poniższego

autor pisze, że korzysta z wersji bazy XE w której nie ma partycjonowania tabel podejrzewam, że i EXCHANGE PARTITION nie zadziała.
Co do zmaterializowanej perspektywy to one dobre są do tabel z dużą ilością danych, a czy do tego zadania będzie to miało sens?

Aby uniknąć dublowania danych to może polecenie "select" z "joint" z albo "where not exists" ?

pozdrawiam

0

Faktycznie nie zwróciłem uwagi, że mowa o wersji XE - nie wiem, co w niej jest okrojone (pewnie większość), mój post odnosił się do pełnej wersji. Jeśli chodzi o widoki zmaterializowane, niekoniecznie muszą być do tabel z dużą ilością danych (raczej przeciwnie, im większa tabela, tym większa korzyść z zaimplemetowania własnego mechanizmu odświeżania - wtedy masz całkowitą kontrolę nad całym procesem).

0

Bardzo dziękuje za zainteresowanie i chęć pomocy. Wszystkie uwagi przeczytałem i zapoznałem się z proponowanymi treściami. Udało mi się dzięki temu ukończyć mój projekt. Na wszystko świetnie odpowiedzieliście i chyba nie ma potrzeby abym się nad tym więcej rozpisywał. :) Dzięki wielkie jeszcze raz.

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