2010-06-28 13 views
7

Aquí está mi problema, quiero crear una línea de base en nuestro desarrollo Dateabase (Oracle 10g), y revisar nuestro svn para control de versiones, y después de esto usaremos liquibase para ayudarnos a administrar los cambios incrementales de la base de datos.Cualquier herramienta para exportar el Oracle DB completo como scripts SQL

Mi problema es cómo debería crear la línea base de Oracle 10g? la base de datos ahora consta de más de 500 tablas, con una gran cantidad de datos de configuración, y quiero que mi base de datos base se base en un conjunto de scripts SQL para verificar en subversión, en lugar de comprobar en el volcado de Oracle ...

Tengo intente utilizar liquibase generateChangeLog, pero tiene algún problema de rendimiento ... alguien puede recomendarme cualquier herramienta que me ayude 1. Escanee cualquier esquema de Oracle 2. Genere un conjunto de secuencias de comandos SQL (con estructuras de tablas y datos) ..

Gracias de antemano

James!

Respuesta

4

Algo así como

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

es un buen comienzo. Puede ajustarlo con PL/SQL y UTL_FILE para que escriba cada tabla en un archivo diferente. Probablemente también necesite hacer secuencias (aunque versionarlas es bastante inútil), y tal vez desencadenar/procedimientos/funciones/paquetes, etc.

No olvide las concesiones.

+0

Se puede utilizar PL/SQL y esta consulta para exportar el DDL en un archivo en el lado del cliente? –

+0

El servidor de bases de datos no puede escribir archivos del cliente (a menos que tenga que lidiar con el problema de compartir y montar el disco, lo que hace que el cliente sea un servidor de archivos). –

1

¿Has probado la herramienta gratuita SQLDeveloper de Oracle? Le da la posibilidad de exportar DDL y datos.

2

EXPDP con la opción CONTENT = METADATA_ONLY, luego IMPDP con SQLFILE = your_script.sql?

Nicolas.

3

La solución más general sería volcar DDL sql para la lista de tablas seleccionada, pero también otros tipos de objetos. Esto podría hacerse utilizando las vistas all_objects y all_users.

Ejemplo que trabajó para mí:

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

escribí un script en Python que refresca esquema de db en modo incremental basado en SQL similar:

  • ejecuta SQL con last_ddl_time> = max (last_ddl_time desde la última actualización)
  • al final almacena last_ddl_time en algún lugar del sistema de archivos para la próxima actualización

Referencias:

  1. oráculo dbms_metadata.GET_DDL función
  2. oráculo all_objects vista
Cuestiones relacionadas