无需停止 Mysql 即可替换 MyISAM 文件

无需停止 Mysql 即可替换 MyISAM 文件

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

答案1

为了回答这个问题,我们假设

  • 您正在替换 proddb 数据库中名为 proddata 的表
  • 你在 /root 中有 proddata.frm、proddata.MYD、proddata.MYI

这是一个“诱饵转换”的方法

步骤 01)mysql> CREATE DATABASE baitandswitch;

这将创建文件夹/var/lib/mysql/baitandswitch

步骤 02)将新版本的proddata表放入数据库,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/.

警告:不要担心 mysql。它将检测baitandswitch数据库中新表的存在并动态更新 information_schema。

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

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

我建议您在同一行运行这两个命令:

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

就是这样

  • 无锁定
  • 无需冲洗
  • 无数据损坏
  • 不停止数据库服务器

玩得开心。

试一试 !!!

警告

步骤 03 使用 SQL 执行交换,因为它会协商何时可以安全地移动表。因此,如果有任何查询针对它运行,SQL 的执行将等待所有查询停止后再执行表的移动。

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

答案2

LOCK TABLES bla;
FLUSH TABLES bla;

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

FLUSH TABLES bla;
UNLOCK TABLES bla;

(感谢 Jeff 提供锁定表)

答案3

不要。相反,将它们加载到另一个 mysql 副本中,并使用 mysqldump 获取转储。然后将其加载到正在运行的 mysql 中。

相关内容