如何将数据从 SQL 服务器传输到 Informix,反之亦然

How to transfer data from SQL Server to Informix and vice versa

我想将 tables 数据从 SQL server 传输到 Informix,反之亦然。

转移应该 运行 安排,有时在用户执行特定操作时。

我通过 delete and insert transactions 执行此操作,并且在 15 minute to 30 minute 之间需要很长时间通过网络。

考虑到performance,如何简单的完成这个操作?


说我有

Vacation table in SQL Server 并希望将所有更新的数据传输到 Vacation table in Informix.

Permission table in Informix 并希望将所有更新的数据传输到 SQL 服务器中的 Permission table。


一些想法:

  1. was_transferred 列添加到源 tables 并将其默认值设置为 0(您可以使用 0/1 而不是 false/true).

  2. 来源 table select 数据 was_transferred=0.

  3. 传输数据更新select源行后,将其was_transferred设置为1

  4. 使用 date_startdate_stop 等字段制作 table syncro_info。如果你发现有date_stop IS NULL的记录,说明你正在传输数据。这将保护您避免同步数据两次。

免责声明: 我不是 SQL 服务器 DBA。但是,我已经担任 Informix DBA 十多年了,可以就其性能提出一些建议。

撇开免责声明不谈,听起来您已经有了一个功能性的应用程序,但性能很差,这正是您主要寻求建议的地方。

了解一些技术信息会有所帮助,但如果没有这些信息,我将对您的环境和应用程序做出以下假设。如果我对这些有任何错误,请评论或编辑您的问题。

  1. 数据库服务器版本。从标签看来,您使用的是 SQL server 2012。但是,我无法确定 Informix 服务器和版本。我假设您 运行 至少 IDS 11.50 或更高。
  2. 当前如何交换数据。您是否直接从 .NET 应用程序连接到 Informix?我假设 SQL 服务器就是这种情况,并且也会对您的 Informix 连接做出相同的假设。
  3. Table 结构。我假设您在 table 上有适当的索引。在 Informix 方面,dbschema -d *dbname* -t *tablename* 将给出基本模式。

如果您还没有尝试将数据导出到 CSV,并且只要您这样做没有任何合规性问题,我建议您从逗号分隔的文件中加载数据。 (Informix 通常处理管道分隔的文件,因此您需要将 SQL 服务器端的分隔符调整为管道 | 或 Informix 导入端的分隔符)。在 Informix 端,这将是

LOAD FROM 'source_file_from_sql_server' DELIMITER '|' INSERT INTO vacation (field1, field2, ..)

为了可重用性,我建议将其放在存储过程中。只需将该加载语句包装在 BEGIN WORK;COMMIT WORK; 中即可保持事务完整性。 Michał Niklas 建议了一些跟踪更改的方法。如果在 Informix 中将数据传输到休假 table 与在 SQL 服务器中返回权限 table 之间存在任何关联,我会提出另一个选项,即添加触发器到vacation table 这样您就可以将所有新值写入暂存 table.

使用存储过程中的导入逻辑,您可以按需触发导入:

EXECUTE PROCEDURE vacation_import();

您还提到需要安排导入,这可以通过 Informix 的“dbcron". Using this feature, you'll create a scheduled task that executes vacation_import() periodically as well. If you haven't used this feature before, using OAT 来完成,这会有所帮助。您还需要对 CSV 文件进行一些整理。这可以通过 system() 调用来解决,您可以从 Informix 中的存储过程进行调用。