一、MySQL权限验证两阶段 1、服务器首先会检查你是否允许连接。因为创建用户的时候会加上主机限制,可以限制成本地、某个IP、某个IP段、以及任何地方等,只允许你从配置的指定地方登录。 2、如果你能连接,MySQL会检查你发出的每个请求,看你是否有足够的权限实施它。比如你要更新某个表、或者查询某个表,MySQL会查看你对哪个表或者某个列是否有权限。再比如,你要运行某个存储过程,MySQL会检查你对存储过程是否有执行权限等。二、MySQL权限经验原则: 1、只授予能满足需要的最小权限,防止用户干坏事。比如用户只是需要查询,那就只给select权限就可以了,不要给用户赋予update、insert或者delete权限。 2、创建用户的时候限制用户的登录主机,一般是限制成指定IP或者内网IP段。 3、初始化数据库的时候删除没有密码的用户。安装完数据库的时候会自动创建一些用户,这些用户默认没有密码。 4、为每个用户设置满足密码复杂度的密码。 5、定期清理不需要的用户。回收权限或者删除用户。三、相关实战 1、GRANT命令使用说明 先来看一个例子,创建一个只允许从本地登录的超级用户jack,并允许将权限赋予别的用户,密码为:jack.mysql> grant all privileges on *.* to jack@"localhost" identified by "jack" with grant option;Query OK, 0 rows affected (0.01 sec) GRANT命令说明: ALL PRIVILEGES 是表示所有权限,你也可以使用select、update等权限。 ON 用来指定权限针对哪些库和表。 *.* 中前面的*号用来指定数据库名,后面的*号用来指定表名。 TO 表示将权限赋予某个用户。 jack@"localhost" 表示jack用户,@后面接限制的主机,可以是IP、IP段、域名以及%,%表示任何地方。注意:这里%有的版本不包括本地,以前碰到过给某个用户设置了%允许任何地方登录,但是在本地登录不了,这个和版本有关系,遇到这个问题再加一个localhost的用户就可以了。 IDENTIFIED BY 指定用户的登录密码。 WITH GRANT OPTION 这个选项表示该用户可以将自己拥有的权限授权给别人。注意:经常有人在创建操作用户的时候不指定WITH GRANT OPTION选项导致后来该用户不能使用GRANT命令创建用户或者给其它用户授权。备注:可以使用GRANT重复给用户添加权限,权限叠加,比如你先给用户添加一个select权限,然后又给用户添加一个insert权限,那么该用户就同时拥有了select和insert权限。 2、刷新权限 使用这个命令使权限生效,尤其是你对那些权限表user、db、host等做了update或者delete更新的时候。以前遇到过使用grant后权限没有更新的情况,只要对权限做了更改就使用FLUSH PRIVILEGES命令来刷新权限。 mysql> flush privileges;Query OK, 0 rows affected (0.01 sec) 3、查看权限查看当前用户的权限:mysql> show grants;+---------------------------------------------------------------------+| Grants for root@localhost |+---------------------------------------------------------------------+| GRANT ALL PRIVILEGES ON *.* TO "root"@"localhost" WITH GRANT OPTION || GRANT PROXY ON ""@"" TO "root"@"localhost" WITH GRANT OPTION|+---------------------------------------------------------------------+2 rows in set (0.00 sec)查看某个用户的权限:mysql> show grants for "jack"@"%";+-----------------------------------------------------------------------------------------------------+| Grants for jack@% |+-----------------------------------------------------------------------------------------------------+| GRANT USAGE ON *.* TO "jack"@"%" IDENTIFIED BY PASSWORD "*9BCDC990E611B8D852EFAF1E3919AB6AC8C8A9F0" |+-----------------------------------------------------------------------------------------------------+1 row in set (0.00 sec) 4、回收权限mysql> revoke delete on *.* from "jack"@"localhost";Query OK, 0 rows affected (0.01 sec) 5、删除用户mysql> select host,user,password from user;+-----------+------+-------------------------------------------+| host| user | password|+-----------+------+-------------------------------------------+| localhost | root | || rhel5.4 | root | || 127.0.0.1 | root | || ::1 | root | || localhost || || rhel5.4 || || localhost | jack | *9BCDC990E611B8D852EFAF1E3919AB6AC8C8A9F0 |+-----------+------+-------------------------------------------+7 rows in set (0.00 sec)mysql> drop user "jack"@"localhost";Query OK, 0 rows affected (0.01 sec) 6、对账户重命名mysql> rename user "jack"@"%" to "jim"@"%";Query OK, 0 rows affected (0.00 sec) 7、修改密码1、用set password命令mysql> SET PASSWORD FOR "root"@"localhost" = PASSWORD("123456");Query OK, 0 rows affected (0.00 sec)2、用mysqladmin[root@rhel5 ~]# mysqladmin -uroot -p123456 password 1234abcd备注:格式:mysqladmin -u用户名 -p旧密码 password 新密码3、用update直接编辑user表mysql> use mysqlReading table information for completion of table and column namesYou can turn off this feature to get a quicker startup with -ADatabase changedmysql> update user set PASSWORD = PASSWORD("1234abcd") where user = "root";Query OK, 1 row affected (0.01 sec)Rows matched: 1Changed: 1Warnings: 0mysql> flush privileges;Query OK, 0 rows affected (0.00 sec)4、在丢失root密码的时候:[root@rhel5 ~]# mysqld_safe --skip-grant-tables &[1] 15953[root@rhel5 ~]# 130911 09:35:33 mysqld_safe Logging to "/mysql/mysql5.5/data/rhel5.4.err".130911 09:35:33 mysqld_safe Starting mysqld daemon with databases from /mysql/mysql5.5/data[root@rhel5 ~]# mysql -u rootWelcome to the MySQL monitor.Commands end with ; or g.Your MySQL connection id is 2Server version: 5.5.22 Source distributionCopyright (c) 2000, 2011, Oracle and/or its affiliates. All rights reserved.Oracle is a registered trademark of Oracle Corporation and/or itsaffiliates. Other names may be trademarks of their respectiveowners.Type "help;" or "h" for help. Type "c" to clear the current input statement.mysql> s--------------mysqlVer 14.14 Distrib 5.5.22, for Linux (i686) usingEditLine wrapperConnection id:2Current database:Current user:root@SSL:Not in useCurrent pager:stdoutUsing outfile:""Using delimiter:;Server version:5.5.22 Source distributionProtocol version:10Connection:Localhost via UNIX socketServer characterset:utf8Db characterset:utf8Client characterset:utf8Conn.characterset:utf8UNIX socket:/tmp/mysql.sockUptime:36 secThreads: 1Questions: 5Slow queries: 0Opens: 23Flush tables: 1Open tables: 18Queries per second avg: 0.138--------------mysql> use mysqlReading table information for completion of table and column namesYou can turn off this feature to get a quicker startup with -ADatabase changedmysql> update user set password = PASSWORD("123456") where user = "root";Query OK, 1 row affected (0.00 sec)Rows matched: 1Changed: 1Warnings: 0mysql> flush privileges;Query OK, 0 rows affected (0.00 sec)本文永久更新链接地址