news 2026/10/6 13:25:04

Linux下彻底卸载MySQL:从包清理到残留文件清扫的完整指南

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Linux下彻底卸载MySQL:从包清理到残留文件清扫的完整指南

搞Linux运维的,估计没人没跟MySQL卸载这件事较过劲。尤其那种“明明把服务停了、rpm包也删了,重装却还是各种报错到头大”的情况,十有八九就是卸得不够彻底——甚至很多时候你以为自己卸干净了,其实系统里还埋着一堆雷,等着你下一次重装时踩响。

我这几年的实战体会是:卸载MySQL这件事,难点从来不在“卸载”本身,而在于“怎么确认卸干净了”。包管理器卸掉的是软件本体,配置、数据、运行痕迹、开机自启脚本这些都散落在系统的各个角落里,一两个残留文件就能让重装后的MySQL起不来。这篇文章我就按自己真实操作过的路径来讲,从确认安装方式、清理服务与软件包、清扫残留文件,到验证是否卸干净、重装前准备,每一步都给你说清楚原理和坑在哪。

1. 为什么“明明卸过了”重装还是失败

很多朋友第一次卸MySQL,用的是最简单的方式:systemctl stop mysqld,然后yum remove mysql或rpm -e mysql一把梭,感觉软件包没了就是卸完了。等到重装时发现各种诡异问题——初始化mysqld --initialize报权限错误、mysql命令连接不上socket、本来已经删掉的3306端口还在被占用,这才意识到事情没那么简单,又回头来翻日志、查系统,来回折腾半天。

按我自己的操作习惯来说,“彻底卸载”至少包含四个层面的东西:

  • 软件包层面:rpm包、deb包或者编译安装产生的二进制文件,这是大多数人理解的“卸载”。
  • 配置层面:/etc/my.cnf、/etc/mysql/目录等配置文件。哪怕只有一个残留的my.cnf带着旧的socket路径和参数,重装后的MySQL就会按它的逻辑走,非常容易埋坑。
  • 数据层面:/var/lib/mysql数据目录。这里存放着实际的数据库文件,如果不清理,可能带着之前的权限属性,新装的MySQL初始化时直接报错。
  • 运行痕迹层面:/tmp/mysql.socksocket文件、pid文件、/var/log/mysql日志、systemd残留的服务配置、开机自启脚本等。这些不清理干净,服务状态会混乱,3306端口也可能莫名其妙被占用。

一句话说透了:MySQL在Linux上不是说删了软件包就没了的,它像搬家后在老房子里留下的水电煤气绑定、家具杂物和墙上的钉子——你光拎包走了不算搬完,得把所有痕迹都收拾利索才算数。下面我就按实际操作顺序,一步步拆解怎么把这些“钉子”全拔干净。

2. 动手前先确认安装方式:卸载策略的第一步分岔路

都说“磨刀不误砍柴工”,卸载MySQL也一样——先搞清楚这个MySQL是怎么装上去的,接下来的操作才有针对性。装法不一样,卸载时该从哪里下手完全不同。

2.1 常见安装方式有哪几类

我平时接触到的Linux服务器上,MySQL的安装方式基本分三类:

  • RPM或Yum方式安装:这是Red Hat系发行版(CentOS、RHEL、Rocky Linux、AlmaLinux等)最常见的装法。特点是软件包分散在mysql-community-server、mysql-community-client、mysql-community-libs、mysql-community-common等多个rpm包中,rpm包之间还有依赖关系。
  • 源码编译方式安装:自己下载源码包,cmake、make、make install三步走。二进制文件通常被放在了自定义目录(比如/usr/local/mysql),卸载时没有系统包管理器能管它,全得手动删目录。
  • 通用二进制包方式安装(tar.gz解压):从官网下载mysql-5.7.x-linux-glibc2.12-x86_64.tar.gz这类二进制包,解压后简单配置就直接用。卸载方式跟源码编译类似,也是纯手动清理。

