MySQLroot密码忘记,原来还有更优雅的解法!
MySQLroot密码忘记,原来还有更优雅的解法!
⼀直以来,对于MySQL root密码的忘记,以为只有⼀种解法-skip-grant-tables。
问了下⾥的⼤咖,第⼀反应也是skip-grant-tables。通过搜索引擎简单搜索了下,⽆论是百度,抑或Google,只要是⽤中⽂搜索,⾸页都是这种解法。可见这种解法在某种程
度上已经占据了使⽤者的⼼智。下⾯具体来看看。
skip-grant-tables的解法
⾸先,关闭实例
这⾥,只能通过kill mysqld进程的⽅式。
注意:不是mysqld_safe进程,也切忌使⽤kill -9。
# ps -ef |grep mysqld
aabc式的词语有哪些root      62206171008:14 pts/000:00:00 /bin/sh bin/mysqld_safe --defaults-file=myf
mysql      63476220008:14 pts/000:00:01 /usr/local/mysql57/bin/mysqld --defaults-file=myf --basedir=/usr/local/mysql57 --datadir=/usr/local/mysql57/data --plugin-dir=/usr/local/mysql57/lib/plugin --user=mysql -- --pid root      64186171008:17 pts/000:00:00grep --color=auto mysqld
# kill6347
使⽤--skip-grant-tables参数,重启实例
# bin/mysqld_safe --defaults-file=myf --skip-grant-tables  --skip-networking &
设置了该参数,则实例在启动过程中会跳过权限表的加载,这就意味着任何⽤户都能登录进来,并进⾏任何操作,相当不安全。
建议同时添加--skip-networking参数。其会让实例关闭监听端⼝,⾃然也就⽆法建⽴TCP连接,⽽只能通过本地socket进⾏连接。
MySQL8.0就是这么做的,在设置了--skip-grant-tables参数的同时会⾃动开启--skip-networking。
修改密码
# mysql -S /usr/local/mysql57/data/mysql.sock
橘梨纱哪部好看mysql>update mysql.user set authentication_string=password('123456') where host='localhost'and user='root';
Query OK, 0 rows affected, 1 warning (0.00 sec)
Rows matched: 1  Changed: 0  Warnings: 1
mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)
注意:
这⾥的update语句针对的是MySQL 5.7的操作,如果是在5.6版本,修改的应该是password字段,⽽不是authentication_string。
update mysql.user set password=password('123456') where host='localhost'and user='root';
跨年的情话句子⽽在MySQL 8.0.11版本中,这种⽅式基本不可⾏,因为其已移除了PASSWORD()函数及不再⽀持SE
T PASSWORD ... = PASSWORD ('auth_string')语法。
不难发现,这种⽅式的可移植性实在太差,三个不同的版本,就先后经历了列名的改变,及命令的不可⽤。
下⾯,介绍另外⼀种更通⽤的做法,还是在skip-grant-tables的基础上。
与上⾯不同的是,其会先通过flush privileges操作触发权限表的加载,再使⽤alter user语句修改root⽤户的密码,如:
# bin/mysql -S /usr/local/mysql57/data/mysql.sock
mysql>alter user'root'@'localhost' identified by'123';
与美同行作文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>alter user'root'@'localhost' identified by'123';
Query OK, 0 rows affected (0.00 sec)
免密码登录进来后,直接执⾏alter user操作是不⾏的,因为此时的权限表还没加载。可先通过flush privileges操作触发权限表的加载,再执⾏alter user操作。
需要注意的是,通过alter user修改密码只适⽤于MySQL5.7和8.0,如果是MySQL 5.6,此处可写成
update mysql.user set password=password('123456') where host='localhost'and user='root';
最后重启实例
mysql>shutdown;
# bin/mysqld_safe --defaults-file=myf &
需要注意的是,如果在启动的过程中没有指定--skip-networking参数,⽆需重启实例。但在⽹上看到的绝⼤多数⽅案,都是没有指定该参数,但重启了实例,实在没有必要。
下⾯对这个⽅案做个总结:
1. 如果只添加了--skip-grant-tables,修改完密码后,其实⽆需重启,执⾏flush privileges即可。
2. 从安全⾓度出发,建议加上--skip-networking。但因其是静态参数,将其剔除掉需要重启实例。
3. 加上--skip-networking,虽然可以屏蔽掉TCP连接,但对于本地其它⽤户,只要有socket⽂件的可读权限,都能⽆密码登录。还是存在安全隐患。
4. 不建议通过update的⽅式修改密码,更通⽤的其实是alter user。
更优雅的解法
相对于skip-grant-tables⽅案,我们来看看另外⼀种更优雅的解法,其只会重启⼀次,且基本上不存在安全隐患。
⾸先,依旧是关闭实例
其次,创建⼀个sql⽂件
写上密码修改语句
# vim init.sql
alter user'root'@'localhost' identified by'123456';
最后,使⽤--init-file参数,启动实例
# bin/mysqld_safe --defaults-file=myf --init-file=/usr/local/mysql57/init.sql &
实例启动成功后,密码即修改完毕~
如果mysql实例是通过服务脚本来管理的,除了创建sql⽂件,整个操作可简化为⼀步。
# service mysqld restart --init-file=/usr/local/mysql57/init.sql
无级变速是什么意思注意:该操作只适⽤于/etc/init.d/mysqld这种服务管理⽅式,不适⽤于RHEL 7新推出的systemd。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。