sobota, 27 listopada 2010

Export i import danych dla NIE-adminów

Dzisiaj przedstawiam proste techniki importu i eksportu danych z bazy Oracle dla normalnych developerów Oracle (tj. nie geeków siedzących 25 godzin na  dobę przed komputerem znających każde najdrobniejsze pojęcie związane z Oracle, wszystkie możliwe struktury i dostępne parametry dla wszystkich programów, tylko dla takich  co pracują jak biali ludzie, mają trochę życia, może nawet psa..).
W Oracle mamy dwa fajne programy do tego celu. 
Generalnie przy użyciu programów exp i imp możemy eksportować i importować :
-całą bazę
-wybrany schemat
-wybrane tabele

Eksport danych

Najprostszy jest eksport całej bazy, swoją drogą może się przydać gdybyśmy coś napsuli :P




Kod:

exp userid=system/assembler1 file='c:\andrzej\ei\calosc.dat' log='c:\andrzej\ei\.calosc.log' FULL=Y

To co następuje po userid to nazwa użytkownika łamana przez hasło. W tym wypadku  muszę to zrobić jako system, ponieważ jako zwykły użytkownik nie mam dostępu do całej bazy (a całą chcę eksportować).
Po file podaję nazwę pliku do którego zostanie wrzucona zawartość bazy. Plik stworzy się sam, ale struktura katalogów już musi być. Po log podaję plik do którego mają być zrzucane logi. Podawanie tego nie jest obowiązkowe. Opcja Full=y nakazuje eksport całej bazy. Jeśli jej nie podasz, musisz wyeksportować schemat, albo tabelę, ale i tak musisz określić które.

Eksport całego schematu:



Kod:

exp userid=hr/hr file='c:\andrzej\ei\schemat.dat' log='c:\andrzej\ei\schemat.log' owner=hr


Parametry userid, file, log znaczą to samo co poprzednio :). Eksportuję jako user hr swój własny schemat. Oczywiście mogę eksportować również schematy innych userów, ale muszę do tego być zalogowany jako user system (albo user który jest ownerem schematu).
Poza tym zamiast "full=y" pojawiło się "owner=hr", co oznacza że wyeksportowany ma zostać cały schemat usera hr.

Na wypadek gdyby nie chciało Ci się wstać z fotela i zrobić eksport na kompie stojącym 2 metry dalej (albo serwerze pilnie strzeżonego przez 1435454 drzwi, strażników i bramek) to możesz zrobić to zdalnie, dodając w userid "@adres_ip" :



Eksport wybranych tabel

Możesz chcieć też zrobić sobie kopię zapasową tylko kilku tabel. Do tego celu w miejsce wcześniejszego full=y czy owner=hr wpisujesz np. tables=employees, departments :



Import danych

Jak już wyrzuciliśmy dane z bazy, to może zechcemy sobie je zaimportować z powrotem albo wrzucić na  innych serwerze. Do takich zabaw używamy programu imp.

Import całej bazy





Kod:

imp userid=system/assember1 file='c:\andrzej\ei\calosc.dat' log='c:\andrzej\ei\iportall.log' full=y destroy=y

Parametr userid - wiadomo to samo co przy exp, wiadomo że jak całość wciągamy to logujemy się jako user system. File to plik z wcześniejszego eksportu danych, log tak jak wcześniej, full=y bo wciągamy całość, destroy=y oznacza, że jeśli istnieje już obiekt w bazie o takiej nazwie to zostanie skasowany i nadpisany. Jeśli tego nie dodamy, to w takiej sytuacji zacznie krzyczeć (chyba że dodamy ignore=y, wtedy olewa problemy).

Chciałbym już pisać dalej i robić screeny ale jeszcze mi się importuje....


Import schematu

