MySQL 遗留数据库的终极噩梦

2023-12-26

表格1: 一切包括厨房水槽。日期格式错误(去年,因此无法对该列进行排序)、存储为 VARCHAR 的数字、“街道”列中的完整地址、名字列中的名字和姓氏、姓氏列中的城市、不完整的地址、通过根据多年来更改的一组规则将数据从一个字段移动到另一个字段来更新前面的行,重复记录,不完整记录,垃圾记录......凡是你能想到的......哦,当然不是 TIMESTAMP 或 PRIMARY关键列就在眼前。

表2: 当这个婴儿被打开时,任何正常化的希望都破灭了。 我们为表一中的每个条目和行更新设置一行。因此,像没有明天这样的重复项(价值 800MB)和诸如 Phone1 Phone2 Phone3 Phone4 ... Phone15 之类的列(它们不称为电话。我用它来说明)外键是..我们猜一下。根据表 1 中的行中的数据类型,有 3 个候选者

表3: 还能变得更糟吗。哦是的。 “外键是短划线、点、数字和字母的 VARCHAR 列组合!如果它不能提供匹配项(通常不会),则类似产品代码的第二列应该提供。具有以下名称的列与其中的数据没有关联,并且必须使用 Phone1 Phone2 Phone3 Phone4...Phone15。有从 Table1 复制的列,但看不到 TIMESTAMP 或 PRIMARY KEY 列。

表 4:被描述为正在进行中的工作,随时可能发生变化。它本质上与其他类似。

在接近 100 万行时,这是一个很大的混乱。幸运的是,这不是我的大麻烦。不幸的是,我必须从中提取每个“客户”的合成记录。

最初,我设计了 Table1 的四步转换,添加主键并将所有日期转换为可排序格式。然后再进行几个查询步骤,返回过滤后的数据,直到我有了 Table1 ,我可以使用它从其他表中提取数据以形成组合。经过几周的工作,我使用一些技巧将其简化为一个步骤。所以现在我可以将我的应用程序指向混乱的地方并拉出一个漂亮干净的合成数据表。幸运的是,我只需要其中一个电话号码来实现我的目的,因此标准化我的桌子不是问题。

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

由于任何表中的现有行都可以更改,并且由于没有 TIMESTAMP ON UPDATE 列,因此我将不得不求助于日志来了解发生了什么。当然,这假设有二进制日志,但实际上不存在!

这个概念的推出就像铅气球一样坠落。我还不如告诉他们,他们的孩子将不得不接受实验性手术。它们并不完全是高科技......以防万一你没有聚集......

情况有点微妙,因为他们掌握了我公司急需的一些有价值的信息。一家大公司的高级管理层(你知道他们是怎样的)派我去“实现这一目标”。

我想不出任何其他方法来处理夜间更新,除了使用另一个应用程序解析 bin 日志文件,找出它们白天对该数据库做了什么,然后相应地组合我的表。我真的只需要查看他们的 table1 就可以知道如何处理我的桌子。其他表仅提供用于刷新记录的字段。 (使用 MASTER SLAVE 不会有帮助,因为我会得到混乱的副本。)

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

我写这篇文章是为了帮助弄清楚这个问题。经常告诉别人有助于澄清问题,使解决方案更加明显。这样的话我就更头疼了!

我们将不胜感激您的想法。


我不是 MySQL 专家,所以这是来自左领域。

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

值得庆幸的是,您实际上只需要从日志中了解两件事。

你需要记录/rowid,并且你需要操作。

在大多数数据库中,我假设 MySQL 中,每行都有一个隐式列,例如 rowid 或 recordid 等。它是数据库使用的内部行号。这是您的“免费”主键。

接下来,就需要进行手术了。特别是它是对行的插入、更新还是删除操作。

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

对于每次插入/更新,您从原始数据库中选择行,然后在目标数据库中插入/更新该行。如果是删除,则删除该行。

您不关心字段值,它们只是不重要。做整行。

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

