作为数据库管理员(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
「注意事项」
「通知用户」:在启用 Offline Mode 前,最好提前通知用户,以避免造成误解和不便。
「监控已连接客户端」:确保已连接的客户端在维护期间不会进行关键操作,影响维护进度。
「适当规划」:根据维护工作的实际情况,合理规划 Offline Mode 的启用和关闭时间,确保对业务影响最小。
「结论」
offline_mode
是将服务器置于维护模式的一个好选项。确保应用程序用户没有管理员权限,只有管理员有权限。我们可以在以下情况中使用offline_mode
:
在进行维护或相关活动之前,将数据库服务器设置为维护模式,直到所有活动完成。
从服务器进行备份时,可以设置此
offline_mode
以避免服务器负载并加快备份速度。如果由于大量查询导致副本上有大量复制,可以设置此模式直到复制与主服务器同步。
当你想立即终止所有应用程序连接时。
「欢迎关注我们的公众号,获取更多技术分享与经验交流。」




