忘记mysql的root用户密码的解决办法
方法一 --skip-grant-tables
首先,关闭实例
这里,只能通过kill mysqld进程的方式。
注意:不是mysqld_safe进程,也切忌使用kill -9。
复制代码
# ps -ef |grep mysqld
root 6220 6171 0 08:14 pts/0 00:00:00 /bin/sh bin/mysqld_safe --defaults-file=my.cnf
mysql 6347 6220 0 08:14 pts/0 00:00:01 /usr/local/mysql57/bin/mysqld --defaults-file=my.cnf --basedir=/usr/local/mysql57 --datadir=/usr/local/mysql57/data --plugin-dir=/usr/local/mysql57/lib/plugin --user=mysql --log-error=slowtech.err --pid-file=slowtech.pid --socket=/usr/local/mysql57/data/mysql.sock --port=3307
root 6418 6171 0 08:17 pts/0 00:00:00 grep --color=auto mysqld
# kill 6347
使用--skip-grant-tables参数,重启实例
# bin/mysqld_safe --defaults-file=my.cnf --skip-grant-tables --skip-networking &
设置了该参数,则实例在启动过程中会跳过权限表的加载,这就意味着任何用户都能登录进来,并进行任何操作,相当不安全。
建议同时添加--skip-networking参数。其会让实例关闭监听端口,自然也就无法建立TCP连接,而只能通过本地socket进行连接。
MySQL8.0就是这么做的,在设置了--skip-grant-tables参数的同时会自动开启--skip-networking。
修改密码
- 方法一 update
USE mysql;
UPDATE user
SET password = PASSWORD('newpasswd')
WHERE user = 'dbadmin' AND
host = 'localhost';
FLUSH PRIVILEGES;
注意:注意:MySQL 5.7.6版本以下,才能使用此方法来修改密码。从MySQL 5.7.6版本起,user表仅使用authentication_string列代替之前版本中的password列来存储密码。
USE mysql;
UPDATE user
SET password = PASSWORD('newpasswd')
WHERE user = 'dbadmin' AND
host = 'localhost';
FLUSH PRIVILEGES;
- 方法二 set password
SET PASSWORD FOR 'dbadmin'@'localhost' = PASSWORD('newpasswd2');
注意
从MySQL 5.7.6版本开始,MySQL不推荐使用此语法,可能会在将来的版本中将其删除。作为一个代替的解决方案,它使用明文密码如下:
SET PASSWORD FOR 'dbadmin'@'localhost' = 'newpasswd2';
- 方法三 alter user
ALTER USER dbadmin@localhost IDENTIFIED BY 'newpasswd3';
方法二 --init-file
首先关闭实例
创建sql文件,sql中的内容为修改密码的三种方式中的任意一种
vim init.sql
SET password for 'root'@'localhost'=password('123456');
启动mysql服务
mysqld_safe --defaults-file=/etc/my.cnf --init-file=/opt/nginx/html/default/init.sql &
实例启动成功,密码就修改完毕。