重命名表需要多长时间

Kat*_*ina 12 mysql alter-table

重命名大小为 219 GB 的表需要多长时间?

这是我们服务器的规格:

  • 内存:65 GB
  • 可用磁盘空间:266 GB

MySQL Ver 14.12 分发版 5.0.77

对困惑感到抱歉。我们的计划是重命名一个大小为 219 GB 的 MySQL 表。需要花多长时间?我们需要为这次迁移准备大磁盘空间吗?

表的引擎:InnoDB.

Mic*_*bot 16

在 MySQL 中重命名表不需要临时表。

有两个语句执行等效操作。

RENAME TABLE t1 TO t2;
ALTER TABLE t1 RENAME TO t2; # as long as no other options to ALTER are also specified
Run Code Online (Sandbox Code Playgroud)

重命名表会获得表上的元数据锁,这要求没有针对该表运行的语句,没有事务具有行锁,并且没有事务持有该表的任何 MVCC 版本的一致快照。

任何一种RENAME操作都将尝试获取元数据锁,随后启动的影响表的语句将阻塞,等待挂起的元数据锁。

如果您在没有任何其他选项的情况下使用 ALTER TABLE tbl_name RENAME TO new_tbl_name,MySQL 只会重命名与表 tbl_name 对应的任何文件,而不进行复制。

http://dev.mysql.com/doc/refman/5.0/en/alter-table.html

请注意,这是 5.0 文档的链接,5.1、5.5、5.6 和 5.7 都有相同的信息。

您可以看到的主要延迟将来自其他会话阻止RENAME启动,因为不能立即需要锁。

如果您能够执行一条FLUSH TABLES table_name;语句并让它在几秒钟内返回,那么这应该作为重命名操作将在相似的时间内完成的确认,因为它需要相同的锁才能删除查询与表相关的缓存,关闭表,并清理一些内部结构,如表共享对象……该表会被下一个访问它的语句自动重新打开……所以它给你一个很好的测试期望并且首先运行将是一个好主意,因为它通常会通过为重命名留下更少的工作来使实际的重命名操作稍微短一些。

SHOW FULL PROCESSLIST;在等待FLUSH完成时(如果有延迟)会让您了解可能妨碍重命名操作的事情,KILL如果需要,您可以安全地刷新。

  • 我认为这是讽刺,如果 0.10 秒是一个问题,这已经足够公平了,但重点当然不是关于实际重命名,这非常快,而是其他事情,例如打开的事务、其他锁、超大查询缓存和正在进行的查询可以大大延长它,并同时中断应用程序......刷新是一个很好的测试。如果刷新很快,重命名应该很快。否则,禁用 sync_frm 是我今天听到的最糟糕的想法,但话说回来,现在还为时过早。 (2认同)

Ray*_*and 3

MySQL文档请参阅http://dev.mysql.com/doc/refman/5.6/en/rename-table.html关于SQL

RENAME table a TO b
Run Code Online (Sandbox Code Playgroud)

看起来更糟糕,那么准确地说是因为

当您执行 RENAME 时,您不能有任何锁定的表或活动事务。您还必须拥有对原始表的 ALTER 和 DROP 权限,以及对新表的 CREATE 和 INSERT 权限。

如果你读到这篇文章,看起来MySQL需要创建一个新表b,将数据从表a复制到表b(插入)并删除表a。

我分析了MySQL 5.0.77 SQL命令背后的源代码

RENAME table a TO b
Run Code Online (Sandbox Code Playgroud)

它看起来几乎是即时操作,因为只有

  1. .frm(表定义文件)
  2. .trg(触发文件)

文件需要被触摸(重命名),不需要表之间的实际数据复制。这让我想知道为什么你应该需要此命令的 INSERT 权限。