我们的客户正在从一个数据库版本升级到另一个数据库版本(Oracle 9i到Oracle 10g或11g是特定的)。在一种情况下,客户导出旧数据库并将其导入新数据库,但由于某种原因,未创建索引和约束。他们可能是故意这样做的,以加快进口过程,但我们仍在调查原因。
真正的问题是,有一种简单的方法可以在导入后验证数据库的结构是否完整?我们可以在结构上做某种校验和吗?我们意识到我们可以做一堆查询来查看是否存在所有表,索引,别名,视图,序列等,但这可能很难编写和维护。
感谢您建议使用商业和/或GUI工具的答案,但我们真的需要一些免费的东西,我们可以用我们的产品打包。它还必须是命令行或脚本驱动,以便我们的客户可以在任何环境(unix,linux,windows)中运行它。
答案 0 :(得分:3)
假设一个模式,就像这样 - 在迁移之前将USER_OBJECTS转储到表中。
CREATE TABLE SAVED_USER_OBJECTS AS SELECT * FROM USER_OBJECTS
然后在迁移后进行验证
SELECT object_type, object_name FROM SAVED_USER_OBJECTS
MINUS
SELECT object_type, object_name FROM USER_OBJECTS
一个问题是,如果您故意在版本之间删除对象,则还需要从SAVED_USER_OBJECTS中删除它们。如果存在错误版本的对象,这也不会发生。
如果您有多个模式,那么每个模式都需要相同的东西,或者使用ALL_OBJECTS并提取/比较相关的用户模式。
你也可以在object_type || object_name上为整个模式做一个哈希/校验和(保存在/之后比较)但是计算的成本与比较索引上的两个表没有什么不同。
答案 1 :(得分:1)
如果您愿意花一些钱,DBDiff是一个高效的实用工具,可以满足您的需求。
答案 2 :(得分:1)
答案 3 :(得分:0)
我不会编写检查脚本,我会编写一个程序来从特定版本的数据库生成检查脚本。只需查看元数据并记录其中的内容并将其写入文件,然后将该文件中的值与客户数据库中的值进行比较。如果您为约束使用系统生成的名称,这将无法正常工作,但它可能足以验证存在的东西。在迁移数据库时,删除索引和约束是很常见的,因此您甚至可能不需要检查太多;如果缺少两三件事,那么假设他们都是不合理的并不是不合理的。您可能还希望编写一个删除所有约束和索引并重新创建它们的脚本,并让您的客户将其作为迁移后步骤运行。请确保按名称删除所有内容,这样就不会删除客户可能创建的任何自定义索引。