使用pt-online-schema-change工具时,是否可以保留原始表的索引?

时间:2013-12-10 06:11:55

标签: mysql database-migration percona

避免必须进行预热"新表是旧的索引吗?

1 个答案:

答案 0 :(得分:1)

是的,所有索引都包含在新表的定义中。

这很容易测试:

mysql> create table test.sometable 
  ( x int primary key, y int, z int, unique key (y), key (z,y));

然后尝试使用pt-online-schema-change更改表:

$ pt-online-schema-change D=test,t=sometable --alter "ENGINE=InnoDB" --execute

现在检查表以确保它仍然具有以它开头的索引:

mysql> SHOW CREATE TABLE test.sometable\G

但是,您的问题提到“热身”,这是一个通常与缓冲池中的表格中的页面相关联的短语。当ALTER对页面进行更改时,它们必须在到磁盘的路上位于缓冲池中。因此,在ALTER结束时,缓冲池中确实有很多页面。

您可以使用MySQL 5.5和5.6中存在的InnoDB指标的新INFORMATION_SCHEMA表对此进行测试:

mysql> SELECT TABLE_NAME, SPACE, COUNT(*) AS num_pages
  FROM INFORMATION_SCHEMA.INNODB_BUFFER_PAGE_LRU
  WHERE TABLE_NAME = '`mydatabase`.`mytable`'
  GROUP BY TABLE_NAME, SPACE;
-- Result shows a lot of pages loaded

mysql> ALTER TABLE mydatabase.mytable ENGINE=INNODB; -- dummy table restucture

mysql> SELECT TABLE_NAME, SPACE, COUNT(*) AS num_pages
  FROM INFORMATION_SCHEMA.INNODB_BUFFER_PAGE_LRU
  WHERE TABLE_NAME = '`mydatabase`.`mytable`'
  GROUP BY TABLE_NAME, SPACE;
-- Result shows a lot of pages still loaded, but the space id has changed

但是在表大于缓冲池容量的情况下,最终会得到一个页面子集,并且无法保证该子集是否适合该表的预热缓冲池。

使用pt-online-schema-change时会发生同样的事情。表空间id发生了变化,但是在alter。

之后缓冲池中有很多页面