MySQL 5.7与8.0双版本共存部署实战指南
1. 项目概述为什么需要在一台机器上共存两个MySQL版本做后端开发或者运维的朋友可能都遇到过这个场景线上生产环境还在跑着老版本的MySQL比如经典的5.7但新项目或者本地开发环境想尝鲜或者必须使用新特性比如MySQL 8.0。直接升级线上数据库风险太大重装系统又太折腾。这时候最稳妥的办法就是在同一台机器上让MySQL 5.7和8.0和平共处各自监听不同的端口互不干扰。这听起来简单但实际操作起来从安装、配置到服务管理每一步都有不少细节需要注意稍有不慎就会导致端口冲突、服务无法启动甚至把原有的数据库搞乱。我最近就因为项目需要在自己的CentOS 7服务器上成功部署了MySQL 5.7和8.0的双版本环境把整个流程和踩过的坑都梳理了一遍。这篇文章就是一份详细的实战记录目标就是让你能照着步骤安全、顺利地完成双版本MySQL的部署无论是用于开发测试还是作为生产环境的过渡方案。2. 环境准备与核心思路拆解在开始动手之前我们必须把核心思路和准备工作做扎实。双版本共存的核心在于“隔离”主要包括以下几个层面的隔离安装路径隔离两个版本的MySQL必须安装在不同的目录下绝对不能混用同一个/usr/local/mysql这样的默认路径。数据目录隔离各自的数据文件如ibdata1,ib_logfile*, 以及各个数据库的文件夹必须分开存放。配置文件隔离需要为每个版本准备独立的配置文件如my.cnf其中指定各自专用的端口、Socket文件路径、数据目录等关键参数。服务进程与端口隔离通过不同的端口号如5.7用33068.0用3307和Unix Socket文件来区分两个实例确保它们能同时被客户端访问。系统服务隔离在Linux上需要注册两个不同的系统服务如mysqld5.7和mysqld8.0方便独立管理启动、停止和状态查看。基于这个思路我们的操作流程可以概括为先确保原有5.7稳定运行并记录其配置 - 为8.0版本规划全新的安装和数据目录 - 分别进行初始化、配置和服务注册 - 最后进行连接测试和基础优化。在整个过程中绝对不要动原有5.7版本的数据目录和正在使用的配置文件这是保证生产环境安全的第一原则。注意本文以Linux系统CentOS 7/8, Rocky Linux等为例进行演示使用二进制压缩包TAR Archive的方式安装这种方式最灵活也最适合多版本共存。Windows或macOS的思路类似但具体路径和命令会有差异。3. 详细实操步骤从规划到安装配置3.1 步骤一检查与记录现有MySQL 5.7环境在安装新版本之前我们必须对现有环境了如指掌。首先登录你的服务器执行以下命令# 1. 检查当前MySQL 5.7的运行状态和版本 systemctl status mysqld mysql -V # 2. 查看当前MySQL使用的配置文件路径 # MySQL会按顺序读取多个位置的my.cnf使用以下命令查看最终生效的配置 mysql --help | grep -A 1 -B 1 Default options # 通常配置文件可能在 /etc/my.cnf, /etc/mysql/my.cnf, /usr/local/mysql/etc/my.cnf 等位置 # 使用以下命令查看具体加载了哪些文件 ps aux | grep mysqld | grep -v grep # 在输出中寻找 --defaults-file 或 --defaults-extra-file 参数这指明了配置文件。 # 3. 记录关键参数 # 连接到MySQL 5.7实例 mysql -u root -p进入MySQL命令行后执行以下SQL将输出结果保存下来SHOW VARIABLES LIKE port; SHOW VARIABLES LIKE socket; SHOW VARIABLES LIKE datadir; SHOW VARIABLES LIKE basedir;记下这些值尤其是port通常是3306、datadir数据目录如/var/lib/mysql和socket文件路径如/var/lib/mysql/mysql.sock。这能帮助我们避免与8.0版本产生冲突。3.2 步骤二为MySQL 8.0规划与创建专属目录假设我们计划将MySQL 8.0安装到/usr/local/mysql8数据存放在/data/mysql8。你需要根据磁盘空间情况自行调整。# 创建安装目录和数据目录 sudo mkdir -p /usr/local/mysql8 sudo mkdir -p /data/mysql8 # 创建mysql用户和组如果已有mysql用户可跳过但建议检查 sudo groupadd mysql sudo useradd -r -g mysql -s /bin/false mysql # 将数据目录的所有权赋予mysql用户 sudo chown -R mysql:mysql /data/mysql8 sudo chmod -R 750 /data/mysql83.3 步骤三下载并安装MySQL 8.0二进制包前往MySQL官方网站下载对应你系统架构通常是x86_64的二进制压缩包TAR Archive。建议使用国内镜像或确保网络通畅。# 进入一个临时目录例如 /tmp cd /tmp # 使用wget下载请替换为实际的下载链接 # 例如wget https://dev.mysql.com/get/Downloads/MySQL-8.0/mysql-8.0.36-linux-glibc2.17-x86_64.tar.xz # 这里以8.0.36为例请下载最新或所需版本 wget [你的MySQL 8.0 TAR包下载链接] # 解压压缩包 tar -xvf mysql-8.0.*-linux-glibc2.17-x86_64.tar.xz # 将解压后的内容移动到我们规划的安装目录 sudo mv mysql-8.0.*-linux-glibc2.17-x86_64/* /usr/local/mysql8/ # 进入安装目录创建mysql-files目录用于安全文件操作 cd /usr/local/mysql8 sudo mkdir mysql-files sudo chown mysql:mysql mysql-files sudo chmod 750 mysql-files3.4 步骤四准备MySQL 8.0的独立配置文件这是最关键的一步配置错误直接导致服务启动失败。我们需要为8.0创建一个全新的配置文件例如/etc/my8.cnf。sudo vim /etc/my8.cnf将以下配置内容写入文件。请务必根据你的实际情况修改port,socket,datadir,basedir,log-error等路径并确保与5.7的配置不冲突。[client] port3307 socket/data/mysql8/mysql.sock [mysql] default-character-setutf8mb4 [mysqld] # 基础设置 usermysql port3307 socket/data/mysql8/mysql.sock basedir/usr/local/mysql8 datadir/data/mysql8 log-error/data/mysql8/error.log pid-file/data/mysql8/mysql.pid # 网络与连接 bind-address0.0.0.0 max_connections200 character-set-serverutf8mb4 collation-serverutf8mb4_0900_ai_ci default_authentication_pluginmysql_native_password # 文件路径 tmpdir/tmp lc-messages-dir/usr/local/mysql8/share # InnoDB设置 innodb_buffer_pool_size256M innodb_log_file_size48M innodb_flush_log_at_trx_commit1 innodb_lock_wait_timeout50 # 安全与兼容性重要 # 禁用符号链接避免安全问题 symbolic-links0 # 8.0默认的密码认证方式可能较老客户端不兼容此项可确保兼容性 default_authentication_pluginmysql_native_password # 关闭表名大小写敏感根据习惯设置 lower_case_table_names1 # 二进制日志如需 # server-id2 # log-bin/data/mysql8/mysql-bin # expire_logs_days7保存并退出。这个配置文件明确指定了8.0实例使用3307端口Socket和数据文件都在/data/mysql8下与5.7的3306和/var/lib/mysql完全隔离。3.5 步骤五初始化MySQL 8.0数据目录MySQL 8.0的初始化命令与5.7略有不同且更加严格。我们使用--defaults-file指定刚创建的配置文件。# 确保在mysql用户下操作相关目录权限 sudo chown -R mysql:mysql /usr/local/mysql8 sudo chown -R mysql:mysql /data/mysql8 # 执行初始化使用 --initialize-insecure 或 --initialize # --initialize-insecure: 初始化后root用户密码为空仅用于测试生产环境勿用 # --initialize: 初始化后会在error log中生成一个随机root密码 cd /usr/local/mysql8 sudo bin/mysqld --defaults-file/etc/my8.cnf --initialize-insecure --usermysql重要选择解释这里我用了--initialize-insecure因为这是搭建测试/开发环境图个方便初始化后root密码为空。如果是生产环境强烈建议使用--initialize然后去/data/mysql8/error.log里找到生成的临时密码。执行成功后/data/mysql8目录下会生成完整的系统数据库文件。3.6 步骤六启动MySQL 8.0实例并进行安全设置初始化完成后我们可以首次启动这个8.0实例。由于还没有注册为系统服务我们手动启动。# 使用指定的配置文件启动MySQL 8.0 sudo /usr/local/mysql8/bin/mysqld_safe --defaults-file/etc/my8.cnf --usermysql # 使用mysql客户端连接注意指定端口和socket # 因为密码为空直接回车 sudo /usr/local/mysql8/bin/mysql -u root -p --port3307 --socket/data/mysql8/mysql.sock成功连接后你就进入了MySQL 8.0的命令行。接下来必须立即修改root密码并执行一些安全设置即使是在内网环境。-- 修改root用户密码 ALTER USER rootlocalhost IDENTIFIED BY YourStrongPassword8; FLUSH PRIVILEGES; -- 可选创建远程访问用户按需 CREATE USER remote_user% IDENTIFIED BY RemoteUserPass8; GRANT ALL PRIVILEGES ON *.* TO remote_user% WITH GRANT OPTION; FLUSH PRIVILEGES; -- 退出 exit;修改密码后下次连接就需要使用新密码了。3.7 步骤七将MySQL 8.0注册为系统服务手动启动毕竟不方便我们需要像管理5.7一样使用systemctl来管理8.0。这需要创建一个新的service文件。sudo vim /etc/systemd/system/mysqld8.service写入以下内容注意ExecStart和ExecStop的路径要指向8.0的安装目录并指定专用的配置文件。[Unit] DescriptionMySQL Server 8.0 Afternetwork.target Aftersyslog.target [Install] WantedBymulti-user.target [Service] Usermysql Groupmysql Typeforking # 启动命令 ExecStart/usr/local/mysql8/bin/mysqld_safe --defaults-file/etc/my8.cnf # 停止命令使用mysqladmin ExecStop/usr/local/mysql8/bin/mysqladmin -S /data/mysql8/mysql.sock -u root -p shutdown # 给服务足够的启动和停止时间 TimeoutSec300 # 重启策略 Restarton-failure RestartPreventExitStatus1 PrivateTmptrue保存后重新加载systemd并启用服务。sudo systemctl daemon-reload sudo systemctl enable mysqld8.service # 停止之前手动启动的进程如果还在运行 sudo pkill -f mysqld.*my8.cnf # 使用systemctl启动服务 sudo systemctl start mysqld8.service sudo systemctl status mysqld8.service如果状态显示为active (running)恭喜你MySQL 8.0服务已经成功安装并运行了现在你可以用sudo systemctl start/stop/restart mysqld8来管理它用sudo systemctl status mysqld8查看状态。4. 连接测试、日常管理与问题排查4.1 双版本连接测试现在你的机器上同时运行着两个MySQL实例。如何区分连接它们呢关键在于指定正确的端口或Socket文件。连接MySQL 5.7默认端口3306:mysql -u root -p -P 3306 -h 127.0.0.1 # 或者使用本地socket如果客户端配置了默认socket mysql -u root -p连接MySQL 8.0我们设置的端口3307:mysql -u root -p -P 3307 -h 127.0.0.1 # 或者使用我们指定的socket文件 mysql -u root -p -S /data/mysql8/mysql.sock你可以在两个客户端窗口分别执行SELECT VERSION();来验证一个会返回5.7.x另一个返回8.0.x。4.2 日常管理命令汇总为了方便我把管理两个服务的常用命令总结一下操作MySQL 5.7 (服务名通常为mysqld)MySQL 8.0 (服务名我们设为mysqld8)启动服务sudo systemctl start mysqldsudo systemctl start mysqld8停止服务sudo systemctl stop mysqldsudo systemctl stop mysqld8重启服务sudo systemctl restart mysqldsudo systemctl restart mysqld8查看状态sudo systemctl status mysqldsudo systemctl status mysqld8设置开机自启sudo systemctl enable mysqldsudo systemctl enable mysqld8禁用开机自启sudo systemctl disable mysqldsudo systemctl disable mysqld8查看日志sudo tail -f /var/log/mysqld.log(路径可能不同)sudo tail -f /data/mysql8/error.log4.3 常见问题与排查技巧实录在实际操作中你可能会遇到以下问题这里给出排查思路问题1MySQL 8.0服务启动失败状态显示failed。排查思路首要查看错误日志执行sudo journalctl -u mysqld8.service -xe或直接看我们配置的日志文件sudo tail -100 /data/mysql8/error.log。错误信息通常非常明确。常见错误1目录权限不足。确保/data/mysql8和/usr/local/mysql8的所有者和所属组都是mysql并且有正确的读写权限。用ls -la /data/mysql8检查。常见错误2端口被占用。检查3307端口是否被其他程序占用sudo netstat -tlnp | grep 3307。如果被占用要么停止那个程序要么在/etc/my8.cnf中为MySQL 8.0换一个端口。常见错误3Socket文件路径冲突或权限问题。确保/data/mysql8目录存在且mysql用户有写权限确保/etc/my8.cnf中socket配置的路径是准确的。常见错误4配置文件语法错误。仔细检查/etc/my8.cnf是否有拼写错误特别是[mysqld]等节标题是否正确。问题2使用mysql客户端连接8.0时报错“ERROR 2059 (HY000): Authentication plugin caching_sha2_password cannot be loaded”。原因与解决这是MySQL 8.0默认使用了更强的密码认证插件caching_sha2_password一些老的客户端或驱动不支持。我们在配置文件中已经通过default_authentication_pluginmysql_native_password强制使用了旧的认证方式。如果还出现可以在MySQL 8.0中修改相应用户的认证插件ALTER USER 你的用户名localhost IDENTIFIED WITH mysql_native_password BY 你的密码; FLUSH PRIVILEGES;问题3如何区分两个版本的命令行工具解决方案为两个版本创建别名或使用绝对路径。在~/.bashrc中添加别名alias mysql5/usr/bin/mysql # 假设5.7的客户端在/usr/bin下 alias mysql8/usr/local/mysql8/bin/mysql --defaults-file/etc/my8.cnf然后执行source ~/.bashrc。之后就可以用mysql5和mysql8命令分别连接两个实例了。问题4想卸载其中一个版本怎么办安全卸载步骤首先停止要卸载的服务sudo systemctl stop mysqld8。禁用开机启动sudo systemctl disable mysqld8。删除服务文件sudo rm /etc/systemd/system/mysqld8.service。重新加载systemdsudo systemctl daemon-reload。谨慎操作删除该版本的安装目录和数据目录sudo rm -rf /usr/local/mysql8 /data/mysql8。删除该版本的配置文件sudo rm /etc/my8.cnf。切记删除数据目录(/data/mysql8)意味着该实例的所有数据库都将永久丢失操作前务必确认已备份重要数据5. 进阶配置与性能调优考虑双版本环境搭建好后如果用于开发测试基础配置已经足够。但如果负载稍高或者希望更精细化控制可以考虑以下方面1. 资源隔离与限制为了避免两个实例争夺系统资源CPU、内存、磁盘IO可以在各自的my.cnf中进行限制。内存innodb_buffer_pool_size是InnoDB最重要的参数应根据机器总内存合理分配。例如机器有16G内存5.7分配4G8.0分配4G给系统和其他应用留出余地。连接数通过max_connections控制每个实例的最大并发连接数防止一个实例耗尽所有连接资源。2. 监控与日志分离确保两个实例的日志文件错误日志、慢查询日志、通用日志路径不同便于排查问题。# 在 /etc/my8.cnf 的 [mysqld] 节添加 slow_query_log1 slow_query_log_file/data/mysql8/slow.log long_query_time2 general_log0 # 生产环境建议关闭通用日志否则日志量巨大 general_log_file/data/mysql8/general.log3. 备份策略差异化两个版本的mysqldump工具最好使用各自版本的避免兼容性问题。制定备份脚本时要指定正确的端口、Socket和客户端路径。# 备份MySQL 5.7 /usr/bin/mysqldump -u root -p -P 3306 --all-databases backup_5.7.sql # 备份MySQL 8.0 /usr/local/mysql8/bin/mysqldump -u root -p -P 3307 --all-databases backup_8.0.sql整个流程走下来最深的体会就是“规划先行隔离为王”。在操作前花十分钟画个简单的目录和端口规划图能避免后面一大堆的麻烦。尤其是配置文件和数据目录的路径一旦弄混排查起来相当头疼。另外善用--defaults-file参数和systemctl status查看日志是解决服务启动问题的两大法宝。这套方法不仅适用于5.7和8.0理论上也适用于任何两个你想共存的MySQL版本核心思路都是相通的。

