唐诡探案外传-MySQL误操作之“寻凶”

news2024/9/23 7:28:47

序幕:字符集被修改之谜

立秋后的第一天下午,太阳仍不知疲倦地炙烤着大地,办公室内的中央空调不停歇地鼓吹着冷风。某办公楼内,IT部门的阿祖被同事急匆匆地找来,说是系统出现了奇怪的bug,追查之下发现测试环境的MySQL中某个关键表的某个字段的字符集竟然被莫名修改了,从原本的utf8改成了utf16。这让所有人都感到不解,因为最近只有阿祖使用Liquibase计划重新添加索引,由于需要先删除旧索引,他特地请了拥有root权限的测试专家黄老邪来帮忙。但问题是,黄老邪只是删除了索引,而Liquibase的xml中只做了添加索引的操作,并没有去修改字符集,再者是拥有root权限有多人,那么到底是谁修改了字段的字符集呢?难道liquibase有这样的bug?这让真相变得更加扑朔迷离。

在这里插入图片描述

第一幕:排除liquibase的作案可能性

阿祖深吸一口气,整理了下思绪,决定先假定liquibase的生成的语句在测试环境的MySQL执行有问题:即添加索引时修改了字段的字符集。虽然内心99%觉得不可能,但也要先排除掉这个选项。于是使用liquibase命令生成了sql,如下

CREATE UNIQUE INDEX uk_order_no ON tb_order(order_no);

此时其他有root权限同事已将字段字符集改成了正常的utf8,便让黄老邪删除索引后执行上述sql,发现索引添加成功,且字符集没有修改,至此排除liquibase的问题。

第二幕:binlog的追踪之旅

接下来,阿祖继续排查,决定从MySQL的binlog入手。他首先使用普通用户查询MySQL是否开启了binlog

SHOW VARIABLES LIKE 'log_bin%';

+---------------------------------+-----------------------------+
| Variable_name                   | Value                       |
+---------------------------------+-----------------------------+
| log_bin                         | ON                          |
| log_bin_basename                | /xxx/mysql/mysql-bin       |
| log_bin_index                   | /xxx/mysql/mysql-bin.index |
| log_bin_trust_function_creators | OFF                         |
| log_bin_use_v1_row_events       | OFF                         |
+---------------------------------+-----------------------------+

发现开启后,使用root用户查询binlog文件列表

SHOW BINARY LOGS;

+-----------------+------------+-----------+
| Log_name        | File_size  | Encrypted |
+-----------------+------------+-----------+
| mysql-bin.000666 | 1073742177 | No        |
| mysql-bin.000888 | 1006300214 | No        |
+-----------------+------------+-----------+

接着,登录到mysql服务器,进入到上述目录log_bin_index中,寻找到对应的二进制binlog文件,防止对测试环境造成影响,阿祖决定先下载到本地,接着利用mysqlbinlog工具,根据数据库名和操作时间范围,筛选出相关的binlog文件,并将其转换为SQL语句:

mysqlbinlog.exe --start-datetime="2024-08-08 13:30:00" --stop-datetime="2024-08-08 15:00:00" --database=mydatabase /path/to/mysql-bin.000001 > modified_operations.sql

打开modified_operations.sql文件,查找表名关键字,阿祖像侦探一样逐行扫描,终于发现了删除索引和修改字符集的SQL语句。关于此表的操作结果精简如下:

# 第一段 让黄老邪删除索引 执行时间为13:42:09
BEGIN
/*!*/;
# at 382849911
# at 382849989
# at 382850157
#240808 13:42:09 server id 131  end_log_pos 382850188 CRC32 0x010443c7  Xid = 728706665
COMMIT/*!*/;
# at 382850188
#240808 13:42:10 server id 131  end_log_pos 382850385 CRC32 0xa25a5fa4  Query thread_id=22232080  exec_time=0 error_code=0
use `mydatabase`/*!*/;
SET TIMESTAMP=1723095730/*!*/;
/*!\C utf8mb4 *//*!*/;
SET @@session.character_set_client=45,@@session.collation_connection=45,@@session.collation_server=33/*!*/;
ALTER TABLE `mydatabase`.`tb_order` 

DROP INDEX `order_no`,


