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

Posted

技术标签:

【中文标题】如何将 Dbase 数据库实时复制到 MYSQL?【英文标题】:How do you replicate a Dbase database to MYSQL in real time? 【发布时间】:2022-01-16 00:39:17 【问题描述】:

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

为了提供帮助,我创建了一个 c# 服务,通过在每个 Mysql 表中进行完全删除,然后从每个 dBase DB 表中重新插入所有内容,将整个信息从 dBase 转储到 Mysql。但是,这几乎不能称为复制,而且对于较大的 dBase 表,它的性能极差。

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

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

【问题讨论】:

有几种方法,但你必须做一些设置 -- 复制from MySQL的主要方法包括:复制; LVM;云服务。如果您还没有为其中任何一个做好准备,那么您可能不走运。 (我不了解 dBase。) 一种实时复制可以通过修改 FoxPro 数据库容器文件 (*.dbc/.dct) 来完成,方法是在其中添加删除/插入/更新触发器,而无需“修改程序”即 vfp .EXE 文件。另见cdata.com/drivers/xbase @RickJames 来自 MySQL 我可以找到很多信息,只是 dBase 是超级黑暗的东西。 @StefanWuebbe 据我所知,vfp 的 db 没有触发器,哈哈,cdata 看起来很棒,但看到他们甚至没有在他们的网站中包含定价,我很倾向于认为这并不便宜,我投资同步一个非常旧的类型的数据库它会更便宜,只是获得一个完全新技术的新软件哈哈 我在答案中添加了一些链接 【参考方案1】:

实际上 VFP *.DBC 数据库容器确实支持触发器。在 Vfp IDE 中,您可以使用 Modify Database 命令,然后在 Database Designer 中进行交互操作或

 CREATE TRIGGER ON myTable FOR DELETE|INSERT|UPDATE AS myTrigger()

在命令窗口中。 另见create a trigger for update, delete or insert in FoxPro Table 和Create FoxPro Trigger

[编辑] 在触发器的Stored Procedure 代码中,您可以使用 FoxPro SQL Pass-Through SPT 代码,即 VfP 的 SQL*() 函数,例如 SQL(String)Connect()SQLExec()Remote ViewsCursorAdapters,它们会将(参数化的)SQL 语句发送到你的 MySQL 服务器。

例子:

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

【讨论】:

哦,我明白了!遗憾的是,cdata 解决方案超出了我们目标的预算。向 dbc 添加触发器我只能自己修改 dbf 表:( 我添加了一个 VFP-MySQL-connection 代码示例 接受它作为答案,因为您甚至包含了连接到 MySQL 的代码。谢谢! @Hikaros,不客气【参考方案2】:

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

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

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

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

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

这是第一部分。第二种是创建一个例程,定期检查 de log 文件并发送命令更新目标数据库。

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

【讨论】:

以上是关于如何将 Dbase 数据库实时复制到 MYSQL?的主要内容,如果未能解决你的问题,请参考以下文章

如何将 MySQL 表从 PhpMyAdmin 复制到不同系统中的 MySQL Workbench?

如何优雅的将数据从sqlite3迁移到mysql

MySQL 不开启slave如何完成异地复制

20160916-3:mysql主从复制

MYSQL主从复制

如何将 Mysql 实时同步到 Bigquery?