另外还有一类是Docker容器安装的MySQL,这个虽然也常见,但它本质上是容器管理范畴,卸载时直接docker rm容器、删掉镜像就行,不涉及系统包管理器,我不把它跟物理机安装混在一起讲,后面单独说一句。

2.2 怎么快速判断当前MySQL的安装方式

在动手卸载之前,先在服务器上执行几组命令,把MySQL现在的安装情况摸个底。

# 查看rpm或yum安装的MySQL包(Debian系请用dpkg -l | grep mysql) rpm -qa | grep mysql rpm -qa | grep mariadb # 确认MySQL服务名和安装路径 systemctl status mysqld systemctl status mysql # 查看mysql二进制文件的真实路径 which mysql ls -l /usr/sbin/mysqld ls -l /usr/local/mysql/bin/mysqld # 查看配置文件有哪些 ls -l /etc/my.cnf ls -l /etc/mysql/ # 如果是纯源码或二进制包安装,看看/usr/local/mysql目录是否存在 ls -d /usr/local/mysql # Docker方式安装的确认 docker ps -a | grep mysql docker images | grep mysql

这几条命令执行完,基本就能判断出MySQL到底属于哪种安装方式。我见过不少新手上来就在/usr/local/mysql里翻找数据目录,结果压根是yum装的默认路径;也有反过来,yum卸载了半天才发现是之前源码编译装的,rpm命令根本查不到任何包,白白浪费时间。

3. 停止服务与包管理器层面的彻底清理

不管哪种安装方式,卸载的第一步永远是先停服务。这个过程看似套路,但有一个必须警惕的坑:停服务前,建议先把关键数据目录备份一下。我在文章前面特意强调过数据层面的概念,这里再说得直接点——卸载不是删库跑路,如果库里还有需要的数据,请先mysqldump导出备份,或者直接整个拷贝一份/var/lib/mysql目录。确认数据已备份之后,再来谈接下来的清理。

提示:如果这个MySQL实例是你自己的学习环境或测试机,无所谓备份不备份。但生产环境,请一定建立备份习惯。别等到rm命令执行完才后悔——那时候想让数据回来,可就很难了。

3.1 停止并禁用MySQL服务

# 停止服务。不同发行版/安装方式服务名可能是mysqld、mysql,多试一下就知道 systemctl stop mysqld systemctl stop mysql # 确认服务确实已经停了(显示inactive或dead就说明停了) systemctl status mysqld # 关闭开机自启。摘掉它的系统拉线和油门,让它在重启之后不会自己蹦起来 systemctl disable mysqld systemctl disable mysql

3.2 RPM包依赖顺序:为什么不能无脑rpm -e

接下来执行rpm -qa | grep mysql,这时候会看到一系列包名。以最常见的社区版为例,无外乎这几个:

mysql-community-server-5.7.44-1.el7.x86_64 mysql-community-client-5.7.44-1.el7.x86_64 mysql-community-libs-5.7.44-1.el7.x86_64 mysql-community-common-5.7.44-1.el7.x86_64

很多兄弟卸载时习惯性一个rpm -e挨个删,或者图省事直接yum remove mysql。实际上yum remove在这里不够“彻底”的关键点在于:它会自动根据依赖关系删掉一批包,但有时某些没被它识别为依赖的零散包就漏网了。而且如果用了第三方源装的MySQL,yum remove也未必能把所有相关包都找全。

我处理rpm包时习惯直接手动按依赖顺序来卸,而且从server往common方向卸是比较稳的顺序:

rpm -e mysql-community-server rpm -e mysql-community-client rpm -e mysql-community-libs rpm -e mysql-community-common

为什么这个顺序更重要?因为server包通常依赖client和libs,如果一开始就删libs会提示依赖失败。这也是rpm卸载中最常见的“卡壳”原因——不是不能删,是顺序不对。

