1

我需要将数据从一个 Informix 数据库复制到另一个。我不想使用 LOAD 来执行此操作。有什么脚本可以帮助我解决这个问题吗?有没有其他方法可以做到这一点?

4

3 回答 3

2

如果没有关于您拥有的 Informix 数据库类型的更多信息,很难准确地说出最适合您的选择是什么。

如果是少量表和大量数据,请查看 onunload、onload 和/或 High Performance Loader。(我假设我们在这里不是在谈论标准引擎。)

另一方面,如果您有很多表格并且 HPL 太繁琐,请查看 myexport/myimport(可在 iiug.org 网站上获得)。这些是标准 dbexport/dbimport 实用程序的非锁定等效项。

于 2009-06-17T08:55:16.407 回答
2

最简单的解决方案是备份数据库实例并将其还原到单独的实例。如果这对您来说不可能,那么还有其他可能性。

  • dbexport/dbimport
  • 卸载/加载
  • 手工制作的 SQL 插入

如果数据库结构相同,那么您可以使用 dbexport/dbimport,但是这会将数据卸载到平面文件中,无论是在文件系统中还是在磁带上,然后从平面文件中导入。

我通常发现如果数据库结构相同,那么加载/卸载是最简单的解决方案。

如果您不想使用加载/卸载 dbimport/dbexport,那么您可以使用直接 SQL INSERTS,如下所示(未经测试,您需要检查语法)

INSERT INTO dbname2@informix_server2:table
SELECT * FROM dbnam1e@informix_server1:table_name

这当然意味着一致的表结构,如果结构不同,您可以使用列列表。

一个会引起问题的领域是参照完整性。如果您有外键,那么这会给您带来问题,因为您需要确保插入以正确的顺序完成。您可能还会遇到 SERIAL 列和 INSERTS 的问题。Load 不会遇到此问题,因为您可以将具有序列值的表加载到表中并保留原始值。

我经常发现最好的解决方案如下

  • 从 database1 中获取模式。
  • 将其分成两部分,初始部分是所有表创建语句,第二部分是所有 CREATE INDEX、引用完整性等语句。
  • 从模式的第一部分创建 database2。
  • 使用 UNLOAD/LOAD 将数据加载到 database2。
  • 将模式的第二部分应用于 database2

这与 dbimport 经历的过程非常相似,但从历史上看,我一直无法使用 dbimport,因为我的数据库包含另一个数据库的同义词,而 dbimport 确实/不适用于这些。

于 2009-06-17T08:56:14.517 回答
1

UNLOAD 和 LOAD 是最简单的方法。通过排除它们,您也排除了使用 DB-Load 和 DB-Access 以及 DB-Export 和 DB-Import。这些是最简单的方法。

如前所述,您可以考虑使用 HPL。

您还可以设置一个 ER 系统 - 它比 UNLOAD 后跟 LOAD 更难,但不使用禁止操作。

如果两台机器基本相同,可以考虑onunload和onload;我不会推荐它。

于 2009-06-17T16:35:02.350 回答