我正在尝试按照this的建议回答将列添加到现有表中,行数约为150k。这是在我的MacBook Pro的本地主机上运行。以下是我在MySQL命令行中使用source
命令运行的脚本:
# Create a temporary new table.
CREATE TABLE psf_new LIKE psf;
ALTER TABLE psf_new ADD COLUMN filter varchar(25) AFTER filename;
ALTER TABLE psf_new ADD COLUMN aperture varchar(50) AFTER filter;
# Add some of the indexes we'll need in the future.
CREATE INDEX filename_index ON psf_new (filename);
CREATE INDEX filter_index ON psf_new (filter);
CREATE INDEX aperture_index ON psf_new (aperture);
CREATE INDEX psf_x_center_index ON psf_new (psf_x_center);
CREATE INDEX psf_y_center_index ON psf_new (psf_y_center);
# Copy over the existing data from the old table.
INSERT INTO psf_new (
id,
filename,
psf_x_center,
psf_y_center,
model_x_center,
model_y_center,
psf_flux, sky,
psf,
model_fraction) SELECT * FROM psf;
# Rename and drop.
RENAME TABLE psf_new TO psf, psf TO psf_old;
DROP TABLE psf_old;
一切似乎都工作正常,直到它到达INSERT
语句然后才停止。我知道这是一个昂贵的操作(我在尝试之前采用的数据库转储是500M)。但我没有看到来自MySQL进程或deamon的任何CPU活动,有足够的可用内存和最小的IO活动(我从OSX活动监视器获得所有这些)。
当我用CTRL-C中止查询并检查一些东西时,我可以看到我的新表已被创建,但它没有数据。我用SELECT count(id) FROM psf_new;
执行此操作。当我尝试在psf
表上运行相同的命令时,我得到一小段CPU和IO然后没有任何反应,除非我再次按CTRL-C,否则不会返回CLI提示符。
更新
所以,令人尴尬的是,解决方案是重启我的机器。事情似乎正如预期的那样发挥作用。如果任何人都可以提供有关可能发生的事情的任何见解,可能需要回滚的陈旧事务,这将是值得赞赏的。