当前位置: 首页 > news >正文

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

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,需要数据库厂家结合代码看一下该段逻辑是怎么样的,看是否和环境变量有直接或者间接的关系。

相关文章:

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

1. 问题现象描述 2023 年 06 月 30 日在迁移数据库过程中,遇到数据库 crash 的缺陷,原因如下:在数据库启动时候生成的一组临时文件中,有 owner 为 root 的文件, 文件权限默认为 640, 当数据库需要使用的时…...

函数的创建和调用

自学python如何成为大佬(目录):https://blog.csdn.net/weixin_67859959/article/details/139049996?spm1001.2014.3001.5501 提到函数,大家会想到数学函数吧,函数是数学最重要的一个模块,贯穿整个数学学习过程。在Python中,函数…...

数模混合芯片设计中的修调技术是什么?

一、修调目的 数模混合芯片需要修调技术主要是因为以下几个原因: 工艺偏差(Process Variations): 半导体制造过程中存在不可避免的工艺偏差,如晶体管尺寸、阈值电压、电阻和电容值等,这些参数的实际值与…...

MySQL 自定义函数(实验报告)

一、实验名称: 自定义函数 二、实验日期: 2024年 6 月 1 日 三、实验目的: 掌握MySQL自定义函数的创建及调用; 四、实验用的仪器和材料: 硬件:PC电脑一台; 配置:内存&#…...

一次职业院校漏洞挖掘

这个是之前挖掘到的漏洞,目前网站进行重构做了全新的改版,但是这个漏洞特别经典,拿出来进行分享。看到src上面的很多敏感信息泄露,所以自己也想找一个敏感信息泄露,官网如图: 发现在下面有一个数字校园入口…...

洪师傅代驾系统开发 支持公众号H5小程序APP 后端Java源码

代驾流程图 业务流程图 管理端设置 1、首页装修 2、师傅奖励配置 师傅注册后,可享受后台设置的新师傅可得的额外奖励; 例:A注册了师傅,新人奖励可享受3天,第一天的第一笔订单完成后可得正常佣金佣金*奖励比例 完成第二笔/第三笔后依次可得正常佣金佣金*奖励比例 完成的第四…...

View->Bitmap缩放到自定义ViewGroup的任意区域(Matrix方式绘制Bitmap)

Bitmap缩放和平移 加载一张Bitmap可能为宽高相同的正方形,也可能为宽高不同的矩形缩放方向可以为中心缩放,左上角缩放,右上角缩放,左下角缩放,右下角缩放Bitmap中心缩放,包含了缩放和平移两个操作&#xf…...

Centos 7部署NTP

介绍 NTP是Network Time Protocol(网络时间协议)的简称,它是用来通过互联网或局域网将计算机时钟同步到世界协调时间(UTC)的协议。 安装 # yum安装 yum install -y ntp# 离线安装 #下载地址:https://mir…...

【前缀和】42. 接雨水

本文涉及知识点 C算法:前缀和、前缀乘积、前缀异或的原理、源码及测试用例 包括课程视频 LeetCode42. 接雨水 给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。 示例 1: 输入&am…...

我的名字叫大数据

第1章 大家好,我叫大数据 1.1 我的家族传统:从我小小的祖先到壮大的我 1.1.1 最初的我:原始部落里的计数石头 大家好,我是你们人类文明的“老朋友”——大数据。你们知道吗?在我还没有变成你们手机、电脑里飞速跑动的那些数字前,我最初的模样可是一块块“计数石头”。…...

数据库漫谈-infomix

infomix数据库知名度不高,主要跟它的定位有关,它主要用于unix操作系统:Informix便是取自Information和Unix的结合,它也是第一个支持linux系统的数据库。它其实在金融、电信行业使用率非常高。98年,当时我在做银行领域的…...

【Qt】Qt界面美化指南:深入理解QSS样式表的应用与实践

文章目录 前言:1. 背景介绍2. 基本语法3. QSS 设置方式3.1. 设置全局样式3.2. 从文件加载样式表3.3. 使用 Qt Designer 编辑样式 总结: 前言: 在当今这个视觉至上的时代,用户界面(UI)的设计对于任何软件产…...

七彩云南文化旅游网站的设计

管理员账户功能包括:系统首页,个人中心,管理员管理,游客管理,导游管理,旅游景点管理,酒店信息管理 前台账户功能包括:系统首页,个人中心,论坛,旅…...

7-zip安装教程

一、简介 7-Zip 是一款开源的文件压缩软件,由 Igor Pavlov 开发。它具有高压缩比、支持多种格式、跨平台等特点。使用 C语言编写,其代码在 Github 上开源。 7-Zip的官网: 7-Zip 7-zip官方中文网站: 7-Zip 官方中文网站 7-Zip 的 G…...

oracle 12c DB卸载流程

1.运行卸载程序 [rootprimary1 ~]# su - oracle [oracleprimary1 ~]$ cd $ORACLE_HOME/deinstall [oracleprimary1 deinstall]$ ./deinstall Checking for required files and bootstrapping ... Please wait ... 这里选择3 、回车、y、y、回车、ASM 这里输入y 2.删除相关目录…...

