Mark Renouf Asked: 2009-06-19 11:37:19 +0800 CST2009-06-19 11:37:19 +0800 CST 2009-06-19 11:37:19 +0800 CST 将 MySQL 数据库迁移到新系统同时最大限度地减少停机时间的最快方法是什么? 772 我想尽量减少停机时间(在“切换”期间)。 我们在 EC2 上运行 EBS 卷上的数据。在数据库卷运行时对其进行快照并使用它来恢复新卷是否安全,或者我是否需要先关闭旧数据库? migration mysql amazon-ec2 database 4 个回答 Voted Dan Carley 2009-06-19T11:48:53+08:002009-06-19T11:48:53+08:00 我会建议: 在短暂处于读取锁定状态时拍摄快照FLUSH TABLES WITH READ LOCK;。 将该数据集放在您的辅助机器上并检查一致性。 设置从旧机器到新机器的复制。 然后在您的切换点: 在旧机器上关闭面向客户端的 IP(你有一个单独的,对吧?)。 FLUSH LOGS;旧机器上的问题。 确保新机器同步。落后 0 秒。 停止旧机器并根据新机器的位置仔细检查最后一个 binlog 大小。 STOP SLAVE; RESET MASTER;新机器上的问题。 在新机器上调出面向客户端的 IP 并进行 arping 以确保客户端看到它。 还有一些更详细的信息,例如您是否是重度 InnoDB 用户。但那是一般的要点。 Shazburg 2009-06-19T12:24:04+08:002009-06-19T12:24:04+08:00 为什么不将第二个 MYSQL 服务器设置为从属服务器,复制,然后将从属服务器重新配置为主服务器? Bruno Bronosky 2009-06-20T22:34:02+08:002009-06-20T22:34:02+08:00 Dan C 在金钱上是对的,但我想更具体地了解第 3 步 为了速度和避免灾难,请在 CLI mysql 客户端中执行所有操作,如下所示: sudo mysql -e "FLUSH TABLES; FLUSH TABLES WITH READ LOCK; SYSTEM ec2-create-snapshot vol-4d826724; UNLOCK TABLES;" 我依赖以下几点: 如果长时间运行 UPDATE、DELETE 或 INSERT 命令,获取读锁可能需要一些时间。我发出一个预备FLUSH TABLES以尽量减少任何表被锁定的时间。 mysql 客户端可以使用SYSTEM命令将命令传递给主机操作系统,并以运行 mysql 客户端的用户身份执行此操作。(这就是我使用 sudo 的原因) 当您说您在 EC2 上使用 ESB(我从未使用过)时,我为您查找了此文档。您必须查找为“vol-XXXXXXXX”添加的内容 让您的生活更轻松一些,并在 ~root/.my.cnf 中输入密码 我看到这个描述模棱两可,或者在互联网上公然错误!文档明确指出:“如果客户端连接断开,服务器会释放客户端持有的表锁。 ”。因此,您无法打开 mysql 客户端、刷新+锁定、退出客户端、制作快照、打开 mysql 客户端、解锁表。您最终会得到一个不一致的快照。 一些特别敏锐的读者会正确地识别出“UNLOCK TABLES”是不必要的,因为无论如何客户端连接最终都会关闭。我把它放在那里是因为它让人们更舒服。 我为您引用了 6 个来源。我希望你现在有信心做这件事。让我们知道您是否还有不确定性。 brian-brazil 2009-06-19T11:49:48+08:002009-06-19T11:49:48+08:00 首先确保启用了二进制日志。在全局读锁 ( ) 下获取 mysql 目录的文件系统级快照(例如 LVM 或类似文件FLUSH TABLES WITH READ LOCK)。使用此快照设置新服务器,并配置复制到旧系统(您可以通过查看快照中最新 binlog 的大小来确定 binlog 名称和位置( master_log_file/ ))。master_log_pos 当您准备好移动时,停止read_only=true旧服务器上的所有写入(,终止所有连接)并等待新服务器赶上复制。然后使新服务器可写并关闭旧服务器。 根据针对您的数据库运行的查询类型,您可能会有几秒钟的停机时间。然而,这取决于您的写入查询是确定性的,以便新旧服务器具有完全相同的数据。
我会建议:
FLUSH TABLES WITH READ LOCK;
。然后在您的切换点:
FLUSH LOGS;
旧机器上的问题。STOP SLAVE; RESET MASTER;
新机器上的问题。还有一些更详细的信息,例如您是否是重度 InnoDB 用户。但那是一般的要点。
为什么不将第二个 MYSQL 服务器设置为从属服务器,复制,然后将从属服务器重新配置为主服务器?
Dan C 在金钱上是对的,但我想更具体地了解第 3 步
为了速度和避免灾难,请在 CLI mysql 客户端中执行所有操作,如下所示:
我依赖以下几点:
我看到这个描述模棱两可,或者在互联网上公然错误!文档明确指出:“如果客户端连接断开,服务器会释放客户端持有的表锁。 ”。因此,您无法打开 mysql 客户端、刷新+锁定、退出客户端、制作快照、打开 mysql 客户端、解锁表。您最终会得到一个不一致的快照。
一些特别敏锐的读者会正确地识别出“UNLOCK TABLES”是不必要的,因为无论如何客户端连接最终都会关闭。我把它放在那里是因为它让人们更舒服。
我为您引用了 6 个来源。我希望你现在有信心做这件事。让我们知道您是否还有不确定性。
首先确保启用了二进制日志。在全局读锁 ( ) 下获取 mysql 目录的文件系统级快照(例如 LVM 或类似文件
FLUSH TABLES WITH READ LOCK
)。使用此快照设置新服务器,并配置复制到旧系统(您可以通过查看快照中最新 binlog 的大小来确定 binlog 名称和位置(master_log_file
/ ))。master_log_pos
当您准备好移动时,停止
read_only=true
旧服务器上的所有写入(,终止所有连接)并等待新服务器赶上复制。然后使新服务器可写并关闭旧服务器。根据针对您的数据库运行的查询类型,您可能会有几秒钟的停机时间。然而,这取决于您的写入查询是确定性的,以便新旧服务器具有完全相同的数据。