我帮助运行一个非常大的ecomm网站,因为我们遇到了由于数据大小而向InnoDB表添加字段的问题。
它甚至不是"那"大...看着大约385,000行,500mb大小 - 但现在当我们添加一个新字段时,整个表锁定并且我已经让它保持运行只要我敢,但是一旦它被锁定它就会阻止查询现场。它还导致"元数据锁定"关于其他问题。
它运行在体面的服务器上,主机说它只是其中一个'就像它做什么(MYSQL)一样。
所以我的想法是用数小时来创建一个包含字段更改的新表,然后重新导入数据,但我并不是很满意它作为解决方案因为它意味着我们无法做到如有需要,可在白天进行任何紧急开发工作。
有没有人对如何解决这个问题有任何想法?
谢谢。
修改
感谢目前为止的回答,回答一些问题;
1)" Dev在现场工作?" - 我们有一个开发环境,但迟早你需要把这些变化付诸实践!这就是我的意思。
2)"复制MYSQL的工作原理?" - 从谷歌的其他搜索,有人建议一个很好的解决方案是创建一个空表,对你需要的字段进行更改,然后重新导入旧数据(然后删除旧表)。不确定这是否比通过创建tmp表让MYSQL更快更好/更好?
3)@Uueerdo - 它是一个非常基本的设置,带有键的InnoDB表。它的表格包含所有已完成的客户购物车详细信息(我们有一个正在进行的订单的浮动表)并且不断访问(添加了新记录,客户服务检查订单,客户检查跟踪等)。我需要在这个表中添加4-5个新字段,当我提交' ALTER'它只是锁定表,因此开始排队上面提到的需要这些数据的查询。
答案 0 :(得分:2)
在开始更改大表之前,您需要将网站切换到维护模式。 您需要在更改执行期间关闭可以查询数据库的所有内容。
是的,可悲的是有服务了,但只要你有一个数据库服务器最好的方法。
关于创建单独的表并自行迁移数据 - 我不知道您的详细信息,但看起来您正在进行MySQL自身内部工作,因此通常不需要您自己执行此类操作。 / p>
此外,在启动ALTER执行后,您可以打开另一个MySQL连接并运行SHOW FULL PROCESSLIST
以查看查询的执行情况。