MySQL 8.0.31 生产环境部署全攻略:从安装到安全加固
1. 项目概述为什么MySQL 8.0.31值得你亲手部署一次最近在帮几个朋友的公司做数据库环境标准化发现一个挺有意思的现象很多人还在用着MySQL 5.7甚至更老的版本一提到升级到8.0就有点发怵。其实从5.7到8.0尤其是像8.0.31这样的长期支持版本带来的性能提升和功能改进是实实在在的。我经手过几十套从零开始的MySQL部署也处理过不少版本升级的案例可以很负责任地说只要你把安装和初始配置的坑都踩明白了后续的运维会轻松很多。这篇内容我就以一个老DBA的视角带你从头到尾走一遍MySQL 8.0.31的安装流程不仅仅是把软件装上去更重要的是把每一步背后的“为什么”讲清楚让你装一次就彻底明白。MySQL 8.0.31作为8.0系列的一个稳定版本它不仅仅是修复了一些bug更重要的是在默认的身份认证插件、性能优化器、JSON支持以及窗口函数等方面都趋于成熟。对于开发者来说这意味着你可以更放心地使用CTE公共表表达式、更好的GIS支持对于运维来说更完善的角色管理和密码策略能提升安全性。但这一切的前提都是一个干净、规范的初始安装。很多人安装失败或者后续问题频出根源往往就在最初的几步环境检查不彻底、参数理解有偏差、目录权限没设对。这次我们就从最基础的准备开始把每一步都掰开揉碎了讲。2. 安装前的核心准备别让细节毁了你的数据库很多人拿到安装包就急着双击运行这是大忌。数据库是系统的基石安装前的规划直接决定了后期的稳定性和可维护性。这一步花上半小时能为你省下未来无数个熬夜排查问题的时间。2.1 系统环境检查与依赖确认首先你得知道自己要在什么环境下安装。虽然教程大多以Linux如CentOS 7/8, Ubuntu 20.04/22.04为例但原理是相通的。假设我们在一台干净的CentOS 7.9系统上操作第一件事不是下载MySQL而是检查系统。打开终端先看看系统版本和架构cat /etc/redhat-release uname -m这能确认你是64位系统x86_64因为MySQL官方已经不提供32位的安装包了。接下来检查关键依赖。MySQL 8.0对libaio异步I/O库和numactl非一致性内存访问控制有强依赖缺少它们可能导致安装失败或性能低下。rpm -qa | grep -E “libaio|numactl”如果没安装就用yum补上yum install -y libaio numactl另一个常被忽略的是现有的MariaDB或旧版MySQL。它们可能与新版本冲突导致服务无法启动。务必彻底清理rpm -qa | grep -i mysql rpm -qa | grep -i mariadb如果发现有用rpm -e --nodeps强制卸载并检查残留的配置文件通常在 /etc/my.cnf 或 /etc/my.cnf.d/和数据目录默认是 /var/lib/mysql手动删除。注意在生产环境中如果是从旧版本升级数据目录的清理要极其谨慎。我们这里是全新安装所以可以删除。如果是升级务必先做好完整的数据备份。2.2 安装包获取与完整性验证直接从MySQL官网下载是最稳妥的。不建议使用某些国内镜像站过时的版本或修改版。访问MySQL Community Server下载页面选择版本8.0.31操作系统选Linux - Generic下载那个体积最大的“Linux - Generic (glibc 2.12) (x86, 64-bit), Compressed TAR Archive”大概700多MB。这个通用二进制包解压就能用比RPM包更灵活不受系统仓库版本限制。下载完成后千万不能急着解压。先验证文件的完整性防止下载过程中损坏或被篡改。官网会提供MD5或SHA256校验值。在终端里进入下载目录计算校验和并对比md5sum mysql-8.0.31-linux-glibc2.12-x86_64.tar.xz # 或 sha256sum mysql-8.0.31-linux-glibc2.12-x86_64.tar.xz务必使计算结果与官网公布的值完全一致。这一步是对数据安全最基本的负责。2.3 规划安装目录与数据目录这是体现DBA功力的地方。很多新手把所有东西都往默认的/usr/local/mysql一扔后期扩容、迁移、备份都会很头疼。我推荐的规划思路是将软件目录、数据目录、日志目录分离。软件目录 (basedir)存放MySQL二进制程序。我习惯放在/opt/mysql/mysql-8.0.31。这样以后想测试8.0.32可以平行安装另一个目录互不影响。数据目录 (datadir)存放所有数据库表数据、索引等核心文件。这是IO最密集的地方强烈建议放在独立的磁盘分区或高性能存储上比如/data/mysql_data。不要放在根分区下防止数据库写满导致系统崩溃。日志目录包括错误日志、慢查询日志、二进制日志等。可以放在/data/mysql_logs。二进制日志尤其重要它用于主从复制和增量恢复最好也能放在单独的存储上。现在创建这些目录并设置正确的权限。我们创建一个专门的mysql用户和组来运行数据库服务这比用root安全得多。groupadd mysql useradd -r -g mysql -s /bin/false mysql # -r创建系统用户-s /bin/false禁止登录 mkdir -p /opt/mysql/mysql-8.0.31 mkdir -p /data/mysql_data mkdir -p /data/mysql_logs chown -R mysql:mysql /opt/mysql /data/mysql_data /data/mysql_logs chmod 750 /data/mysql_data /data/mysql_logs权限设置是关键mysql用户需要对数据目录有读写权但其他用户绝对不能有访问权750表示属主可读可写可执行属组可读可执行其他用户无权限。3. 分步安装与初始化详解准备工作做扎实了安装过程其实就是个体力活。但即使是解压、移动文件这样的“体力活”顺序和参数不对也会导致前功尽弃。3.1 解压软件包与目录部署我们将下载的压缩包解压到规划好的软件目录。注意压缩包解压后自带一个类似mysql-8.0.31-linux-glibc2.12-x86_64的目录我们需要将其内容移动到我们的目标目录。tar -xvf mysql-8.0.31-linux-glibc2.12-x86_64.tar.xz -C /opt/mysql/ mv /opt/mysql/mysql-8.0.31-linux-glibc2.12-x86_64/* /opt/mysql/mysql-8.0.31/ rmdir /opt/mysql/mysql-8.0.31-linux-glibc2.12-x86_64然后创建关键的软链接。很多第三方工具或脚本会默认寻找/usr/local/mysql创建一个软链接可以兼容这些习惯也方便未来版本升级时切换。ln -s /opt/mysql/mysql-8.0.31 /usr/local/mysql别忘了把安装目录的属主也改成mysql用户chown -R mysql:mysql /opt/mysql/mysql-8.0.313.2 核心配置文件 my.cnf 的编写MySQL的配置文件my.cnf是调优和定制的核心。默认位置是/etc/my.cnf。我们不建议直接修改安装包内的示例文件而是在/etc下新建一个。这个文件的内容决定了数据库的内存使用、文件句柄、连接数、日志行为等几乎所有方面。下面是一个针对4核8G内存的入门级服务器的最小化配置示例你可以在此基础上调整[mysqld] # 基础目录设置 basedir/usr/local/mysql datadir/data/mysql_data socket/tmp/mysql.sock # 网络与连接 port3306 bind-address0.0.0.0 # 允许远程连接生产环境建议指定IP max_connections200 # 最大连接数根据应用调整 default_authentication_pluginmysql_native_password # 兼容旧版客户端 # 内存与缓存 key_buffer_size16M innodb_buffer_pool_size2G # InnoDB缓冲池通常是物理内存的50%-70% innodb_log_file_size256M # Redo日志大小 innodb_flush_log_at_trx_commit1 # 事务提交时刷写redo日志保证ACID # 日志设置 log-error/data/mysql_logs/error.log slow_query_log1 slow_query_log_file/data/mysql_logs/slow.log long_query_time2 # 超过2秒的查询记录慢日志 # 字符集设置避免乱码 character-set-serverutf8mb4 collation-serverutf8mb4_unicode_ci [mysql] default-character-setutf8mb4 [client] socket/tmp/mysql.sock default-character-setutf8mb4实操心得innodb_buffer_pool_size是最重要的参数之一。设置太小数据频繁在内存和磁盘交换性能极差设置太大可能挤占系统内存。一个简单的起点是物理内存的50%。bind-address在初始化阶段可以先设为0.0.0.0方便测试正式上线前一定要根据安全需求收紧。3.3 初始化数据目录与生成临时密码这是安装过程中最核心的一步。MySQL 8.0 使用mysqld --initialize命令来初始化数据目录它会创建系统数据库如mysql,sys,information_schema并为root用户生成一个临时随机密码。这个密码显示在错误日志里务必找到并记录下来。使用mysql用户来执行初始化确保所有生成的文件权限正确cd /usr/local/mysql ./bin/mysqld --defaults-file/etc/my.cnf --initialize --usermysql --basedir/usr/local/mysql --datadir/data/mysql_data如果一切顺利命令行不会有太多输出。关键信息在错误日志里。查看我们配置的日志文件grep ‘A temporary password’ /data/mysql_logs/error.log你会看到类似这样的一行2023-10-27T08:00:00.123456Z 6 [Note] [MY-010454] [Server] A temporary password is generated for rootlocalhost: qkKsj*aB3x,把qkKsj*aB3x,这个临时密码复制保存好第一次登录必须用它。踩坑记录这里最容易出的问题是权限。如果用root用户初始化生成的数据文件属主是rootmysql服务进程将没有权限写入导致启动失败。务必确保--usermysql参数正确且datadir目录的属主是mysql:mysql。3.4 配置系统服务与启动MySQL手动启动MySQL不适合生产环境。我们需要配置systemd服务实现开机自启和方便的管理。在/etc/systemd/system/目录下创建mysqld.service文件[Unit] DescriptionMySQL Server 8.0 Afternetwork.target [Service] Typesimple Usermysql Groupmysql ExecStart/usr/local/mysql/bin/mysqld --defaults-file/etc/my.cnf LimitNOFILE65535 Restarton-failure RestartSec5 [Install] WantedBymulti-user.target这里的关键点User和Group指定了服务运行者ExecStart指向我们的mysqld二进制文件和配置文件路径LimitNOFILE提高了文件描述符限制对于高并发场景很重要。让systemd重新加载配置启动服务并设置开机自启systemctl daemon-reload systemctl start mysqld systemctl enable mysqld检查服务状态确认它正在运行systemctl status mysqld如果状态是active (running)恭喜你MySQL服务已经成功启动。如果失败查看journalctl -u mysqld或我们配置的/data/mysql_logs/error.log来排查错误。4. 安装后的关键配置与安全加固服务跑起来只是第一步一个裸奔的MySQL数据库是极不安全的。我们需要登录修改密码并进行一系列安全设置。4.1 首次登录与修改root密码使用刚才记录的临时密码登录。注意临时密码含有特殊字符最好用单引号括起来。/usr/local/mysql/bin/mysql -uroot -p‘qkKsj*aB3x,’如果成功你会进入mysql提示符。但此时你几乎什么也做不了因为MySQL强制要求你首先修改密码。执行以下命令修改root用户的本地登录密码ALTER USER ‘root’‘localhost’ IDENTIFIED BY ‘YourNewStrongPassword123!’;请将‘YourNewStrongPassword123!’替换为一个足够复杂的密码。MySQL 8.0默认的密码策略要求密码包含大小写字母、数字和特殊字符。4.2 运行安全安装向导MySQL提供了一个非常实用的安全配置脚本mysql_secure_installation但它通常只适用于RPM安装。对于二进制安装我们需要手动执行它的一系列建议操作。核心步骤包括设置root密码我们已经做了。移除匿名用户匿名用户允许任何人无需密码登录数据库必须删除。DELETE FROM mysql.user WHERE User’’;禁止root远程登录root账户只允许从本地服务器连接这是最重要的安全原则之一。DELETE FROM mysql.user WHERE User‘root’ AND Host NOT IN (‘localhost’, ‘127.0.0.1’, ‘::1’);移除测试数据库默认的test数据库权限设置宽松存在风险。DROP DATABASE IF EXISTS test; DELETE FROM mysql.db WHERE Db‘test’ OR Db LIKE ‘test\\_%’;重新加载权限表让上述所有更改立即生效。FLUSH PRIVILEGES;完成这些后退出MySQL客户端再用新密码登录一次确认修改生效。4.3 创建专用管理账户与基础优化日常管理中我们不应该频繁使用root账户。创建一个拥有所需权限的专用管理账户是更好的实践。例如创建一个用户dba_admin允许从本地和运维网段登录并授予所有数据库的管理权限但注意这仍然是高权限账户需妥善保管密码。CREATE USER ‘dba_admin’‘localhost’ IDENTIFIED BY ‘AnotherStrongPass!’; CREATE USER ‘dba_admin’‘192.168.1.%’ IDENTIFIED BY ‘AnotherStrongPass!’; -- 允许特定内网段 GRANT ALL PRIVILEGES ON *.* TO ‘dba_admin’‘localhost’ WITH GRANT OPTION; GRANT ALL PRIVILEGES ON *.* TO ‘dba_admin’‘192.168.1.%’ WITH GRANT OPTION; FLUSH PRIVILEGES;此外可以进行一些基础的性能观察。例如查看当前的缓冲池使用情况SHOW VARIABLES LIKE ‘innodb_buffer_pool_size’; SHOW STATUS LIKE ‘Innodb_buffer_pool_pages%’;这可以帮助你感受innodb_buffer_pool_size这个参数设置得是否合理。5. 常见问题排查与实战技巧即使按照步骤来你也可能会遇到一些“拦路虎”。这里我总结几个最常见的问题和解决方法。5.1 服务启动失败问题排查如果systemctl status mysqld显示失败按以下顺序排查检查错误日志这是第一现场。tail -100f /data/mysql_logs/error.log看最后的错误信息。检查权限确保/data/mysql_data和/data/mysql_logs目录的属主是mysql:mysql。检查端口占用3306端口是否被其他程序占用netstat -tlnp | grep 3306。检查SELinux在CentOS/RHEL上SELinux可能会阻止MySQL访问数据目录。可以临时禁用SELinux进行测试setenforce 0如果问题解决则需要为MySQL目录配置正确的SELinux上下文而不是永久关闭SELinux。检查配置文件语法mysqld --defaults-file/etc/my.cnf --validate-config可以检查配置文件是否有语法错误。5.2 客户端连接失败问题服务起来了但用mysql客户端连不上。socket文件问题如果使用-S指定socket或默认连接确认/tmp/mysql.sock文件存在且权限正确。有时socket路径在my.cnf里配置的和客户端默认寻找的不一致。绑定地址问题确认my.cnf中的bind-address是0.0.0.0允许所有IP或特定的服务器IP而不是127.0.0.1仅本地。用户权限问题你是否在用root‘localhost’登录密码是否正确是否已经执行了FLUSH PRIVILEGES防火墙问题服务器防火墙如firewalld、iptables可能屏蔽了3306端口。需要添加规则放行。5.3 性能与稳定性初期观察安装完成后建议运行一段时间观察几个关键指标连接数SHOW STATUS LIKE ‘Threads_connected’;对比max_connections看是否接近上限。慢查询定期查看/data/mysql_logs/slow.log看看是否有需要优化的SQL。缓冲池命中率这是一个重要的性能指标。可以通过以下公式粗略计算SHOW STATUS LIKE ‘Innodb_buffer_pool_read%’; -- 命中率 (1 - Innodb_buffer_pool_reads / Innodb_buffer_pool_read_requests) * 100%如果命中率长期低于95%可能需要考虑增大innodb_buffer_pool_size。5.4 备份与恢复的起点思考安装配置妥当后第一件该做的事不是马上导入业务数据而是制定备份策略。哪怕数据是空的也要测试备份恢复流程。对于MySQL 8.0物理备份如Percona XtraBackup和逻辑备份mysqldump都是可选项。我建议在安装初期就先用mysqldump备份一下系统库和你的初始配置/usr/local/mysql/bin/mysqldump -u dba_admin -p --all-databases --single-transaction --master-data2 /backup/full_init_backup.sql这条命令会生成一个包含所有数据的SQL文件--single-transaction参数确保在InnoDB表上备份的一致性。把这个流程写成脚本放到cron里定期执行这才是运维的正道。走到这里一个生产可用的MySQL 8.0.31基础环境就已经搭建完成了。这套流程我重复过很多次关键不在于记忆命令而在于理解每个步骤的目的和可能产生的影响。数据库运维谨慎和规划永远比事后救火更重要。下次如果你需要搭建主从复制或者进行版本升级今天打下的这个规范的基础会让后续的工作顺畅得多。

