当前位置:Gxlcms > 数据库问题 > MySQL用户、[表库字段]权限、管理及查询缓存详解

MySQL用户、[表库字段]权限、管理及查询缓存详解

时间:2021-07-01 10:21:17 帮助过:19人阅读

用户帐号:username@hostname, password


用户帐号管理:

CREATE USER

DROP UESER

RENAME USER 修改用户名称

SET PASSWORD


权限管理:

GRANT  如果用户不存在 ,可以同时创建用户

REVOKE


【CREATE USER】


CREATE USER username@hostname

[

IDENTIFIED BY [PASSWORD] ‘password‘

]


主机也可使用通配符:

%:

_:

 

testuser@‘172.16.100.1__‘ 这就是下面的地址范围

  172.16.100.100-172.16.100.199

   【创建testuser 用户,限制在192.168.6.0/24 网段内,密码是testpass】



   【查看用户能够使用的权限】:SHOW GRANTS FOR username@‘hostname‘

mysql> SHOW GRANTS FOR ‘testuser‘@‘192.168.6.%‘ \G
*************************** 1. row ***************************
Grants for testuser@192.168.6.%: GRANT USAGE ON *.* TO ‘testuser‘@‘192.168.6.%‘ IDENTIFIED BY PASSWORD <secret>
1 row in set (0.00 sec)
mysql> create user testuser@‘192.168.6.%‘ identified by ‘testpass‘;
Query OK, 0 rows affected (0.00 sec)

【通知重读授权表】

mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)


【打开一个终端2,用testuser 远程访问mysql服务器192.168.6.177】

[root@pc0003 ~]# mysql -u testuser -h 192.168.6.177 -p
Enter password:


【终端2此时什么库也看不到】

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| test               |
+--------------------+
2 rows in set (0.02 sec)


【 information_schema】

mysql> show tables from  information_schema;


mysql共享信息,关机就清空,相当于linux的/proc


【终端2 尝试创建一个库,提示没有权限】

mysql> create database testdb;
ERROR 1044 (42000): Access denied for user ‘testuser‘@‘192.168.6.%‘ to database ‘testdb‘


【Ranme User】终端2自己没有权限给自己改名

mysql> rename user ‘testuser‘@‘192.168.6.%‘ to ‘tuser‘@‘192.168.6.%‘;
ERROR 1227 (42000): Access denied; you need (at least one of) the CREATE USER privilege(s) for this operation


【给有权限的用户来操作】

mysql> rename user ‘testuser‘@‘192.168.6.%‘ to ‘tuser‘@‘192.168.6.%‘;
Query OK, 0 rows affected (0.01 sec)


【!!!!!!!!!】

此时终端2没有任何变化,必须退出重新登录才能或得更改的效果。


【终端2 以新的用户名,旧的密码就可以登录了】

[root@pc0003 ~]# mysql -u tuser -h 192.168.6.177 -p
Enter password:



【修改密码】mysql> help set password;

SET PASSWORD FOR ‘bob‘@‘%.example.org‘ = PASSWORD(‘cleartext password‘);


【授权】mysql> help grant;


【显示服务器当前所有线程】

mysql> show processlist \G
*************************** 1. row ***************************
     Id: 1
   User: root
   Host: localhost
     db: NULL
Command: Query
   Time: 0
  State: NULL
   Info: show processlist
*************************** 2. row ***************************
     Id: 7
   User: tuser
   Host: 192.168.6.177:52151
     db: NULL
Command: Sleep
   Time: 12
  State: 
   Info: NULL
2 rows in set (0.00 sec)

【查看谁在登录我的mysql】

mysql> use hellodb;
Database changed
mysql> lock tables classes read;
Query OK, 0 rows affected (0.01 sec)
mysql> show processlist \G
*************************** 1. row ***************************
     Id: 1
   User: root
   Host: localhost
     db: hellodb
Command: Query
   Time: 0
  State: NULL
   Info: show processlist
*************************** 2. row ***************************
     Id: 7
   User: tuser
   Host: 192.168.6.177:52151
     db: NULL
Command: Sleep
   Time: 165
  State: 
   Info: NULL
2 rows in set (0.00 sec)




【MySQL的权限类别:】

库级别

表级别

字段级别

管理类

程序类


管理类权限:

CREATE TEMPORARY TABLES

CREATE USER

FILE

SUPER

SHOW DATABASES

RELOAD

SHUTDOWN

REPLICATION SLAVE

REPLICATION CLIENT

LOCK TABLES

PROCESS


库级别和表级别:

ALTER

ALTER ROUTINE

CREATE 

CREATE ROUTINE

CREATE VIEW

DROP

EXECUTE

GRNAT OPTION

INDEX

SHOW VIEW


数据操作(表级别):

SELECT

