我在mysql目录中有一堆MyISAM文件(MYD,MYI,FRM),而在另一个目录中有更新的版本。 如何在不停止mysql服务器的情况下用“较新”replace“旧”?
对于我的答案,让我们假设
这是一个诱饵和转换的方法
步骤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;
而已
玩得开心。
试一试 !!!
警告
步骤03使用SQL来执行交换,因为它将在移动表的安全时进行协商。 因此,如果有任何查询正在运行,那么在执行表移动之前,SQL的执行将等待所有查询停止。
这种方法的另外一个好处是旧表格在baitandswitch数据库中仍然baitandswitch 。 您可以在操作系统中创build表的副本,运行SQL,或者直接删除baitandswitch数据库以删除所有需要切换的表。
LOCK TABLES bla; FLUSH TABLES bla;
在操作系统级别上交换文件。
FLUSH TABLES bla; UNLOCK TABLES bla;
(把信贷给杰夫的锁表)
别。 相反,将它们加载到另一个mysql副本,并使用mysqldump获得转储。 然后加载到运行的MySQL。