2010-06-28 11 views
7

Ecco il mio problema, voglio creare una base di riferimento sul nostro sviluppo Dateabase (Oracle 10g), e controllare nel nostro controllo svn per la versione, e dopo useremo il liquibase per aiutarci a gestire le modifiche incrementali del database.Qualsiasi strumento per esportare l'intero DB Oracle come script SQL

Il mio problema è come devo creare la linea di base di Oracle 10g? il database ora è composto da oltre 500 tabelle, con una grande quantità di dati di configurazione, e voglio che la mia linea di base DB si basi su un set di script SQL da controllare in subversion, piuttosto che check in Oracle dump ..

Ho provato a usare liquibase generateChangeLog, ma ha qualche problema di prestazioni .. chiunque può consigliarmi qualche strumento che mi aiuti 1. Scansiona qualsiasi schema Oracle 2. Genera un set di script SQL (con strutture di tabella e dati) ..

Grazie in anticipo

James!

risposta

4

Qualcosa di simile

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

è un buon inizio. Puoi modificarlo con PL/SQL e UTL_FILE per farlo scrivere su ogni tabella in un file diverso. Probabilmente avrai bisogno di fare anche delle sequenze (anche se la loro versione è abbastanza inutile) e forse i trigger/procedure/funzioni/pacchetti ecc.

Non dimenticare le sovvenzioni.

+0

È possibile utilizzare PL/SQL e questa query per esportare il DDL in un file sul lato client? –

+0

Il server DB non può scrivere file client (a meno che non si abbia il problema di condividere e montare l'unità, rendendo efficacemente il client un file server). –

1

Hai provato lo strumento SQLDeveloper gratuito di Oracle? Ti dà la possibilità di esportare DDL e dati.

2

EXPDP con CONTENT = opzione METADATA_ONLY, quindi IMPDP con SQLFILE = your_script.sql?

Nicolas.

3

Una soluzione più generale sarebbe quella di scaricare DDL sql per l'elenco di tabelle selezionato, ma in aggiunta anche altri tipi di oggetti. Questo potrebbe essere fatto usando le viste all_objects e all_users.

Esempio che ha lavorato per me:

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 '%$%' 
) 
; 

ho scritto uno script python che rinfresca lo schema db in modalità incrementale basato su SQL simile:

  • esegue SQL con last_ddl_time> = max (last_ddl_time dall'ultimo aggiornamento)
  • alla fine memorizza last_ddl_time da qualche parte nel filesystem per il prossimo aggiornamento

Riferimenti:

  1. Oracle dbms_metadata.GET_DDL funzione
  2. oracolo all_objects vista
Problemi correlati