Grants for root@localhost
-----------------------------------------------------------------------------------------------------------------
GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' IDENTIFIED BY PASSWORD '*6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9' WITH GRANT OPTION
GRANT PROXY ON ''@'' TO 'root'@'localhost' WITH GRANT OPTION
MariaDB [mysql]>SHOW GRANTS FOR 'long'@'192.168.100.1';
Grants for long@192.168.100.1
-----------------------------------------------------------------------------------------------------------
GRANT USAGE ON *.* TO 'long'@'192.168.100.1' IDENTIFIED BY PASSWORD '*6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9'
GRANT SELECT ON `test`.* TO 'long'@'192.168.100.1'
2.5 revoke命令的严格性
revoke命令回收权限时必须要明确指定回收的数据库对象以及用户名,其中usage权限无法回收。特别要说明的是revoke all,当你以为它会回收所有权限的时候,它可能一点权限都没有回收。也就是说revoke命令的书写非常严格。
用户 'long'@'192.168.100.1' 在 *.* 上具有usage权限,在test.*上具有select权限。
MariaDB [mysql]> SHOW GRANTS FOR 'long'@'192.168.100.1';
Grants for long@192.168.100.1
-----------------------------------------------------------------------------------------------------------
GRANT USAGE ON *.* TO 'long'@'192.168.100.1' IDENTIFIED BY PASSWORD '*6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9'
GRANT SELECT ON `test`.* TO 'long'@'192.168.100.1'
对该用户在 *.* 上进行revoke all,再次查看权限,发现权限根本一点变化都没有。因为usage权限无法回收,而select权限是在test.*上而非*.*上。
REVOKE ALL ON *.* FROM 'long'@'192.168.100.1';
要回收test.*上的select权限,必须在revoke中指定test.*,而不能是 *.* 。以下两个语句都能回收。
revoke select on test.* from 'long'@'192.168.100.1';
revoke all on test.* from 'long'@'192.168.100.1';
2.6 删除用户
直接使用drop user命令或者从mysql.user表中删除对应记录。
drop user user_name1,username2...
注意,删除表中用户记录的时候不会从现有用户中回收对该表的权限,当下次再创建同名表的时候,会自动为用户授予该表的权限造成权限外流。
因此,建议使用drop user语句来删除用户。
3.设置密码和恢复root密码
3.1 设置密码
(1)grant all on *.* to 'root'@'localhost' identified by '123456' with grant option;
(2)grant usage on *.* to 'root'@'localhost' identified by '123456' with grant option;
使用usage权限表示在不影响现有权限的情况下使用grant来修改密码。
(3)set password [for 'root'@'localhost'] =password('123456');
password函数中必须加引号,不写user时是为当前用户修改。
(4)alter user root@localhost identified by '123456';
(5)mysqladmin -uroot -h localhost -p'old_password' password 'new_password';
(6)update mysql.user set password=password('123456') where user='root' and host='localhost';
其中grant和set password语句可以直接刷新权限表,其他语句需要使用 flush privileges 或其他刷新语句。
3.2 恢复root密码
可以在启动mysql服务时使用mysqld_safe服务程序并指定"--skip-grant-tables"选项表示跳过授权表,这样登陆mysql服务器将不需要任何权限,包括密码认证也不需要,但是同样受限的是不能操作任何权限相关的内容,比如修改权限,刷新授权表等。这通常是mysql管理员密码忘记的时候使用的选项。由于跳过授权表使得mysql服务器极不安全,任何用户都能直接登录服务器,所以通常和"--skip-networking"选项一起使用来禁止来自网络的服务器连接请求,这样只能使用localhost或者127.0.0.1作为host来登录。
另外,使用mysqld_safe启动无授权表的服务前要停止已有的MySQL实例。由于跳过授权表无法操作权限相关内容,所以修改mysql.user表中的管理员账号的密码字段是唯一修改方法。修改密码后记得重启MySQL服务。
步骤如下:
[root@linuxidc mysql]# service mysqld stop
[root@linuxidc mysql]# mysqld_safe --skip-grant-tables --skip-networking &
[root@linuxidc mysql]# mysql
mysql> update mysql.user set password=password("123456") where user='root' and host='localhost';
mysql> flush privileges;
mysql> select user,host,password from mysql.user where user='root' and host='localhost';
+------+-----------+-------------------------------------------+
| user | host | password |
+------+-----------+-------------------------------------------+
| root | localhost | *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9 |
+------+-----------+-------------------------------------------+
1 row in set
mysql> \q
[root@linuxidc mysql]# service mysqld stop
[root@linuxidc mysql]# service mysqld start
[root@linuxidc mysql]# mysql -uroot -p123456
mysql> \q
如果要找回多实例的密码,则在mysqld_safe命令中使用 --defaults-file 指定对应的配置文件即可。