相关新闻

基于Vue 3构建JSON可视化编辑器:从原理到实战

基于Vue 3构建JSON可视化编辑器:从原理到实战

1. 项目缘起:为什么我们需要一个专门的JSON字段编辑器? 在前后端分离的开发模式下,JSON数据格式几乎成了前后端通信的“普通话”。无论是API接口的请求与响应,还是前端组件间的状态传递,亦或是配置文件的管理&#xff…

2026/10/13 12:02:12 阅读更多 →
Python实现LSM模型:可转债定价与套利策略的工程化实践

Python实现LSM模型:可转债定价与套利策略的工程化实践

如果你在量化投资领域工作,或者对可转债市场感兴趣,你很可能听说过“LSM模型”这个名字。它经常出现在一些关于可转债定价、套利策略的学术论文或高端策略报告中,听起来高深莫测,似乎与复杂的数学推导和蒙特卡洛模拟紧密相连。但一…

2026/10/13 12:02:11 阅读更多 →
第9章 异常、IRQ 与时间:内核获得外部世界的节拍

第9章 异常、IRQ 与时间:内核获得外部世界的节拍

第9章 异常、IRQ 与时间:内核获得外部世界的节拍 内核版本:Linux 7.1.3 架构:x86_64 核心源码路径: arch/x86/kernel/traps.c arch/x86/kernel/idt.c arch/x86/kernel/irqinit.c kernel/irq/irqdesc.c kernel/time/tick-common.c kernel/time/timekeeping.c kernel/time/h…

