Любые инструменты для экспорта всей базы данных Oracle в виде сценариев SQL

Вот моя проблема, я хочу создать основу для нашей разработки Dateabase (Oracle 10g) и проверить наш svn для контроля версий, и после этого мы будем использовать Liquibase, чтобы помочь нам управлять инкрементными изменениями базы данных.

Моя проблема в том, как мне создать базовую версию Oracle 10g? база данных теперь состоит из более чем 500 таблиц с большим объемом данных конфигурации, и я хочу, чтобы моя база данных базировалась на наборе сценариев SQL для проверки на подрывную деятельность, а не на проверку дампа Oracle ..

Я попробовал использовать Liquibase generateChangeLog, но у него есть проблемы с производительностью ... может ли кто-нибудь порекомендовать мне какие-либо инструменты, которые помогут мне 1. Сканировать любую схему Oracle 2. Сгенерировать набор сценариев SQL (со структурами таблиц и данными) ..

заранее спасибо

Джеймс!


person James Khoo    schedule 28.06.2010    source источник


Ответы (4)


Что-то типа

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

хорошее начало. Вы можете настроить его с помощью PL / SQL и UTL_FILE, чтобы заставить его записывать каждую таблицу в другой файл. Вам, вероятно, также понадобится выполнять последовательности (хотя их версионирование довольно бессмысленно) и, возможно, триггеры / процедуры / функции / пакеты и т. Д.

Не забывайте о грантах.

person Gary Myers    schedule 28.06.2010
comment
Можете ли вы использовать PL / SQL и этот запрос для экспорта DDL в файл на стороне клиента? - person Derek Mahar; 23.09.2010
comment
Сервер БД не может записывать клиентские файлы (если только вы не столкнетесь с трудностями при совместном использовании и подключении диска, что фактически делает клиент файловым сервером). - person Gary Myers; 23.09.2010

Более общим решением было бы сбросить DDL sql для выбранного списка таблиц, а также других типов объектов. Это можно сделать с помощью представлений all_objects и all_users.

Пример, который сработал для меня:

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

Я написал сценарий python, который обновляет схему db в инкрементальном режиме на основе аналогичного sql:

  • запускает sql с last_ddl_time> = max (last_ddl_time с последнего обновления)
  • в конце сохраняет last_ddl_time где-нибудь в файловой системе для следующего обновления

Использованная литература:

  1. Функция oracle dbms_metadata.GET_DDL
  2. представление oracle all_objects
person Robert Lujo    schedule 02.04.2014

Вы пробовали бесплатный инструмент Oracle SQLDeveloper? Это дает вам возможность экспортировать DDL и данные.

person Rene    schedule 28.06.2010

EXPDP с опцией CONTENT = METADATA_ONLY, затем IMPDP с SQLFILE = your_script.sql?

Николас.

person N. Gasparotto    schedule 28.06.2010