rpm --import只叠加不覆盖,导致系统残留多个MySQL密钥ID(如0x5072e1f5、0xb7b3b788a8d3785c),yum随机选用失败密钥校验新包;须用for循环批量卸载所有MySQL相关gpg-pubkey,再导入2022和2023官方密钥,并验证无残留输出。

为什么 rpm -qa gpg-pubkey | grep mysql 会看到多个密钥ID
系统里混着旧密钥(比如 0x5072e1f5、0xb7b3b788a8d3785c)不是偶然,而是 rpm 密钥管理的默认行为:每次 rpm --import 都只叠加不覆盖。哪怕你导入了 RPM-GPG-KEY-mysql-2023,旧密钥仍留在 rpm -qa gpg-pubkey 列表里。yum/dnf 在校验时会随机选一个匹配的密钥,而旧密钥根本签不了新包(如 mysql-community-server-8.0.46),于是报 “already installed but they are not correct for this package”。
如何安全清空所有 MySQL 相关 GPG 密钥
别跳过这步——残留密钥是问题复发的根源。执行以下命令批量卸载:
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 应无任何输出
注意:
- 不要手动删 /etc/pki/rpm-gpg/RPM-GPG-KEY-mysql 文件,那是 repo 配置引用路径,删了反而让 yum 找不到 key 文件
- --allmatches 是关键,确保同名密钥全部卸载,避免漏掉某个版本
RHEL/CentOS/Rocky 系统必须导入哪两个密钥
截至 2026 年,MySQL 官方维护的签名密钥有两个有效版本,必须都导入才能覆盖全部包签名:
sudo rpm --import https://repo.mysql.com/RPM-GPG-KEY-mysql-2022sudo 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 的条目,且指纹对应官方公布的 SHA256 值(如 2023 密钥有效期至 2026-06-16)
如果 curl 报 SSL certificate problem,说明系统 CA 证书过旧,可临时加 --nogpgcheck 参数导入,但仅限此一步:
sudo rpm --import --nogpgcheck https://repo.mysql.com/RPM-GPG-KEY-mysql-2023
Debian/Ubuntu 用户不能用 rpm --import
APT 和 RPM 密钥体系不兼容。apt-key add 已弃用且污染全局密钥环,正确做法是创建独立 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
然后确保你的 /etc/apt/sources.list.d/mysql.list 中 signed-by= 指向该路径,例如:
deb [arch=amd64 signed-by=/usr/share/keyrings/mysql-2023-keyring.gpg] https://repo.mysql.com/apt/debian/ bookworm mysql-8.0
最后执行 sudo apt update,而不是 apt-key add 或 apt-get install 后补救
真正容易被忽略的是密钥清理的彻底性——只要 rpm -qa gpg-pubkey 里还残留一个旧 ID,就可能在某次安装中被随机选中,导致 NOKEY 报错重现。这不是运气问题,是密钥环的确定性行为。


















