replaceMyISAM文件而不停止Mysql

我在mysql目录中有一堆MyISAM文件(MYD,MYI,FRM),而在另一个目录中有更新的版本。 如何在不停止mysql服务器的情况下用“较新”replace“旧”?

对于我的答案,让我们假设

  • 您正在replaceproddb数据库中名为proddata的表
  • 你有proddata.frm,proddata.MYD,proddata.MYI in / root

这是一个诱饵和转换的方法

步骤01) mysql> CREATE DATABASE baitandswitch;

这应该创build文件夹/var/lib/mysql/baitandswitch

步骤02)将baitandswitch表的新版本放入baitandswitch数据库中,如下所示:

 $ cp /root/proddata.frm /var/lib/mysql/baitandswitch/. $ cp /root/proddata.MYD /var/lib/mysql/baitandswitch/. $ cp /root/proddata.MYI /var/lib/mysql/baitandswitch/. 

CAVEAT:不要担心mysql。 它将检测baitandswitch数据库中新表的存在,并且baitandswitch更新information_schema。

步骤03)在proddb数据库和baitandswitch数据库之间执行proddb表的交换

 mysql> ALTER TABLE proddb.proddata RENAME baitandswitch.proddata_old; mysql> ALTER TABLE baitandswitch.proddata RENAME proddb.proddata; 

我build议你在同一行上运行这两个命令:

 mysql> ALTER TABLE proddb.proddata RENAME baitandswitch.proddata_old; ALTER TABLE baitandswitch.proddata RENAME proddb.proddata; 

而已

  • 没有locking
  • 没有冲洗
  • 没有数据损坏
  • 不停止数据库服务器

玩得开心。

试一试 !!!

警告

步骤03使用SQL来执行交换,因为它将在移动表的安全时进行协商。 因此,如果有任何查询正在运行,那么在执行表移动之前,SQL的执行将等待所有查询停止。

这种方法的另外一个好处是旧表格在baitandswitch数据库中仍然baitandswitch 。 您可以在操作系统中创build表的副本,运行SQL,或者直接删除baitandswitch数据库以删除所有需要切换的表。

 LOCK TABLES bla; FLUSH TABLES bla; 

在操作系统级别上交换文件。

 FLUSH TABLES bla; UNLOCK TABLES bla; 

(把信贷给杰夫的锁表)

别。 相反,将它们加载到另一个mysql副本,并使用mysqldump获得转储。 然后加载到运行的MySQL。