这使您可以保持系统非常简单,并且它应该仅取决于您一天中的实际活动,而不是总数据库大小。最后,您可以稍后通过使其“更智能”来优化它。例如,也许他们插入一行,然后更新它,然后删除它。您会知道您可以在重播中完全忽略该行。

显然,这需要一些晦涩的知识才能真正读取日志文件,但其余的应该很简单。我想日志文件也带有时间戳,因此您可以知道要处理“从今天开始”的行,或者您想要的任何日期范围。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

MySQL 遗留数据库的终极噩梦 的相关文章

  • dayname(curdate()) 不适用于 codeigniter php

    此 sql 在 phpmyadmin 中有效 但在 codeigniter php 中无效 function getProgramsHomepage data array this gt db gt select p name p star
  • 在 Android 中获取联系方式需要花费大量时间?

    您好 目前正在做一个与联系人相关的项目 我正在从联系人中获取详细信息 电子邮件 电话号码和联系人姓名 效果很好 但问题是获取联系方式需要很长时间 超过 1000 个联系人 包括从社交网站同步的联系人 这样我就放了一个Asynchronous
  • 从 CSV 到 MySQL 的换行问题

    我正在将 csv 文件导入 MySQL 除了文件中的换行符之外 一切正常 我的 csv 行之一如下所示 42 E A R Classic Earplugs ear images ear classic jpg 5 Proven size s
  • 如何使用 SQL 对项目进行排序,然后按另一个条件再次排序

    我正在使用 MySQL 我想对记录进行排序 或者我想对记录进行分组 然后按另一个条件再次对其进行排序 例如我有 6 个项目 Names Group Jack G1 Dian G2 Emily G2 Dean G1 Teddy G2 Gabe
  • 连接所有 PostgreSQL 表并创建 Python 字典

    我需要加入allPostgreSQL 表并将它们转换为 Python 字典 数据库中有72张表 总列数大于1600 我编写了一个简单的 Python 脚本 该脚本连接多个表 但由于以下原因无法连接所有表内存错误 https gist git
  • MySQL 5:我的 GROUP BY 字段的顺序重要吗?

    Peeps 我的 MySQL 查询中有一些聚合 计算字段 我的 GROUP BY 子句是动态生成的 具体取决于用户在 Web 表单中选择的选项 很好奇 GROUP BY 子句中列出的字段顺序是否会对计算产生任何影响 例如 SUM AVERA
  • 错误代码:1062。重复条目“PRIMARY”

    因此 我的教授给了我表格将其插入数据库 但是当我执行他的代码时 MySQL 不断给出错误代码 1062 这是冲突表和插入 TABLES CREATE TABLE FABRICANTES COD FABRICANTE integer NOT
  • 为什么要为字符变化类型指定长度

    参考 Postgres 文档字符类型 http www postgresql org docs current static datatype character html 我不清楚指定字符变化 varchar 类型的长度 假设 字符串的长
  • MySQL InnoDB引擎是否对只读事务运行任何性能优化

    根据参考文档 只读事务标志可能会提示存储引擎运行一些优化 设置会话事务只读 如果事务访问模式设置为 READ ONLY 则对表进行更改 被禁止 这可能使存储引擎能够提高性能 不允许写入时可能进行的改进 InnoDB引擎是否对只读事务运行这样
  • 使用 Laravel 和 Eloquent 从表中选择全部

    我正在使用 Laravel 4 设置我的第一个模型 以从名为的表中提取所有行posts 在标准 MySQL 中我会使用 SELECT FROM posts 如何在 Laravel 4 模型中实现这一目标 我的完整模型源代码如下
  • MySQL - 查找接近的匹配项

    MySQL 有没有办法在文本字段中找到紧密匹配的内容 说找到 email protected cdn cgi l email protection当搜索时 email protected cdn cgi l email protection
  • 在 Python 中,如果我有 unix 时间戳,如何将其插入 MySQL 日期时间字段?

    我正在使用 Python MySQLDB 我想将其插入 Mysql 中的 DATETIME 字段 我该如何使用cursor execute 来做到这一点 要将 UNIX 时间戳转换为 Python 日期时间对象 请使用datetime fr
  • Mysql 将 --secure-file-priv 选项设置为 NULL

    我在 Ubuntu 中运行 MySQL 我在运行特定的查询集时收到此错误 MySQL 服务器正在使用 secure file priv 选项运行 因此无法执行此语句 当我这样做的时候SELECT secure file priv 在我的 m
  • 将自动递增值添加到只有一列的表中

    我需要创建一个基本上仅保留索引列表的表 因此 我创建了一个只有一个名为 id 的自动递增列的表 但是 我似乎无法隐式地将自动递增值添加到该表中 我知道通常当您在表中有这样一列 不仅仅是此列 时 您可以执行以下操作 插入表 col1 col2
  • java.lang.NoSuchMethodError:没有虚拟方法 setTag(Ljava/lang/Object;)

    我刚刚完成使用登录和注册屏幕与齐射的代码 但在模拟器中运行时我收到此错误 java lang NoSuchMethodError No virtual method setTag Ljava lang Object Lcom android
  • “create_date”时间戳字段的默认值无效

    我有以下 sql 创建语句 mysql gt CREATE TABLE IF NOT EXISTS erp je menus gt id INT 11 NOT NULL AUTO INCREMENT gt name VARCHAR 100
  • DataTables 第 2 页的分页未调用放大弹出窗口

    所以我有这个启用分页的数据表 我编码了一种方式 以便用户可以编辑表的行 当用户调用它在放大弹出窗口中打开的编辑页面时 它在第 1 页 从第 2 页起都运行良好 DataTable 及其前面停止调用 Magnific Popup 我只是不明白
  • Apache 子进程已退出,状态为 255

    经过大量的搜索 尝试 修复 等待和哭泣 在我放弃之前 我想为这个错误抓住最后的机会 我们正在奔跑Microsoft Windows Server 2012 Apache 2 4 6 Win64 OpenSSL 1 0 1e PHP 5 5
  • 无法加载身份验证插件“caching_sha2_password”

    我正在将 MySQL 8 0 与 MySQL Workbench 连接并收到以下错误 无法加载身份验证插件 caching sha2 password dlopen usr local mysql lib plugin caching sh
  • sql直接获取表行数的方法

    stackoverflow 的朋友们大家好 我的例行程序中有一个我认为不必要的步骤 假设您想从图库中获取所有图像 并限制每页一定数量的图像 db PDO object start pagenum x images per page limi

