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 with Sysbench”) 的所有连接都将被终止。您将在 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.cnaaa.net,转载请注明出处:https://www.cnaaa.net/archives/9882

(0)
凯影的头像凯影
上一篇 2023年10月20日 下午4:41
下一篇 2023年10月23日 下午5:18

相关推荐

  • 用户管理命令

    useradd 命令 创建普通用户 指定uid和组 创建用户,禁止登录且不创建家目录 使用 -M -s 参数 userdel命令 删除用户与相关文件 案例 passwd命令 passwd命令修改用户密码和过期时间等,root可以改普通用户,反之不可以 一条命令设置密码,企业常用 echo “密码” | passwd — stdin 用户名 –s…

    2022年6月11日
    1.5K00
  • MySQL 用户管理和权限管理

    在项目中,一个数据库有很多人需要使用,不能所有的人都使用相同的权限,如果人比较多,一人一个用户也很难管理。一般来说,会分超级管理员权限,管理员权限,读写权限,只读权限等,这样方便管理。当然,具体怎么管理权限根据实际情况来确定。无论如何,都需要创建多个用户来管理权限。root 是数据库的超级管理员用户,对于普通开发人员来说,权限太大了,如果不小心做了一些不可逆…

    2022年6月9日
    1.7K00
  • Ubuntu修改静态IP、网关和DNS的方法总结

    /etc/netplan (use) Ubuntu 18.04开始可以使用netplan配置网络,其也是默认安装的。配置文件位于/etc/netplan/xxx.yaml中,netplan默认是使用NetworkManager来配置网卡信息的。 使用 netplan apply 网络配置 Ubuntu /etc/network/interfaces 修改静态…

    2023年11月27日
    1.2K00
  • 二进制安装MySQL

    Yum/rpm包安装,简单、快速、无法定制化、新手推荐使用 二进制安装,解压缩后直接简单配置即可使用,速度较快,专业DBA常用 源码编译安装,特点是可以定制化安装需求,缺点过程较为复杂 二进制安装 创建mysql用户 因为这个用户只是用来进行管理,为了系统安全,配置无登录权限 下载mysql二进制软件包(本案例为mysql5.7.33版本) 创建tools目…

    2022年6月24日
    1.5K00
  • ARM服务器快速测速

    下载speedtest镜像[arm64] 项目地址:https://github.com/cdhtlr/MikroTik-Speedtest/ root@nanopik2-s905:~# docker run -itd –name speedtest -p 8080:80 -e ‘MAX_KB=1000’ -e ‘THRESHOLD_MBPS=1.0’ -…

    2023年1月20日
    1.3K00

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

在线咨询: QQ交谈

邮件:712342017@qq.com

工作时间:周一至周五,8:30-17:30,节假日休息

关注微信