3.3 libs包的特殊情况:一个容易牵连无辜的坑

mysql-community-libs这个包经常会跟系统里其他软件扯上依赖关系。我以前在一台跑了Web服务的机器上卸载MySQL时,rpm -e mysql-community-libs直接报错,说被postfix等软件依赖着,硬删会把这些依赖它的软件也搞得不能正常用。处理方式有两条路:

  • 其一,临时用rpm -e --nodeps mysql-community-libs强制删除,但要清楚这个操作只是删掉了libs包本身,不处理它跟postfix的关联,postfix后续是否还能正常用需要自行观察。
  • 其二,如果只是嫌某个版本库文件过期或冲突,其实不用卸,直接用新版本的libs包rpm -Uvh替换升级,也一样效果。

这里要说明一点:--nodeps这招属于“暴力拆迁”,不是不能用,但用了之后系统里就可能出现其他软件运行时找不到库文件的隐患。我更倾向于建议先看看到底谁依赖它,有没有更优雅的路可以走。

3.4 Yum方式卸载时的建议命令

如果你倾向偷懒省事,用yum也不是不行。但别指望一条命令干完所有事,卸完还要自己检查一遍漏网之鱼:

# 先看yum会动哪些包 yum remove mysql-community-server 这个命令实际可能因为依赖关系把client也带走 # 更建议直接一次性把核心包都点名 yum remove mysql-community-server mysql-community-client mysql-community-libs mysql-community-common

Debian系(Ubuntu、Debian)的朋友对应逻辑是dpkg -l | grep mysql看包名,然后apt-get remove --purge mysql-server mysql-client mysql-common,注意--purge参数,它会把配置文件一并清掉,比裸apt-get remove干净得多。

3.5 源码编译安装和二进制包安装的“卸载”方式

这类安装方式在rpm -qa里查不到任何MySQL包,所以包管理器层面的清理主要是靠make uninstall(如果源码目录还在且有uninstall目标的话)或者干脆直接删目录。二进制解压安装的尤其典型——MySQL原本就在/usr/local/mysql目录下,软件层面把它整个删掉就行:

rm -rf /usr/local/mysql

同时/usr/local/mysql/bin下的mysql、mysqld等命令如果之前做过软链接到/usr/bin或/usr/local/bin,也得一并删掉软链接。这个我会在后面“残留文件清扫”里详细展开,先不急着跳,这里大家心里先有个数:rpm包层面清理完成后,真正的重头戏才开始。

4. 残留文件清扫:数据、配置与运行痕迹

很多“卸载不彻底”问题,根源都在这一步没做好。前面删包只是把可执行程序和库文件拿掉了,配置文件、数据文件、日志、socket、systemd服务脚本这些还在系统里躺着。它们就像一个个埋在地下的小地雷,平时看不出毛病,重装MySQL时一踩一个准。

4.1 数据目录/var/lib/mysql:最容易被忽视的重灾区

数据目录是MySQL真正的“心脏”——所有库、表、数据文件都堆在这里。/var/lib/mysql如果没清理,会带来一个典型的麻烦:

重装MySQL后执行mysqld --initialize初始化时,系统本来要新建数据文件并设定权限为mysql用户所有。结果旧数据目录里的文件还带着旧的属主、属组或权限属性,可能导致初始化失败,日志里报Permission denied之类错误。

处理方式很直接:

rm -rf /var/lib/mysql

但这里有个习惯我强烈建议各位养成:别直接rm整个目录,而是把目录改个名留几天观察。

mv /var/lib/mysql /var/lib/mysql.bak.$(date +%Y%m%d)

为什么不直接删?因为任何人都有脑子短路或操作失误的时候,把目录改名为自己留一个后悔药的空窗期,确认新装的MySQL跑得完全正常之后,再回头删除这个备份目录,风险就小很多了。这个习惯救过我很多次,尤其在忙乱的多任务操作场景下。

