忘记root密码
一、init-file方式(推荐的方式)
修改my.cnf,添加参数
[mysqld]
init-file=/tmp/init.sql
创建init.sql,并编辑
可以直接将修改密码的SQL重定向到init.sql文件中
echo "alter user root@localhost identified by '123456';" > /tmp/init.sql
echo "alter user root@'%' identified by '123456';" >> /tmp/init.sql
停止MySQL
由于没有root用户密码,无法使用mysqladmin shutdown之类的命令进行关闭实例的操作,如果配置过service或systemd,可以使用系统命令将实例正常关闭:
service mysqld stop
systemctl stop mysqld
如果没有配置过service和systemd,则只能通过kill mysqld进程的方式关闭实例(注意:不能用kill -9):
kill <pid of mysqld>
重启MySQL
mysqld_safe --defaults-file=/etc/my.cnf --user=mysql &
##如果配置了service或systemctl,优先使用以下命令启动:
service mysqld restart
或systemctl restart mysqld
删除init.sql,注释参数
init.sql中有root密码,在修改密码后一定要记得删除文件:
rm -f /tmp/init.sql
也别忘了注释参数:
[mysqld]
# init-file=/tmp/init.sql
二、skip-grant-table方式
停止MySQL
由于没有root用户密码,无法使用mysqladmin shutdown之类的命令进行关闭实例的操作,如果配置过service或systemd,可以使用系统命令将实例正常关闭:
service mysqld stop
systemctl stop mysqld
如果没有配置过service和systemd,则只能通过kill mysqld进程的方式关闭实例(注意:不能用kill -9):
kill <pid of mysqld>
修改my.cnf,添加参数
添加以下参数到配置文件:
[mysqld]
skip-grant-tables
skip-networking // 虽然不是强制要求,但是为了防止期间实例被免密远程访问,建议与skip-grant-tables同时配置
启动MySQL
mysqld --defaults-file=/etc/my.cnf &
##如果配置了service或systemctl,优先使用以下命令启动:
service mysqld start或systemctl start mysqld
登录MySQL修改密码
mysql -S /var/lib/mysql/mysql.sock -p
Enter password:(此处直接回车即可,即使用任意密码都可以登陆)
mysql> flush privileges;
mysql> alter user root@'localhost' identified by '123456';
mysql> alter user root@'%' identified by '123456';
注意:修改密码不建议使用其他不通用的方式,比如update mysql.user set password=password() where user=root.一是不规范,二是password字段名随版本变化,三是password()函数在MySQL8.0废弃了。
注释参数,重启MySQL
注释参数:
[mysqld]
# skip-grant-tables
# skip-networking
重启MySQL:
mysqladmin shutdown -S /data/mysql/data/3306/mysqld.sock -p
Enter password:(此处输入修改的新密码)
mysqld --defaults-file=/date/msyql/etc/3306/my.cnf &
##如果配置了service或systemctl,优先使用以下命令启动:
service mysqld restart
或systemctl restart mysqld
三、MySQL忘记root密码不重启mysqld的方法
此方法仅针对 5.6 和 5.7 mysql.user 表是MyISAM存储引擎,对于InnoDB存储引擎未测试过,或许不可行。
1、首先得有一个可以拥有修改权限的mysql数据库账号,当前的mysql实例账号(较低权限的账号,比如可以修改 scott 数据库)或者其他相同版本实例的账号。把 data/mysql 目录下面的user表相关的文件复制到 data/scott 目录下面。
[root@restoredb mysql]# cp mysql/user.* scott/
[root@restoredb mysql]# chown mysql.mysql scott/user.*
2、使用另一个较低权限的账号链接数据库,设置 scott 数据库中的 user 存储的密码数据。
[root@restoredb mysql]# mysql -utest_user -p123456 -h127.0.0.1 -A
mysql> use scott;
mysql> update user set authentication_string=password('123456') where user='root';
3、把修改后的user.MYD和user.MYI复制到mysql目录下,记得备份之前的文件。
mv mysql/user.MYD mysql/user.MYD.bak
mv mysql/user.MYI mysql/user.MYI.bak
mv mysql/user.frm mysql/user.frm.bak
cp scott/user.* mysql/
chown mysql.mysql mysql/user.*
4、kill -SIGHUP
[root@testdb62 mysql]# pgrep -n mysql
28878
[root@restoredb mysql]#
[root@restoredb mysql]# kill -SIGHUP 28878
5、测试
[root@restoredb mysql]# mysql -uroot -p123456 -h127.0.0.1 -A