我们已经使用Percona OSC一段时间了,在不锁定表的情况下更改我们的 mysql 模式并且效果很好,通常在几个内向“大型”innodb 表(约 380 万行)添加新列或索引小时。
然而,我尝试的最后一次更新在运行 7 小时后仅完成了 40%(一夜之间,在我们最安静的时期),估计还需要 11 小时才能完成(不断增加)。RedHat 服务器上所有 4GB 的可用内存都被使用了 - 32GB,我们最近从 16GB 升级。
那么这里发生了什么?为什么花费的时间会突然跳得这么高?我们是不是刚刚达到了某种percona/mysql/服务器无法应对的阈值?我们可以调整任何配置以提高性能吗?
该表有 32 列和 12 个索引(包括主键和 2 个其他唯一索引)。我知道这很多,但正如我所说,直到最近它表现还不错。
该表还有几个指向它的外键,我们设置为使用 drop_swap 方法进行更新。
我使用的完整命令是:
pt-online-schema-change --execute --ask-pass --set-vars innodb_lock_wait_timeout=50 --alter-foreign-keys-method=drop_swap
--alter "ADD is_current TINYINT(1) DEFAULT '1' NOT NULL" u=admin,p=XXXXXXX,D=xxxxx_live,t=applicant
innodb_buffer_pool_size 当前设置为 2147483648 - 应该增加吗?如果是这样,多少?Web 服务器(apache/php/symfony)也在这个盒子上运行。
我对这个特定表所做的最后一次更改是将 1 个字段的排序规则更改为 utf8_bin(其他字段是 utf8_unicode_ci)——这会有所不同吗?