相关新闻

银河麒麟V10安装神通数据库全流程指南与国产化迁移实践

银河麒麟V10安装神通数据库全流程指南与国产化迁移实践

1. 项目概述与核心需求解析 最近在国产化替代的浪潮下,很多项目都开始从传统的CentOS、Ubuntu迁移到国产操作系统,比如银河麒麟(KylinOS)。我手头就有一个项目,客户明确要求底层操作系统使用银河麒麟V10,数…

2026/10/17 1:27:43 阅读更多 →
精密积分电路设计:攻克电容电介吸收,从理论到选型与实测

精密积分电路设计:攻克电容电介吸收,从理论到选型与实测

1. 项目概述:从“理想”到“现实”的电容选择 在模拟电路设计,尤其是精密信号处理领域,积分电路是一个基础且至关重要的模块。无论是用于波形变换、信号调理,还是作为模拟计算机的核心运算单元,其性能直接决定了整个系…

2026/10/18 1:37:50 阅读更多 →
从零构建操作系统:引导程序、保护模式与Bochs调试实践

从零构建操作系统:引导程序、保护模式与Bochs调试实践

1. 项目概述:从零开始,构建一个属于自己的“玩具”操作系统 如果你对计算机底层技术充满好奇,看着屏幕上运行的Windows、macOS或Linux,心里是否曾闪过一个念头:“这玩意儿到底是怎么跑起来的?” 或者&#…

