记一次 MySQL 5.7 误删管理员 ‘root‘@‘localhost‘ 账户后的解决方案

本文档详细介绍了在MySQL中不小心删除'root@localhost'用户后,如何通过停止数据库、跳过密码验证登录、更改root口令、重启服务等步骤来恢复用户,并强调了在数据库管理中应谨慎对待root用户的使用。


前言

在我们的 MySQL 中,有个 ‘root’@‘localhost’,如果删除该用户后,就无法对其他用户授权了,即使你有一个 ALL PRIVILEGES 的普通用户也是不能授权的(仅可创建用户、增删改查等),本次是在创建了一个 'root'@'%',并赋予 ALL PRIVILEGES ON *.* 的情况下不小心删掉了原来的 'root'@'localhost' 用户的实验环境下进行演示的。

删除后的现象是:能正常的增删改查,但是 'root'@'%' 这个用户不能对其他用户授权(可创建用户),为了解决这个问题,需要将删掉的 'root'@'localhost' 用户恢复过来,接下来是详细操作步骤。

一、恢复步骤

1、stop 数据库

systemctl stop mysqld.service

2、跳过密码验证登录数据库

/opt/mysql/bin/mysqld_safe --defaults-file=/etc/my.cnf --user=mysql --skip-grant-tables &

重新再打开另一个终端登录数据库

mysql -u root -p
# 回车直接登录即可

3、更改 root 口令

use mysql;
insert into user set user='root',ssl_cipher='',x509_issuer='',x509_subject='';
flush privileges;

GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' IDENTIFIED BY 'passwd' WITH GRANT OPTION;
flush privileges;

4、查看新添加用户权限

select * from mysql.user where user='root'\G;

*************************** 1. row ***************************
                  Host: localhost
                  User: root
           Select_priv: Y
           Insert_priv: Y
           Update_priv: Y
           Delete_priv: Y
           Create_priv: Y
             Drop_priv: Y
           Reload_priv: Y
         Shutdown_priv: Y
          Process_priv: Y
             File_priv: Y
            Grant_priv: Y
       References_priv: Y
            Index_priv: Y
            Alter_priv: Y
          Show_db_priv: Y
            Super_priv: Y
 Create_tmp_table_priv: Y
      Lock_tables_priv: Y
          Execute_priv: Y
       Repl_slave_priv: Y
      Repl_client_priv: Y
      Create_view_priv: Y
        Show_view_priv: Y
   Create_routine_priv: Y
    Alter_routine_priv: Y
      Create_user_priv: Y
            Event_priv: Y
          Trigger_priv: Y
Create_tablespace_priv: Y
              ssl_type: 
            ssl_cipher: 
           x509_issuer: 
          x509_subject: 
         max_questions: 0
           max_updates: 0
       max_connections: 0
  max_user_connections: 0
                plugin: mysql_native_password
 authentication_string: *BB7F095E4808E1C1A5B7AAE4DE56F814CEF5C5CC
      password_expired: N
 password_last_changed: 2021-12-04 09:30:28
     password_lifetime: NULL
        account_locked: N
1 row in set (0.00 sec)

*************************** 1. row ***************************
                  Host: %
                  User: root
           Select_priv: Y
           Insert_priv: Y
           Update_priv: Y
           Delete_priv: Y
           Create_priv: Y
             Drop_priv: Y
           Reload_priv: Y
         Shutdown_priv: Y
          Process_priv: Y
             File_priv: Y
            Grant_priv: N
       References_priv: Y
            Index_priv: Y
            Alter_priv: Y
          Show_db_priv: Y
            Super_priv: Y
 Create_tmp_table_priv: Y
      Lock_tables_priv: Y
          Execute_priv: Y
       Repl_slave_priv: Y
      Repl_client_priv: Y
      Create_view_priv: Y
        Show_view_priv: Y
   Create_routine_priv: Y
    Alter_routine_priv: Y
      Create_user_priv: Y
            Event_priv: Y
          Trigger_priv: Y
Create_tablespace_priv: Y
              ssl_type: 
            ssl_cipher: 
           x509_issuer: 
          x509_subject: 
         max_questions: 0
           max_updates: 0
       max_connections: 0
  max_user_connections: 0
                plugin: mysql_native_password
 authentication_string: *A1F1CB851D62F002C09A0C9C4A76262473432F55
      password_expired: N
 password_last_changed: 2021-12-04 09:30:28
     password_lifetime: NULL
        account_locked: N
