报错并非密钥真过期,而是系统残留旧密钥(如0x5072e1f5、0xb7b3b788a8d3785c)导致yum/dnf随机选用失败密钥校验;须彻底清理所有mysql相关gpg-pubkey,再导入官方rpm-gpg-key-mysql-2023(截至2026年7月最新),并执行rpm -qa gpg-pubkey | grep -i mysql确认清空、验证指纹为3a79bd29,debian/ubuntu用户须用gpg --dearmor转为二进制密钥环格式。

报错不是密钥真过期了,而是系统里混着旧密钥(比如 0x5072E1F5、0xB7B3B788A8D3785C),yum/dnf 随机挑了一个失败的密钥去校验新包——你刚导入的 RPM-GPG-KEY-mysql-2023 根本没被用上。
为什么 rpm --import 新密钥后还是报 GPG 错误
RPM 密钥环支持多个同名密钥共存,rpm --import 只加不删。只要系统里还留着 gpg-pubkey-5072e1f5-* 这类残留项,yum install mysql-community-server 就可能拿它去校验 mysql-community-common-8.0.46,而这个旧密钥根本签不了新包。
-
rpm -qa gpg-pubkey | grep -i mysql会输出类似gpg-pubkey-3a79bd29-4a806c31或gpg-pubkey-5072e1f5-5c4058fb—— 这些 ID 对应不同年份的签名,混用必然失败 - 别信“重装 repo 包就能解决”,那只是掩耳盗铃
- EL9 系统必须确认
baseurl中是el9,不是el7或el8;密钥与包版本强绑定
彻底清理 MySQL 相关 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 rm -f /etc/pki/rpm-gpg/RPM-GPG-KEY-mysql*
导入并验证最新官方密钥(2023 版)
截至 2026 年 7 月,MySQL 官方仍在使用 RPM-GPG-KEY-mysql-2023,不是 2022,也不是 2024(尚未发布)。
- 远程导入(推荐):
sudo rpm --import https://repo.mysql.com/RPM-GPG-KEY-mysql-2023 - 若网络受限,可手动下载再导入:
wget https://repo.mysql.com/RPM-GPG-KEY-mysql-2023 -O /tmp/RPM-GPG-KEY-mysql-2023 && sudo rpm --import /tmp/RPM-GPG-KEY-mysql-2023 - 验证是否成功:
rpm -q gpg-pubkey --qf '%{name}-%{version}-%{release} --> %{summary}\n' | grep -i mysql
应看到含2023的条目,且指纹为3A79BD29
Debian/Ubuntu 用户必须用 gpg --dearmor + signed-by
APT 系统不认 RPM 密钥,apt-key add 已弃用,且会污染全局密钥环。
- 创建 keyring 目录:
sudo mkdir -p /usr/share/keyrings - 下载并转为二进制格式(
curl -fsSL和--dearmor缺一不可):curl -fsSL https://repo.mysql.com/RPM-GPG-KEY-mysql-2023 | sudo gpg --dearmor -o /usr/share/keyrings/mysql-2023-keyring.gpg - 修改源配置(如
/etc/apt/sources.list.d/mysql.list):deb [arch=amd64 signed-by=/usr/share/keyrings/mysql-2023-keyring.gpg] http://repo.mysql.com/apt/debian bookworm mysql-8.0 - 最后执行:
sudo apt update
密钥清理和格式转换这两步最容易被跳过,但恰恰是问题反复出现的根源。尤其是 Debian 系统上漏掉 --dearmor,或 EL9 上没改 baseurl 里的 el9,都会让前面所有操作失效。