2026/10/17 2:01:20 阅读更多 →

最新新闻

梯度消失全解析:从数学原理到ReLU、BN与残差连接的实战解决路径

梯度消失全解析:从数学原理到ReLU、BN与残差连接的实战解决路径

1. 从一个训练到一半就“躺平”的模型说起如果你亲手训练过一个稍微有点深度的神经网络,大概率见过这种让人抓狂的场景:前几个epoch损失还降得好好的,突然就卡在一个不上不下的数值,准确率死活上不去,再往后训练&#…

2026/10/18 15:01:54 阅读更多 →
LAMMPS (23 Jun 2022) + oneAPI 安装避坑:从环境变量到编译验证的完整清单

LAMMPS (23 Jun 2022) + oneAPI 安装避坑:从环境变量到编译验证的完整清单

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

2026/10/18 15:01:54 阅读更多 →
MATLAB三维热力图绘制全指南:从数据组织到交互验证

MATLAB三维热力图绘制全指南:从数据组织到交互验证

简介:这份资源聚焦MATLAB三维数据可视化,面向需要绘制三维热力图的学生、科研人员与工程技术人员,帮助解决三维曲面数据难以直观呈现的问题。资源包共3个文件,包含1个m脚本、1个mat数据文件和1个png效果图,压缩包约219…

