暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

MySQL Offline Mode 使用指南:轻松实现数据库维护

数据库驾驶舱 2024-07-26
213

作为数据库管理员(DBA),一个非常常见的任务是停止/启动MySQL服务以进行批处理或其他活动。在停止MySQL之前,我们可能需要检查是否有活动连接;如果有,我们可能需要终止所有这些连接。通常,我们使用pt-kill来终止应用程序连接或使用select查询来准备kill语句。

示例命令:

pt-kill --host=192.168.1.100 --user=root -p --sentinel /tmp/pt-kill.sentinel2 --pid /tmp/pt-kill.pid --victims all --match-command 'Query' --ignore-user 'root|system_user|zabbix|event_scheduler' --busy-time 10 --verbose --print --kill 

mysql> select concat('kill ',id,';'from information_schema.processlist where user='app_user';

MySQL有一个名为offline_mode
的变量,用于将服务器设置为维护模式。当设置此变量时,它会立即断开所有没有super (8以下)或者 SYSTEM_VARIABLES_ADMIN
CONNECTION_ADMIN
权限的客户端连接,并且不允许新的连接,除非用户具有这些权限。如果手动或使用pt-kill终止连接,则无法避免新的连接创建。但通过使用此模式,我们可以避免新的连接。这是一个全局动态变量,可以在服务器运行时设置此模式。

要启用offline_mode
,用户帐户必须具有SUPER
权限,8版本使用SYSTEM_VARIABLES_ADMIN
CONNECTION_ADMIN
。从MySQL 8.0.31开始,建议使用CONNECTION_ADMIN
以防止意外锁定。让我们测试一下。

测试版本5.7.40

mysql> create user app_user identified by 'app_user_123';
Query OK, 0 rows affected (0.20 sec)

mysql> GRANT all on app.* to app_user;
Query OK, 0 rows affected (0.00 sec)

mysql> show processlist;
+----+-----------------+-----------+------+---------+-------+------------------------+------------------+
| Id | User            | Host      | db   | Command | Time  | State                  | Info             |
+----+-----------------+-----------+------+---------+-------+------------------------+------------------+
|  1 | event_scheduler | localhost | NULL | Daemon  | 81606 | Waiting on empty queue | NULL             |
| 15 | root            | localhost | NULL | Query   |     0 | starting               | show processlist |
| 17 | app_user        | localhost | NULL | Sleep   |    43 |                        | NULL             |
+----+-----------------+-----------+------+---------+-------+------------------------+------------------+

设置offline_mode=1
,所有来自app_user的连接将被终止。

mysql> set global offline_mode=1;
Query OK, 0 rows affected (0.00 sec)

查看连接(原有连接自动已断开)
mysql> show processlist;
+----+-----------------+-----------+------+---------+-------+------------------------+------------------+
| Id | User            | Host      | db   | Command | Time  | State                  | Info             |
+----+-----------------+-----------+------+---------+-------+------------------------+------------------+
|  1 | event_scheduler | localhost | NULL | Daemon  | 81883 | Waiting on empty queue | NULL             |
| 15 | root            | localhost | NULL | Query   |     0 | starting               | show processlist |
+----+-----------------+-----------+------+---------+-------+------------------------+------------------+

尝试连接

mysql> mysql -uapp_user -papp_user_123
mysql: [Warning] Using a password on the command line interface can be insecure.
ERROR 3032 (HY000): The server is currently in offline mode

「注意事项」

  1. 「通知用户」:在启用 Offline Mode 前,最好提前通知用户,以避免造成误解和不便。

  2. 「监控已连接客户端」:确保已连接的客户端在维护期间不会进行关键操作,影响维护进度。

  3. 「适当规划」:根据维护工作的实际情况,合理规划 Offline Mode 的启用和关闭时间,确保对业务影响最小。

「结论」

offline_mode
是将服务器置于维护模式的一个好选项。确保应用程序用户没有管理员权限,只有管理员有权限。我们可以在以下情况中使用offline_mode

  1. 在进行维护或相关活动之前,将数据库服务器设置为维护模式,直到所有活动完成。

  2. 从服务器进行备份时,可以设置此offline_mode
    以避免服务器负载并加快备份速度。

  3. 如果由于大量查询导致副本上有大量复制,可以设置此模式直到复制与主服务器同步。

  4. 当你想立即终止所有应用程序连接时。

「欢迎关注我们的公众号,获取更多技术分享与经验交流。」


文章转载自数据库驾驶舱,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论