用户与授权
MySQL中的用户存在哪张表中 mysql.user
mysql> select user,host,password from mysql.user;
+------+-----------+-------------------------------------------+
| user | host | password |
+------+-----------+-------------------------------------------+
| root | localhost | *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9 |
| root | mysql | |
| root | 127.0.0.1 | |
| root | ::1 | |
| | localhost | |
| | mysql | |
+------+-----------+-------------------------------------------+
6 rows in set (0.00 sec)
如果root密码忘记了,该怎么办?
破解root密码前提,就是你能够停止mysql服务。
1)停止服务
[root@mysql ~]# /etc/init.d/mysqld stop
2)使用跳过授权表的方式启动数据库
[root@mysql ~]# mysqld_safe --skip-grant-tables --user=mysql &
3)匿名登录
[root@mysql ~]# mysql
4)修改user表
mysql> use mysql;
Database changed
mysql> select user,host,password from user;
mysql> update user set password=password("redhat") where user='root' and host='localhost';
#使用password()函数去生成新密码的加密字符串
5)重启mysql服务
[root@mysql mysql]# mysqladmin shutdown //正常情况下使用mysqld_safe启动的服务需要这么关闭
[root@mysql mysql]# ps -ef | grep mysqld
root 25049 16794 0 11:39 pts/0 00:00:00 grep mysqld
--------------------
如果正常关闭不好使,那么就强制杀死进程
[root@mysql mysql]# kill -9 `pgrep mysqld`
--------------------
[root@mysql mysql]# /etc/init.d/mysqld start
6)重新使用新的密码登录数据库即可
[root@mysql mysql]# mysql -uroot -predhat
-------------------------------------------------------------------------------
插曲
[root@mysql subsys]# pwd
/var/lock/subsys //各种服务的锁文件所在的位置
xxxx is not running,but lock file exists.
------------------------------------------------------------------------------
创建用户
语法:create user 用户名@主机 identified by '密码';
1、创建本地用户
mysql> create user local@localhost identified by 'local';
mysql> select user,host,password from mysql.user where user='local';
+-------+-----------+-------------------------------------------+
| user | host | password |
+-------+-----------+-------------------------------------------+
| local | localhost | *EF82E77FF4184209858BDA2C853D3D7A5870DE80 |
+-------+-----------+-------------------------------------------+
1 row in set (0.00 sec)
登录测试:
[root@mysql ~]# mysql -ulocal -plocal
mysql> show databases; //普通用户,默认只能看到以下两个数据库
+--------------------+
| Database |
+--------------------+
| information_schema |
| test |
+--------------------+
2 rows in set (0.00 sec)
2、删除用户
mysql> drop user local@localhost; //用普通用户删除不了用户
ERROR 1227 (42000): Access denied; you need (at least one of) the CREATE USER privilege(s) for this operation
mysql> exit
Bye
[root@mysql ~]# mysql -uroot -predhat
mysql> drop user local@localhost;
Query OK, 0 rows affected (0.03 sec)
3、创建可以远程登录的用户
服务器端:172.16.254.200
客户端:172.16.42.8 保证要有mysql命令
1)服务器端操作
(1)创建远程用户
mysql> create user remote@'172.16.42.8' identified by 'simida'; //此处为客户端IP
mysql> create user remote@'%' identified by 'simida';
# %表示除了localhost和127.0.0.1之外的所有客户端
mysql> create user remote@'172.16.%.%' identified by 'simida';
# 172.16.%.%表示172.16.0.0/16网段的所有客户端
(2)重启服务
[root@mysql mysql]# /etc/init.d/mysqld restart
插曲:如果远程连接报如下错误,那么修改服务器端配置文件,添加一行即可:
[root@MySQL ~]# mysql -u remote -h 172.16.254.200 -p
Enter password:
ERROR 1042 (HY000): Can't get hostname for your address
----------------
[root@mysql mysql]# /etc/my.cnf
在[mysqld]那段里面添加如下行:5.6版本不需要
skip-name-resolve //跳过名字解析,否则无法远程连接该mysql管理系统
2)客户端登录验证
#客户端IP:172.16.42.8
[root@MySQL ~]# mysql -u remote -h 172.16.254.200 -p //此处为服务器端IP
Enter password:simida
4、授权 grant
grant不仅可以授权,还能创建用户
授权的语法:grant 权限列表 on 库名.表名 to 用户@主机 identified by '密码';
1)授予全部权限
mysql> grant all on *.* to allpriv@'172.16.%.%' identified by 'allpriv';
mysql> flush privileges; //刷新权限
Query OK, 0 rows affected (0.00 sec)
测试:
[root@mysql mysql]# mysql -uallpriv -h 172.16.254.200 -p
Enter password:
插曲:权限的级联授予
mysql> grant select on test.score to douni@'%' identified by 'douni';
ERROR 1142 (42000): GRANT command denied to user 'allpriv'@'172.16.254.200' for table 'score'
用root用户创建用户时,希望新的用户能够给别人授权的话,执行如下操作:
mysql> grant all on *.* to allpriv1@'172.16.%.%' identified by 'allpriv1' with grant option;
[root@mysql mysql]# mysql -uallpriv1 -h 172.16.254.200 -p
Enter password:
mysql> grant select on test.score to douni2@'%' identified by 'douni'; //能够执行成功
------------------------------------------------------
2)授予部分权限
mysql> create database up;
Query OK, 1 row affected (0.00 sec)
mysql> use up;
Database changed
mysql> create table upt1 (id int);
Query OK, 0 rows affecte d (0.01 sec)
mysql> insert into upt1 values();
Query OK, 1 row affected (0.00 sec)
mysql> insert into upt1 values();
Query OK, 1 row affected (0.01 sec)
mysql> insert into upt1 values();
Query OK, 1 row affected (0.00 sec)
mysql> create table upt2 (id int);
Query OK, 0 rows affected (0.03 sec)
mysql> grant select,insert,update on up.upt1 to douwo@'%' identified by 'douwo';
mysql> flush privileges;
验证权限
[root@mysql ~]# mysql -udouwo -h 172.16.254.200 -p
Enter password:
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| test |
| up |
+--------------------+
3 rows in set (0.00 sec)
mysql> use up;
Database changed
mysql> show tables;
+--------------+
| Tables_in_up |
+--------------+
| upt1 | //只对该表有权限,就只能看到这张表
+--------------+
1 row in set (0.00 sec)
mysql> select * from upt1;
+------+
| id |
+------+
| NULL |
| NULL |
| NULL |
+------+
3 rows in set (0.00 sec)
mysql> update upt1 set id=1 where id is null; //成功
mysql> insert into upt1 values(); //成功
Query OK, 1 row affected (0.00 sec)
mysql> delete from upt1 where id is null; //失败
ERROR 1142 (42000): DELETE command denied to user 'douwo'@'172.16.254.200' for table 'upt1'
mysql> drop table upt1; //失败
ERROR 1142 (42000): DROP command denied to user 'douwo'@'172.16.254.200' for table 'upt1'
5、回收权限 revoke
取消用户权限:
1)删除用户
2)revoke
回收语法:revoke 权限 on 库名.表名 from 用户@主机;
[root@mysql ~]# mysql -uroot -p
Enter password:
mysql> revoke all on *.* from allpriv@'172.16.%.%';
回收部分权限
mysql> show grants for part@'%'; //查看用户的权限的
+-----------------------------------------------------------------------------------------------------+
| Grants for part@% |
+-----------------------------------------------------------------------------------------------------+
| GRANT USAGE ON *.* TO 'part'@'%' IDENTIFIED BY PASSWORD '*57FA4A97AD182F6A0872282CACBE109822E9E801' |
| GRANT SELECT, INSERT, UPDATE ON `test`.`score` TO 'part'@'%' |
+-----------------------------------------------------------------------------------------------------+
2 rows in set (0.00 sec)
mysql> revoke update on test.score from part@'%';
Query OK, 0 rows affected (0.00 sec)
mysql> show grants for part@'%';
+-----------------------------------------------------------------------------------------------------+
| Grants for part@% |
+-----------------------------------------------------------------------------------------------------+
| GRANT USAGE ON *.* TO 'part'@'%' IDENTIFIED BY PASSWORD '*57FA4A97AD182F6A0872282CACBE109822E9E801' |
| GRANT SELECT, INSERT ON `test`.`score` TO 'part'@'%' |
+-----------------------------------------------------------------------------------------------------+
2 rows in set (0.00 sec)
6、查看用户的权限
mysql> select user,host from mysql.user;
+----------+-------------+
| user | host |
+----------+-------------+
| douni | % |
| douni2 | % |
| douwo | % |
| part | % |
| root | 127.0.0.1 |
| allpriv | 172.16.%.% |
| allpriv1 | 172.16.%.% |
| remote | 172.16.42.8 |
| root | ::1 |
| | localhost |
| root | localhost |
| | mysql |
| root | mysql |
+----------+-------------+
13 rows in set (0.00 sec)
mysql> show grants for part@'%'; #查看用户的权限的
+-----------------------------------------------------------------------------------------------------+
| Grants for part@% |
+-----------------------------------------------------------------------------------------------------+
| GRANT USAGE ON *.* TO 'part'@'%' IDENTIFIED BY PASSWORD '*57FA4A97AD182F6A0872282CACBE109822E9E801' |
| GRANT SELECT, INSERT, UPDATE ON `test`.`score` TO 'part'@'%' |
+-----------------------------------------------------------------------------------------------------+
2 rows in set (0.00 sec)
#权限查看:
mysql> use information_schema;
Database changed
mysql> select distinct grantee from user_privileges;
mysql> select privilege_type from user_privileges where grantee="'test'@'172.16.%.%'";
+-------------------------+
| privilege_type |
+-------------------------+
| SELECT |
| INSERT |
| UPDATE |
| DELETE |
| CREATE |
| DROP |
| RELOAD |
| SHUTDOWN |
| PROCESS |
| FILE |
| REFERENCES |
| INDEX |
| ALTER |
| SHOW DATABASES |
| SUPER |
| CREATE TEMPORARY TABLES |
| LOCK TABLES |
| EXECUTE |
| REPLICATION SLAVE |
| REPLICATION CLIENT |
| CREATE VIEW |
| SHOW VIEW |
| CREATE ROUTINE |
| ALTER ROUTINE |
| CREATE USER |
| EVENT |
| TRIGGER |
| CREATE TABLESPACE |
+-------------------------+
28 rows in set (0.00 sec)