2010-06-28 13 views
7

Oto mój problem, chcę stworzyć linię bazową dla naszej bazy danych deweloperskich (Oracle 10g) i sprawdzić w naszym svn dla kontroli wersji, a następnie użyjemy liquibase aby pomóc nam w zarządzaniu przyrostowymi zmianami w bazie danych.Wszelkie narzędzia do eksportowania całego Oracle DB jako skrypty SQL

Mój problem polega na tym, jak utworzyć bazę danych Oracle 10g? baza danych składa się teraz z ponad 500 tabel, z dużą ilością danych konfiguracyjnych i chcę, aby moja baza bazowa db opierała się na zestawie skryptów SQL, aby sprawdzić subversion, a następnie sprawdzić zrzut Oracle.

Mam spróbować użyć liquibase generateChangeLog, ale ma pewien problem z wydajnością. Czy każdy może polecić mi jakieś narzędzia, które mi pomogą 1. Zeskanuj dowolny schemat Oracle 2. Wygeneruj zestaw skryptów SQL (ze strukturami tabel i danymi).

Z góry dziękuję

James!

Odpowiedz

4

Coś

SELECT DBMS_METADATA.GET_DDL('TABLE',table_name) FROM USER_TABLES; 

to dobry początek. Możesz dostosować go za pomocą PL/SQL i UTL_FILE, aby zmusić go do zapisania każdej tabeli do innego pliku. Prawdopodobnie będziesz musiał także wykonać sekwencje (chociaż ich wersja jest dość bezcelowa), a może wyzwalacze/procedury/funkcje/pakiety itp.

Nie zapomnij o grantach.

+0

Można użyć PL/SQL i tę kwerendę, aby wyeksportować do pliku DDL po stronie klienta? –

+0

Serwer DB nie może zapisywać plików klienta (chyba że przejdziesz do kłopotów z udostępnianiem i instalowaniem napędu, efektywnie czyniąc klienta serwerem plików). –

1

Czy wypróbowałeś darmowe narzędzie SQLDeveloper firmy Oracle? Daje możliwość eksportu DDL i danych.

2

EXPDP z TREŚCI = opcja METADATA_ONLY, a następnie IMPDP z SQLFILE = your_script.sql?

Nicolas.

3

Bardziej ogólnym rozwiązaniem byłoby zrzucenie DDL sql dla wybranej listy tabel, ale dodatkowo także innych typów obiektów. Można to zrobić za pomocą widoków all_objects i all_users.

Przykład że pracował dla mnie:

select dbms_metadata.GET_DDL(u.object_type,u.object_name, u.owner) 
from all_objects u 
where 1=1 
-- filter only selected object types 
and u.object_type in ('TABLE', 'INDEX', 'FUNCTION', 'PROCEDURE', 'VIEW', 
         'TYPE', 'TRIGGER', 'SEQUENCE') 
-- don't want system objects, generated, temp, invalid etc. 
and u.object_name not like 'SYS_%' 
and temporary!='Y' 
and generated!='Y' 
and status!='INVALID' 
and u.object_name not like 'TMP_%' 
and u.object_name not like '%$%' 

-- if you want to filter only changed from some date/timestamp: 
-- and u.last_ddl_time > '2014-04-02' 

-- filter by owner 
and owner in (
    select username from dba_USERS where DEFAULT_TABLESPACE not like 'SYS%' 
    and username not in ('ORACLE_OCM') 
    and username not like '%$%' 
) 
; 

Napisałem skrypt Pythona, który odświeża schematu db w bieżących trybie oparty na podobnym SQL:

  • działa SQL z last_ddl_time> = max (last_ddl_time from last refresh)
  • na końcu przechowuje last_ddl_time gdzieś w systemie plików do następnego odświeżenia

Referencje:

  1. oracle dbms_metadata.GET_DDL funkcja
  2. oracle all_objects widok
Powiązane problemy