在不停止 Mysql 的情况下替换 MyISAM 文件

geo*_*org 3 mysql

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

Rol*_*DBA 5

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

  • 您正在替换 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/.
Run Code Online (Sandbox Code Playgroud)

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

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

mysql> ALTER TABLE proddb.proddata RENAME baitandswitch.proddata_old;
mysql> ALTER TABLE baitandswitch.proddata RENAME proddb.proddata;
Run Code Online (Sandbox Code Playgroud)

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

mysql> ALTER TABLE proddb.proddata RENAME baitandswitch.proddata_old; ALTER TABLE baitandswitch.proddata RENAME proddb.proddata;
Run Code Online (Sandbox Code Playgroud)

就是这样

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

玩得开心。

试一试 !!!

警告

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

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