# 第二段 字段字符集被修改 执行时间为13:42:28
#240808 13:42:28 server id 131  end_log_pos 382905001 CRC32 0xb9cc6875  Query thread_id=22232080  exec_time=1 error_code=0
SET TIMESTAMP=1723095748/*!*/;
/*!\C utf8mb4 *//*!*/;
SET @@session.character_set_client=45,@@session.collation_connection=45,@@session.collation_server=33/*!*/;
ALTER TABLE `mydatabase`.`tb_order` 

MODIFY COLUMN `order_no` varchar(100) CHARACTER SET utf16 NULL DEFAULT NULL COMMENT '订单号' AFTER `id`

# 第三段 Liquibase添加索引 执行时间为13:52:53
BEGIN
/*!*/;
# at 384167351
# at 384167440
# at 384167866
#240808 13:52:53 server id 131  end_log_pos 384167897 CRC32 0x717f361e  Xid = 728741825
COMMIT/*!*/;
# at 384167897
#240808 13:52:54 server id 131  end_log_pos 384168058 CRC32 0x397934e7  Query thread_id=22232199  exec_time=0 error_code=0
SET TIMESTAMP=1723096374/*!*/;
/*!\C utf8 *//*!*/;
SET @@session.character_set_client=33,@@session.collation_connection=33,@@session.collation_server=33/*!*/;
CREATE UNIQUE INDEX uk_order_no ON tb_order(order_no)

其中第一段删除索引和第二段修改字符集,执行时间只差了19秒,合理怀疑是黄老邪操作,但黄老邪拒不承认,表示根本不可能是他操作的。且日志中这些记录只显示了操作内容,也确实未指明操作者是谁。

第三幕:Navicat的意外线索

不甘心就此放弃,阿祖又尝试从Navicat的本地日志中寻找蛛丝马迹。使用下述按键查看本地执行日志

CRTL+H 或者 CRTL+L

遗憾的是,由于版本限制,Navicat并未记录足够的操作日志。不过,一个念头在他脑海中闪过:会不会是在使用Navicat查看表结构时,不小心修改了字符集?这种误操作虽然罕见,但也并非不可能。此时有些烦躁,感觉已经接近真相但求而不得!

第四幕:Thread_id的真相揭露

就在阿祖准备接受这个不太确定的推测时,binlog中的一个细节再次引起了他的注意。通过比对,他发现删除索引和修改字符集的操作都来自同一个thread_id:22232080。
阿祖立刻行动,使用root用户登录MySQL,执行SHOW PROCESSLIST;命令,并导出结果。

SHOW PROCESSLIST;
+----------+------------+--------------------+----------------+---------+-------+-------+------------------+
| Id       | User       | Host               | db             | Command | Time  | State | Info             |
+----------+------------+--------------------+----------------+---------+-------+-------+------------------+
| 22220001 | dev_select | 10.98.98.90:62192  | testdb         | Sleep   | 22724 |       | NULL             |
| 22220002 | dev_select | 10.98.98.90:62195  | testdb         | Sleep   | 19917 |       | NULL             |
| 22220003 | dev_select | 10.98.98.90:62196  | testdb         | Sleep   | 19917 |       | NULL             |
| 22220004 | dev_select | 10.98.98.90:59780  | testdb         | Sleep   | 19917 |       | NULL             |
| 22232080 | root       | 10.98.98.160:58321 | mydatabase     | Sleep   |  1683 |       | NULL             |
...
+----------+------------+--------------------+----------------+---------+-------+-------+------------------+

在长长的列表中,他找到了thread_id为22232080的记录,让黄老邪查看本机ip后,其对应的host正是黄老邪电脑的IP地址。

第五幕:真相大白

面对铁证如山,黄老邪虽然没有印象操作过,但也不得不承认了事实。阿祖试着复现了“凶案”现场,在使用Navicat查看表结构时,鼠标不小心滑过字符集设置,当鼠标滚轮滚动时,字符集便被修改了。
“黄老邪啊黄老邪,你可真是邪门啊,哈哈哈哈!这下得请客喝奶茶了吧”阿祖笑着摇了摇头,但心中也暗自庆幸,总算找到了问题的根源。

