在企业中,数据库密码复杂度极高。偶尔会忘记数据库管理员的密码,在这种情况下如何保证数据不丢失情况下,并且重置数据库管理员的密码呢?下文将会以MySQL 5.7.26版本为例进行介绍。
1. 关闭数据库
[root@templates ~]# systemctl stop mysqld [root@templates ~]# netstat -lntup|grep 3306
【注意】关闭数据库和启动数据库的方式要一致,即 sys -v 方式启动和关闭数据库或者 systemd 方式启动和关闭数据库。不能交叉使用。
2. 启动数据库到维护模式
--skip-grant-tables 跳过授权表,避开密码验证功能--skip-networking 跳过远程登录
[root@templates ~]# mysqld_safe --skip-grant-tables --skip-networking & #<==== 以命令的方式启动数据库[1] 3207[root@templates ~]# 2021-03-02T16:00:18.536024Z mysqld_safe Logging to '/data/mysql/data/templates.err'.2021-03-02T16:00:18.627434Z mysqld_safe A mysqld process already exists [1]+ Exit 1 mysqld_safe --skip-grant-tables --skip-networking
3. 登录数据库,并修改密码
方式一:
[root@templates ~]# mysqlWelcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 2Server version: 5.7.26 MySQL Community Server (GPL) Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved. 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. mysql> alter user root@'localhost' identified by '123.com';ERROR 1290 (HY000): The MySQL server is running with the --skip-grant-tables option so it cannot execute this statement mysql> flush privileges;Query OK, 0 rows affected (0.01 sec) mysql> alter user root@'localhost' identified by '123.com';Query OK, 0 rows affected (0.00 sec) mysql> exitBye [root@templates ~]#
方法二:(包括更改完进行登录验证)
[root@templates ~]# mysqld_safe --skip-grant-tables --skip-networking &[1] 3784[root@templates ~]# 2021-03-02T16:11:22.739112Z mysqld_safe Logging to '/data/mysql/data/templates.err'.2021-03-02T16:11:22.837697Z mysqld_safe Starting mysqld daemon with databases from /data/mysql/data [root@templates ~]# ps -ef|grep mysqldroot 3784 2341 0 00:11 pts/0 00:00:00 /bin/sh /application/mysql/bin/mysqld_safe --skip-grant-tables --skip-networking mysql 3959 3784 3 00:11 pts/0 00:00:00 /application/mysql/bin/mysqld --basedir=/application/mysql --datadir=/data/mysql/data --plugin-dir=/application/mysql/lib/plugin --user=mysql --skip-grant-tables --skip-networking --log-error=templates.err --pid-file=templates.pid --socket=/tmp/mysql.sock --port=3306root 3989 2341 0 00:11 pts/0 00:00:00 grep --color=auto mysqld [root@templates ~]# mysqlWelcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 2Server version: 5.7.26 MySQL Community Server (GPL) Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved. 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. mysql> grant all on *.* to root@'localhost' identified by '123456';ERROR 1290 (HY000): The MySQL server is running with the --skip-grant-tables option so it cannot execute this statement mysql> flush privileges;Query OK, 0 rows affected (0.00 sec) mysql> grant all on *.* to root@'localhost' identified by '123456';Query OK, 0 rows affected, 1 warning (0.00 sec) mysql> exitBye [root@templates ~]#
[root@templates ~]# ps -ef|grep mysqld root 3784 2341 0 00:11 pts/0 00:00:00 /bin/sh /application/mysql/bin/mysqld_safe --skip-grant-tables --skip-networking mysql 3959 3784 0 00:11 pts/0 00:00:00 /application/mysql/bin/mysqld --basedir=/application/mysql --datadir=/data/mysql/data --plugin-dir=/application/mysql/lib/plugin --user=mysql --skip-grant-tables --skip-networking --log-error=templates.err --pid-file=templates.pid --socket=/tmp/mysql.sock --port=3306root 3996 2341 0 00:15 pts/0 00:00:00 grep --color=auto mysqld [root@templates ~]# kill -9 3784[root@templates ~]# ps -ef|grep mysqld mysql 3959 1 0 00:11 pts/0 00:00:00 /application/mysql/bin/mysqld --basedir=/application/mysql --datadir=/data/mysql/data --plugin-dir=/application/mysql/lib/plugin --user=mysql --skip-grant-tables --skip-networking --log-error=templates.err --pid-file=templates.pid --socket=/tmp/mysql.sock --port=3306root 3999 2341 0 00:15 pts/0 00:00:00 grep --color=auto mysqld [1]+ Killed mysqld_safe --skip-grant-tables --skip-networking [root@templates ~]# kill -9 3959[root@templates ~]# ps -ef|grep mysqld root 4001 2341 0 00:15 pts/0 00:00:00 grep --color=auto mysqld [root@templates ~]# systemctl start mysqld [root@templates ~]# netstat -lntup|grep 3306tcp6 0 0 :::3306 :::* LISTEN 4008/mysqld [root@templates ~]# mysql -uroot -p123456 mysql: [Warning] Using a password on the command line interface can be insecure. Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 2Server version: 5.7.26 MySQL Community Server (GPL) Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved. 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. mysql> select user,host from mysql.user;+---------------+-----------+ | user | host | +---------------+-----------+ | mysql.session | localhost | | mysql.sys | localhost | | root | localhost | +---------------+-----------+3 rows in set (0.00 sec) mysql>
4. 关闭数据库,重新启动进行验证(方式一登录验证)
[root@templates ~]# ps -ef|grep mysqld_saferoot 3383 2341 0 00:03 pts/0 00:00:00 /bin/sh /application/mysql/bin/mysqld_safe --skip-grant-tables --skip-networking root 3595 2341 0 00:06 pts/0 00:00:00 grep --color=auto mysqld_safe [root@templates ~]# kill -9 3383[root@templates ~]# ps -ef|grep mysqld_saferoot 3599 2341 0 00:06 pts/0 00:00:00 grep --color=auto mysqld_safe [root@templates ~]# systemctl start mysqld [root@templates ~]# mysql -uroot -p123.com mysql: [Warning] Using a password on the command line interface can be insecure. Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 4Server version: 5.7.26 MySQL Community Server (GPL) Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved. 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. mysql> select user,host from mysql.user;+---------------+-----------+ | user | host | +---------------+-----------+ | mysql.session | localhost | | mysql.sys | localhost | | root | localhost | +---------------+-----------+3 rows in set (0.00 sec) mysql> exit Bye