Importować możemy zawartość schematu nie tylko z powrotem do schematu usera z którego zostały dane wyciągnięte, ale też dane możemy wstawić innemu userowi. Dlatego przy imporcie nie ma już 'owner=hr', ale za to jest 'touser=hr' określający do schematu jakiego usera mają dane zostać wrzucone, oraz 'fromuser=hr'
czyli schemat jakiego usera może być wciągnięty ( bo jeżeli importujemy jakiś schemat z eksportu całej bazy, to przecież mamy tam schematów od pytki i trzeba któryś wybrać ).



Kod:

imp userid=hr/hr file='c:\andrzej\ei\schemat.dat' fromuser=hr touser=hr destroy=y

Tutaj też mógłbym dać np. log='costamcostam' jak przy eksporcie, ale mi się nie chciało pisać (czytaj: da się).


Import poszczególnych tabel

Podobnie jak przy imporcie schematu robię fromuser i touser - w tym względzie działa to tak samo. Wybieram sobie też tabele które chcę zaimportować.



Kod:

imp userid=hr/hr file='c:\andrzej\tabele.dat' fromuser=hr touser=hr tables=employees

Uważaj tylko z tym importem, bo Oracle nadpisuje tabele importowane bez żadnej gadki.

W nagrodę że chciało Ci się tyle czytać masz zagadkę: Co to jest : "nie świeci i nie mieści się w dupie?"
..
...
....
..
..

"radziecka maszyna do świecenia w dupie".

Programy exp i imp mają jeszcze kilka mniej lub bardziej przydatnych parametrów. Wszystkie znajdziesz tutaj :)

11 komentarzy:

  1. Czy jesli wyeksportuje baze z jednego serwera 'a' czy dam rade ja zaimportowac na serwerze 'b'?? opisany wyzej sposob opisuje tylko dzilania w obrebie jednego serwera czy wielu?

    OdpowiedzUsuń
  2. Możesz do innego serwera przenieść dane.

    OdpowiedzUsuń
  3. a czy jest możliwość importu csv z pliku znajdującego się w sieci lokalnej ?
    np z komputera koleżanki, która udostępniła nam katalog z plikiem csv?

    OdpowiedzUsuń
  4. a w jaki sposob wyeksportowac cala baze ze stacji na ktorej siedzi 5 roznych baz. Np. mamy:
    baza1
    baza2
    .
    .
    baza5
    IP stacji roboczej na ktorej siedza bazy:
    10.1.20.340
    Interesuje nas tylko baza1. Jak ją konkretnie wskazać?
    dostep do bazy1:
    user/passw

    OdpowiedzUsuń
  5. Mam pytanie, czy jest możliwe wyeksportowanie widoku do pliku, nie importując całego schematu czy bazy?

    OdpowiedzUsuń
  6. Jak wyeksportować dane z bazy 11 do 9 ?

    OdpowiedzUsuń
  7. W przypadku skomplikowanych relacji należy pamiętać o wyczyszczeniu schematu docelowej bazy ze starych danych i obiektów bo import może się nie udać...

    OdpowiedzUsuń
  8. Z importem jest jeden problem. W przypadku (na przyklad) triggerow w pliku *.dat sa odwolania do pierwotnego schematu np.
    CREATE OR REPLACE TRIGGER "HR"."TRIGGER1"
    AFTER INSERT OR DELETE OR UPDATE ON hr.applications
    ...
    Czy jest mozliwosc zamiany prefixu schematu w HR.APPLICATIONS? (bo chamska zmiana w pliku (np. sedem) "psuje go")

    OdpowiedzUsuń
  9. z tym wskaźnikiem do parametrów polecenia imp i exp średnio zabawne (albo nie mam dzisiaj nastroju), wystarczy: imp help=y lub exp help=y

    pozdrawiam

    OdpowiedzUsuń
  10. swietny artykuł ale brakuje mi odpowiedzi na pytanie czy podana komenda:
    exp userid=system/assembler1 file='c:\andrzej\ei\calosc.dat' log='c:\andrzej\ei\.calosc.log' FULL=Y
    moze byc wykonana na bazie dzialajacej, czy nalezy wszystkich uzytkownikow na ten czas wylogowac.

    OdpowiedzUsuń