为什么我的 Amazon RDS for MySQL 数据库实例停留在“重启”状态?

上次更新日期:2021 年 10 月 28 日

我正在尝试重启适用于 MySQL 数据库实例的 Amazon Relational Database Service (Amazon RDS)。但是,我的数据库实例停留在“重启”状态,或者重启时间比预期更长。为什么会出现这种情况,我该如何解决呢?

简短描述

在执行重启之前,请确保停止数据库实例中的任何传入或正在进行的事务。正在进行的事务将被停止,任何未提交的事务都将被回滚。

注意:回滚未提交的事务可能是一项代价极高的操作。在您Amazon RDS for MySQL可再次可用之前,未提交的事务也可能需要很长时间才能完成。

重新启动开始后,该过程将无法取消,重新启动将一直持续到完成。如果重启时间比预期长,请调查根本原因,然后考虑以下故障排除方法:

  • 检查正在进行的查询。
  • 检查是否有任何未清除的事务处理。
  • 查看 MySQL 错误日志文件。

解决方法

检查正在进行的查询

使用 SHOW FULL PROCESSLIST(显示完整进程列表)命令检查您的Amazon RDS for MySQL 实例上是否有任何活动查询:

mysql> SHOW FULL PROCESSLIST;

以下是一个示例输出,表明 UPDATE 查询仍在进行中:

+-----+---------------+---------------------+------+---------+------+----------+-----------------------+
| Id  | User          | Host                | db   | Command | Time | State    | Info                  |
+-----+---------------+---------------------+------+---------+------+----------+-----------------------+
|   2 | rdsadmin      | localhost:30662     | NULL | Sleep   |    4 |          | NULL                  |
| 101 | admin         | 172.31.28.252:58288 | NULL | Query   |  111 | updating |UPDATE tutorials SET tu|
+-----+---------------+---------------------+------+---------+------+----------+-----------------------+

输出提供有关在数据库上运行的 MySQL 线程的信息。如果有查询仍在运行,则在执行重新启动之前允许查询完成。

注意:请以主用户身份运行 SHOW FULL PROCESSLIST(显示完整进程列表)查询。如果您不是主用户,则必须具有 MySQL 服务器管理权限才能查看 MySQL 实例上的所有活动线程。否则,输出仅显示用户的 MySQL 帐户中的活动线程 ID。有关更多信息,请参阅 MySQL 网站上的 SHOW PROCESSLIST(显示进程列表)语句 MySQL 服务器管理

检查是否有任何未清除的事务处理

MySQL InnoDB 引擎使用多版本并发控制 (MVCC),它在事务期间维护已更改行的旧版本的列表。如果必须回滚事务,则 InnoDB 可以在此过程中执行任何撤消操作。在撤消空间内捕获旧版本的行。在事务期间不再调用这些旧版本时,它们将被清除。如果由于事务仍然引用捕获的更改而未清除这些更改,则历史记录列表的长度可能会增加。有关更多信息,请参阅 MySQL 网站上的 InnoDB 多版本控制

未清除的事务处理表示为历史记录列表长度值。此值可以在 SHOW ENGINE INNODB STATUS(显示引擎 INNODB 状态)命令输出中的“事务处理”下找到。请注意,历史记录列表长度通常是一个较低的值,尽管写入量大的工作负载或长时间运行的事务可能会导致值增加。有关历史记录列表长度值的更多信息,请参阅 MySQL 网站上的清除配置

要检查历史记录列表长度内是否有任何未清除的事务,请使用 SHOW ENGINE INNODB STATUS(显示引擎 INNODB 状态)命令。此命令的输出还允许您查看历史记录列表长度的大小以及“事务处理”部分下列出的任何正在进行的事务处理的大小。有关查看列出的事务处理的更多信息,请参阅 MySQL 网站上的 InnoDB 标准监控和锁定监控输出

例如:

------------
TRANSACTIONS
------------
Trx id counter 105746959
Purge done for trx's n:o < 105746958 undo n:o < 0 state: running but idle
History list length 32
LIST OF TRANSACTIONS FOR EACH SESSION:
---TRANSACTION 328605240396520, not started
0 lock struct(s), heap size 1136, 0 row lock(s)
---TRANSACTION 328605240395600, not started
0 lock struct(s), heap size 1136, 0 row lock(s)

注意:如果历史记录列表长度很高且存在活动的事务处理,那么重新启动不是最佳做法。

有关更多信息,请参阅 MySQL 网站上的 SHOW ENGINE INNODB STATUS(显示引擎 INNODB 状态)。

查看 MySQL 错误日志文件

在 Amazon RDS 中,默认情况下会启用 MySQL 错误日志文件。如果您怀疑 RDS 实例需要太长时间才能重新可用,请查看 MySQL 错误日志文件的内容。MySQL 在启动、关闭或遇到任何错误时写入错误日志文件。

例如,作为 InnoDB 崩溃恢复过程的一部分,InnoDB 可能必须回滚任何未提交的事务。如果回滚了任何未提交的事务,则 MySQL 错误日志会记录此事件。有关更多信息,请参阅 MySQL 网站上的 InnoDB 崩溃恢复

其他问题排查

注意:如果您选择执行时间点恢复 (PITR) 或从快照还原,则新的 Amazon RDS 实例可能无法立即可用。有关更多信息,请参阅以下文章:

如果您Amazon RDS for MySQL数据库实例重启了一段时间,请尝试以下其他故障排除提示:

  • 如果您的数据库实例启用了自动备份,则执行 PITR 以在指定时间内还原到新的 Amazon RDS 实例。您可以恢复到备份保留期内的任意时间点。
    注意:默认情况下,还原的数据库实例与默认数据库参数和选项组关联。但是,您可以通过在还原期间指定自定义参数组和选项组来使用它们。
  • 通过创建新的数据库实例,从最新的数据库快照还原数据库实例。一旦恢复的数据库实例状态可用,您就可以立即使用该实例。
  • 如果数据库实例有只读副本,则将该只读副本提升为独立数据库实例。提升只读副本时,数据库实例会在可用之前自动重新启动。

定期监控数据库活动也是一种最佳实践。您可以使用以下工具监控Amazon RDS for MySQL数据库实例

  • Amazon CloudWatch:借助 Amazon CloudWatch,您可以监控任何正在进行的数据库工作负载。如果您观察到数据库连接、CPU 使用率或写/读 IOPS 值较高,则数据库实例中可能存在持续活动。
  • 增强监控:增强监控需要获得向 CloudWatch Logs 发送操作系统指标信息的权限。您可以使用 AWS Identity and Access Management (IAM) 角色授予增强监控权限。在启用增强监控之前,您必须首先创建一个 IAM 角色。
  • 性能详情:性能架构适用于 Amazon RDS for MySQL(或 MariaDB)使用的可选性能工具。如果启用或禁用性能详情,则无需重启数据库实例。您也不会遇到任何停机或故障转移。

这篇文章对您有帮助吗?


您是否需要账单或技术支持?