1 row in set (0.00 sec)

5、重启 MySQL 服务

Ctrl c 结束第二步,然后重新启动 MySQL

systemctl start mysqld.service

二、登录验证

mysql -u root -p
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 147
Server version: 5.7.34-log MySQL Community Server (GPL)

Copyright (c) 2000, 2021, Oracle and/or its affiliates.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

root@mysql 13:02:  [(none)]>

小结

不管是再测试环境还是生产环境,都要特别小心对数据库的 root 管理用户使用,一定要建立一个程序用户(读写)和一个查询用户(只读),避免使用 root 来直接测试,这样的话风险非常大(尤其是在生产环境中)。

<点击跳转至开头>

<think>我们正在解决两个问题: 1. 执行 `yum localinstall mysql57-community-release-el7-11.noarch.rpm` 时提示“不更新已安装软件包,无须任何处理” 2. 执行 `yum repolist enabled | grep "mysql.*-community.*"` 显示各MySQL社区仓库可用软件包数量为0 根据之前的思路,我们需要: 步骤1:确认并移除已安装的mysql-release包 步骤2:清理可能存在的残留仓库配置文件 步骤3:重新安装指定版本的mysql-release包(使用rpm命令强制安装) 步骤4:检查并确保仓库配置正确(特别是是否启用了正确的子仓库) 步骤5:重新生成缓存并检查仓库状态 同时,引用中提到的GPG密钥问题也可能导致仓库不可用,因此我们也要注意导入新的GPG密钥。 具体步骤: ### 步骤1: 移除已安装的mysql-release包 ```bash # 查询已安装的mysql-release包 rpm -qa | grep mysql57-community-release # 如果存在,则卸载它(例如包名为mysql57-community-release-el7-11.noarch) rpm -e mysql57-community-release-el7-11.noarch # 备份并删除残留的仓库文件 mkdir -p /tmp/backup_repo mv /etc/yum.repos.d/mysql-community*.repo /tmp/backup_repo/ ``` ### 步骤2: 清理yum缓存 ```bash yum clean all rm -rf /var/cache/yum ``` ### 步骤3: 导入新的GPG密钥(引用[1]和引用[3]提到的问题) ```bash rpm --import https://repo.mysql.com/RPM-GPG-KEY-mysql-2022 ``` ### 步骤4: 强制安装指定版本的mysql-release包 ```bash rpm -ivh --force mysql57-community-release-el7-11.noarch.rpm ``` ### 步骤5: 检查仓库配置文件 编辑`/etc/yum.repos.d/mysql-community.repo`文件,确保你打算使用的MySQL版本仓库被启用(enabled=1),而其他版本被禁用(enabled=0)。例如,我们想使用MySQL5.7,那么: ```ini [mysql57-community] name=MySQL 5.7 Community Server baseurl=http://repo.mysql.com/yum/mysql-5.7-community/el/7/$basearch/ enabled=1 # 确保这里是1 gpgcheck=1 gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-mysql # 其他仓库如mysql80-community应该禁用 [mysql80-community] enabled=0 # 确保这里是0 ``` ### 步骤6: 重新生成yum缓存并检查仓库 ```bash yum makecache yum repolist enabled | grep "mysql.*-community.*" ``` ### 步骤7: 测试安装 ```bash yum install mysql-community-server ``` ### 常见问题解决 - **依赖冲突**:如果出现依赖错误(如引用[2]),可能需要先移除冲突的包(例如mariadb-libs): ```bash yum remove mariadb-libs ``` - **GPG验证失败**:如果步骤3的导入密钥没有解决问题,可以尝试重新导入。 ### 相关问题 1. 如何彻底卸载MySQL及其相关仓库配置? 2. 如何解决MySQL安装过程中的GPG密钥验证失败问题? 3. 在CentOS 7上安装MySQL 5.7时如何处理与MariaDB的冲突? 4. 如何配置多个MySQL版本仓库并切换版本? [^1]: 引用用户提供的解决GPG密钥问题的方法:重新导入2022年的密钥 [^2]: 引用用户遇到的依赖错误示例:安装mysql-community-server时需要特定版本的common包 [^3]: 引用用户遇到的GPG密钥错误信息:Failing package is: mysql-community-libs-5.7.44-1.el7.x86_64 [^4]: 引用用户提供的仓库配置方法:通过修改enabled选项启用或禁用子仓库 </think>### 解决 MySQL 仓库安装问题和软件包数量为零的完整指南 #### 问题诊断 1. **"无须任何处理"提示**:表明系统已存在相同或更高版本的 `mysql57-community-release` 包 2. **可用软件包为0**:通常由以下原因导致: - 仓库配置文件损坏或路径错误 - GPG密钥验证失败(引用[1][3]) - 子仓库未正确启用(引用[4]) - 网络访问限制或缓存问题 --- ### 解决方案步骤 #### 步骤1:彻底清理现有仓库配置 ```bash # 卸载现有仓库包 rpm -e --nodeps mysql57-community-release* # 删除残留配置文件 rm -f /etc/yum.repos.d/mysql-community*.repo # 清理缓存 yum clean all rm -rf /var/cache/yum ``` #### 步骤2:强制重新安装仓库包 ```bash rpm -ivh --force mysql57-community-release-el7-11.noarch.rpm ``` - `--force` 参数覆盖现有安装(即使版本相同) #### 步骤3:修复 GPG 密钥问题(引用[1][3]) ```bash # 导入2022年新密钥(原始密钥已过期) rpm --import https://repo.mysql.com/RPM-GPG-KEY-mysql-2022 # 验证密钥 rpm -qa gpg-pubkey* | grep mysql ``` #### 步骤4:配置仓库启用状态(引用[4]) 编辑配置文件: ```bash vi /etc/yum.repos.d/mysql-community.repo ``` 确保 **MySQL 5.7** 仓库启用: ```ini [mysql57-community] name=MySQL 5.7 Community Server baseurl=http://repo.mysql.com/yum/mysql-5.7-community/el/7/$basearch/ enabled=1 # ← 必须为1 gpgcheck=1 gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-mysql ``` 禁用其他版本仓库: ```ini [mysql80-community] enabled=0 # ← 禁用8.0版本 ``` #### 步骤5:验证仓库状态 ```bash # 重新生成缓存 yum makecache # 检查仓库状态 yum repolist enabled | grep mysql.*community # 预期输出示例: mysql57-community/x86_64 MySQL 5.7 Community Server 5,072 ``` #### 步骤6:解决依赖冲突(引用[2]) ```bash # 移除冲突的MariaDB库 yum remove mariadb-libs # 完整安装MySQL yum install mysql-community-server ``` --- ### 关键故障排查点 1. **网络连通性测试**: ```bash curl -v http://repo.mysql.com/yum/mysql-5.7-community/el/7/x86_64/repodata/ ``` - 若返回HTTP 200表示连接正常 2. **仓库路径验证**: - 确认 `/etc/yum.repos.d/mysql-community.repo` 中的 `baseurl` 与实际路径匹配 - EL7 的正确路径:`http://repo.mysql.com/yum/mysql-5.7-community/el/7/$basearch/` 3. **手动清除元数据**: ```bash rm -f /var/cache/yum/x86_64/7/mysql*/* ``` --- ### 相关问题延伸 1. 如何验证 MySQL RPM 仓库的 GPG 密钥有效性? ```bash rpm -qi gpg-pubkey-3a79bd29-* | grep Release # 应显示: Release Date: Wed 19 Oct 2022 ``` 2. 当系统同时存在多版本 MySQL 仓库时如何管理? - 通过 `yum-config-manager --enable/disable` 动态切换(需 EPEL 仓库) 3. 如何修复 "Couldn't open file /etc/pki/rpm-gpg/RPM-GPG-KEY-mysql" 错误? ```bash rpm --import https://repo.mysql.com/RPM-GPG-KEY-mysql-2022 ln -s /etc/pki/rpm-gpg/RPM-GPG-KEY-mysql-2022 /etc/pki/rpm-gpg/RPM-GPG-KEY-mysql ``` 4. 离线环境中如何部署 MySQL 仓库? - 下载完整仓库镜像:`reposync -r mysql57-community -p /local/path` - 创建本地仓库:`createrepo /local/path` [^1]: 解决 GPG 密钥过期问题需导入 2022 年新密钥 [^2]: 依赖冲突通常由 MariaDB 残留引起 [^3]: GPG 密钥路径错误会导致包验证失败 [^4]: 仓库启用状态必须显式配置才能生效
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

云计算-Security

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值