Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MySQL遗留数据库的终极噩梦_Mysql_Database_Refactoring_Binary Log - Fatal编程技术网

MySQL遗留数据库的终极噩梦

MySQL遗留数据库的终极噩梦,mysql,database,refactoring,binary-log,Mysql,Database,Refactoring,Binary Log,表1: 所有的东西,包括厨房的水槽。日期格式错误(去年,因此您无法对该列进行排序)、存储为VARCHAR的数字、“street”列中的完整地址、firstname列中的firstname和lastname、lastname列中的city、地址不完整,通过将数据从一个字段移动到另一个字段来更新前一行的行,这些行基于一组多年来已更改的规则、重复记录、不完整记录、垃圾记录。。。你说得对。。。哦,当然,我们看不到时间戳或主键列 表2: 把这个婴儿打开后,一切正常化的希望都破灭了。 表1中的每个条目和行的

表1: 所有的东西,包括厨房的水槽。日期格式错误(去年,因此您无法对该列进行排序)、存储为VARCHAR的数字、“street”列中的完整地址、firstname列中的firstname和lastname、lastname列中的city、地址不完整,通过将数据从一个字段移动到另一个字段来更新前一行的行,这些行基于一组多年来已更改的规则、重复记录、不完整记录、垃圾记录。。。你说得对。。。哦,当然,我们看不到时间戳或主键列

表2: 把这个婴儿打开后,一切正常化的希望都破灭了。 表1中的每个条目和行的更新都有一行。因此,重复出现了“没有明天”(价值800MB)和“Phone1 Phone2 Phone3 Phone4”等列。。。Phone15(它们不是电话。我用这个来说明)外键是。。我们猜猜看。根据表1行中的数据类型,有三种候选数据

表3: 还会更糟吗。哦,是的。 “外键是由破折号、点、数字和字母组成的VARCHAR列组合!如果不提供匹配项(通常不提供匹配项)然后,应显示第二列类似的产品代码。名称与其中的数据不相关的列,以及必需的Phone1 Phone2 Phone3 Phone4…Phone15。表1中有重复的列,但看不到时间戳或主键列

表4:被描述为一部进展中的作品,随时可能发生变化。它本质上与其他作品相似

在接近100万行的地方,这是一个大混乱。幸运的是,这不是我的大混乱。不幸的是,我不得不为每个“客户”拿出一份合成记录

最初,我设计了一个表1的四步翻译,添加一个主键,并将所有日期转换为可排序的格式。然后,我又设计了两步查询,返回过滤后的数据,直到我有了表1,我可以使用它从其他表中提取,以形成合成。经过几周的工作,我使用一些tr将这一步骤简化为一步icks。所以现在我可以把我的应用程序指向混乱的地方,拿出一个干净的合成数据表。幸运的是,我只需要其中一个电话号码就可以了,所以规范化我的表不是问题

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

由于任何表中的现有行都可以更改,而且更新列上没有时间戳,因此我必须借助日志来了解发生了什么。当然,这假设存在二进制日志,而实际上没有

引入这个概念就像铅气球一样失败了。我还不如告诉他们,他们的孩子将要接受实验性手术。他们并不是高科技……如果你没有收集到

情况有点微妙,因为他们有一些我的公司急需的有价值的信息。我被一家大公司的高级管理人员(你知道他们是怎么做的)派去“让它发生”

除了使用另一个应用程序解析bin日志文件,我想不出任何其他方法来处理夜间更新,以确定他们在白天对该数据库做了什么,然后相应地合成我的表。我只需要查看他们的表1,以确定对我的表做了什么。其他表只提供字段刷新记录。(使用主从机不会有帮助,因为我会有一个混乱的副本。)

另一种方法是为他们的表1的每一行创建一个唯一的哈希表,并构建一个哈希表。然后,我每天晚上都会检查整个数据库,看看哈希是否匹配。如果他们不匹配,那么我会读取该记录,并检查它是否存在于我的数据库中,如果存在,那么我会在我的数据库中更新它,如果不匹配,那么它就存在一个新的记录,我会插入它。这是丑陋的,不快,但解析一个二进制日志文件也不好看

我写这篇文章是为了帮助你弄清楚这个问题。经常把它告诉别人有助于澄清这个问题,使解决方案更加明显。在这种情况下,我只是有一个更大的头痛


您的想法将不胜感激。

您能否使用访问此数据库的现有代码并使其适应您的需要?当然,代码一定很糟糕,但它可能会为您处理数据库结构,不是吗?您可以集中精力完成工作,而不是扮演考古学家。

您可以使用maatkit的mk表格同步工具来同步临时数据库(毕竟,您的数据库非常小)。这将“复制混乱”

然后,您可以编写一些东西,在同步之后,执行各种查询以生成一组更合理的表,然后您可以报告这些表

我认为这可以每天进行,而不会出现性能问题

在不同的服务器上完成这一切将避免影响原始数据库


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

我不是MySQL用户,所以这是从左字段出来的

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

谢天谢地,你真的只需要从日志中知道两件事

您需要记录/rowid,并且需要操作

在大多数数据库中,我假设MySQL,每一行上都有一个隐式列,比如rowid或recordid,或者其他什么。它是数据库使用的内部行号。这是您的“free”主键

接下来,您需要该操作。尤其是该行上的插入、更新或删除操作

您可以按时间顺序整合所有这些信息,然后对其进行浏览

对于每个插入/更新,您可以