在这里插入图片描述

尾声:教训与反思

这次事件不仅解决了系统的bug,也给所有同事上了一堂生动的课。大家纷纷表示,以后在使用具有修改权限的工具时,一定要更加小心谨慎,避免类似的误操作再次发生。而黄老邪,则因这次“意外”的壮举,被大家戏称为“字符集杀手”,当然,这只是同事间的一个善意的玩笑罢了。同时阿祖也在反思,如果黄老邪navicat关了还能查询到这个线程id吗?

彩蛋及下集看点:

昏暗的灯光下,保安室监控里,黄老邪在删除好索引后,便锁好了屏幕,去上厕所摸鱼去了,其他同事也在各自忙着自己的事情,办公室里一如往常的吵闹。突然!空气猛地变得肃静起来!黄老邪电脑屏幕亮了,屏幕上输入了密码解锁,并且用navicat打开了表结构,最终修改了字符集,并点击了保存,然后又把屏幕锁上,整个过程一气呵成,且无人察觉。最后,昏暗的保安室里,隐约听得一阵阵狂妄和阴森的笑声~

在这里插入图片描述

如果您对技术有兴趣,友好交流,可以加v进技术群一起沟通,v:zzs1067632338,备注csdn即可

在这里插入图片描述
bye~ bye~拜谢

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2036775.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

搭建高可用OpenStack(Queen版)集群(十二)之启动一个实例

一、搭建高可用OpenStack(Queen版)集群之启动一个实例 创建实例之前,首先要创建虚拟网络 一、创建网络 建议命令行和web管理协同进行配置,这样不容易出错 在控制节点执行 1、创建公有网络部分 1、在命令行执行 . admin-openrc ne…

【SQL】平均售价

目录 题目 分析 代码 题目 表:Prices ------------------------ | Column Name | Type | ------------------------ | product_id | int | | start_date | date | | end_date | date | | price | int | ---------------…

技术研究:Redis 数据结构与 I/O 模型

数据结构 Redis之所以“快”,一方面因为它是内存数据库,所有操作都在内存上完成,内存的访问速度本来就快。另一方面则是因为高效的数据结构,使得操作键值效率较高。总体来说,Redis使用了一个用来保存每个Key/Value的全…

【Story】如何高效记录并整理编程学习笔记?

目录 一、为何笔记在编程学习中如此重要?1.1 知识的捕捉1.2 理解和消化1.3 知识的复习1.4 知识的分享 二、建立高效的笔记系统2.1 确定笔记的目标2.2 选择合适的工具2.3 笔记的结构化2.4 记录有效的内容2.5 定期回顾和更新 三、保持笔记条理性的技巧3.1 使用一致的格…

【数据结构】堆排序与TOP-K问题

🌈个人主页:Yui_ 🌈Linux专栏:Linux 🌈C语言笔记专栏:C语言笔记 🌈数据结构专栏:数据结构 文章目录 1.堆排序1.1 建堆1.2 利用堆删除思想来进行排序1.3 堆排序的时间复杂度 2.TOP-K问…

Uniapp之微信小程序计算器

UI仿的iOS手机计算器,基本功能已经实现,如下效果图 具体使用可以参考微信小程序:日常记一记--我的---计算器 第一步:UI界面设计 1,strClass模块是计算过程代码展示 2,result-view模块是结果展示 3&#xff…

嵌入式学习---DAY24:进程--二

一、exec函数族----启动一个新程序 用fork创建子进程后执行的是和父进程相同的程序(但有可能执行不同的代码分支), 子进程往往要调用一种exec函数以执行另一个程序。当进程调用一种exec函数时,该进程的 用户空间代码和数据完全被…

SHT30温湿度传感器全解析——概况,性能,MCU连接,样例代码

常见温湿度传感器测量范围:(价格仅供参考,具体性能要看折线图) 型号DHT11DHT20AHT10AHT20AHT30SHT20价格¥ 2.49¥3.04¥ 1.9¥1.4¥ 1.3¥5.5温度测量范围20—90%RH0—100%RH0—100%RH0—…

pycharm最新专业版激活码

