报错不是密钥真过期,而是系统残留旧密钥(如0x5072e1f5、0xb7b3b788a8d3785c)导致yum随机选用失败密钥校验;须彻底清理所有mysql相关gpg-pubkey后重新导入官方2022/2023密钥,并执行yum clean all && yum makecache或apt update刷新缓存。

直接告诉你结论:报错不是密钥真过期了,而是系统里混着旧密钥(比如 0x5072E1F5、0xB7B3B788A8D3785C),yum/dnf/rpm 随机挑了一个失败的密钥去校验新包——你刚导入的 RPM-GPG-KEY-mysql-2022 或 RPM-GPG-KEY-mysql-2023 根本没被用上。
为什么 rpm --import 新密钥后还是报 GPG 错误
RPM 密钥环支持多个同名密钥共存,rpm --import 只加不删,旧密钥仍驻留在 rpm -qa gpg-pubkey 列表中。只要系统里还留着 gpg-pubkey-5072e1f5-* 这类残留项,yum install mysql-community-server 就可能拿它去校验 mysql-community-common-8.0.46,而这个旧密钥根本签不了新包。
-
rpm -qa gpg-pubkey | grep -i mysql查看当前所有 MySQL 相关密钥 ID - 输出类似
gpg-pubkey-3a79bd29-4a806c31或gpg-pubkey-5072e1f5-5c4058fb,说明已有残留 - 这些 ID 对应不同年份的签名(
3a79bd29是 2022/2023 年密钥,5072e1f5是更早版本),混用必然失败 - 别信“重装 repo 包就能解决”,那只是掩耳盗铃
如何彻底清理并导入正确 GPG 密钥
必须清空所有 MySQL 相关密钥,再导入官方全量密钥。别跳过清理这步,否则问题必复发。
- 批量清理命令(安全、生产环境可用):
for key in $(rpm -qa gpg-pubkey | grep -i mysql | cut -d'-' -f4-); do rpm -e --allmatches gpg-pubkey-$key; done - 确认清空:
rpm -qa gpg-pubkey | grep -i mysql应无任何输出 - 导入两个官方密钥(兼容性更稳):
sudo rpm --import https://repo.mysql.com/RPM-GPG-KEY-mysql-2022和sudo rpm --import https://repo.mysql.com/RPM-GPG-KEY-mysql-2023 - 验证是否成功:
rpm -q gpg-pubkey --qf '%{name}-%{version}-%{release} --> %{summary}\n' | grep -i mysql,应看到含 2022 和 2023 的条目
Debian/Ubuntu 用户该怎么做
APT 系统不认 RPM 密钥,不能直接用 rpm --import。必须走 gpg --dearmor + signed-by 路径,否则会格式不兼容或污染全局密钥环。
- 创建 keyring 目录:
sudo mkdir -p /usr/share/keyrings - 下载并转为二进制格式:
curl -fsSL https://repo.mysql.com/RPM-GPG-KEY-mysql-2023 | sudo gpg --dearmor -o /usr/share/keyrings/mysql-2023-keyring.gpg - 检查密钥有效性:
gpg --no-default-keyring --keyring /usr/share/keyrings/mysql-2023-keyring.gpg --list-keys,输出中应含pub rsa4096 2023-01-19 [SC] [expires: 2028-01-18]和对应 key IDB7B3B788A8D3785C - 修改源文件(如
/etc/apt/sources.list.d/mysql.list),把deb行改成:deb [arch=amd64 signed-by=/usr/share/keyrings/mysql-2023-keyring.gpg] http://repo.mysql.com/apt/debian bookworm mysql-8.0
最容易被忽略的是缓存和仓库配置:即使密钥导入成功,yum clean all && yum makecache 或 sudo apt update 必须执行,否则旧元数据仍引用失效路径;同时确认 /etc/yum.repos.d/mysql-community.repo 中的 gpgkey= 指向的是有效 URL(不是 file:///etc/pki/rpm-gpg/RPM-GPG-KEY-mysql 这种硬编码路径),且 gpgcheck=1 保持启用。











