【问题标题】:How to run a big update on a live database?如何在实时数据库上运行大更新?
【发布时间】:2011-05-22 02:33:20
【问题描述】:

我正在编写的一个 Web 项目使用复杂的 CSV 到 MySQL 转换器来创建他们的数据库。这意味着要使用来自 CSV 的最新更改来更新数据库内容,运行一个转换器来截断相关表格(但留下通过网站填充的其他表格)并用来自 CSV 的数据再次填充它们。

是的,这不是一个很好的过程,但是有充分的理由选择这种方法而不是标准的“处理实际数据库”方法。

我正在努力寻找运行此更新过程的最佳方法,而不会过多地损害用户体验。需要记住的几个数字:

1) 此过程必须定期运行,范围为每几周/每月一次
2) db 转换器目前大约需要一个小时,未来可能需要长达 15 小时,至少如果关于数据库增长的预测是正确的(是的,哎哟!)
3) 完整数据库的 sql 转储目前小于 20MB(允许通过 phpmyadmin 轻松导入),但很快就会打破这个障碍。我想这应该不是问题,因为我可以使用 SSH 上传来代替。

以下是我想到的一些替代方案,它们都使用具有全局设置的单独数据库(这些设置在站点上的每次读/写时都会检查)。备选方案 2 似乎是最糟糕的,因为它阻止了整个转换期间的读取访问,正如我所说的那样,这可能会很长。所有这些都在大约相同的时间内阻止写访问,但这很好,但它不会阻止用户注册或类似的任何重要内容。我很好奇第三种选择的可行性,因为它理论上可以缩短读取功能的停机时间,因为我不必上传大转储。

有人做过这样的事吗?如果有更好的选择,或者有任何关于如何改进这些以及是否选择 1 或 3 的反馈,我将不胜感激。在此先感谢 :)

Alternative 1
1) Set globalsettings_booleans_writeable to 0
2) Download current DB (SQL dump)
3) Import downloaded DB locally
4) Run converter (in update mode) on local database
5) Export local DB
6) Set globalsettings_booleans_readable to 0
7) Import exported DB online
8) Set globalsettings_booleans_readable to 1
9) Set globalsettings_booleans_writeable to 1

Alternative 2
1) Set globalsettings_booleans_writeable to 0
2) Set globalsettings_booleans_readable to 0
3) Run converter (in update mode) on live database
4) Set globalsettings_booleans_readable to 1
5) Set globalsettings_booleans_writeable to 1

Alternative 3
1) Set globalsettings_booleans_writeable to 0
2) Create a remote copy of the database
3) Run converter (in update mode) on remote copy
4) Set globalsettings_booleans_readable to 0
5) Replace remote original with remote copy (easy?)
6) Set globalsettings_booleans_readable to 1
7) Set globalsettings_booleans_writeable to 1

【问题讨论】:

  • 对当前数据库做了哪些变换?是数据本身发生了变化还是结构发生了变化?

标签: mysql database scalability


【解决方案1】:

在我看来,通过检查 CSV 以查看哪些记录实际上会导致数据库更改,可以避免很多排他性。看起来 CSV 生成器是数据的实际来源,而数据库只是它的镜像,对吗?

如果是这样,可以忽略导致没有变化的 CSV 记录,不截断 d/b 表,并且可以使用备选方案 2 运行剩余的 CSV 记录,这大概只需要几分钟。

这种方法的主要缺点是,如果记录在源头被删除,并且没有迹象表明 d/b 需要在本地删除它们。

【讨论】:

  • 只是为了确保没有误解:没有 CSV 生成器。 CSV 是手动创建/更新的,然后通过 Java 工具转换为数据库。所以源是转换器安装到数据库中的 CSV。无论如何,您绝对正确地建议最好的方法是通过仅更改必要的内容而不是截断和创建来使转换器更快。不幸的是,这几乎是不可能的(是的,像你说的那样在 CSV 中删除,以及其他问题),如果不是,那么做起来非常复杂,而且很容易出错。所以我宁愿不走那条路。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-27
  • 1970-01-01
  • 2011-03-10
  • 1970-01-01
相关资源
最近更新 更多