MySQL运维之神奇的参数(终结篇)

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: 一、主要内容 生产前的测试方案 生产环境如何平滑实施 生产坏境中遇到哪些困难 我们的解决方案 价值与意义 二、背景 这个项目的起源,来源于生产环境中的N次误删数据,所以才有他的姊妹篇文章,一个神奇的参数前传 三、生产前的测试方案 3.

一、主要内容

    1. 生产前的测试方案
    1. 生产环境如何平滑实施
    1. 生产坏境中遇到哪些困难
    1. 我们的解决方案
    1. 价值与意义

二、背景

这个项目的起源,来源于生产环境中的N次误删数据,所以才有他的姊妹篇文章,一个神奇的参数前传

三、生产前的测试方案

3.1 why

  • 为什么要做测试方案
1. 大家都知道设置sql_safe_update=1 会拒绝掉很多你想不到的SQL,这样会导致业务出问题,服务中断,影响非常严重
2. 我们需要测试出哪些SQL语句会被拒绝?
3. 我们需要知道已经上线的SQL语句中,哪些会被拒绝?

总之,我们需要无缝升级,怎么样才能既加强安全防范,又不影响业务呢?
这就是我们的SQL防火墙系统的升级改造之路

3.2 如何测试

非常感谢DBA团队袁俊敏同学的细心测试

1. 根据官方文档的提示,以及之前碰壁的经验,我们详细的设计了各种SQL方案
    a. 单键索引
        a.1 update语句
        a.2 delete语句
        a.3 replace into系列
        a.4 有limit
        a.5 无limit
        a.6 有where条件
        a.7 无where条件
        a.8 隐式类型字符转换
        a.9 SQL带有函数方法
    b. 组合索引
        b.1 update语句
        b.2 delete语句
        b.3 replace into系列
        b.4 有limit
        b.5 无limit
        b.6 有where条件
        b.7 无where条件
        b.8 隐式类型字符转换
        b.9 SQL带有函数方法
    等等

3.3 哪些语句会触发sql_safe_update报错

1. 有where 条件且没有使用索引,且没有limit语句  --触发
2. 没有where 条件 , 有limit,delete语句 --触发
3. 没有where 条件 , 没有limit, delete+update语句  --触发

总结: 没有使用索引的DML语句,都会被触发

四、生产环境如何平滑实施

log_queries_not_using_indexes=on
long_query_time = 10000
log_queries_not_using_indexes 无长连接的概念,立即对所有链接生效

通过log_queries_not_using_indexes=on + long_query_time = 10000 可以抓出所有我们需要的dml,解决掉这些sql,我们的目的就达到了

五、生产坏境中遇到哪些困难

这边说一个典型的坑

  • 你们真的以为设置了sql_safe_updates就一定能够拒绝没有使用索引的SQL吗?
1. 首先:log_queries_not_using_indexes=on,的确是可以抓出所有没有使用索引的DML
2. 但是:再设置sql_safe_updates=1之前,如果这个connection已经存在了,那么sql_safe_updates=1对早已经存在的connection是不起作用的
  • 不可预见的问题
1. online目前long_query_time=0.1,本来打算当场设置long_query_time = 10000, 来排除掉slow的因素,然后设置log_queries_not_using_indexes=on 将所有没有使用索引的SQL抓出来。

2. 结果出乎意料的是:将使用索引的DML也抓了出来

3. 后来通过slow发现这些dml都是大于100ms的,才得知结论:长连接还在使用long_query_time=0.1的参数,对于刚刚设置的参数不生效。

4. 所以,long_query_time 对长连接无效。

目前总结下来:这里面有两个关键参数对长连接无效

1. long_query_time
2. sql_safe_updates
  • 故障一
1. master 由于对于长连接不生效,所以全表更新dml在master执行了,但是在slave却不能执行,导致主从同步失败(MIXED,STATEMENT)
2. 以上情况ROW模式不受影响,因为Row模式已经是对每一行记录进行更改,不可能不安全
  • 故障二
1. master 由于对于长连接不生效,所以全表更新dml在master执行了,那么意味着,你以为可以保障MySQL安全,其实只是自欺欺人而已

六、我们的解决方案

解决长连接问题

  • 删掉所有链接
1. 有人说,那简单,我们直接全部删掉所有链接就好了。
    的确,全部删除,的确可以做到,但是是不是有点粗暴呢?

2. 那就让业务方将所有长连接应用重启
    这。。。业务方会很崩溃,也不可能停掉所有的长连接服务
  • 只kill具有dml权限的长连接
* 如何找到长连接

1. 长连接的特点:长
2. 那么MySQL里面的show processlist有两个非常重要的属性
    Id: session id
    Time: command status time
3. 误区
    这里有大部分人会根据Time来识别这个链接是不是长连接,那么他一定不理解time的含义
    它并不是链接的时间长短,而是command某个状态的时间而已