INSERT

UPDATE

DELETE


字段级别:

SELECT(col1,...)

UPDATE(col1,...)

INSERT(col1,...)


所有权限:

ALL [PRIVILEGES]



GRANT ALL ON [FUNCTION] *.* 
GRANT priv_type [(column_list)]
      [, priv_type [(column_list)]] ...
    ON [TABLE|FUNCTION|PROCEDURE] priv_level
    TO username@hostname [IDENTIFIED BY ‘password‘], [username@hostname [],...]
    [REQUIRE SSL]
    [WITH with_option ...]
priv_level:
    *
  | *.*
  | db_name.*
  | db_name.tbl_name
  | tbl_name
  | db_name.routine_name
with_option:
    GRANT OPTION
  | MAX_QUERIES_PER_HOUR count
  | MAX_UPDATES_PER_HOUR count
  | MAX_CONNECTIONS_PER_HOUR count
  | MAX_USER_CONNECTIONS count


【授予tuser 创建 testdb库的tb1表 】

mysql> grant create on testdb.tb1 to ‘tuser‘@‘192.168.6.%‘;
Query OK, 0 rows affected (0.04 sec)

【终端2 不用退出,就可以查看自己拥有的权限】

mysql> SHOW GRANTS FOR ‘tuser‘@‘192.168.6.%‘\G
*************************** 1. row ***************************
Grants for tuser@192.168.6.%: GRANT USAGE ON *.* TO ‘tuser‘@‘192.168.6.%‘ IDENTIFIED BY PASSWORD <secret>
*************************** 2. row ***************************
Grants for tuser@192.168.6.%: GRANT CREATE ON `testdb`.`tb1` TO ‘tuser‘@‘192.168.6.%‘
2 rows in set (0.00 sec)

【终端2 create database testdb 失败!】

mysql> create database testdb;
ERROR 1044 (42000): Access denied for user ‘tuser‘@‘192.168.6.%‘ to database ‘testdb‘

【grant create on testdb.*】

mysql> grant create on testdb.* to ‘tuser‘@‘192.168.6.%‘;
Query OK, 0 rows affected (0.01 sec)

【终端2 create database testdb 正常!】

查看自己的权限,就多了一行

mysql> SHOW GRANTS FOR ‘tuser‘@‘192.168.6.%‘\G
*************************** 1. row ***************************
Grants for tuser@192.168.6.%: GRANT USAGE ON *.* TO ‘tuser‘@‘192.168.6.%‘ IDENTIFIED BY PASSWORD <secret>
*************************** 2. row ***************************
Grants for tuser@192.168.6.%: GRANT CREATE ON `testdb`.* TO ‘tuser‘@‘192.168.6.%‘
*************************** 3. row ***************************
Grants for tuser@192.168.6.%: GRANT CREATE ON `testdb`.`tb1` TO ‘tuser‘@‘192.168.6.%‘
3 rows in set (0.00 sec)

【此时终端2 tuser 只有一个创建这个表的权限,没有desc,insert,drop,select 权限】

mysql> create database testdb;
Query OK, 1 row affected (0.03 sec)
mysql> use testdb;
Database changed
mysql> create table t1 (ID tinyint unsigned);
Query OK, 0 rows affected (0.14 sec)
mysql> desc t1;
ERROR 1142 (42000): SELECT command denied to user ‘tuser‘@‘192.168.6.177‘ for table ‘t1‘
mysql> insert into t1 value(1);
ERROR 1142 (42000): INSERT command denied to user ‘tuser‘@‘192.168.6.177‘ for table ‘t1‘
mysql> drop table t1;
ERROR 1142 (42000): DROP command denied to user ‘tuser‘@‘192.168.6.177‘ for table ‘t1‘
mysql> select * from t1;
ERROR 1142 (42000): SELECT command denied to user ‘tuser‘@‘192.168.6.177‘ for table ‘t1‘


【赋予drop权限】

mysql> grant drop on testdb.* to ‘tuser‘@‘192.168.6.%‘;
Query OK, 0 rows affected (0.00 sec)

【终端2 查看自己的权限 ,会多出一点,并不是覆盖,而是累加】

需要退出mysql再次登录,重新认证就可以使用这个权限

或者 通知改变授权表也可以

mysql> SHOW GRANTS FOR ‘tuser‘@‘192.168.6.%‘\G
Grants for tuser@192.168.6.%: GRANT CREATE, DROP ON `testdb`.* TO ‘tuser‘@‘192.168.6.%‘

收回授权:

REVOKE

   priv_type [(column_list)]

     [, priv_type [(column_list)]] ...

   ON [object_type] priv_level

   FROM user [, user] ...


REVOKE ALL PRIVILEGES, GRANT OPTION

   FROM user [, user] ...