随机推荐

  • 如何在 EntityFramework 中计算行而不加载内容?

    我正在尝试确定如何count使用 EntityFramework 匹配表中的行 问题是每行可能有很多兆字节的数据 在二进制字段中 当然 SQL 会是这样的 SELECT COUNT FROM MyTable WHERE fkID 1 我可以
  • Laravel Backpack 中带有列的过滤表

    我有一个员工表 显示如下 id name code 1 Employee 1 A1 2 Employee 2 A2 我想在此表中按代码列创建一个过滤器 我的查询将是这样的 SELECT name FROM employee WHERE co
  • 需要检查和填充 sqlite 数据库管理和操作代码

    All 更新 根据谷歌结果和答案 我添加了更多提示 但仍未完成 在使用sqlite3和研究sqlalchemy的过程中 我发现有必要编写下面的代码来管理数据 但是 对我来说在sqlalchemy中做到这一点可能是一个困难的部分 然后我又回到
  • Gmail API OAuth2 错误:redirect_uri_mismatch

    我遵循了 Gmail API Python 快速入门教程 https developers google com gmail api quickstart python https developers google com gmail a
  • 在 Swift 3 中使用音频队列获取麦克风输入

    我正在开发一个应用程序 通过内置麦克风录制语音并将其实时发送到服务器 所以我需要在录音时从麦克风获取字节流 经过谷歌搜索和堆栈溢出相当长一段时间后 我想我弄清楚了它应该如何工作 但事实并非如此 我认为使用音频队列可能是可行的方法 这是我到目
  • 获取int的长度

    我正在尝试获取一个的长度 以十进制解释时的位数 int生锈了 我找到了一种方法来做到这一点 但是我正在寻找来自原语本身的方法 这就是我所拥有的 let num 90 to string println num num chars count
  • 获取选择 jquery ui 选项卡上的选项卡文本

    我正在使用 jquery ui 选项卡 我可以在 load ajax 事件中获取所选选项卡的索引 tabs tabs load function e ui if tabs tabs option selected 0 现在我想获取选项卡名称
  • JPA 坚持多对多

    我有一个非常标准的场景 其中我有一个以 user id 作为 PK 的用户表和一个以 role id 作为 PK 的角色表 这两个表通过多对多关系相关 即用户可以拥有多个角色 一个角色可以应用于多个用户 随后我有一个名为 users has
  • 如何将 grails 3 插件发布到我的本地 Nexus 存储库?

    Running grails publish plugin似乎没有做任何事情 我能找到的唯一文档是关于发布到 bintray 的 edit 我可以通过发布插件gradle publish 但想知道是否有一种 gr ails y 的方法可以做
  • (StaleElementException:Selenium) 我该如何处理这个问题?

    这是我第一次第一天研究 Selenium 而且我也没有深入的 Web 技术实践经验 解决办法是 当我尝试访问 DOM 上的特定对象时 我一直面临 StaleElementException 以下方法处理所有任务 private void e
  • 为什么我们为每个变量分配 12 个字节?

    在 Visual Studio 2010 Professional x86 Windows 7 中 more 00DC1362 B9 39 00 00 00 mov ecx 39h 00DC1367 B8 CC CC CC CC mov e
  • 是否可以在 Jupyter Notebook 中使用 SCOOP?

    有没有一种方法可以从 Jupyter 笔记本中运行 SCOOP 模块 我需要使用 SCOOP 构建数据集 然后使用 matplotlib seaborn 构建绘图 None
  • 如何根据缩放级别获取等于 Geozone 圆半径的像素数?或者区域圆到屏幕像素的半径?

    我正在谷歌地图上创建地理区域 默认Circle https developers google com android reference com google android gms maps model Circle滚动地图时地图 AP
  • 将 WinForm 保存为 PDF 并打印多页 WinForm [关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 如何将多页 WinForm 保存为 PDF 以及如何打印 谢谢 奥菲尔 一个好的框架是pdfSharp http www pdfsharp
  • Angular 2 教程,路由部分未处理的承诺拒绝

    我正在尝试遵循官方教程 一切都很顺利 直到路由部分here https angular io docs ts latest tutorial toh pt5 html 当我到达重新制作 app component ts 并更改 app mo
  • TFS Rest API 不适用于日志

    知道为什么这个方法不起作用 GET https instance DefaultCollection project apis build builds buildId logs api version 2 0 我能够获取构建定义等 但是当
  • 如何在 Visual Studio 中仅调试一个线程[重复]

    这个问题在这里已经有答案了 我希望在调试时能够仅跟踪一个线程的执行 我使用线程池 因此调试器不断在线程之间切换 这使得调试非常不舒服 Reading Visual Studio 调试多个线程之一 https stackoverflow co
  • 如何在 Coffeescript 中实现和谐?

    这是我运行 js 代码的方式 node harmony data app js 现在我想转向 CoffeeScript 所以我尝试这样运行它 coffee data app coffee 但它失败了 我怎样才能通过这个 harmony op
  • 小书签如何避免弹出窗口拦截器

    我编写了一个书签 用于在弹出窗口中使用谷歌翻译器快速翻译选定的文本 javascript function var text encodeURI document getSelection if text length text promp
  • MySQL 遗留数据库的终极噩梦

    表格1 一切包括厨房水槽 日期格式错误 去年 因此无法对该列进行排序 存储为 VARCHAR 的数字 街道 列中的完整地址 名字列中的名字和姓氏 姓氏列中的城市 不完整的地址 通过根据多年来更改的一组规则将数据从一个字段移动到另一个字段来更