skip-grant-tables
1、关闭mysql服务
略(可以kill,尽量别用kill -9)
2、参数启动mysql
bin/mysqld_safe --defaults-file=my.cnf --skip-grant-tables --skip-networking &
#在mysql8.0以skip-grant-tables选项启动,会自动启用--skip-networking
--skip-networking参数。其会让实例关闭监听端口,自然也就无法建立TCP连接,而只能通过本地socket进行连接。
3、更改密码
mysql -S /usr/local/mysql57/data/mysql.sock
5.6:
update mysql.user set password=password('123456') where host='localhost' and user='root';
5.7:
update mysql.user set authentication_string=password('123456') where host='localhost' and user='root';
8.0:
移除了PASSWORD()函数及不再支持SET PASSWORD ... = PASSWORD ('auth_string')语法。
所以需要先通过flush privileges操作触发权限表的加载,再使用alter user语句修改root用户的密码
flush privileges;
alter user 'root'@'localhost' identified by '123456';
4、刷新权限
flush privileges;
5、重启mysql
先关闭再重启
bin/mysqld_safe --defaults-file=my.cnf &
总结:
1. 如果只添加了--skip-grant-tables,修改完密码后,其实无需重启,执行flush privileges即可。
2. 从安全角度出发,建议加上--skip-networking。但因其是静态参数,将其剔除掉需要重启实例。
3. 加上--skip-networking,虽然可以屏蔽掉TCP连接,但对于本地其它用户,只要有socket文件的可读权限,都能无密码登录。还是存在安全隐患。
4. 不建议通过update的方式修改密码,更通用的其实是alter user。