如何将 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 Views
或 CursorAdapters
,它们会将(参数化的)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?的主要内容,如果未能解决你的问题,请参考以下文章