最终的MySQL原有数据库的噩梦(The ultimate MySQL legacy databas

2019-07-28 23:04发布

表1:一切,包括厨房水槽。 在错误的日期格式(前年所以你不能对列进行排序),存储为VARCHAR号,在“街道”列完整的地址,名字和姓氏的名字列,城市的名字列,不完整的地址,行即更新由移动数据从一个领域到另一个基于某些设定的已改变多年来的规则,重复的记录,记录不全,垃圾记录......你的名字......哦,当然不是一个TIMESTAMP或PRIMARY前述行在望键列。

表2:标准化的希望在开裂这个宝贝开出去的窗口。 我们在表中的行的每个条目和更新的行。 所以重复像没有明天(800MB价值)和列像电话1电话2电话3 PHONE4 ... Phone15(他们不叫手机。我用这个图示)的foriegn关键是..好拿的猜测。 有三个候选取决于什么样的数据是在表1的行

表3:它可以变得更糟。 哦,是的。 在“外键是虚线,点,数字和字母的VARCHAR列的组合!如果不提供匹配(这通常不会),那么类似的产品代码,第二列是有承担的名称应。列NO相关性在其中的数据,以及强制性电话1电话2电话3 PHONE4 ...... Phone15。还有,并在视线时间戳或PRIMARY KEY列从表1重复的列没有。

表4:被描述为陆侃和议题的工作在任何时刻改变。 这是essentailly simlar别人。

在近1点的行,这是一个很大的混乱。 幸运的是,这不是我的大混乱。 不幸我不得不退出它的组合大记录每个“客户”。

起初我设计的表1添加主键和所有的日期转换成可排序格式的四步翻译。 然后,直到我有表1的地方,我可以用它来从其他表拉来形成组合大传回过滤数据查询的几个步骤。 工作周后,我得到这个下来使用一些技巧一步。 所以,现在我可以在乱点我的应用程序,并拉出合成数据的一个干净的桌子。 幸运的是,我只需要在电话号码中的一个,我的目的所以我正常化表是不是一个问题。

然而,这是真正的任务开始的地方,在方式,因为每天都有数百名员工的添加/更新/删除这个数据库,你不想想象每天晚上我必须检索新行。

因为在任何表中现有的行可以被改变,因为没有TIMESTAMP ON UPDATE专栏中,我将不得不诉诸日志就知道发生了什么事。 当然,这个假设有一个二进制日志,其中有没有!

提出这一概念去了像灌了铅的气球。 我不妨告诉他们,他们的孩子将不得不接受手术治疗实验。 他们是不完全高科技......如果你还没有收集到...

这种情况有点微妙,因为他们有我的公司要严重一些有价值的信息。 我已经发下来的大型企业(你知道他们是如何)的高级管理人员,以“做到这一点。”

我想不出任何其他方式来处理夜间更新,比另一个应用程序解析的bin日志文件,以找出他们白天做相应到数据库,然后复合我的表。 我真的只需要看看他们的表1弄清楚怎么做我的桌前。 其它表只是提供栏刷新了纪录。 (使用主从不会帮助,因为我将有乱七八糟的副本。)

另一种方法是创建一个独特的哈希表1的的每一行,并建立一个哈希表。 然后,我会每天晚上都要经过整个数据库检查,看是否hashs匹配。 如果他们不这样做,那么我会阅读记录,并检查它是否存在在我的数据库,如果它不那么我会在我的数据库更新它,如果它不那么它的一个新的记录,我会插入。 这是丑陋的,而不是快,而是解析二进制日志文件是不漂亮无论是。

我写了这个,以帮助明确的问题。 往往告诉别人帮助澄清制作解决方案更明显的问题。 在这种情况下,我只是有一个更大的头痛!

您的想法将不胜感激。

Answer 1:

日志文件(二进制日志)是我第一个想到了。 如果你知道他们是如何做的事情,你会不寒而栗。 对于每一行有日志中很多很多条目的追加和变更。 它只是巨大的! 现在我在哈希方法解决。 一些聪明的文件内存分页,这是相当快的。



Answer 2:

我不是一个MySQL的人,所以这是走出左外野。

但我认为,日志文件可能是答案。

值得庆幸的是,你真的只需要知道从日志两件事情。

你需要记录/ ROWID,和你需要的操作。

在大多数DB的,我认为MySQL的,有一个隐含的列的各行的,就像一个rowid或recordId所,或什么的。 这是由数据库使用的内部行数。 这是你的“自由”的主键。

接下来,你需要的操作。 值得注意的是无论是插入,更新,或行删除操作。

您将所有的这些信息,按时间顺序,然后通过它运行。

对于每个插入/更新,您可以选择从您的原始数据库的行,插入/更新该行的目标DB。 如果它是一个删除,然后删除该行。

你不关心的字段值,他们只是并不重要。 做全行。

你希望不应该“解析”二进制日志文件中,MySQL已经必须有程序要做到这一点,你只需要找到并弄清楚如何使用它们(甚至有可能是一些方便的“转储日志”实用工具,您可以使用)。

这可以让你保持系统非常简单,它应该只在白天取决于你的实际活动,而不是总的数据库大小。 最后,你可以稍后使其“更聪明”优化它。 比如,也许他们插入一行,然后更新它,然后将其删除。 你会知道你可以不理会该行完全在你的重播。

显然,这需要一点神秘的知识,以便实际读取日志文件,但其余的应该很容易。 我想认为,日志文件的时间戳为好,这样你就可以知道“今天”的行工作,或任何你想要的日期范围。



Answer 3:

你不能使用现有的代码,访问该数据库,并使其适应您的需求? 当然,代码必须是可怕的,但它可能会处理数据库的结构你,不是吗? 你可能希望集中精力完成工作,而不是扮演考古学家则。



Answer 4:

您可能能够使用maatkit的MK-表同步工具来同步一个临时数据库(你的数据库仅仅是非常小的,毕竟)。 这将“复制烂摊子”

然后,你可以写的东西,同步后,确实各种查询,生成一套更健全的表,然后就可以创建报表的。

我想,这可能每天都在做没有性能问题。

做这一切掀起了不同的服务器将避免影响原始数据库。

我能看到的唯一的问题是,如果一些表没有主键。



文章来源: The ultimate MySQL legacy database nightmare