Docker学习笔记 - 创建自己的image

目录 基本概念常用命令使用docker compose启动脚本创建自己的image 使用Docker是现在最为流行的软件发布方式, 本系列将阐述Docker的基本概念,常用命令,启动脚本和如何生产自己的docker image。 在我们发布软件时,往往需要把我…...

java web爬虫

目录 读取本地文件 从网站读取文件 java爬虫 总结 读取本地文件 import java.io.File; import java.io.PrintWriter; import java.util.Scanner;public class ReplaceText {public static void main() throws Exception{File file new File("basic\\test.txt"…...

MySQL开发教程和具体应用案例

一、MySQL开发教程 初识数据库 定义:数据仓库,安装在操作系统之上,用于存储和管理数据。 分类:关系型数据库(如MySQL、Oracle、SQL Server)和非关系型数据库(如Redis、MongoDB)。 SQL:结构化查询语言,用于管理和操作关系型数据库。 操作数据库 创建、修改、删除…...

QT C++ 模型视图结构 QTableView 简单例子

在Qt中,MVC模式被广泛使用于各种用户界面框架中,包括Qt的模型视图结构。Qt的模型视图结构是基于MVC模式设计的,其中包括了Model、View和Delegate三个部分。 QTableView是Qt模型视图结构中的一种视图,它用于以表格形式显示数据。 …...

2024年3月电子学会Python编程等级考试(四级)真题题库

2024年3月青少年软件编程Python等级考试(四级)真题试卷 题目总数:38 总分数:100 选择题 第 1 题 单选题 运行如下Python代码,若输入整数3,则最终输出的结果为?( &#xff…...

golang循环变量捕获问题​​

在 Go 语言中,当在循环中启动协程(goroutine)时,如果在协程闭包中直接引用循环变量,可能会遇到一个常见的陷阱 - ​​循环变量捕获问题​​。让我详细解释一下: 问题背景 看这个代码片段: fo…...

Rapidio门铃消息FIFO溢出机制

关于RapidIO门铃消息FIFO的溢出机制及其与中断抖动的关系,以下是深入解析: 门铃FIFO溢出的本质 在RapidIO系统中,门铃消息FIFO是硬件控制器内部的缓冲区,用于临时存储接收到的门铃消息(Doorbell Message)。…...

ip子接口配置及删除

配置永久生效的子接口,2个IP 都可以登录你这一台服务器。重启不失效。 永久的 [应用] vi /etc/sysconfig/network-scripts/ifcfg-eth0修改文件内内容 TYPE"Ethernet" BOOTPROTO"none" NAME"eth0" DEVICE"eth0" ONBOOT&q…...

Springboot社区养老保险系统小程序

一、前言 随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱,社区养老保险系统小程序被用户普遍使用,为方…...

微软PowerBI考试 PL300-在 Power BI 中清理、转换和加载数据

微软PowerBI考试 PL300-在 Power BI 中清理、转换和加载数据 Power Query 具有大量专门帮助您清理和准备数据以供分析的功能。 您将了解如何简化复杂模型、更改数据类型、重命名对象和透视数据。 您还将了解如何分析列,以便知晓哪些列包含有价值的数据,…...

Java + Spring Boot + Mybatis 实现批量插入

在 Java 中使用 Spring Boot 和 MyBatis 实现批量插入可以通过以下步骤完成。这里提供两种常用方法&#xff1a;使用 MyBatis 的 <foreach> 标签和批处理模式&#xff08;ExecutorType.BATCH&#xff09;。 方法一&#xff1a;使用 XML 的 <foreach> 标签&#xff…...

Go 语言并发编程基础:无缓冲与有缓冲通道

在上一章节中&#xff0c;我们了解了 Channel 的基本用法。本章将重点分析 Go 中通道的两种类型 —— 无缓冲通道与有缓冲通道&#xff0c;它们在并发编程中各具特点和应用场景。 一、通道的基本分类 类型定义形式特点无缓冲通道make(chan T)发送和接收都必须准备好&#xff0…...

【JVM】Java虚拟机(二)——垃圾回收

目录 一、如何判断对象可以回收 &#xff08;一&#xff09;引用计数法 &#xff08;二&#xff09;可达性分析算法 二、垃圾回收算法 &#xff08;一&#xff09;标记清除 &#xff08;二&#xff09;标记整理 &#xff08;三&#xff09;复制 &#xff08;四&#xff…...

AI语音助手的Python实现

引言 语音助手(如小爱同学、Siri)通过语音识别、自然语言处理(NLP)和语音合成技术,为用户提供直观、高效的交互体验。随着人工智能的普及,Python开发者可以利用开源库和AI模型,快速构建自定义语音助手。本文由浅入深,详细介绍如何使用Python开发AI语音助手,涵盖基础功…...

Linux部署私有文件管理系统MinIO

最近需要用到一个文件管理服务&#xff0c;但是又不想花钱&#xff0c;所以就想着自己搭建一个&#xff0c;刚好我们用的一个开源框架已经集成了MinIO&#xff0c;所以就选了这个 我这边对文件服务性能要求不是太高&#xff0c;单机版就可以 安装非常简单&#xff0c;几个命令就…...