MySQL 如何使用离线模式维护服务器
离线模式
作为 DBA,最常见的任务之一就是批量处理 MySQL 服务的启停或其他一些活动。在停止 MySQL 服务前,我们可能需要检查是否有活动连接;如果有,我们可能需要把它们全部杀死。通常,我们使用 pt-kill 杀死应用连接或使用 SELECT
语句查询准备杀死语句。例如:
pt-kill --host=192.168.11.11 --user=percona -p --sentinel /tmp/pt-kill.sentinel2 --pid /tmp/pt-kill.pid --victims all --match-command 'Query' --ignore-user 'pmm|rdsadmin|system_user|percona' --busy-time 10 --verbose --print --kill select concat('kill ',id,';') from information_schema.processlist where user='app_user';
MySQL 有一个名为 offline_mode
的变量来将服务器设置为维护模式。设置此选项后,它会立即断开所有不具有 SYSTEM_VARIABLES_ADMIN 和 CONNECTION_ADMIN 权限的客户端连接,并且不允许新连接,除非用户拥有这些权限。如果您手动终止连接或使用 pt-kill
,则无法避免新连接的创建。但通过使用这种模式,我们可以避免新的连接。这是一个全局动态变量,我们可以在服务器运行时设置此模式。
要启用 offline_mode
,用户帐户必须具有 SYSTEM_VARIABLES_ADMIN* 权限和 CONNECTION_ADMIN 权限(或已弃用的 SUPER 权限,它涵盖了这两个权限)。CONNECTION_ADMIN 从 MySQL 8.0.31 开始是必需的,并建议在所有版本中使用,以防止意外锁定。让我们测试一下。
要对此进行测试,请创建一个新用户 app_user,该用户仅具有 DDL/DML 权限。
mysql> create user app_user identified by 'App@!234TEst'; Query OK, 0 rows affected (0.20 sec) mysql> GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP , REFERENCES, INDEX, ALTER, SHOW DATABASES, CREATE TEMPORARY TABLES, LOCK TABLES, EXECUTE,CREATE VIEW, SHOW VIEW, CREATE ROUTINE, ALTER ROUTINE, CREATE USER, EVENT, TRIGGER, CREATE TABLESPACE on *.* to app_user; Query OK, 0 rows affected (0.00 sec)
使用 aap_user 用户启动 sysbench 工具。
[root@centos12 vagrant]# sysbench /usr/share/sysbench/oltp_read_write.lua --threads=10 --time=100 --mysql-db=sysbench --mysql-user=app_user --mysql-password='App@!234TEst' run sysbench 1.0.20 (using bundled LuaJIT 2.1.0-beta2) Running the test with following options: Number of threads: 10 Initializing random number generator from current time Initializing worker threads...
mysql> show processlist; +----+-----------------+---------------------+----------+-------------+------+-----------------------------------------------------------------+------------------------------------------------------------------------------------------------------+---------+-----------+---------------+ | Id | User | Host | db | Command | Time | State | Info | Time_ms | Rows_sent | Rows_examined | +----+-----------------+---------------------+----------+-------------+------+-----------------------------------------------------------------+------------------------------------------------------------------------------------------------------+---------+-----------+---------------+ | 5 | event_scheduler | localhost | NULL | Daemon | 2151 | Waiting for next activation | NULL | 2151034 | 0 | 0 | | 9 | bhuvan | 192.168.33.11:50642 | NULL | Binlog Dump | 2102 | Source has sent all binlog to replica; waiting for more updates | NULL | 2102317 | 0 | 0 | | 14 | bhuvan | localhost | NULL | Query | 0 | init | show processlist | 0 | 0 | 0 | | 20 | app_user | localhost | sysbench | Execute | 0 | waiting for handler commit | COMMIT | 11 | 0 | 0 | | 21 | app_user | localhost | sysbench | Execute | 0 | updating | DELETE FROM sbtest1 WHERE id=5000 | 6 | 0 | 0 | | 23 | app_user | localhost | sysbench | Execute | 0 | waiting for handler commit | COMMIT | 8 | 0 | 0 | | 24 | app_user | localhost | sysbench | Execute | 0 | waiting for handler commit | COMMIT | 18 | 0 | 0 | | 25 | app_user | localhost | sysbench | Execute | 0 | updating | UPDATE sbtest1 SET c='99153469917-25523144931-18125321038-96151238215-88445737418-14906501975-136014 | 13 | 0 | 0 | | 27 | app_user | localhost | sysbench | Execute | 0 | waiting for handler commit | COMMIT | 7 | 0 | 0 | | 28 | app_user | localhost | sysbench | Execute | 0 | statistics | SELECT c FROM sbtest1 WHERE id=5003 | 0 | 0 | 0 | | 29 | app_user | localhost | sysbench | Execute | 0 | updating | UPDATE sbtest1 SET c='84180675456-88426921120-90373546373-84823361786-77912396694-08592771856-912331 | 13 | 0 | 0 | +----+-----------------+---------------------+----------+-------------+------+-----------------------------------------------------------------+------------------------------------------------------------------------------------------------------+---------+-----------+---------------+ 13 rows in set (0.00 sec)
当 sysbench 运行时,设置 offline_mode=ON
,来自 sysbech 的所有连接都将被终止。您将在 sysbench 中看到错误。
mysql> select @@offline_mode; +----------------+ | @@offline_mode | +----------------+ | 0 | +----------------+ 1 row in set (0.15 sec) mysql> set global offline_mode=1; Query OK, 0 rows affected (0.15 sec) mysql> show processlist; +----+-----------------+---------------------+------+-------------+------+-----------------------------------------------------------------+------------------+---------+-----------+---------------+ | Id | User | Host | db | Command | Time | State | Info | Time_ms | Rows_sent | Rows_examined | +----+-----------------+---------------------+------+-------------+------+-----------------------------------------------------------------+------------------+---------+-----------+---------------+ | 5 | event_scheduler | localhost | NULL | Daemon | 2178 | Waiting for next activation | NULL | 2178008 | 0 | 0 | | 9 | bhuvan | 192.168.33.11:50642 | NULL | Binlog Dump | 2129 | Source has sent all binlog to replica; waiting for more updates | NULL | 2129291 | 0 | 0 | | 14 | bhuvan | localhost | NULL | Query | 0 | init | show processlist | 0 | 0 | 0 | +----+-----------------+---------------------+------+-------------+------+-----------------------------------------------------------------+------------------+---------+-----------+---------------+ 3 rows in set (0.01 sec)
如果您在 offline_mode=1
时尝试使用 app_user 连接数据库,它将不允许连接并收到一条错误消息,表明服务器当前处于离线模式。这个 offline_mode
不会影响复制。可以看到上面的 processlist 日志,当我们设置 offline_mode=1
时,复制线程并没有断开。要禁用 offline_mode
,请将值设置为 0。
mysql> set global offline_mode=0; Query OK, 0 rows affected (0.00 sec)
结论
offline_mode
是将服务器置于维护模式的一个不错的选择。只需确保应用程序用户没有管理员权限,只有管理员有。我们可以在以下情况下使用 offline_mode
:
- 在将数据库服务器取出进行维护或其相关活动之前,请在配置文件中进行更改并保持此模式,直到所有活动完成。
- 在从服务器进行备份时,我们可以设置这个
offline_mode
,以避免服务器的负载,使备份速度更快。 - 如果由于大量查询而导致副本上出现大量复制,我们可以设置此模式,直到复制与主服务器同步。
- 当您想立即终止所有应用程序连接时。
本文原文:https://www.percona.com/blog/mysql-offline-mode-to-disconnect-client-connections/
更多技术文章,请访问:https://opensource.actionsky.com/
关于 SQLE
爱可生开源社区的 SQLE 是一款面向数据库使用者和管理者,支持多场景审核,支持标准化上线流程,原生支持 MySQL 审核且数据库类型可扩展的 SQL 审核工具。
SQLE 获取
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
《优化接口设计的思路》系列:第四篇—接口的权限控制
前言 大家好!我是sum墨,一个一线的底层码农,平时喜欢研究和思考一些技术相关的问题并整理成文,限于本人水平,如果文章和代码有表述不当之处,还请不吝赐教。 作为一名从业已达六年的老码农,我的工作主要是开发后端Java业务系统,包括各种管理后台和小程序等。在这些项目中,我设计过单/多租户体系系统,对接过许多开放平台,也搞过消息中心这类较为复杂的应用,但幸运的是,我至今还没有遇到过线上系统由于代码崩溃导致资损的情况。这其中的原因有三点:一是业务系统本身并不复杂;二是我一直遵循某大厂代码规约,在开发过程中尽可能按规约编写代码;三是经过多年的开发经验积累,我成为了一名熟练工,掌握了一些实用的技巧。 我们在做系统的时候,只要这个系统里面存在角色和权限相关的业务需求,那么接口的权限控制肯定必不可少。但是大家一搜接口权限相关的资料,出来的就是整合Shrio、Spring Security等各种框架,然后下面一顿贴配置和代码,看得人云里雾里。实际上接口的权限控制是整个系统权限控制里面很小的一环,没有设计好底层数据结构,是无法做好接口的权限控制的。那么怎么做一个系统的权限控制呢?我认为有以下几步: 那么...
- 下一篇
Go函数全景:从基础到高阶的深度探索
在本篇文章中,我们深入探索了Go语言中的函数特性。从基础的函数定义到特殊函数类型,再到高阶函数的使用和函数调用的优化,每一个部分都揭示了Go的设计哲学和其对编程效率的追求。通过详细的代码示例和专业解析,读者不仅可以掌握函数的核心概念,还能了解如何在实践中有效利用这些特性来提高代码质量和性能。 关注公众号【TechLeadCloud】,分享互联网架构、云服务技术的全维度知识。作者拥有10+年互联网服务架构、AI产品研发经验、团队管理经验,同济本复旦硕,复旦机器人智能实验室成员,阿里云认证的资深架构师,项目管理专业人士,上亿营收AI产品研发负责人。 一、Go函数基础 Go语言提供了丰富的函数定义和调用机制,允许开发者构建模块化、可维护的代码。本节将介绍Go函数的基础概念,包括函数的定义、声明、以及参数传递方式。 1.1 函数定义和声明 在Go中,函数是一系列语句的集合,它们在一起执行一个任务。每个Go程序至少有一个函数,即main函数。 基础函数结构 函数的基本结构包括返回值类型、函数名称、参数列表和函数体。 func functionName(parameters) returnType...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7
- CentOS8编译安装MySQL8.0.19
- CentOS7,8上快速安装Gitea,搭建Git服务器
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- Docker安装Oracle12C,快速搭建Oracle学习环境
- CentOS6,CentOS7官方镜像安装Oracle11G
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装
- MySQL8.0.19开启GTID主从同步CentOS8
- SpringBoot2更换Tomcat为Jetty,小型站点的福音