2026/10/13 12:02:21 阅读更多 →

最新新闻

智能体部署工具链选型与编排层实战指南

智能体部署工具链选型与编排层实战指南

1. 为什么“趁手”比“强大”更重要1.1 一个被忽略的真相:工具选型决定落地效率很多人一上来就问“哪个模型最强”,这其实是个伪命题。我在过去一年里帮三个不同规模的团队做过智能体落地,踩过最大的坑不是模型能力不够,而是工具链…

2026/10/14 5:33:14 阅读更多 →
Scrapy+Redis分布式爬虫改造实战:从单机到集群

Scrapy+Redis分布式爬虫改造实战:从单机到集群

把单机Scrapy跑顺之后,你迟早会碰上“这量级单机实在顶不住”的时刻。我之前维护的一套爬虫,单机大概跑到 8~10 个并发,每天抓几十万页面时还凑合,但某天业务方需求翻了三倍,Redis 里 pending 的 URL 越堆越多&#xf…

2026/10/14 5:33:14 阅读更多 →
国产旗舰涨价2000元背后:芯片影像成本与高端化博弈解析

国产旗舰涨价2000元背后:芯片影像成本与高端化博弈解析

最近我刷到一条数码圈的吐槽,大意是:“某国产旗舰新机发布,起售价直接比上一代贵了2000块,之前说国产手机要涨价的预言算是真的应验了。普通人是真买不起国产手机了,只能去买iPhone。”这话乍一看有点道理,…