4.2 配置文件:/etc/my.cnf和相关目录

配置文件是另一个高频残留点。rpm或yum卸载时,/etc/my.cnf经常不会被自动删掉(apt的--purge会删,但rpm未必)。残留的my.cnf可能会导致新装的MySQL沿用旧参数。

另外还要注意/etc/mysql/这个目录,Debian系会把多处配置分散在/etc/mysql/mysql.conf.d/、/etc/mysql/conf.d/等子目录里。

# 彻底检查这些位置,存在就删 ls -l /etc/my.cnf ls -l /etc/mysql/ rm -rf /etc/my.cnf /etc/my.cnf.d /etc/mysql

有些服务端还会生成/etc/my.cnf.rpmnew或/etc/my.cnf.rpmsave这类备份文件,也一并清掉。我用find扫一遍更稳妥:

find /etc -maxdepth 2 -name "*my.cnf*" -o -name "*mysql*"

4.3 日志、socket文件和pid文件

MySQL运行时会留下这些文件,卸载了软件包它们还在原地:

# 常见日志位置 /var/log/mysql/ /var/log/mysqld.log # socket与pid文件(很多环境下在/tmp或/run目录) /tmp/mysql.sock /run/mysqld/mysqld.sock /run/mysqld/mysqld.pid # 一并清理 rm -rf /var/log/mysql /var/log/mysqld.log rm -rf /tmp/mysql.sock /tmp/mysql.sock.* rm -rf /run/mysqld

为什么要清socket文件?有个特别典型的重装场景:启动新MySQL时如果socket文件路径和旧的冲突,或者旧socket文件被某个进程占用,服务可能起不来或连接报Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock'。把残留socket和pid文件清掉,能省去这类莫名其妙的麻烦。

4.4 systemd服务残留

很多朋友不知道,即使rpm包删了,/usr/lib/systemd/system/mysqld.service也可能还留在系统里。结果就是systemctl daemon-reload之后依然能看到mysqld相关的unit。处理方式是手动删掉,再重载daemon:

rm -rf /usr/lib/systemd/system/mysqld.service rm -rf /lib/systemd/system/mysql.service systemctl daemon-reload

注意:如果你打算立刻重装新版本MySQL,新版本的rpm包会重新生成这个service文件,那时直接让新包覆盖写入就行,不一定非得提前删。但如果你确认不再装MySQL或想彻底把痕迹清光,就要删掉。

4.5 命令软链接、man手册和头文件

如果之前手动把mysql、mysqldump等命令做了软链接到/usr/local/bin或/usr/bin,卸载后这些链接就变成失效状态。虽然不影响系统正常运行,但对你后续安装新版本时判断路径会造成干扰。清掉不用的软链接,避免重装时出现“两个路径、两个同款命令”的岔路问题:

# 检查相关命令是否还存在(which不到说明shell里已经找不到了;软链接残留文件还在则需要手动删) which mysql which mysqldump ls -l /usr/bin/mysql rm -f /usr/bin/mysql /usr/bin/mysqldump # man手册和头文件,源码编译/二进制安装尤其常见 rm -rf /usr/share/man/man1/mysql.1.gz rm -rf /usr/include/mysql

5. 验证卸载干净的标准方法:别再用“好像没了”来做判断

清理工作做完,最重要的一环就是验证。我见过太多人卸载后只执行一句rpm -qa | grep mysql,看到没有输出就宣布“卸载完成”,这判断太早了。下面五组检查,每一组都值得认真过一遍。

5.1 软件包层面的复查

# 逐项检查rpm包里是否还有mysql或mariadb相关包 rpm -qa | grep -iE "mysql|mariadb" # Debian系用 dpkg -l | grep -iE "mysql|mariadb"

