【技术实操】银河高级服务器操作系统实例分享,数据库日志文件属主不对问题分析

news2024/11/16 13:26:20

1. 问题现象描述

2023 年 06 月 30 日在迁移数据库过程中,遇到数据库 crash 的缺陷,原因如下:在数据库启动时候生成的一组临时文件中,有 owner 为 root 的文件, 文件权限默认为 640, 当数据库需要使用的时候, mysql 用户又没有权限,然后直接导致数据库 crash,临时文件如下:

-rw-r----- 1 mysql dbgrp 33554432 Jun 30 17:44 '#ib_redo1_tmp'

-rw-r----- 1 mysql dbgrp 33554432 Jun 30 17:44 '#ib_redo2_tmp'

-rw-r----- 1 mysql dbgrp 33554432 Jun 30 17:44 '#ib_redo3_tmp'

-rw-r----- 1 mysql dbgrp 33554432 Jun 30 17:44 '#ib_redo4_tmp'

-rw-r----- 1 mysql dbgrp 33554432 Jun 30 17:44 '#ib_redo5_tmp'

-rw-r----- 1 mysql dbgrp 33554432 Jun 30 17:44 '#ib_redo6_tmp'

-rw-r----- 1 mysql dbgrp 33554432 Jun 30 17:44 '#ib_redo7_tmp'

-rw-r----- 1 mysql dbgrp 33554432 Jun 30 17:44 '#ib_redo8_tmp'

-rw-r----- 1 mysql dbgrp 33554432 Jun 30 17:44 '#ib_redo9_tmp'

-rw-r----- 1 mysql dbgrp 33554432 Jun 30 17:44 '#ib_redo10_tmp'

-rw-r----- 1 mysql dbgrp 33554432 Jun 30 17:44 '#ib_redo11_tmp'

-rw-r----- 1 mysql dbgrp 33554432 Jun 30 17:44 '#ib_redo12_tmp'

-rw-r----- 1 mysql dbgrp 33554432 Jun 30 17:44 '#ib_redo13_tmp'

-rw-r----- 1 mysql dbgrp 33554432 Jun 30 17:44 '#ib_redo14_tmp'

-rw-r----- 1 mysql dbgrp 33554432 Jun 30 17:44 '#ib_redo15_tmp'

-rw-r----- 1 mysql dbgrp 33554432 Jun 30 17:44 '#ib_redo16_tmp'

-rw-r----- 1 mysql dbgrp 33554432 Jun 30 17:44 '#ib_redo17_tmp'

-rw-r----- 1 mysql dbgrp 33554432 Jun 30 17:44 '#ib_redo18_tmp'

-rw-r----- 1 mysql dbgrp 33554432 Jun 30 17:44 '#ib_redo19_tmp'

-rw-r----- 1 mysql dbgrp 33554432 Jun 30 17:44 '#ib_redo20_tmp'

-rw-r----- 1 mysql dbgrp 33554432 Jun 30 17:44 '#ib_redo21_tmp'

-rw-r----- 1 mysql dbgrp 33554432 Jun 30 17:44 '#ib_redo22_tmp'

-rw-r----- 1 root dbgrp 33554432 Jun 30 17:44 '#ib_redo23_tmp'

-rw-r----- 1 root dbgrp 33554432 Jun 30 17:44 '#ib_redo24_tmp'

-rw-r----- 1 root dbgrp 33554432 Jun 30 17:44 '#ib_redo25_tmp'

-rw-r----- 1 root dbgrp 33554432 Jun 30 17:44 '#ib_redo26_tmp'

-rw-r----- 1 root dbgrp 33554432 Jun 30 17:44 '#ib_redo27_tmp'

-rw-r----- 1 root dbgrp 33554432 Jun 30 17:44 '#ib_redo28_tmp'

-rw-r----- 1 root dbgrp 33554432 Jun 30 17:44 '#ib_redo29_tmp'

-rw-r----- 1 root dbgrp 33554432 Jun 30 17:44 '#ib_redo30_tmp'

-rw-r----- 1 root dbgrp 33554432 Jun 30 17:44 '#ib_redo31_tmp'

-rwxrwxrwx 1 mysql dbgrp 33554432 Jun 30 17:46 '#ib_redo0'

