Mysql 无法更改pt online架构更改中的列和索引

Mysql 无法更改pt online架构更改中的列和索引,mysql,database-schema,alter,percona,Mysql,Database Schema,Alter,Percona,我试图同时改变一列和表上的几个索引。为此,我使用了pt-online-schema-change,这样就可以在线进行更改,但我得到了一个错误: 更改新表“db”时出错。“test”表“new”:DBD::mysql::db do失败:表中不存在键列“foo”[对于语句“ALTER table`db`.`“test”表“new”表“ADD INDEX test”表“composite”idx(foo,bar)、DROP INDEX test表“foo”idx、DROP INDEX test表“ba

我试图同时改变一列和表上的几个索引。为此,我使用了
pt-online-schema-change
,这样就可以在线进行更改,但我得到了一个错误:

更改新表“db”时出错。“test”表“new”:DBD::mysql::db do失败:表中不存在键列“foo”[对于语句“ALTER table`db`.`“test”表“new”表“ADD INDEX test”表“composite”idx(foo,bar)、DROP INDEX test表“foo”idx、DROP INDEX test表“bar”idx、CHANGE列“foo foo”VARCHAR(127)NOT NULL;]at/usr/bin/pt在线模式更改行9040

该表的创建如下所示:

CREATE TABLE `test_table` (
    `id` bigint(20) unsigned NOT NULL,
    `foo` varchar(127) DEFAULT NULL,
    `bar` varchar(32) CHARACTER SET ascii DEFAULT NULL,
    KEY `test_table_id_idx` (`id`),
    KEY `test_table_foo_idx` (`foo`, `id`),
    KEY `test_table_bar_idx` (`bar`, `id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
本质上,我正在尝试以下几点:

ADD INDEX test_table_composite_idx (foo, bar)
DROP INDEX test_table_foo_idx,
DROP INDEX test_table_bar_idx,
CHANGE COLUMN foo foo2 TEXT;
我可以分别执行索引更改和列更改(但是我需要复制所有数据两次,我更愿意只执行一次),但是如果我将这两个操作相加,就会出现错误。感觉好像我错过了一些明显的东西;有什么想法吗?

试试看:

ALTER TABLE test_table
  DROP INDEX test_table_foo_idx
  DROP INDEX test_table_bar_idx
  CHANGE COLUMN foo foo2 VARCHAR(127)
  MODIFY COLUMN foo2 TEXT
  ADD INDEX test_table_composite_idx (foo2, bar)

我看到您正在尝试对同一查询中名称设置为修改的列应用新索引。因此,请将其替换为:

ADD INDEX test_table_composite_idx (foo, bar)
为此:

ADD INDEX test_table_composite_idx (foo2, bar)

现在,关于尝试单独的步骤:首先更改列名,然后应用
addindex test\u table\u composite\u idx(foo,bar)
。你收到了什么?一个错误

现在,颠倒步骤。发生了什么事?正如你已经说过的,它是有效的


祝你好运。

也许我遗漏了什么-但是你为什么不以常规方式重命名该列(不更改pt online模式)?@PaulSpiegel我实际上也在尝试对该列进行更改:我想要不同的类型。但我能够将问题简化为重命名。我想,复制所需的较小数据集。percona toolkit的原因是我希望所有事情都能在线进行,并且能够限制费率。仍然不确定这是否有帮助。。但请看下面的例子。由于MySQL 5.6,重命名列不需要“表重建”。True,但我确实需要表重建来更改列上的数据类型。目前我的具体问题是
altertable
语法在pt-online模式更改中似乎不起作用,因为一个困难的要求是能够控制流程的资源,并且我们没有cgroup。我将更新我的措辞以更好地反映这一点。有趣的是,我没想到会看到最终结果,但这是有意义的。谢谢