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

【mysql系】mysql启动异常Can‘t create test file localhost.lower-test

1.查看通过下面命令获取对应mysql配置文件

whereis my.cnf

2.查看日志文件

下面这里是对应的错误日志

2025-03-03T06:33:56.402057Z 0 [Warning] TIMESTAMP with implicit DEFAULT value is deprecated. Please use --explicit_defaults_for_timestamp server option (see documentation for more details).
2025-03-03T06:33:56.402351Z 0 [Warning] Can't create test file /home/xxx/data/mysql/localhost.lower-test
2025-03-03T06:33:56.402412Z 0 [Note] /usr/sbin/mysqld (mysqld 5.7.35-log) starting as process 4020 ...
2025-03-03T06:33:56.405813Z 0 [Warning] Can't create test file /home/xxx/data/mysql/localhost.lower-test
2025-03-03T06:33:56.405861Z 0 [Warning] Can't create test file /home/xxx/data/mysql/localhost.lower-test
mysqld: File './mysql-bin.index' not found (Errcode: 13 - Permission denied)
2025-03-03T06:33:56.406318Z 0 [ERROR] Aborting

2025-03-03T06:33:56.406355Z 0 [Note] Binlog end
2025-03-03T06:33:56.406572Z 0 [Note] /usr/sbin/mysqld: Shutdown complete

3.查看相关目录是否有对应的目录权限,

我们都知道mysql安装的话,为了增强数据安全,mysqlf安装通常会创建一个名为mysql的系统用户和用户组,而不是root用户。默认数据目录归属mysql:mysql 这样的用户和用户组的身份权限

ls -ld /home/xxx/data/mysql

可以看到数据目录权限没有问题

4.了解SELinux

那上面的权限没有问题,为什么日志还是提示没有权限访问的异常呢?回想记得linux在控制操作系统目录权限有个SELinux的东西,

我们借助ai了解下

SELinux(Security-Enhanced Linux)是 Linux 内核的一个 ​强制访问控制(MAC,Mandatory Access Control)​​ 安全模块,由美国国家安全局(NSA)开发并开源。它的核心目标是为 Linux 系统提供更细粒度的权限控制,弥补传统 Linux 权限(DAC,自主访问控制)的不足,增强系统安全性。

下面是ai给我们的回复

SELinux 的核心作用
1. ​强制访问控制(MAC)​
​传统 Linux 权限(DAC)的问题:
通过 chmod 和 chown 设置的权限是“自主”的,用户或进程可以自由修改文件权限。一旦某个进程被入侵(如 Web 服务器被攻破),攻击者可以利用该进程的权限肆意操作。
​SELinux 的解决方案:
定义严格的规则(策略),明确指定 ​哪些进程可以访问哪些资源​(文件、端口等)。即使进程拥有 root 权限,若不符合 SELinux 规则,依然会被拒绝访问。
2. ​最小权限原则
每个进程只能访问完成其任务所必需的资源,其他操作默认禁止。例如:
Apache 只能访问 /var/www/html 目录,无法读取 /etc/shadow。
MySQL 只能写入其数据目录,不能修改系统配置文件。
3. ​防御未知漏洞
即使应用程序存在漏洞(如缓冲区溢出),SELinux 也能限制被入侵进程的行为,防止横向渗透。
4. ​保护敏感资源
控制对系统关键文件、端口、设备的访问。例如:
禁止非授权进程监听 80 端口。
禁止普通用户修改系统日志。
​SELinux 的三种运行模式
模式	说明
​Enforcing​	强制执行 SELinux 策略,违反规则的操作会被阻止并记录日志(生产环境推荐)。
​Permissive	仅记录违规行为,不阻止操作(用于调试和策略测试)。
​Disabled​	完全禁用 SELinux(不推荐,会降低系统安全性)。
查看当前模式:
bash
getenforce  # 输出 Enforcing/Permissive/Disabled
临时切换模式:
bash
setenforce 1  # Enforcing 模式
setenforce 0  # Permissive 模式
​SELinux 的关键概念
1. ​上下文(Context)​
每个进程、文件、端口等资源都有一个 SELinux 上下文标签,格式为:
user:role:type:level(常用的是 type 字段)。
示例:
bash
# 查看文件的 SELinux 上下文
ls -Z /var/www/html/index.html
# 输出:system_u:object_r:httpd_sys_content_t:s0 index.html

# 查看进程的 SELinux 上下文
ps -Z $(pgrep httpd)
# 输出:system_u:system_r:httpd_t:s0
2. ​策略(Policy)​
预定义规则集合,描述允许的操作(例如:httpd_t 类型的进程可以读取 httpd_sys_content_t 类型的文件)。
默认策略包:
targeted:仅保护关键服务(默认)。
mls:多级安全策略(军事级)。
3. ​布尔值(Boolean)​
动态调整策略的开关。例如,允许 Apache 访问用户家目录:
bash
setsebool -P httpd_enable_homedirs on
​SELinux 的典型应用场景
1. ​Web 服务器(Apache/Nginx)​
默认只能访问 /var/www/html。若网站目录更改到 /opt/webapp,需修改上下文:
bash
semanage fcontext -a -t httpd_sys_content_t "/opt/webapp(/.*)?"
restorecon -Rv /opt/webapp
2. ​数据库(MySQL/PostgreSQL)​
数据目录必须标记为 mysqld_db_t。自定义路径时需修复上下文(如你的案例)。
3. ​自定义端口
若要让 Nginx 监听 8080 端口,需授权:
bash
semanage port -a -t http_port_t -p tcp 8080
​为什么不应禁用 SELinux?
​降低安全防护:禁用后,系统仅依赖传统 Linux 权限,易受提权攻击。
​合规性要求:许多安全标准(如 PCI DSS)要求启用 MAC 机制。
​调试优先于禁用:遇到权限问题时,应通过日志分析并修复策略,而不是直接关闭 SELinux。
​SELinux 日志与故障排查
查看 SELinux 拒绝记录:
bash
# 安装分析工具
yum install setroubleshoot -y  # CentOS/RHEL
apt install setroubleshoot -y  # Ubuntu/Debian

# 查看日志
grep "AVC denied" /var/log/audit/audit.log
根据日志提示使用 audit2allow 生成临时规则:
bash
audit2allow -a -M mypolicy
semodule -i mypolicy.pp
​总结
SELinux 是 Linux 系统的“超级保镖”,通过强制访问控制提供纵深防御。虽然初期学习成本较高,但正确配置后能显著提升系统安全性。遇到权限问题时,应优先通过 semanage、restorecon 和布尔值调整策略,而非简单禁用。

查看对应SELinux的模式

getenforce

我们调试执行setenforce 0 命令,mysql确实可以正常启动了。但是这种方式根据ai的回复是有风险的,那我们正确处理的方法怎么处理呢?

5.修复 SELinux 上下文

MySQL 默认数据目录的 SELinux 上下文类型为 mysqld_db_t,需将自定义目录标记为此类型:

sudo yum install policycoreutils-python -y

# 添加 SELinux 规则(允许递归标记所有子文件/目录)
semanage fcontext -a -t mysqld_db_t "/home/xxx/data/mysql(/.*)?"

# 应用上下文规则
restorecon -Rv /home/xxx/data/mysql

验证上下文是否生效

ls -Z /home/xxx/data/mysql

如果输出的目录包含mysqld_db_t这个字样,就代表成功了

6.重启mysql

systemctl restart mysqld

再次重启mysql,即可看到已经成功启动

相关文章:

  • 【大模型基础_毛玉仁】1.4 语言模型的采样方法
  • Excel中COUNTIF用法解析
  • 【笔记】记一次easyExcel中注解ExcelProperty映射字段赋值无效问题
  • dify 工作流 迭代
  • ArcGIS操作:15 计算点的经纬度,并添加到属性表
  • NDT 代价函数
  • 音视频入门基础:RTP专题(15)——FFmpeg源码中,获取RTP的视频信息的实现
  • K8S学习之基础十一:k8s中容器钩子
  • 日新F1、瑞研F600P 干线光纤熔接(熔接损耗最大0.03DB)
  • three学习记录
  • 秋云 ucharts echarts 高性能跨全端图表组件导入
  • P1443 马的遍历(BFS)
  • 企业日常工作中常用的 Linux 操作系统命令整理
  • Vue 与 Element UI 深度探秘:从 Array.isArray 到动态绑定的技术之旅!✨
  • HTML 表单 (form) 的作用解释
  • 【STM32F103ZET6——库函数】11.捕获红外信号
  • Linux基本操作指令1
  • WPS工具栏添加Mathtype加载项
  • 【网络】IP地址的分类
  • 兰亭妙微设计分享:解锁UI设计新趋势:界面设计色彩与布局秘籍
  • 淮安市车桥中学党总支书记王习元逝世,终年51岁
  • 特朗普指控FBI前局长“暗示刺杀总统”,“8647”藏着什么玄机?
  • 中央提级巡视后,昆明厅官郭子贞接受审查调查
  • 习近平在第三十五个全国助残日到来之际作出重要指示
  • 既是工具又是食物,可食用机器人开启舌尖上的新科技
  • 九江宜春领导干部任前公示,3人拟提名为县(市、区)长候选人