我在 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 中。