除了MySQL本身,还有一个极容易被忽略的坑是Mariadb。CentOS 7等发行版默认自带Mariadb的lib库,rpm -qa | grep mariadb经常能看到结果。多数情况下Mariadb的包跟MySQL本身不同源不同命,但之前MySQL的libs包如果已被替换或装过Mariadb的兼容库,这里也会出现连带关系。严格来说Mariadb不应该被算作MySQL残留,但如果你的目标就是让系统回归到“没有数据库服务”的状态,Mariadb也可以一并考虑处理掉。

5.2 端口与服务状态检查

# 用ss或netstat确认3306端口不再监听 ss -lntp | grep 3306 netstat -lntp | grep 3306 # 再次确认真实状态 systemctl status mysqld systemctl status mysql

如果3306端口仍然有进程监听,说明清理有遗漏或之前的连接进程还活着,继续深挖,用lsof -i:3306看看是谁占着它。

5.3 目录和文件残留扫描

这一步就是“扫地雷”了,重点关注我们前面提过的每一个位置:

find / -maxdepth 3 -name "my.cnf" 2>/dev/null ls -d /var/lib/mysql 2>/dev/null ls -d /etc/mysql 2>/dev/null ls -l /usr/lib/systemd/system/mysqld.service 2>/dev/null

另外,像locate mysql这种通过updatedb数据库查询的方式也能帮上忙,不过locate依赖系统的文件索引,刚新生成的或者索引没更新时可能查不准,还是find最可靠。也建议检查一下/usr/local/mysql目录是否还残留:

ls -ld /usr/local/mysql 2>/dev/null

5.4 环境中还包含一个关键表项

这里我整理一个快速自检表,每次卸完MySQL之后对照过一遍,基本可以确定系统处于干净状态:

检查项命令期望结果
rpm包列表rpm -qa | grep -iE "mysql|mariadb"无输出或只剩不相关的mariadb-libs
服务状态systemctl status mysqld显示未安装或inactive
配置文件ls /etc/my.cnf /etc/mysql文件不存在
数据目录ls -d /var/lib/mysql目录不存在
日志与socketls /var/log/mysql /tmp/mysql.sock不存在
端口监听ss -lntp | grep 3306无输出
systemd unitls /lib/systemd/system/mysqld.service不存在或已被新包覆盖

5.5 systemd reload后仍可能出现的“幽灵服务”

还有一个容易让人疑惑的点:即使你已经把mysqld.service删了,systemctl list-unit-files | grep mysql有时还是能看到一些残留条目。这是因为systemd除了从/usr/lib/systemd/system读取unit文件,还可能从/etc/systemd/system等目录读取,或者某些unit文件之前被enable过,符号链接残留在/etc/systemd/system/multi-user.target.wants/等目录下。处理方式除了删除unit文件,还要清理启用的软链接:

rm -rf /etc/systemd/system/*.wants/*mysqld* rm -rf /etc/systemd/system/*.wants/*mysql* systemctl daemon-reload

再执行systemctl list-unit-files | grep mysql复查,这回应该就干净了。

6. 卸完后的几个特殊情况与重装前准备

本来到这里,整篇卸载主流程已经讲完。但结合我自己的实际运维经历和网上常被问到的点,有几个特殊情况必须单独点名,尤其是那些会让新手反复踩坑的场景。

6.1 源码编译安装的“防漏网”检查

前面提过源码编译或二进制包安装的卸载方式不太一样,这里再展开说细一点。源码编译安装时,如果编译参数里设置了-DCMAKE_INSTALL_PREFIX=/usr/local/mysql,那么整个MySQL安装树都在这一个目录下面,删掉目录就相当于删了软件本体。但残留的隐患通常在这些位置:

  • /usr/local/mysql整个目录(删掉之前先确认数据目录是独立存放的还是在里面)。
  • /usr/local/mysql/bin下如果有软链接被指向/usr/local/bin或/usr/bin,也要删软链接。
  • 编译时生成的/etc/init.d/mysql或/etc/init.d/mysqld启动脚本(老一些的版本很常见)。
  • 日志和数据目录如果手工指定过参数,可能不在默认位置,用find / -name "*.err" -o -name "*.pid" 2>/dev/null扫一遍更放心。

源码编译安装这种情况,虽然RPM和Yum路径都没有问题,但很多人最后卡在“明明卸载了,which mysql还是有结果”这样的怪相。所以再次提醒:查一遍软链接,很关键。

6.2 Docker方式安装的MySQL怎么“卸载”

如果你是用docker run启动的MySQL,卸载逻辑完全不同。它是在宿主机上隔离运行,不会污染系统里的目录和systemd服务。停止和移除流程大概是:

# 停容器并删除 docker stop container_name docker rm container_name # 删除volume(数据卷)时注意:如果只是想换个镜像版本而保留数据,就别删volume;如果彻底不要了,就一起删 docker volume ls docker volume rm volume_name # 删除镜像 docker images | grep mysql docker rmi mysql:tag

用Docker方式安装的好处就是卸载确实干净,镜像、容器、volume一删,宿主机干干净净。但从另一个角度看,它也在宿主机上留下了若干网络和目录挂载的痕迹,比如挂载到宿主机/data/mysql之类的目录,这些是你自己指定的挂载路径,不属于Docker自动生成,真要彻底清就得手动删挂载目录。

6.3 重装前的最终检查清单

如果你卸载MySQL是为了重装一个新版本,那么在yum install或解压新包之前,再做几个小动作,防止重装时新老痕迹打架:

  1. 配置文件先清空:如果/etc/my.cnf还存在,尽量不要留着它直接装新版,让新包生成默认配置最稳妥。已备份的配置也建议等新版本安装成功后再对比设置,而不是提前拷回去。
  2. 数据目录可迁移不可混用:旧数据备份目录如/var/lib/mysql.bak.xxx不要直接改回原名让新包使用——不同大版本的MySQL数据目录格式不一定兼容(比如5.7升到8.0,区别就很大)。需要数据时用mysqldump导出的SQL文件来做迁移才是正常路径。
  3. 清理防火墙和服务残留:如果之前配置过firewalld或iptables开放3306端口,理论上重装后新的MySQL还会用同样端口,不需要重复配置;但如果之前改动过乱七八糟的规则,顺手firewall-cmd --list-all确认一下也好。
  4. 检查用户和组:MySQL安装时会创建名为mysql的系统用户和组。卸载并不需要把用户也删掉,因为重装还要用;但如果你确实打算彻底不装了,有一天想让系统恢复到最干净的状态,顺手把这个用户也一并清理掉:
    userdel mysql groupdel mysql
  5. 确认磁盘空间:MySQL数据目录可能非常大,卸载后要释放空间就必须确保/var/lib/mysql备份目录最终也被你删掉了。很多服务器卸完之后空间没释放,就是因为数据目录其实只是被改了名。

6.4 卸载过程中的日志和报错排查思路

最后这点是我特别想分享给新手的经验:如果卸载过程中出现奇怪的报错,别急着用--nodeps硬刚,先把/var/log/messages、/var/log/yum.log或dnf.log翻一下。很多卸载失败的根源都是依赖关系导致的连锁问题。

比如rpm -e mysql-community-server时报告“Failed dependencies”,查看一下具体是哪个包在依赖它,就可以决定是先把那个依赖包卸掉,还是用--nodeps跳过检查。大部分情况下跳过依赖检查不是不可行,但你要清楚它到底绕过了什么——这就像拔钉子时你知道这颗钉子连着的木条是哪一根,才能决定要不要连木条一起丢。

我自己的习惯是:先卸载依赖者,再卸载被依赖者,把依赖链理顺,rpm卸载会顺利得多。实在理不顺的,才用--nodeps点到为止地强删,绝不一上来就无脑绕过依赖检查。

7. 卸载MySQL之后的下一步路怎么走

到了这一步,MySQL已经从你的Linux系统里彻底离开了。我建议把备份目录再留几个星期,确认新环境或新版本跑得够稳定,再回头删掉那些.bak备份目录。这段缓冲期是你最后一道后悔药防线,别做让自己觉得可惜的决定。

根据我这几年在Linux上跟MySQL打交道总结的经验,卸载这件事最消耗时间的从来不是那些执行命令的几秒钟,而是排查“哪里没删干净”的分析过程。第一次装卸MySQL的新手,多半会经历一个“卸载时感觉啥都没删完、重装时感觉哪哪都在报错——然后回头再卸载一遍”的循环过程。这很正常,因为MySQL毕竟是由十几个包、多个目录、多种运行文件组合起来的服务栈,它的“卸载”本来就不像删除一个普通软件那么简单。

把本文提供的卸载步骤按顺序执行一遍,再对照自查表过一遍检查项,基本可以避免绝大多数重装时的诡异问题。吃透这套思路,你再去处理其他类似有复杂运行结构的服务端软件(Redis、Nginx、PostgreSQL都会遇到同样类型的残留问题),就会有种“深谙此道”的感觉——所有这类服务,本质上都逃不掉“包、配置、数据、运行痕迹”这四个层面的清理思路。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/6 13:24:32

Flutter权限管理实战:permission_handler配置与避坑指南

做 Flutter 开发,只要是涉及文件下载、拍照、定位、通讯录这些功能,十有八九都会栽在权限管理这个坎上。Android 和 iOS 两套系统的权限机制本身就差异巨大,再加上 Android 6.0 之后运行时权限、Android 11 的包可见性变化、iOS 的隐私新政&a…

作者头像 李华
网站建设 2026/10/6 13:24:24

无监督谱回归测试阶段实现详解:投影矩阵、均值对齐与阈值设定

无监督谱回归(USR)这名字听起来挺学术,但其实它要解决的问题很朴素:给一堆没有标签的样本建图、找低维结构,再让新来的样本也能快速落到同一个低维空间里。我最近在帮业务团队落地一版 USR 模型,整整两天时…

作者头像 李华
网站建设 2026/10/6 13:23:25

基于SQLite FTS5的中文全文搜索实现及踩坑指南

今天是“30天挑战”的第11天,整个项目刚好走完三分之一。先交代一下背景:我在做的是一个本地优先的 Markdown 知识管理工具 DayNotes,要求数据完全离线、启动速度快、折腾成本低。前 10 天已经完成了文档解析、编辑器、标签体系和列表页&…

作者头像 李华
网站建设 2026/10/6 13:22:51

C#开发U盘禁用工具:守护进程+白名单+审计日志完整方案

最近在公司做终端安全加固时接到一个需求:禁止员工随意插入U盘拷贝资料。需求听起来简单,但真正落地才发现坑不少——普通策略禁用U盘后,换台电脑改个注册表就能绕过;光监听插入事件,又不处理开机前已插好的U盘&#x…

作者头像 李华
网站建设 2026/10/6 13:22:30

MySQL慢SQL优化:Explain执行计划关键字段与实战调优

很多搞后端的朋友第一次接触Explain,是在慢SQL压测被领导叫过去的时候。我也不例外:线上有个订单统计页面,运营点一下要等十几秒,一翻日志全是同一条SELECT。当时我做的第一件事不是改代码,而是把这条SQL丢进工具里跑了…

作者头像 李华
网站建设 2026/10/6 13:22:26

主动降噪(ANC)从原理到实战:降噪耳机如何凭空消声

先说点实在的。ANC这三个字母,这几年在耳机圈、手机圈几乎天天见,但你要是去问十个买了降噪耳机的人,至少有六七个其实说不清它到底是怎么把地铁轰隆隆的噪声变没的,更别说自己做一套可用的降噪方案了。我在这个方向断续折腾了两三…

作者头像 李华