几个跟用户授权相关的表:

db: 库级别权限;

host: 主机级别权限,已废弃

tables_priv: 表级别权限

colomns_priv:列级别的权限

procs_priv:存储过程和存储函数相关的权限

proxies_priv:代理用户权限


练习:

1、授予testuser能够通过172.16.0.0/16网络内的任意主机访问当前mysql服务器的权限;

2、让此用户能够创建及删除testdb数据库,及库中的表;

3、让此用户能够在testdb库中的t1表中执行查询、删除、更新和插入操作;

4、让此用户能够在testdb库上执行创建和删除索引;

5、让此用户能够在testdb.t2表上查询id和name字段,并允许其将此权限转授予其他用户;



【面试】【面试】【面试】【面试】【面试】

【面试】【面试】【面试】【面试】【面试】

【面试】【面试】【面试】【面试】【面试】

MySQL查询缓存


用于保存MySQL查询语句返回的完整结果。被命中时,MySQL会立即返回结果,省去解析、优化和执行等阶段。


如何检查缓存?

MySQL保存结果于缓存中:

把SELECT语句本身做hash计算,计算的结果作为key,查询结果作为value


什么样的语句不会被缓存?

查询语句中有一些不确定数据时,不会缓存:例如NOW(), CURRENT_TIME();一般来说,如果查询中包含用户自定义函数、存储函数、用户变量、临时表、mysql库中系统表、或者任何包含权限的表,一般都不会缓存;


缓存会带来额外开销:

1、每个查询都得先检查是否命中;

2、查询结果要先缓存;


MariaDB [(none)]> SHOW GLOBAL VARIABLES LIKE ‘query_cache%‘;
+------------------------------+----------+
| Variable_name                | Value    |
+------------------------------+----------+
| query_cache_limit            | 1048576  |
| query_cache_min_res_unit     | 4096     |
| query_cache_size             | 16777216 |
| query_cache_strip_comments   | OFF      |
| query_cache_type             | ON       |
| query_cache_wlock_invalidate | OFF      |
+------------------------------+----------+

query_cache_type: 查询缓存类型;是否开启缓存功能,开启方式有三种{ON|OFF|DEMAND};

DEMAND:意味着SELECT语句明确使用 SQL_CACHE 选项时才会缓存;


query_cache_size: 总空间,单位为字节,大小必须是1024的整数倍。MySQL启动时,会一次分配并立即初始化这里指定大小的内存空间;这意味着,如果修改此大小,会清空缓存并重新初始化的。


query_cache_min_res_unit: 存储缓存的最小内存块;(query_cache_size-Qcache_free_memory)/Qcache_queries_in_cache能够获得一个理想的值。


query_cache_limit: 单个缓存对象的最大值,超出时则不预缓存;手动使用SQL_NO_CACHE可以人为地避免尝试缓存返回结果超出此参数限定值的语句。


query_cache_wlock_invalidate: 如果某个表被其它用户连接锁住了,是否仍然从缓存中返回结果。OFF表示返回。



如何判断命令率:

MariaDB [hellodb]> SHOW GLOBAL STATUS LIKE ‘Qcache%‘;
+-------------------------+----------+
| Variable_name           | Value    |
+-------------------------+----------+
| Qcache_free_blocks      | 1        |
| Qcache_free_memory      | 16757008 |
| Qcache_hits             | 4        |
| Qcache_inserts          | 2        |
| Qcache_lowmem_prunes    | 0        |
| Qcache_not_cached       | 18       |
| Qcache_queries_in_cache | 2        |
| Qcache_total_blocks     | 6        |
+-------------------------+----------+

碎片整理:FLUSH QUERY_CACHE

清空缓存:RESET QUERY_CACHE


计算命中率:

MariaDB [hellodb]> SHOW GLOBAL STATUS WHERE Variable_name=‘Qcache_hits‘ OR Variable_name=‘Com_select‘;
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| Com_select    | 24    |
| Qcache_hits   | 4     |
+---------------+-------+
Qcache_hits/(Com_select+Qcache_hits)

也应该参考另外一个指标:命中和写入的比率,即Qcache_hits/Qcache_inserts的值,此比值如果能大于3:1,则表明缓存也是有效的。能达到10:1,为比较理想的情况。


缓存优化使用思路:

1、批量写入而非多次单个写入;

2、缓存空间不宜过大,因为大量缓存同时失效时会导致服务器假死;

3、必要时,使用SQL_CACHE和SQL_N0_CACHE手动控制缓存;

4、对写密集型的应用场景来说,禁用缓存反而能提高性能;


【面试】【面试】【面试】【面试】【面试】


MySQL用户、[表库字段]权限、管理及查询缓存详解

标签:mysql用户、[表库字段]权限、管理及查询缓存详解

人气教程排行