【发布时间】:2016-05-04 02:44:36
【问题描述】:
我需要将数据从一个 Informix 数据库复制到另一个。我不想使用 LOAD 来执行此操作。有什么脚本可以帮助我解决这个问题吗?有没有其他方法可以做到这一点?
【问题讨论】:
-
鉴于 LOAD(和 UNLOAD)是显而易见的答案,但您拒绝它,您应该解释为什么 LOAD 不适合您。
标签: database scripting informix
我需要将数据从一个 Informix 数据库复制到另一个。我不想使用 LOAD 来执行此操作。有什么脚本可以帮助我解决这个问题吗?有没有其他方法可以做到这一点?
【问题讨论】:
标签: database scripting informix
如果没有关于您拥有的 Informix 数据库类型的更多信息,很难准确地说出最适合您的选择。
如果是少量表和大量数据,请查看 onunload、onload 和/或高性能加载程序。 (我假设我们在这里讨论的不是标准引擎。)
另一方面,如果您有很多表格并且 HPL 过于繁琐,请查看 myexport/myimport(可在 iiug.org 网站上获得)。这些是标准 dbexport/dbimport 实用程序的非锁定等效项。
【讨论】:
最简单的解决方案是备份数据库实例并将其还原到单独的实例。如果您无法做到这一点,那么还有其他可能性。
如果数据库结构相同,则可以使用 dbexport/dbimport,但这会将数据卸载到平面文件中,无论是在文件系统中还是在磁带上,然后从平面文件中导入。
我通常发现如果数据库结构相同,那么加载/卸载是最简单的解决方案。
如果您不想使用加载/卸载 dbimport/dbexport,那么您可以使用直接 SQL INSERTS,如下所示(未经测试,您需要检查语法)
INSERT INTO dbname2@informix_server2:table
SELECT * FROM dbnam1e@informix_server1:table_name
这当然意味着表结构一致,如果结构不同,您可以使用列列表。
会导致您出现问题的一个方面是参照完整性。如果您有外键,那么这会给您带来问题,因为您需要确保插入以正确的顺序完成。您可能还会遇到 SERIAL 列和 INSERTS 的问题。加载不会遇到这个问题,因为您可以将序列值加载到表中并保留原始值。
我经常发现最好的解决方案如下
这与 dbimport 所经历的过程非常相似,但从历史上看,我一直无法使用 dbimport,因为我的数据库包含另一个数据库的同义词,而 dbimport 可以/不使用这些。
【讨论】:
UNLOAD 和 LOAD 是最简单的方法。通过排除它们,您也排除了使用 DB-Load 和 DB-Access 以及 DB-Export 和 DB-Import。这些是最简单的方法。
如前所述,您可以考虑使用 HPL。
您还可以设置一个 ER 系统 - 它比 UNLOAD 后跟 LOAD 更难,但不使用禁止操作。
如果两台机器基本相同,可以考虑onunload和onload;我不会推荐它。
【讨论】: