Centos7、Mysql8.0 load_file函数返回为空的终极解决方法--暨selinux的深入理解
零、问题背景
最近想换房,为了方便自己对比感兴趣的房子,因此决定将目标房源的基本信息放在表里,特别是要一目了然的看到众多房子的各种图纸和照片,因此决定要在Mysql8.0.34数据库中以二进制形式保存图片(抛开合理性和性能暂且不谈,这里只说技术实现),许多帖子说使用load_file函数来实现,但我按照其他人的方法实操时一直返回NULL,还好历经千辛万苦终于解决了,现将过程与思路加以总结,存档留念。
一、准备工作
1.1、服务器与数据库版本
我是用 rpm 方式安装的 MySQL 8.0.23 版本,服务器操作系统是Centos 7.9 虚拟机资源 2C 4G 40G
1.2、表结构
下图是我的表结构,其中有几个字段是 mediumblob类型,用来存放大小约为200k以内的图片。

1.3、图片保存位置
为了便于后续业务扩展,也出于数据隔离的需要,我用服务器上自定义了 /data/pic/house 路径作为当前业务存储图片的根目录。并在其下面创建了 housepic 和 roomtype两个路径。
二、问题分步展示
2.1、问题展示
我将一张名为 h_1.jpg 的图片放到 /data/pic/house/roomtype 下,然后使用如下语句尝试查看图片时没能返回预期图片内容,而是返回了NULL。
select load_file('/data/pic/house/roomtype/h_1.jpg');

2.2、原因及secure_file_priv介绍
load_file 函数返回为 null 的原因,根源在于 MySQL 配置文件中的 “secure_file_priv” 属性取值与load_file 函数使用的路径不一。在具体解决问题之前,应该先了解这一属性的作用和取值范围是什么。
2.2.1、secure_file_priv介绍
该属性有三类取值,分别为 "NULL"、空值、具体路径字符串。不同取值的含义如下表所示
| 取值 | 含义 |
| NULL | 不允许读写任何路径下的文件 |
| '' 或 没有值 | 允许读写任意路径下的文件 |
| 字符串(如 /tmp) | 允许读写当前路径(如 /tmp)下的文件 |
2.2.2、secure_file_priv 查看
在MySQL任意一种客户端中输入如下命令查看。secure_file_priv的默认取值如下图所示,为 “/var/lib/mysql-files/”。说明当前load_file 函数只能操作 “/var/lib/mysql-files/” 路径下的文件。
show variables like '%secure%';

2.2.3、secure_file_priv 修改
通过上面的分析已经知道了问题的原因,下面就是在MySQL的配置文件中修改这一参数的取值。因为我的MySQL是rpm安装版,所以配置文件的名称与路径为: /etc/my.cnf (其他版本操作系统下的MySQL的配置文件位置与名称请自行确认)。同时我希望 MySQL 不限制文件路径,因此 secure_file_priv 取值及展示如下所示:
#关闭mysql的文件读写路径限制,取值为空
secure-file-priv= ''

需要注意的一点就是,配置文件中应写成 “secure-file-priv” 而非“secure_file_priv”的形式,切切!
2.3、效果与终极解决方法
如果逐位按照上面的方法作了修改,大概率是依然不成功。原因在于没有关闭selinux 。我之前就在selinux 这个坑中挣扎了好久才爬出来。下面就简单聊聊 selinux 是啥,以及为什么会对这个参数有这么大的影响。
2.3.1、selinux是什么、能做什么
它是“安全增强型 Linux(Security-Enhanced Linux)”的简称,它是 Linux 的一个安全子系统。
它能对linux系统中,包括root在内的所有用户的行为做管制。它能通过一系列的配置实现 “允许 X 目标,对 Z 对象/资源,做 Y行为 ” (May <subject> do <action> to <object/source>)的访问控制。其中,X多指进程;Y多指X访问的资源,如端口、文件等;Z多指访问或操作规则。
它有三种工作模式,如下表所示:
| 模式名称 | 作用 |
| enforcing | 强制模式。阻止并在日志记录违反SELinux规则的行为 |
| permissive | 宽容模式。仅在日志记录违反SELinux规则的行为 |
| disabled | 关闭模式。关闭SELinux |
selinux 是一套相当复杂的子系统,里面有庞大的配置项需要了解,在此不做进一步的解释,只需要知道它会对 MySQL 的关键行为做校验与限制即可。除非是专门负责安全和服务器运维的工程师需要深入了解selinux各种规则之外,一般的开发人员在遇到linux 的一些校验失败的情况时,可以想到有这样一个东西存在,并且知道通过关闭selinux可以解决大部分的安全校验问题即可。
2.3.2、selinux 的关闭与开启
selinux 的关闭分为临时关闭和永久关闭,下图为临时关闭方式(即设为宽容模式)

下面为永久关闭方法
# 修改 /etc/selinux/config 文件中的 SELINUX=disabled
[root@MySQL01 ~]# vim /etc/selinux/config# 修改 /etc/sysconfig/selinux 文件中的 SELINUX=disabled
[root@MySQL01 ~]# vim /etc/sysconfig/selinux
2.4、最终效果
在MySQL 的 secure_file_priv参数设置为理想的值,并且关闭了 selinux 之后,发现可以正常读取到图片了,如下图所示

2.5、补充说明
存放图片的路径,建议放到 mysql 属组,且赋予 对应的权限。如下图所示

三、说在最后
9.1 如何查看centos 版本
cat /etc/redhat-release
9.2、如何查看MySQL版本
select VERSION();
9.3、load_file 函数的作用与效率
它在 MySQL 中的主要作用是读取本地或远程的文件。文件种类涵盖文本、二进制、图片、视频等。因这样的读取方式不够安全,因此建议在受信的环境中使用。
9.4、MySQL 几种操作图片的思路和对比
可以通过load_file 函数将图片记录到字段中,也可以将图片所在的路径记录到字段中。前者存在安全隐患,后者无法在MySQL中直接看到图片内容。因此对图片的处理方式应根据业务需求等因素综合考虑后选择。
相关文章:
Centos7、Mysql8.0 load_file函数返回为空的终极解决方法--暨selinux的深入理解
零、问题背景 最近想换房,为了方便自己对比感兴趣的房子,因此决定将目标房源的基本信息放在表里,特别是要一目了然的看到众多房子的各种图纸和照片,因此决定要在Mysql8.0.34数据库中以二进制形式保存图片(抛开合理性和…...
基于Spring Boot的水产养殖管理系统
文章目录 项目介绍主要功能截图:部分代码展示设计总结项目获取方式🍅 作者主页:超级无敌暴龙战士塔塔开 🍅 简介:Java领域优质创作者🏆、 简历模板、学习资料、面试题库【关注我,都给你】 🍅文末获取源码联系🍅 项目介绍 基于Spring Boot的水产养殖管理系统,jav…...
LCR 090. 打家劫舍 II(leetcode)动态规划
文章目录 前言一、题目分析二、算法原理1.状态表示2.状态转移方程3.初始化4.填表顺序5.返回值是什么 三、代码实现总结 前言 在本文章中,我们将要详细介绍一下LeetcodeLCR 090. 打家劫舍 II。采用动态规划解决,这是一道经典的多状态dp问题 一、题目分析…...
【小沐学Python】Python实现语音识别(Whisper)
文章目录 1、简介1.1 whisper简介1.2 whisper模型 2、安装2.1 whisper2.2 pytorch2.3 ffmpeg 3、测试3.1 命令测试3.2 代码测试:识别声音文件3.3 代码测试:实时录音识别 结语 1、简介 https://github.com/openai/whisper 1.1 whisper简介 Whisper 是…...
Nginx负载均衡实战
🎵负载均衡组件 ngx_http_upstream_module https://nginx.org/en/docs/http/ngx_http_upstream_module.html upstream模块允许Nginx定义一组或多组节点服务器组,使用时可以通过多种方式去定义服务器组 样例: upstream backend {server back…...
Redis skiplist源码解析(支持范围查询)
跳表是一个多层的有序链表,在跳表中进行查询操作时,查询代码可以从最高层开始查询。层数越高,结点数越少,同时高层结点的跨度会比较大。因此,在高层查询结点时,查询一个结点可能就已经查到了链表的中间位置…...
MVSNeRF:多视图立体视觉的快速推广辐射场重建(2021年)
MVSNeRF:多视图立体视觉的快速推广辐射场重建(2021年) 摘要1 引言2 相关工作3 MVSNeRF实现方法3.1 构建代价体3.2 辐射场的重建3.3 体渲染和端到端训练 3.4 优化神经编码体 Anpei Chen and Zexiang Xu and Fuqiang Zhao et al. MVSNeRF: Fast…...
华为OD机试真题-CPU算力分配-2023年OD统一考试(C卷)
题目描述: 现有两组服务器A和B,每组有多个算力不同的CPU,其中A[i]是A组第i个CPU的运算能力,B[i]是B组第i个CPU的运算能力。一组服务器的总算力是各CPU的算力之和。为了让两组服务器的算力相等,允许从每组各选出一个CPU进行一次交换,求两组服务器中,用于交换的CPU的算力,…...
校验数据是否重叠(各种操作符>,<,>=,<=,or,and)
最近接到一个需求,其中部分功能涉及到数据的重叠校验,并且录入的数据需要包含各种操作符。如果只通过java代码来查询并进行循环判断的话,判断情况会很复杂,幸好有同事的帮忙提供了一个用sql查询重叠部分的方法,现在分享…...
大一C语言作业 12.8
1.C 对一维数组初始化时,如果全部元素都赋了初值,可以省略数组长度。 这里没有指定数组长度,编译器会根据初始化列表的元素个数来确定数组长度。 2.C 在C语言中,字符数组是不能用赋值运算符直接赋值的。 3.C 在二维数组a中&#x…...
ELasticsearch:什么是语义搜索?
语义搜索定义 语义搜索是一种解释单词和短语含义的搜索引擎技术。 语义搜索的结果将返回与查询含义匹配的内容,而不是与查询中的单词字面匹配的内容。 语义搜索是一组搜索引擎功能,其中包括根据搜索者的意图及其搜索上下文理解单词。 此类搜索旨在通过…...
ooTD I 女儿是自己的,尽情打扮尽情可爱
分享女宝的时尚穿搭 奶乎乎的黄色也太好看了 超足充绒量+优质面料 柔软蓬松上身体验感超赞 怎么穿都好看系列 轻轻松松打造时尚造型!!...
第62天:django学习(十一)
cookie和session 发展史 一开始,只有一个页面,没有登录功能,大家看到东西都一样。 时代发展,出现了需要登录注册的网站,要有一门技术存储我们的登录信息,于是cookie诞生了。 cookie: - 存储形式:k:v键值对…...
Rust测试字符串的移动,Move
代码创建了一个结构体,结构体有test1 字符串,还有指向字符串的指针。一共创建了两个。 然后我们使用swap 函数 交换两个结构体内存的内容。 最后如上图。相同的地址,变成了另外结构体的内容。注意看指针部分,还是指向原来的地址…...
vue+electron问题汇总
1. Vue_Bug Failed to fetch extension, trying 4 more times 描述:项目启动时报错 解决:注释图片中内容 2. Module not found: Error: Can’t resolve ‘fs’ in 描述:项目启动报错 解决:vue.config.js中添加图中数据 3.导入…...
Linux中的网络时间服务器
本章主要介绍网络时间的服务器 使用chrony配置时间服务器配置chrony客户端服务器同步时间 1.1 时间同步的重要性 一些服务对时间要求非常严格,例如如图所示的由三台服务器搭建的ceph集群 这三台服务器的时间必须保持一致,如果不一致,就会显…...
fastadmin打印页面
如下图选中订单号进行打印 html中增加代码 <div id"toolbar" class"toolbar"><a href"javascript:;" class"btn btn-primary btn-refresh" title"{:__(Refresh)}" ><i class"fa fa-refresh">&l…...
Java 将word转为PDF的三种方式和处理在服务器上下载后乱码的格式
我这边是因为业务需要将之前导出的word文档转换为PDF文件,然后页面预览下载这样的情况。之前导出word文档又不是我做的,所以为了不影响业务,只是将最后在输出流时转换成了PDF,当时本地调用没什么问题,一切正常…...
C\C++ 获取最值
C C 语言的不同类型的最值可以在 limits.h 头文件里找到定义 #include <limits.h>int main() {printf("%d", INT_MAX); // 整数最大值printf("%d", INT_MIN); // 整数最小值 } C C 有模板,可以通过替换下面的 int 和 doubleÿ…...
机器学习之无监督学习:九大聚类算法
今天,和大家分享一下机器学习之无监督学习中的常见的聚类方法。 今天,和大家分享一下机器学习之无监督学习中的常见的聚类方法。 在无监督学习中,我们的数据并不带有任何标签,因此在无监督学习中要做的就是将这一系列无标签的数…...
LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明
LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造,完美适配AGV和无人叉车。同时,集成以太网与语音合成技术,为各类高级系统(如MES、调度系统、库位管理、立库等)提供高效便捷的语音交互体验。 L…...
51c自动驾驶~合集58
我自己的原文哦~ https://blog.51cto.com/whaosoft/13967107 #CCA-Attention 全局池化局部保留,CCA-Attention为LLM长文本建模带来突破性进展 琶洲实验室、华南理工大学联合推出关键上下文感知注意力机制(CCA-Attention),…...
React Native在HarmonyOS 5.0阅读类应用开发中的实践
一、技术选型背景 随着HarmonyOS 5.0对Web兼容层的增强,React Native作为跨平台框架可通过重新编译ArkTS组件实现85%以上的代码复用率。阅读类应用具有UI复杂度低、数据流清晰的特点。 二、核心实现方案 1. 环境配置 (1)使用React Native…...
pikachu靶场通关笔记22-1 SQL注入05-1-insert注入(报错法)
目录 一、SQL注入 二、insert注入 三、报错型注入 四、updatexml函数 五、源码审计 六、insert渗透实战 1、渗透准备 2、获取数据库名database 3、获取表名table 4、获取列名column 5、获取字段 本系列为通过《pikachu靶场通关笔记》的SQL注入关卡(共10关࿰…...
让回归模型不再被异常值“带跑偏“,MSE和Cauchy损失函数在噪声数据环境下的实战对比
在机器学习的回归分析中,损失函数的选择对模型性能具有决定性影响。均方误差(MSE)作为经典的损失函数,在处理干净数据时表现优异,但在面对包含异常值的噪声数据时,其对大误差的二次惩罚机制往往导致模型参数…...
LINUX 69 FTP 客服管理系统 man 5 /etc/vsftpd/vsftpd.conf
FTP 客服管理系统 实现kefu123登录,不允许匿名访问,kefu只能访问/data/kefu目录,不能查看其他目录 创建账号密码 useradd kefu echo 123|passwd -stdin kefu [rootcode caozx26420]# echo 123|passwd --stdin kefu 更改用户 kefu 的密码…...
【JVM面试篇】高频八股汇总——类加载和类加载器
目录 1. 讲一下类加载过程? 2. Java创建对象的过程? 3. 对象的生命周期? 4. 类加载器有哪些? 5. 双亲委派模型的作用(好处)? 6. 讲一下类的加载和双亲委派原则? 7. 双亲委派模…...
适应性Java用于现代 API:REST、GraphQL 和事件驱动
在快速发展的软件开发领域,REST、GraphQL 和事件驱动架构等新的 API 标准对于构建可扩展、高效的系统至关重要。Java 在现代 API 方面以其在企业应用中的稳定性而闻名,不断适应这些现代范式的需求。随着不断发展的生态系统,Java 在现代 API 方…...
图解JavaScript原型:原型链及其分析 | JavaScript图解
忽略该图的细节(如内存地址值没有用二进制) 以下是对该图进一步的理解和总结 1. JS 对象概念的辨析 对象是什么:保存在堆中一块区域,同时在栈中有一块区域保存其在堆中的地址(也就是我们通常说的该变量指向谁&…...
Linux操作系统共享Windows操作系统的文件
目录 一、共享文件 二、挂载 一、共享文件 点击虚拟机选项-设置 点击选项,设置文件夹共享为总是启用,点击添加,可添加需要共享的文件夹 查询是否共享成功 ls /mnt/hgfs 如果显示Download(这是我共享的文件夹)&…...
