如何实时将 Dbase 数据库复制到 MYSQL?

How do you replicate a Dbase database to MYSQL in real time?

我有一个庞大的 dBase 数据库 (Visual FoxPro vfp)。我需要将它实时复制到 Mysql 数据库。

为了提供帮助,我制作了一个 c# 服务,通过在每个 Mysql table 然后从每个 dBase DB table 再次插入所有内容。但是,这很难称为复制,而且对于较大的 dBase tables.

,它的性能极差

我无法直接使用VFP 文件修改程序。我只能访问数据库文件本身。

我怎样才能以有效的方式实时或接近实时地完成上述任务?

实际上 VFP *.DBC 数据库容器支持触发器。在 Vfp IDE 中,您可以使用 Modify Database 命令,然后在数据库设计器或

中交互操作
 CREATE TRIGGER ON myTable FOR DELETE|INSERT|UPDATE AS myTrigger()

在命令中 Window。 另见 create a trigger for update, delete or insert in FoxPro TableCreate FoxPro Trigger

[编辑] 在触发器的 Stored Procedure 代码中,您可以使用 FoxPro SQL 直通 SPT 代码,即 VfP 的 SQL*() 函数,如 SQL(String)Connect()SQLExec()Remote ViewsCursorAdapters 将向您的 MySQL 服务器发送(参数化)SQL 语句。

示例:

LOCAL lcConnString
IF m.llSuccess
    lcConnString = ;
        [DRIVER=MySQL ODBC 5.1 Driver;] + ;
        [USER=] + m.lcUser + [;] + ;
        [PASSWORD=] + m.lcPwd + [;] + ;
        [DATABASE=Test;] + ;
        [SERVER=] + m.lcServer+ [;] + ;
        [OPTION=3;]
ENDIF

PUBLIC h
IF m.llSuccess
    h = SQLSTRINGCONNECT(m.lcConnstring)
    llSuccess = ( h > 0 )
    lcErrorMessage = "Connection failed."
ENDIF

Local lnPk, lnValue, lcSQL, lnSuccess, laSQLErrors[1]
IF m.llSuccess
    lnPk = 15887
    lnValue = 15
    lcSQL = "Insert Into test (primaryKey, testInt) Values (?m.lnPk, ?m.lnValue)"
    lnSuccess = SqlExec(h,m.lcSQL)
    llSuccess = ( m.lnSuccess > 0 )

    IF m.lnSuccess < 1
        AERROR(laSQLErrors)
        lcErrorMessage = ;
            TRANSFORM(laSQLErrors[1]) + ", " + ;
            TRANSFORM(laSQLErrors[2])
    ENDIF
ENDIF

IF h > 0
    SQLDISCONNECT(h)
ENDIF

至于商业 CData 3rd 方工具,他们提供了一个 xBase/dBase 驱动程序 https://www.cdata.com/drivers/xbase/ 以及我还没有尝试过的“通用数据管道”复制工具: https://www.cdata.com/sync/ , https://www.cdata.com/sync/#purchase

很久以前,我使用以下方法做了类似的事情:我创建了触发器来记录到 table 所操作记录的 ID。然后我将定期例程设置为每隔几分钟 运行,读取日志并将实际记录值发送到云中的 Postgres 目标数据库。

首先,检查DBC中的tables是否有一些方法来唯一标识每条记录,你可以尝试在这些tables上创建触发器,捕获每次它们被更改(添加、更新或删除记录)并将该记录的标识(可能是 table 的主键的值)记录到 LOG table。此日志 table 可能是这样的:

SYNC_LOG.DBF 字段: table(字符) 键(Char 或 Int 或系统使用的其他内容) 操作(字符)“插入”或“更新”或“删除” 已处理的布尔值(假或真)

因此,每次插入、更新或删除同一 table 中的记录时,触发器都会将操作记录到 SYNC_LOG.DBF,将“已处理”字段设置为 FALSE。

如果该记录的日志已经存在并且尚未处理,则触发器不需要创建新日志。定义此规则可确保日志文件不会无限期地变大。

这是第一部分。第二个是创建一个例程,该例程将定期检查 de 日志文件并发送命令以更新 de-destination 数据库。

所有这些都可以在 VFP 中 100% 轻松完成,但我不知道你对狐狸的了解。