通过分析代码发现,这些都是在数据库启动的时候一起创建的,启动的时候,会删除现有的临时文件(带 tmp 的文件),然后再根据#ib_redoN_tmp(本例为 0), 创建后续的临时文件,本例从#ib_redo1_tmp 开始,创建 31 个临时文件,但是,经常出现后面几个文件的 owner 变成了 root, 具体有几个文件的 owner 是 root 也不固定,有时候只有 1-2 个,有时候有 10 来个,有时候一个都没有。

现场认为: 从理论上跟实际来讲, MySQlD 进程创建的所有文件的 owner ,都应该

是 mysql , mysql 没有理由跟必要去修改自己的文件的 owner 为 root, 通过官方网站的后续版本也没有发现关于这个现象的任何介绍,目前暂时怀疑是操作系统创建文件时的一些差异。

2. 问题分析

检查 my.conf 中配置的相关 mysql 目录权限,目录属主和属组为 mysql:dbgrp,

未发现异常。 my.cnf 如图 1

图 1

mysql 相关目录及权限如图 2,值得注意的是网上有提到, mysql 有些日志目录权

限不能为 777,得改成 700,如 redo_log 目录(此处仅作为参考供数据库厂家确认)

图 2

检查 my.cnf 文件配置参数,发现未配置 user=mysql 参数,但是检查 mysql 进程可以看到进程启动是带了—user=mysql 的,所以 mysqld 进程是完全以 mysql 用户启

动的,未见异常,如图 3

图 3

将启动脚本写在 /etc/rc.local 中,重启服务器进行测试,数据库产生的临时文件属主正常。但是如果在启动之后, 将启动脚本写在/etc/rc.local 中,执行systemctl restart rc-local,这样启动数据库后,有概率性产生的#ib_redoN_tmp文件属主不正常,并且每次都是从#ib_redo26_tmp 开始才会有属主为 root 的问题,#ib_redo25_tmp 及之前的 tmp 文件属主为正常的 mysql。 如图 4

图 4

/etc/rc.local 启动脚本如图 5

图 5

怀疑是写在 rc-local 中,有些资源或者配置没有完全加载完的原因,或者是环境变量不一致的原因导致的该差异。由于现场没有 root 密码,不能以 single 的方式进入单用户进行验证,所以后续将重点放在了环境量是否有差异上面。

经过测试,通过堡垒机的方式 ssh 到服务器上,执行数据库启动命令存在#ib_redoN_tmp 属主为 root 的问题、通过平台 console 的方式同样也有该问题,但是,如果是先通过堡垒机方式 ssh 到服务,然后执行 su - root 的方式,这样在启动数据库,就不会有问题。这步怀疑,可能是几种登录方式的不一致,各自的环境变量不同导致的该问题。

通过 set > /tmp/set.baolei 和 su - root 后 set > /tmp/set.root 做对比vimdiff /tmp/set.baolei /tmp/set.root 发现变量存在很大差异,包含 PATH 等变量均有不同处。 Vimdiff 结果如图 6、图 7、图 8

图 6

图 7

图 8

查看当前系统相关环境变量配置文件,如: /etc/profile, /root/.bashrc/root/.bash_profile 等,无异常 mysql 变量,如图 9、图 10、图 11

图 9

图 10

图 11

从 目 前 来 看 , 环 境 变 量 的 不 一 致 并 非 /etc/profile 、 /root/.bashrc 、/root/.bash_profile 引起,而是由于登录方式的不一致导致。

继续寻找根源,配置 audit 审计规则,发现异常时候, audit 审计到虽然都是mysqld 进程里面的某个线程创建的#ib_redo26_tmp 文件,但是异常时候, euid 也就是有效用户却是 root 而非 mysql, 如图 12

图 12

而正常时候, audit 审计到的有效用户 euid 却是 mysql, 如图 13,怀疑是 mysqld在创建第#ib_undo26_tmp 之前,有一段逻辑将有效用户设置为了 root。

图 13

通 过 strace 抓 取 异 常 和 正 常 时 候 的 系 统 调 用 , 发 现 异 常 时 候 , 在 创建!ib_redo25_tmp 和!ib_redo26_tmp 之间存在 setreuid 设置 uid 行为, `setreuid(-1,0)=0`是一个系统调用的返回值,表示调用成功执行。具体来说,这个系统调用是用于修改进程的实际用户 ID(ruid)和有效用户 ID(euid),其中, `-1`表示保持原有的 ruid 不变, `0`表示将 euid 设置为 0(即 root 用户)。