2026/10/14 5:33:14 阅读更多 →
工业AI落地工厂:视觉质检、预测性维护与工艺优化实操指南

工业AI落地工厂:视觉质检、预测性维护与工艺优化实操指南

1. 工业AI到底在工厂里干什么:从概念到落地场景的拆解工业AI这个词这两年热得发烫,但真正走进车间、走到产线边上,你会发现它跟互联网圈子里聊的AI完全不是一回事。互联网AI可以容忍一定的错误率,推荐错了顶多用户划走&#xff1b…

2026/10/14 5:33:14 阅读更多 →
缓存穿透防御实战:从参数校验到布隆过滤器与空值缓存

缓存穿透防御实战:从参数校验到布隆过滤器与空值缓存

凌晨两点半,值班手机把我从浅睡眠里拽了出来。监控平台上数据库的慢查询曲线直直地往上冲,像是心电图上拉平了的直线。第一反应是缓存挂了,登录服务器去看,Redis的QPS正常,内存占用也正常,数据节点一个没宕…

2026/10/14 5:33:14 阅读更多 →
电信用户流失预测实战:从特征工程到模型落地的完整指南

电信用户流失预测实战:从特征工程到模型落地的完整指南

简介:面向数据分析与机器学习入门者的电信用户流失预测完整项目,基于Kaggle公开数据集,从数据读取与清洗起步,依次完成三大特征群可视化对比、皮尔逊相关系数剔除冗余特征、类别不平衡处理等关键步骤,并采用K折交叉验证…

