我有两个MySQL数据库,我想编写一个脚本来比较和更新它们之间的数据变化。
有没有人知道用于在MySQL数据库中区分或修补数据的Linux命令行工具?
答案 0 :(得分:2)
蛮力的方式:转储两个数据库并区分转储......? ; - )
- “如果蛮力没有解决你的问题,你就没有施加足够的力量。”
(我对此并不完全认真......)
答案 1 :(得分:1)
正如DevSolar建议的那样,获得差异的简单方法是仔细转储两个数据库(每个表有一个输出文件,每个文件中,表中每个记录一个逻辑行),并应用对每个表的文件提供令人钦佩,可靠且值得尊敬的diff
程序。但是,“谨慎”可能是工作中的扳手 - 您需要确保每个数据文件以排序顺序(而不仅仅是物理顺序)转储,这样如果两个记录同时出现,它将出现在文件中的相同位置。如果数据不是那么有序,你会得到很多虚假的差异。
甚至在你这样做之前,你需要比较两个模式 - 因为模式中的许多差异将自动使两个具有相同名称的表中的每一行都具有不同的行。例如,如果数据库DB1中的TableA有10列,但Db2中的TableA有11列,则转储数据中的每一行都不同。
您还需要担心其他一些可能不同的列 - 特别是自动分配的ID号,以及“上次更新时间”或“创建时间”值。主键中的自动ID号通常会强烈影响加入PK的表中的数据顺序 - 您必须考虑是否有好的方法。这将部分取决于数据库的历史;他们曾经是一个共同的数据库,被复制,修改,现在正在重新组合?如果是这样,问题可能比它们是两个具有相同模式但从未对其中存储的数据具有任何共同祖先的数据库有更少的问题。
您可能会发现,最好的办法是创建视图,使视图反映的数据结构对于两个数据库都相同(即使视图定义因模式不同而不相同)。然后,您可以比较转储这些视图的结果。仔细完成,这可以减轻或最小化由于自动分配的ID号而产生的差异。
让我们假装您设法获得可比较的数据,您现在需要同步适度数量的差异。是否有补丁工具来完成这项工作?
答案很可能是你不想听到的答案 - 不。
一个问题是您必须确定操作所需的结果。它是两个数据库的联合,还是交集,还是什么?您要修改哪个数据库 - 第一个或第二个,或两者兼而有之?
从一个出现在另一个数据库中的数据库中删除的行可以从另一个数据库中删除,也可以插入到另一个数据库中。插入的行是删除行的镜像,需要类似的处理。这很容易......
如果某个标准在两个数据库中出现“同一行”,但字段(列)存在差异,那么您需要完成一项棘手的工作。您必须决定在当前正在修改的数据库中应更改哪些不同的列。标准的Unix工具(例如diff
)是为基于行的差异而设计的。此时,我可能会进入Perl(但Python或其他脚本语言会很好),获取表的差异记录以及表名和列列表(以便数据中的字段可以关联)用数据库中的列),然后安排它生成相应的语句。类型可能是一个因素 - 您的UPDATE语句可能需要引用字符串而不引用更新的数字。您还需要知道主键,以便识别要更新的行。输出将是一组合适的UPDATE语句,可以将表的第一个版本变形为第二个版本。