【发布时间】: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