pycharm最新专业版激活码 Pycharm下载地址:pycharm下载 首先,我们打开下载的 pycharm 专业版并安装。 按照下图所示先点击上方的 Activation code,再将激活码粘贴至输入框,最后点击 Activate 激活。 激活码: OS2AN…

旋转关系介绍

目录 旋转矩阵与轴角 旋转矩阵与欧拉角 旋转矩阵与四元数 轴角与四元数 轴角与欧拉角 欧拉角与四元数 欧拉角与四元数 旋转矩阵与轴角 设旋转矩阵R[■8(r_11&r_12&r_13r_21&r_22&r_23r_31&r_32&r_33)],轴角使用一个单位向量n和一个角…

Go--GMP调度模型

目录 GMP模型G、M、P简介P和M的个数**P和M何时会被创建**goroutine创建流程goroutine什么时候会被挂起 GMP的调度调度流程调度策略调度时机同时启动了一万个goroutine,会如何调度? GMP模型 G、M、P简介 GMP是Go运行时调度层面的实现,包含4个…

质量对中国开发商提升游戏品牌信誉和信任度的影响

随着全球游戏产业的持续增长,中国开发商正在大举进军国际市场。然而,他们面临的关键挑战之一是建立和维护与全球参与者的品牌信誉和信任。他们的游戏质量在实现这一目标方面起着至关重要的作用。从技术性能到故事讲述和本地化,高质量的游戏对…

OpenGL3.3_C++_Windows(35)

PBR_IBL漫反射 IBL图像的光照(Image based lighting):非直接光源,它是一种更精确的环境光照输入格式,甚至也可以说是一种全局光照的粗略近似。环境光照:获取每个wi光源辐射率,求辐照度:将周围环…

Linux学习笔记11(计算机网络)

目录 网络七层模型/五层模型 IP地址分类 CIDR Centos7的网卡IP配置 RockyLinux9的网卡IP配置 网络七层模型/五层模型 自下到上 物理层: 建立物理连接,传输 0 和 1 的比特流 数据链路层: 物理地址寻址,流量控制,差错…

基于vue框架的SSM基于B_S的毕业设计题目管理系统的设计与实现ij0q7(程序+源码+数据库+调试部署+开发环境)系统界面在最后面。

系统程序文件列表 项目功能:学生,教师,毕设题目,毕设选题,毕设任务书,开题报告,中期检查,毕业论文,论文成绩,答辩成绩,答辩通知,班级 开题报告内容 基于Vue框架的SSM(SpringSpring MVCMyBatis)的毕业设计题目管理系统设计与实现 开题报告…

刷题记录第109天-K个一组反转链表

解题思路: 第一步:实现一个数组,给定一段链表的头结点和尾节点,反转该链表,并返回新的头结点和尾结点。 第二步:初始化一个虚拟头结点,用于记录最终头结点和规范操作。 第三步:给定一…

​产品经理-​你如何理解“互联网思维(35)

在产品规划和功能改版中,确实非常重视用户需求和体验。产品需求是互联网产品的核心 用户体验是互联网产品的重点。在互联网新产品规划中,会非常重视用户验证环节 确保做出来的东西确实是用户想要的;而在已经上线的产品中,往往会有…

Raspberry Pi Pico 家族的进化 —— RP2040、RP2350与RP2354性能比较

随着树莓派Pico系列的不断扩展,其背后的芯片也得到了升级和改进。从最初的RP2040到最新的RP2354,每一次迭代都带来了新的功能和性能提升。本文将详细对比RP2040、RP2350和RP2354三款芯片的关键特性,帮助开发者了解它们的差异,并选…

Windows File Recovery卡在99%怎么解决?实用指南!

为什么会出现“Windows File Recovery卡在99%”的问题? Windows File Recovery(Windows文件恢复)是微软设计的命令行应用程序。它可以帮助用户从健康/损坏/格式化的存储设备中恢复已删除/丢失的文件。 通过输入相关命令,设置源/…

【轨物推荐】技术创新的演进逻辑

注:本文节选自郭朝晖老师的《知行-工业基因的数字化演进》 推进数字化技术的过程本质上是一种技术创新。理解创新的逻辑,有利于推进数字化技术。 科技工作的价值往往短期被高估,长期被低估。短期被高估,是因为忽视了技术应用过程…