2026/10/18 15:01:54 阅读更多 →
2026 用 AI 工具分析空口包 WiFi 包:TaoToken 统一 Key 接入 tshark/Wireshark 抓包总结

2026 用 AI 工具分析空口包 WiFi 包:TaoToken 统一 Key 接入 tshark/Wireshark 抓包总结

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

2026/10/18 15:01:54 阅读更多 →
Java SHA算法实战:选型、编码、文件校验与安全边界

Java SHA算法实战:选型、编码、文件校验与安全边界

说实话,看到“SHA加密算法”这个标题,我第一反应是:这又是一个被写烂的入门Demo。但实际在项目里接手过几个跟数据校验、安全存储相关的模块之后,我觉得“SHA”这一块值得聊的东西其实非常多——很多人止步于会用MessageDigest.ge…

2026/10/18 15:01:54 阅读更多 →
JsLeakWatcher 报出一批对象,真的是内存泄漏吗:页面缓存、监听器和可达路径怎么分

JsLeakWatcher 报出一批对象,真的是内存泄漏吗:页面缓存、监听器和可达路径怎么分

JsLeakWatcher 报出一批对象,真的是内存泄漏吗:页面缓存、监听器和可达路径怎么分 页面退出后 JsLeakWatcher 报出几十个对象,团队立刻把所有缓存清掉,结果二次进入变慢,告警却仍然存在。工具发现“对象仍可达”&…

2026/10/18 15:00:54 阅读更多 →

日新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/18 0:00:55 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/18 0:00:55 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/18 0:00:55 阅读更多 →

周新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/18 0:00:55 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/18 0:00:55 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/18 0:00:55 阅读更多 →

月新闻

我发现了一个新思路:用 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/18 0:55:02 阅读更多 →
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/17 17:22:31 阅读更多 →
黑夜航拍船只数据集训练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/18 12:16:16 阅读更多 →