2026/10/14 5:32:14 阅读更多 →

日新闻

AnyPS5通用适配层设计:兼容性与性能的工程取舍

AnyPS5通用适配层设计:兼容性与性能的工程取舍

1. 从"AnyPS5"这个名字说起:它到底想解决什么问题第一次看到"AnyPS5"这个标题,我脑子里冒出来的第一个念头是:这大概率是一个围绕"跨平台运行"或者"通用适配"做文章的项目。名字里的"Any"…

2026/10/14 0:00:41 阅读更多 →
Flutter跨平台开发实战:二手交易应用与HarmonyOS适配

Flutter跨平台开发实战:二手交易应用与HarmonyOS适配

1. 项目概述:Flutter跨平台二手交易应用开发作为一名长期从事移动应用开发的工程师,我最近完成了一个基于Flutter框架的二手物品交易平台项目。这个项目最吸引我的地方在于它完美结合了Flutter的跨平台优势与HarmonyOS的生态特性,实现了"…

2026/10/14 0:00:41 阅读更多 →
DFS算法解决飞机降落调度问题实战

DFS算法解决飞机降落调度问题实战

1. 项目背景与核心思路飞机降落问题是一个经典的调度优化场景,也是算法竞赛和面试中的高频题目。这个题目要求我们合理安排多架飞机的降落顺序和时间,确保所有飞机都能安全着陆而不发生冲突。在实际航空管制中,这类问题直接关系到飞行安全和机…

2026/10/14 0:00:41 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/14 3:30:28 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/13 16:22:04 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/14 3:29:58 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/13 22:01:27 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/13 14:57:39 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 18:11:17 阅读更多 →