4. 大家已经猜到,最终的方案就是通过session id来判断识别长连接

    4.0 先在master上设置sql_safe_update=on
    4.1 然后假设10:00 show processlist,记录下所有的id
    4.2 那么明天10:00 show processlist,与上一次的id进行匹配,如果匹配中了,那么说明这个connection已经存在一天,那么可以认为他是长连接了
    4.3 判断这些id对应的用户权限,只读账号忽略
    4.4 kill掉这些长连接即可(注意:repl,system user 这些系统进程不要被误删掉了,否则哭都来不及)
    4.5 可以根据host:port告知业务方,一起配合重启和kill之后的观察

价值和意义

目前我们已经完成了N组DB集群的设置

这里有很多人有疑问:

  1. 花这么大的代价,只是为了设置这样的一个参数,值得吗?
  2. 万一搞不好,弄出问题来,岂不是没事找事,给自己找罪受?
  3. 这样操作,开发会支持你吗?你们老大支持你吗?

我是这么理解的:

  1. 刚开始的时候,的确难度非常大,后来我们经过无数次测试和技术方案演练,还是决定冒着枪林弹雨,只为以后的数据安全
  2. 一切以用户为中心,我们必须用我们专业的判断对用户负责
  • final:我将这件事看做: '功在当代,利在千秋' 的一件事
相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
14天前
|
缓存 监控 关系型数据库
如何根据监控结果调整 MySQL 数据库的参数以提高性能?
【10月更文挑战第28天】根据MySQL数据库的监控结果来调整参数以提高性能,需要综合考虑多个方面的因素
54 1
|
21天前
|
运维 关系型数据库 MySQL
运维|MySQL 数据库被黑,心力交瘁
前一阵有一个测试用的 MySQL 数据库被黑了,删库勒索的那种,这里记录一下事情经过,给自己也敲个警钟。
31 2
|
29天前
|
SQL 运维 关系型数据库
MySQL 运维 SQL 备忘
MySQL 运维 SQL 备忘录
45 1
|
2月前
|
存储 SQL 关系型数据库
【MySQL调优】如何进行MySQL调优?从参数、数据建模、索引、SQL语句等方向,三万字详细解读MySQL的性能优化方案(2024版)
MySQL调优主要分为三个步骤:监控报警、排查慢SQL、MySQL调优。 排查慢SQL:开启慢查询日志 、找出最慢的几条SQL、分析查询计划 。 MySQL调优: 基础优化:缓存优化、硬件优化、参数优化、定期清理垃圾、使用合适的存储引擎、读写分离、分库分表; 表设计优化:数据类型优化、冷热数据分表等。 索引优化:考虑索引失效的11个场景、遵循索引设计原则、连接查询优化、排序优化、深分页查询优化、覆盖索引、索引下推、用普通索引等。 SQL优化。
536 15
【MySQL调优】如何进行MySQL调优?从参数、数据建模、索引、SQL语句等方向,三万字详细解读MySQL的性能优化方案(2024版)
|
1月前
|
SQL 关系型数据库 MySQL
数据库:MYSQL参数max_allowed_packet 介绍
数据库:MYSQL参数max_allowed_packet 介绍
58 2
|
3月前
|
存储 SQL 运维
运维开发.MySQL.范式与反范式化
运维开发.MySQL.范式与反范式化
54 1
|
3月前
|
运维 关系型数据库 MySQL
在Linux中,MySQL数据库日常运维中涉及哪些关键任务?
在Linux中,MySQL数据库日常运维中涉及哪些关键任务?
|
3月前
|
运维 关系型数据库 MySQL
"MySQL运维精髓:深入解析数据库及表的高效创建、管理、优化与备份恢复策略"
【8月更文挑战第9天】MySQL是最流行的开源数据库之一,其运维对数据安全与性能至关重要。本文通过最佳实践介绍数据库及表的创建、管理与优化,包括示例代码。涵盖创建/删除数据库、表结构定义/调整、索引优化和查询分析,以及数据备份与恢复等关键操作,助您高效管理MySQL,确保数据完整性和系统稳定运行。
369 0
|
1月前
|
运维 Linux Apache
,自动化运维成为现代IT基础设施的关键部分。Puppet是一款强大的自动化运维工具
【10月更文挑战第7天】随着云计算和容器化技术的发展,自动化运维成为现代IT基础设施的关键部分。Puppet是一款强大的自动化运维工具,通过定义资源状态和关系,确保系统始终处于期望配置状态。本文介绍Puppet的基本概念、安装配置及使用示例,帮助读者快速掌握Puppet,实现高效自动化运维。
52 4
|
4天前
|
机器学习/深度学习 数据采集 人工智能
智能运维:从自动化到AIOps的演进与实践####
本文探讨了智能运维(AIOps)的兴起背景、核心组件及其在现代IT运维中的应用。通过对比传统运维模式,阐述了AIOps如何利用机器学习、大数据分析等技术,实现故障预测、根因分析、自动化修复等功能,从而提升系统稳定性和运维效率。文章还深入分析了实施AIOps面临的挑战与解决方案,并展望了其未来发展趋势。 ####