Всички инструменти за експортиране на цялата Oracle DB като SQL скриптове

Ето моят проблем, искам да създам базова линия на нашата разработка Dateabase (Oracle 10g) и да проверя в нашия svn за контрол на версиите и след това ще използваме liquibase, за да ни помогне да управляваме постепенните промени в базата данни.

Проблемът ми е как да създам базова линия на Oracle 10g? базата данни сега се състои от 500+ таблици с голямо количество конфигурационни данни и искам моята базова линия на db да се основава на набор от SQL скриптове за проверка в subversion, вместо да проверява в дъмп на 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
DB сървърът не може да записва клиентски файлове (освен ако не се наложи да споделяте и монтирате устройството, което ефективно превръща клиента във файлов сървър). - 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. изглед на all_objects на оракул
person Robert Lujo    schedule 02.04.2014

Опитвали ли сте безплатния инструмент SQLDeveloper на Oracle? Дава ви възможност за експортиране на DDL и данни.

person Rene    schedule 28.06.2010

EXPDP с опция CONTENT=METADATA_ONLY, след това IMPDP с SQLFILE=your_script.sql?

Никола.

person N. Gasparotto    schedule 28.06.2010