三种方式
- linux命令行执行mysqladmin客户端程序
- mysql命令行set password命令
- mysql命令行update命令 (推荐使用,避免多用户问题)
方式一:mysqladmin方式
格式
$ mysqladmin -uuser_name -p'oldPasswd' password 'newPasswd'
其中user_name
即为用户名,oldPasswd
即为旧密码,newPasswd
即为新密码;
示例
$ mysqladmin -uroot -p'1qaz!QAZ' password 123456
方式二:set password方式
需要先通过mysql -uroot -p
进入mysql命令行
格式
mysql> set password for user_name@localhost=password('newPasswd');
Query OK, 0 rows affected (0.94 sec)
其中user_name
即为用户名,newPasswd
即为新密码;
示例
mysql> set password for root@localhost = password('1qw2!QW@');
方式三:update命令
需要先通过mysql -uroot -p
进入mysql命令行
格式
mysql> update mysql.user set password=password('newPasswd') where user='userName';
mysql> flush privileges;
其中user_name
即为用户名,newPasswd
即为新密码;
示例
mysql> update mysql.user set password=password('1qaz!QAZ') where user='root';
Query OK, 0 rows affected (0.94 sec)
mysql> flush privileges;
Query OK, 0 rows affected (0.94 sec)
Q & A
问题:修改密码后服务端生效,但是navicat还能使用旧密码连接mysql?
其实mysql数据库中,我们所说的用户不仅仅只是'root'
,更多的是指root@localhost
和root@%
这种带有'userName'@'hostName'
的才是具体的用户。
1)当我们使用:
mysql> set password for root@localhost=password('newPasswd');`
可能只是改了root@localhost
这个用户,有可能还有root@%
用户。
2)查看user表:
mysql> select host, user, password from mysql.user where user='root';
从user表中,我们可以看到root
对应到多个host
,使用之前的set语句可能我们只是更改了其中一个用户,我们可以通过update
命令更新mysql.user
表,全局更新所有root@hostName
的密码;
3)所以,我们应该使用:
mysql> update mysql.user set password=password('newPasswd') where user='root';
Query OK, 1 row affected (0.11 sec)
Rows matched: 5 Changed: 1 Warnings: 0
mysql> flush privileges;
Query OK, 0 rows affected (0.94 sec)
这样可以全局改变所有带有root@
的用户密码,再通过navicat使用旧密码连接数据库时,远程访问拒绝。