我对Oracle来说是全新的,我正在尝试迁移一个现有的VM,它在每个版本上都运行部署脚本,而不是使用一个docker容器。然后,我可以运行发布脚本并为每个版本标记一个新容器(用于集成测试)。
不幸的是,不管我尝试了什么(exp、expdp、根据数据交换生成ddl、datagrip生成ddl、toad中的expdp ),都不可能在没有大量包错误或键约束错误的情况下将远程数据库完全复制到XE数据库中。
我遗漏了什么?
以下是我迄今所做的工作:
expdp user/pass@XE directory=dp_dir FULL=YES dumpfile=8_17.dmp logfile=8_17.log network_link=XE_BUILD content=ALL TRANSPORT_FULL_CHECK=YES
这将创建一个看起来应该有效的转储文件。
然后我就这么做了,impdp importer/importer@XE directory=dp_dir full=Y dumpfile=8_17.dmp logfile=imp_full.log
这也是以相对较少的错误完成的。但是,在使用远程数据库时,我经常会遇到关键的约束错误和损坏的包。
我试过重建所有的包裹和类似的东西,但还是没有运气。
发布于 2019-08-20 00:13:02
子表可能在某个时间点导出,比如12:00。然后,随着expdp的继续,父表可能在几分钟后导出,比方说在12:05。转储文件包含来自不同时间点的这些表的内容。
是的,如果这些表在这5分钟内发生了更改,它们之间的关系可能会变得不一致,您将得到关键的约束错误。子表可能对不存在的父项具有引用。
这就是为什么您应该将flashback_scn、flashback_time或consistent=y参数用于expdp。有了它们,所有的东西都会被导出,因为它们存在于一个特定的SCN或时间点。不使用这些参数是一个非常常见的错误。
那就去拿包裹。不,甚至没有一个FULL=Y费用出口所有的东西。大多数SYS对象都没有导出。
假设您的包使用SYS.DBMS_LOCK包。默认情况下,用户无法使用该包,因为他们需要在该包上授予EXECUTE特权。由于包没有导出,所以不会被导入。由于不会导入DBMS_LOCK,因此也不会导入对其授予的特权。因此,对于这个特定的包,您需要手动授予所需的权限。
这只是一个例子。然后是SYS.DBMS_CRYPTO和其他人。
“破碎的包裹”部分太宽泛,无法在此回答。您是访问包和代码的人,是能够检查错误的人。
https://dba.stackexchange.com/questions/245613
复制相似问题