【问题标题】:Linux diff and patch command line utilities for MySQL data (not structure)MySQL 数据的 Linux diff 和 patch 命令行实用程序(不是结构)
【发布时间】:2010-12-09 02:28:50
【问题描述】:

我有两个 MySQL 数据库,我想编写一个脚本来比较和更新它们之间的数据变化。

有人知道用于在 MySQL 数据库中区分或修补数据的 Linux 命令行工具吗?

【问题讨论】:

    标签: mysql linux command-line diff


    【解决方案1】:

    蛮力之道:转储两个数据库并区分转储...? ;-)

    -- “如果你的问题没有通过蛮力解决,那么你没有施加足够的力量。”

    (我对此并不(完全)认真......)

    【讨论】:

    • eeeeeeeeeeeek。这听起来很有趣。
    • 好吧,我想知道是否有人已经应用了蛮力并编写了一个实用程序来做到这一点。
    【解决方案2】:

    差异

    正如 DevSolar 所建议的,获取差异的简单方法是仔细转储两个数据库(每个表有一个输出文件,在每个文件中,表中的每条记录一个逻辑行),然后应用令人钦佩,可靠和可敬的diff 程序为每个表的文件。但是,这种“小心”可能是工作中的扳手——您需要确保每个数据文件都按排序顺序(不仅仅是物理顺序)转储,这样如果记录出现在两者中,它就会出现在文件中的相同位置。如果数据没有那么有序,你会得到很多虚假的差异。

    在您这样做之前,您需要比较两个架构 - 因为架构中的许多差异会自动使两个同名表中的每一行都具有不同的每一行。例如,如果数据库 DB1 中的 TableA 有 10 列,而 Db2 中的 TableA 有 11 列,则转储数据中的每一行都会不同。

    您还需要担心其他一些可能不同的列 - 特别是自动分配的 ID 号,以及“上次更新时间”或“创建时间”值。主键中的自动 ID 号通常会强烈影响连接到 PK 的表中的数据顺序 - 您必须考虑是否有解决此问题的好方法。这将部分取决于数据库的历史;它们曾经是一个被复制、修改并正在重新组合的通用数据库吗?如果是这样,那么问题可能比它们是具有相同架构但从未与其中存储的数据有任何共同祖先的两个数据库相比问题更少。

    您可能会发现最好的办法是创建视图,使视图反映的数据结构对于两个数据库都是相同的(即使视图定义因架构不同而不同)。然后,您可以比较转储这些视图的结果。小心操作,这可以减轻或最小化由于自动分配的 ID 号造成的差异。

    补丁

    假设您设法获得了可比较的数据,现在您需要同步少量的差异。有修补工具来完成这项工作吗?

    答案很可能是你不想听到的——不。

    一个问题是您必须决定操作所需的结果是什么。是两个数据库的联合,还是交集,还是什么?您要修改哪个数据库 - 第一个或第二个,或两者兼而有之?

    从一个数据库中删除并出现在另一个数据库中的行可以从另一个数据库中删除或插入到另一个数据库中。插入的行是删除行的镜像,需要类似的处理。这很容易......

    如果“同一行”根据某些标准出现在两个数据库中,但字段(列)存在差异,那么您要做的工作就更棘手了。您必须决定应该在您当前正在修改的数据库中更改哪些不同的列。标准的 Unix 工具(例如 diff)是为基于行的差异而设计的。在这一点上,我可能会进入 Perl(但 Python 或其他脚本语言会很好),获取表的差异记录以及表名和列列表(以便可以关联数据中的字段与数据库中的列),然后安排它生成适当的语句。类型可能是一个因素 - 您的 UPDATE 语句可能需要引用字符串而不是引用数字以进行更新。您还需要知道主键,以便识别要更新的行。输出将是一组合适的 UPDATE 语句,它将表的第一个版本转变为第二个版本。

    【讨论】:

    • 正如我所说,我对转储差异的事情并不认真。但是,当我们这样做时,如果您通过sort 管道转储,您将获得排序后的输出。 ;-)(IIRC,MySQL 转储采用 SQL 语法,即您仍将在一个块中拥有一张表中的所有条目。)在我伤害自己之前,我现在将放弃这个想法。 :-D
    • 这种“转储”格式有很多优点,尽管它与您从我大部分时间使用的 DBMS 中获得的非常不同。一个简单的“排序”命令的问题是输出格式是否严格地是每行一行 - 或者任何字符字段是否可以包含换行符。对多行拆分的记录进行排序是灾难的保证。同样,这将取决于 DBMS 使用的数据格式和约定。
    • 另外,FWIW,您的基本想法 - 尝试从 DBMS 外部找到两个数据库之间的差异 - 在很大程度上是合理的。试图用纯 SQL 来做这件事简直就是地狱。此外,在适当的上下文中,可能会使用 Unix 的“准关系”命令(pastesortjoincut)。
    猜你喜欢
    • 2011-09-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-03
    • 1970-01-01
    • 2012-06-09
    • 2012-09-20
    • 1970-01-01
    相关资源
    最近更新 更多