在 Linux 系统中,进程的 ruid 和 euid 通常是相同的。通过`setreuid()`系统调用,可以修改进程的 ruid 和 euid,从而改变进程的权限。如果这个调用返回了 0,则表示修改成功,否则返回的是一个错误码,表示修改失败。 如图 14

这也和从!ib_redo26_tmp 及之后的属主变成 root 吻合。

图 14

而正常时候的 strace 信息,则是在线程创建完所有的#!b_redoN_tmp 之后,才执行 setreuid 操作,如图 15。

图 15

通过以上分析,发现启动过程中调用了 setreuid 方法,对比异常与正常日志,发现此参数出现的位置也所有不同,正常的是在日志生成后才有设置 setereuid,而异常的是在日志生成过程产生,从而有 root 属主问题,其中 setreuid 参数调用时会修改有效用户导致后续生产日志文件属主变 root。

并且在 mysql 的源码中,存在设置 euid 逻辑的代码, 如图 16, 需要麻烦数据库厂家同事一起排查,是否是由于环境变量不一致,触发了数据库里面的某一段逻辑,使得提前执行了 setreuid 的操作,从而导致了后续#ib_redoN_tmp 文件属组变成了root。

图 16

3. 问题分析结果

初步怀疑是由于 msyqld 提前调用 setreuid 将线程的有效用户设置为了 root,使得接下里产生的日志文件属主变成了 root,需要数据库厂家结合代码看一下该段逻辑是怎么样的,看是否和环境变量有直接或者间接的关系。

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

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

相关文章

重生奇迹mu魔剑职业技能一览

1、火剑袭:魔剑士三转前4个技能中,核心技能火剑袭为buff技能,可在短时间内大幅提升自身伤害输出能力,由于提升的数值依赖于技能等级,因此一个高技能等级魔剑士的爆发能力相当恐怖。 2、天雷闪:是剩余技能中…

Sapphire开发日志(四)

任务描述 本周任务,将模型进行封装,实现模型推理的基本API,从而可以根据输入数据输出蒙版数据。 模型输入数据处理 首先进行模型输入数据的预处理。首先支持点击和框选两种模式,所以这里需要对这两种模式进行适配。 modelData…

微信小程序蓝牙连接部分Android14调用wx.setBLEMTU协商低功耗最大传输单元失败解决方案(部分安卓14设置超过23就会报错)

1.解决方案的核心内容:第一次设置失败不要管,在complate函数里面继续往下连接,然后设置一个定时器每1秒钟在重新设置一次,肯定会成功的!!!!!!!&am…

使用compile_commands.json配置includePath环境,解决vscode中引入头文件处有波浪线的问题

通过编译时生成的 compile_commands.json 文件自动完成对 vscode 中头文件路径的配置,实现 vscode 中的代码的自动跳转。完成头文件路径配置后,可以避免代码头部导入头文件部分出现波浪线,警告说无法正确找到头文件。 步骤 需要在 vscode 中…

Java Sort 方法的使用(包含Arrays.sort(),Collections.sort()以及Comparable,Comparator的使用 )

目录 Comparable && Comparator的使用: Comparable: Comparator: Arrays.sort()的使用: 升序排序: 降序排序: 自定义排序方法: 在日常的刷题或开发中,很多时候我们需要对数据进行排序,以达到我…

【PHP项目实战训练】——laravel框架的实战项目中可以做模板的增删查改功能(1)

👨‍💻个人主页:开发者-曼亿点 👨‍💻 hallo 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅! 👨‍💻 本文由 曼亿点 原创 👨‍💻 收录于专栏&#xff1a…

【银河麒麟V10服务器OS-系统根分区扩容】指导教程手册

【银河麒麟V10服务器OS-系统根分区扩容】指导教程手册 环境信息:VMware虚拟软件16.0 首先查看KylinOS服务器版本:nkvers 备注: (Tercel) 版本是 V10 SP1 版本, (Sword) 版本是 V10 SP2 版本, (Lance) 版本是 V10 …

开源与闭源 AI 模型:发展路径的比较与前瞻

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

super().__init__() 来自于哪个PEP

super() 的简化用法(即不带参数的 super())是在 Python 3 中引入的。这个改进是由 PEP 3135 规范化的。 PEP 3135: New Super PEP 3135 标题为 “New Super”。它介绍了一种新的方式来调用超类的方法,即不再需要显式地传递当前类和实例&…

前端Vue小兔鲜儿电商项目实战Day04

