8

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

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

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

提前致谢

詹姆士!

4

4 回答 4

4

就像是

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

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

不要忘记赠款。

于 2010-06-28T09:49:37.870 回答
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以增量模式刷新db模式:

  • runs sql with last_ddl_time>=max(last_ddl_time from last refresh)
  • at the end stores last_ddl_time somewhere in filesystem for next refresh

References:

  1. oracle dbms_metadata.GET_DDL function
  2. oracle all_objects view
于 2014-04-02T23:31:03.283 回答
2

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

于 2010-06-28T07:25:41.347 回答
2

EXPDP 带有 CONTENT=METADATA_ONLY 选项,然后是 IMPDP 带有 SQLFILE=your_script.sql ?

尼古拉斯。

于 2010-06-28T07:35:37.923 回答