任何将整个Oracle DB导出为SQL脚本的工具

时间:2010-06-28 06:54:21

标签: oracle export liquibase baseline

这是我的问题,我想在我们的开发Dateabase(Oracle 10g)上创建一个基线,并检查我们的svn进行版本控制,然后我们将使用liquibase帮助我们管理增量数据库更改。

我的问题是我应该如何创建Oracle 10g的基线?数据库现在包含500多个表,包含大量配置数据,我希望我的数据库基线基于设置的SQL脚本来检查subversion,而不是检查Oracle转储..

我已经尝试使用liquibase generateChangeLog,但它有一些性能问题..任何人都可以推荐我任何可以帮助我的工具 1.扫描任何Oracle架构 2.生成一组SQL脚本(使用表结构和数据)..

提前致谢

詹姆斯!

4 个答案:

答案 0 :(得分:4)

这样的东西
SELECT DBMS_METADATA.GET_DDL('TABLE',table_name) FROM USER_TABLES;

是一个好的开始。您可以使用PL / SQL和UTL_FILE对其进行调整,以使其将每个表写入不同的文件。你可能也需要做序列(虽然版本化它们是毫无意义的),也许是触发器/程序/函数/包等。

不要忘记补助金。

答案 1 :(得分:3)

更通用的解决方案是为选定的表列表转储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脚本,它基于类似的sql在 incremental 模式下刷新db模式:

  • 使用last_ddl_time> = max运行sql(从上次刷新开始的last_ddl_time)
  • 最后在文件系统中的某个地方存储last_ddl_time以进行下一次刷新

参考文献:

  1. oracle dbms_metadata.GET_DDL功能
  2. oracle all_objects查看

答案 2 :(得分:2)

您是否尝试过Oracle免费SQL Developer工具?它使您可以导出DDL和数据。

答案 3 :(得分:2)

EXPDP with CONTENT = METADATA_ONLY选项,IMPDP with SQLFILE = your_script.sql?

尼古拉斯。