一、二级分类 - 整体认识和路由配置 1. 配置二级路由 ①准备组件模板 - src/views/SubCategory/index.vue <script setup></script><template><div class"container"><!-- 面包屑 --><div class"bread-container">…

软件需求规格说明书(Word原件@配套软件全资料)

软件需求规格说明书编写规范编写规范 1.项目背景 2.项目目标 3.系统架构 4.总体流程 5.名称解释 6.功能模块 软件项目相关全套精华资料包获取方式①&#xff1a;点我获取 获取方式②&#xff1a;本文末个人名片直接获取。 软件资料清单列表部分文档清单&#xff1a;工作安排任…

python操作mongodb底层封装并验证pymongo是否应该关闭连接

一、pymongo简介 https://pymongo.readthedocs.io/en/stable/github地址&#xff1a;https://github.com/mongodb/mongo-python-driver mymongo安装命令&#xff1a;pip install pymongo4.7.2 mymongo接口文档&#xff1a;PyMongo 4.7.2 Documentation PyMongo发行版包含Py…

AI绘画Stable Diffusion【实战】一下给我整破防了!!SD制作商业海报——香水海报

大家好&#xff0c;我是画画的小强 今天给大家分享关于SD制作商业海报案例——香水海报。内容很干&#xff0c;但很实用&#xff0c;后续也会持续分享一些其他商业海报的制作案例&#xff0c;喜欢的朋友请持续关注 人“狠”话不多&#xff0c;大家请上车&#xff01;&#xff…

VB.net 进行CAD二次开发(二)

利用参考文献2&#xff0c;添加面板 执行treeControl New UCTreeView()时报一个错误&#xff1a; 用户代码未处理 System.ArgumentException HResult-2147024809 Message控件不支持透明的背景色。 SourceSystem.Windows.Forms StackTrace: 在 System.Windows…

Java流与链表:探索java.util.stream与LinkedList的交汇点

在现代Java开发中&#xff0c;流&#xff08;Streams&#xff09;和链表&#xff08;LinkedList&#xff09;都是强大且常用的数据处理工具。java.util.stream提供了高效的方式来处理数据流&#xff0c;而LinkedList则是java.util包中的经典集合实现。本文将探索它们的交汇点&a…

手拉手springboot整合kafka发送消息

环境介绍技术栈springbootmybatis-plusmysqlrocketmq软件版本mysql8IDEAIntelliJ IDEA 2022.2.1JDK17Spring Boot3.1.7kafka2.13-3.7.0 创建topic时&#xff0c;若不指定topic的分区(Partition主题分区数)数量使&#xff0c;则默认为1个分区(partition) springboot加入依赖kafk…

MySQL排序字段无法唯一标识一条数据,导致分页查询结果出现重复或遗漏问题

问题描述 MySQL排序字段无法唯一标识一条数据&#xff0c;且排序字段可能有多个&#xff0c;多个排序字段无法唯一标识一条数据&#xff0c;即排序字段标识的相同数据过多&#xff0c;可能导致分页查询出现重复或遗漏的情况。 具体说明&#xff1a;      如果在排序条件中…

Stable Diffusion AI绘画:从创意词汇到艺术图画的魔法之旅

文章目录 一、Stable Diffusion的工作原理二、从提示词到模型出图的过程三、Stable Diffusion在艺术创作中的应用《Stable Diffusion AI绘画从提示词到模型出图》内容简介作者简介楚天 目录前言/序言本书特色特别提示 获取方式 在科技的飞速发展中&#xff0c;Stable Diffusion…

江协科技STM32学习-1 购买24Mhz采样逻辑分析仪

前言&#xff1a; 本文是根据哔哩哔哩网站上“江协科技STM32”视频的学习笔记&#xff0c;在这里会记录下江协科技STM32开发板的配套视频教程所作的实验和学习笔记内容。本文大量引用了江协科技STM32教学视频和链接中的内容。 引用&#xff1a; STM32入门教程-2023版 细致讲…

机器人系统ros2-开发学习实践16-RViz 用户指南

RViz 是 ROS&#xff08;Robot Operating System&#xff09;中的一个强大的 3D 可视化工具&#xff0c;用于可视化机器人模型、传感器数据、路径规划等。以下是RViz用户指南&#xff0c;帮助你了解如何使用RViz来进行机器人开发和调试。 启动可视化工具 ros2 run rviz2 rviz2…