重新启动 MySQL 时避免动态更改的参数不会丢失

如果您是 DBA,“最简单”的任务之一就是在维护时段停止/启动 MySQL,但如果您在实例中的某个时刻修改某些动态参数,即使这样简单的重启操作也可能会导致出现意想不到的情况。

这里有一个关于如何发生这种情况的简短故事:

您是一名管理一些 MySQL 服务器的 DBA。 在周五晚上,使用其中的MySQL的应用程序就在你离开之前开始出现问题; 快速检查后,您注意到应用程序正在请求更多连接,快速解决方案是增加最大连接数; 你动态地改变最大连接数,问题暂时解决了。 你准备在在下周一尝试找到根本原因并正确解决它。

但生活总会发生变化, 周一又迎来了新的挑战,你已经忘记了连接数问题……几个月后,MySQL需要重启,没想到重启之后,问题又“出乎意料”地又回来了; 现在你必须排除故障并浪费时间想知道发生了什么并修复它。

注:这不是关于如何解决问题的建议; 这个故事只介绍了重启MySQL时可能发生的事情以及如何预防它。 这也可能说明为什么进行这种“管理”是不好的。

1. pt-config-diff介绍及情况

您可能知道,Percona Toolkit 是高级命令行工具的集合,用于执行各种 MySQL、MongoDB 和系统任务,这些任务过于困难或复杂而无法手动执行。

这些工具之一是 pt-config-diff; 该工具可以显示 MySQL 配置文件和服务器变量之间的差异。

您可以使用它来比较两个配置文件(即,您希望确保新服务器具有与旧服务器相同的设置)或一个配置文件和一个正在运行的 MySQL 实例(这就是我们将在此处使用的)。

以下是导致故事中不同值的命令和输出。首先,让我们看看配置文件中的连接设置。

$ grep conn /etc/my.cnf
max_connections=200

并且在动态更改之前,MySQL 正在以相同的值运行。

$ mysql -e "SELECT @@max_connections"
+-------------------+
| @@max_connections |
+-------------------+
|               200 |
+-------------------+

那个周五晚上,价值增加到 500:

$ mysql -vv -e "SET GLOBAL max_connections=500; SELECT @@GLOBAL.max_connections"

--------------
SET GLOBAL max_connections=500
--------------
Query OK, 0 rows affected (0.01 sec)


--------------
SELECT @@GLOBAL.max_connections
--------------
+--------------------------+
| @@GLOBAL.max_connections |
+--------------------------+
|                      500 |
+--------------------------+
1 row in set (0.00 sec)

Bye

届时,配置文件中的设置和 max_connections 的运行时值将不同,并且动态更改将在 MySQL 重新启动后丢失。

2. 如何检查动态变化

当需要重新启动 MySQL 时,您可以使用 pt-config-diff 来验证运行时设置是否与配置文件中的相同。

使用相同的示例,输出如下:

$ pt-config-diff h=localhost /etc/my.cnf

1 config difference

Variable                  localhost.localdomain /etc/my.cnf
========================= ===================== ===========
max_connections           500                   200

现在,您知道配置文件和运行时设置之间的区别,并且可以相应地做好准备(修改配置文件中的值或 SET PERSIST)。

我们手动修改一下配置文件:

$ grep conn /etc/my.cnf
max_connections=500

并使用与上面相同的命令重新检查,现在没有输出(意味着没有发现差异)。

$ pt-config-diff h=localhost /etc/my.cnf
$

3. 需要注意的事项

该工具只会比较两个源中存在的参数值。

使用相同的示例。 如果配置文件中不存在 max_connections 参数(MySQL 使用默认值运行),pt-config-diff 将不会在输出中显示该值。

例子:

配置文件中不存在该参数。

$ grep conn /etc/my.cnf
$

MySQL 以默认值运行:

$ mysql -e "SELECT @@max_connections"
+-------------------+
| @@max_connections |
+-------------------+
|               151 |
+-------------------+

动态修改值(使用与上例相同的命令)并运行 pt-config-diff,输出为空。

$ mysql -e "SELECT @@max_connections"
+-------------------+
| @@max_connections |
+-------------------+
|               500 |
+-------------------+


$ pt-config-diff h=localhost /etc/my.cnf
$

如上所述,发生这种情况是因为没有什么可比较的; 配置文件没有 max_connections 参数的值。

另一件要记住的事情是,如果您有多个配置文件(使用 !include 或 !includedir,或者在多个 MySQL 查找配置文件的默认位置),您无法同时比较所有配置文件。

如果您的情况如此,请确保比较所有必需的配置文件。

4. 最后的想法

首先,将此作为提醒,始终保留您的更改,可以手动将它们添加到配置文件中,也可以使用 SET PERSIST (注意:此命令将在 datadir 内创建/使用 mysqld-auto.cnf)。

即使在使用 pt-config-diff 检查后,重新启动后也可能会丢失一些差异,但使用此工具可以帮助您防止不必要的意外并在重新启动之前突出显示可能的问题。

与往常一样,即使在执行“最简单”的任务时,也建议进行一些预先检查,以确保活动顺利进行。


原文地址:https://www.percona.com/blog/avoid-surprises-when-restarting-mysql-ensure-dynamic-changes-wont-be-lost/

文章评论

0条评论