一、背景

我们在部署Mysql的时候,在初始化Mysql数据时,系统都会产生一些初始密码,因不同的初始化方式,这个密码要么为空,要么记录在Mysql的日志里。

# grep 'password' /data/mysqldata/mysqld.log

2024-09-09T11:17:01.685768Z 6 [Note] [MY-010454] [Server] A temporary password is generated for root@localhost: )T8tL4fIr(.d

部署完成,我们一般会进Mysql把初始密码进行修改,但由于记录文档没有来得及写,过几天,就可能会忘记这个修改后的密码,造成我们无法用root登录Mysql。今天的主题就是忘记Root密码后,怎么解决这个问题。

二、关闭Mysql

2.1、关闭3306访问

在关闭Mysql数据库之前,先关闭业务程序,让业务程序不要连接到数据库,进行读写数据,特别是写数据。如果业务程序不方便关闭,我们就开启系统的防火墙,阻断所有IP地址连接3306端口。

# systemctl status firewalld    #查询防火墙的状态

● firewalld.service - firewalld - dynamic firewall daemon
     Loaded: loaded (/usr/lib/systemd/system/firewalld.service; enabled; preset: enabled)
     Active: active (running) since Thu 2024-09-12 14:58:30 CST; 18min ago
       Docs: man:firewalld(1)
   Main PID: 725 (firewalld)
      Tasks: 2 (limit: 24637)
     Memory: 43.7M
        CPU: 757ms
     CGroup: /system.slice/firewalld.service
             └─725 /usr/bin/python3 -s /usr/sbin/firewalld --nofork --nopid

Sep 12 14:58:29 alma92-88 systemd[1]: Starting firewalld - dynamic firewall daemon...
Sep 12 14:58:30 alma92-88 systemd[1]: Started firewalld - dynamic firewall daemon.


# firewall-cmd --list-all   #查询防火墙的安全策略

public (active)
  target: default
  icmp-block-inversion: no
  interfaces: ens160
  sources: 
  services: cockpit dhcpv6-client ssh
  ports: 80/tcp 3306/tcp
  protocols: 
  forward: yes
  masquerade: no
  forward-ports: 
  source-ports: 
  icmp-blocks: 
  rich rules: 


# firewall-cmd --remove-port=3306/tcp --permanent 移除3306的访问策略
# firewall-cmd --reload

2.2、关闭Mysql数据库

# ps aux |grep mysql  #查找Mysql数据库进程,一般是两个

root         929  0.0  0.0   4860  3760 pts/0    S    15:02   0:00 /bin/sh /usr/local/mysql-8.0.35/bin/mysqld_safe
mysql       1180  0.4 10.5 2347176 422276 pts/0  Sl   15:02   0:06 /usr/local/mysql-8.0.35/bin/mysqld --basedir=/usr/local/mysql-8.0.35 --datadir=/data/mysqldata --plugin-dir=/usr/local/mysql-8.0.35/lib/plugin --user=mysql --log-error=/data/mysqldata/mysqld.log --pid-file=/data/mysqldata/mysqld.pid --socket=/data/mysqldata/mysql.sock

# kill -9 929;kill -9 1180   #kill 2个进程,先kill主进程,即Mysqld_safe进程。

三、启动Mysql

#启动时,带上--skip-grant-tables参数,跳过权限表。这种启动方式,是没有tcp端口监听的。
# /usr/local/mysql-8.0.35/bin/mysqld_safe --skip-grant-tables &

# mysql -uroot -p -S /data/mysqldata/mysql.sock  #登录Mysql库

mysql> flush privileges;               #必须先做这步,直接alter user时会报错
Query OK, 0 rows affected (0.01 sec)

mysql> alter user 'root'@'localhost' identified by 'Abc@123456';
Query OK, 0 rows affected (0.01 sec)

mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)

mysql> exit
Bye

四、重启Mysql

# mysqladmin -uroot -p -S /data/mysqldata/mysql.sock shutdown

# /usr/local/mysql-8.0.35/bin/mysqld_safe &

# mysql -uroot -p -h 127.0.0.1  #登录测试,用刚修改的密码

五、高手恢复法

对于第三步修改root密码,还有使用–init-file参数实现,具体步骤为:

# cat /opt/change_mysql_root_pwd.sql
alter user 'root'@'localhost' identified by 'Abc@123456';

# chmod +rx /opt/change_mysql_root_pwd.sql

#使用–init-file=/opt/change_mysql_root_pwd.sql参数启动数据库,启动时会自动执行SQL文件修改密码
# mysqld_safe --init-file=/opt/change_mysql_root_pwd.sql &

# mysql -uroot -p -h 127.0.0.1  #登录测试,用刚修改的密码

#登录没有问题后,把sql文件删掉,防止泄密
#  rm -f /opt/change_mysql_root_pwd.sql
声明:欢迎大家光临本站,学习IT运维技术,转载本站内容,请注明内容出处”来源刘国华教育“。如若本站内容侵犯了原著者的合法权益,请联系我们进行处理。