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

MySQL用户管理:

mysql> help contents;
You asked for help about help category: "Contents"
For more information, type ‘help <item>‘, where <item> is one of the following
categories:
   Account Management
   Administration
   Compound Statements
   Data Definition
   Data Manipulation
   Data Types
   Functions
   Functions and Modifiers for Use with GROUP BY
   Geographic Features
   Help Metadata
   Language Structure
   Plugins
   Procedures
   Storage Engines
   Table Maintenance
   Transactions
   User-Defined Functions
   Utility
 *************
mysql> help Account Management;
You asked for help about help category: "Account Management"
For more information, type ‘help <item>‘, where <item> is one of the following
topics:
   CREATE USER
   DROP USER
   GRANT
   RENAME USER
   REVOKE
   SET PASSWORD

用户帐号:[email protected], password

用户帐号管理:

CREATE USER

DROP UESER

RENAME USER 修改用户名称

SET PASSWORD

权限管理:

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

REVOKE

【CREATE USER】

CREATE USER [email protected]

[

IDENTIFIED BY [PASSWORD] ‘password‘

]

主机也可使用通配符:

%:

_:

[email protected]‘172.16.100.1__‘ 这就是下面的地址范围

172.16.100.100-172.16.100.199

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

【查看用户能够使用的权限】:SHOW GRANTS FOR [email protected]‘hostname‘

mysql> SHOW GRANTS FOR ‘testuser‘@‘192.168.6.%‘ \G
*************************** 1. row ***************************
Grants for [email protected]%: GRANT USAGE ON *.* TO ‘testuser‘@‘192.168.6.%‘ IDENTIFIED BY PASSWORD <secret>
1 row in set (0.00 sec)
mysql> create user [email protected]‘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】

[[email protected] ~]# 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 以新的用户名,旧的密码就可以登录了】

[[email protected] ~]# 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 [email protected] [IDENTIFIED BY ‘password‘], [[email protected] [],...]
    [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 [email protected]%: GRANT USAGE ON *.* TO ‘tuser‘@‘192.168.6.%‘ IDENTIFIED BY PASSWORD <secret>
*************************** 2. row ***************************
Grants for [email protected]%: 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 [email protected]%: GRANT USAGE ON *.* TO ‘tuser‘@‘192.168.6.%‘ IDENTIFIED BY PASSWORD <secret>
*************************** 2. row ***************************
Grants for [email protected]%: GRANT CREATE ON `testdb`.* TO ‘tuser‘@‘192.168.6.%‘
*************************** 3. row ***************************
Grants for [email protected]%: 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 [email protected]%: 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、对写密集型的应用场景来说,禁用缓存反而能提高性能;

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

时间: 2024-12-26 03:13:32

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

上课笔记第三十一天MySQL并发控制、引擎、用户权限管理、查询缓存

1.MySQL并发控制机制        并发控制:每个会话会启动一个mysql线程               服务器层:用于控制锁               存储引擎层:并发访问控制基本上应该由存储引擎层完成 锁:lock                读锁:共享锁                写锁:独占锁 锁力度:                 表级锁:myisam表级锁                 行级锁:innodb行级锁 锁分类:                 隐式锁:由

JAVAWEB开发之权限管理(二)——shiro入门详解以及使用方法、shiro认证与shiro授权

shiro介绍 什么是shiro shiro是Apache的一个开源框架,它将软件系统的安全认证相关的功能抽取出来,实现用户身份认证,权限授权.加密.会话管理等功能,组成了一个通用的安全认证框架.它可以实现如下的功能: 1.验证用户 2.对用户执行访问控制,如:判断用户是否具有角色admin,判断用户是否拥有访问的资源权限. 3.在任何环境下使用SessionAPI.例如C/S程序 4.可以使用多个用户数据源.例如一个是Oracle数据库,另外一个是MySQL数据库. 5.单点登录(SSO)功能

MySQL查询缓存详解

一:缓存条件,原理 MySQL Query Cache是用来缓存我们所执行的SELECT语句以及该语句的结果集,MySql在实现Query Cache的具体技术细节上类似典型的KV存储,就是将SELECT语句和该查询语句的结果集做了一个HASH映射并保存在一定的内存区域中.当客户端发起SQL查询时,Query Cache的查找逻辑是,先对SQL进行相应的权限验证,接着就通过Query Cache来查找结果(注意必须是完全相同,即使多一个空格或者大小写不 同都认为不同,即使完全相同的SQL,如果使

40 用户权限管理及查询缓存、索引和explain、MariaDB存储引擎及编译安装、MySQL中的事务

03 MariaDB存储引擎及编译安装 CentOS6.x下安装Mariadb #准备MaridDB存储分区 [[email protected] ~]# fdisk /dev/sda WARNING: DOS-compatible mode is deprecated. It's strongly recommended to switch off the mode (command 'c') and change display units to sectors (command 'u').

MySQL用户、库、表的操作语法 关于用户的语法

MySQL用户.库.表的操作语法 关于用户的语法 查看当前系统里的用户: select user,host from mysql.user; 查看当前登陆的用户 select user(); 创建用户 语法:create user '用户'@'主机' identified by '密码'; 示例:create user 'anuo'@'localhost' identified by '123' 创建用户并授权 grant 权限 on 库.表 to '用户名'@'主机域' identified

【转】MySQL用户管理及SQL语句详解

[转]MySQL用户管理及SQL语句详解 1.1 MySQL用户管理 1.1.1 用户的定义 用户名+主机域 mysql> select user,host,password from mysql.user; +--------+------------+-------------------------------------------+ | user | host | password | +--------+------------+---------------------------

2017-11-13Linux基础知识(11)用户、组和权限管理

在之前的章节中讲述了bash的基础特性以及IO重定向以和管道等其它的功能程序,之后介绍了一些其相关的命令,例如:tr和tee命令等,之后我们介绍了Here document,在这一章中,我们开始讲述用户.组及权限管理中的一部分,我们首先来说用户和组. 一.用户 Linux操作系统是一款多用户Multi-Users及多任务Multi-tasks的操作系统,也就是说,可以多个用户同时登录该系统执行各自的任务,彼此用户与用户之间互不干扰,这也是当时为了解决主机资源所提供的一种有效手段,那时候主机都在中

LINUX用户、用户组及权限管理

LINUX用户.用户组及权限管理 一.LINUX权限管理 LINUX权限分为:r,w,x,读,写,可执行 对文件来说: r 可读,即可以使用类似cat等命令查看文件的内容 w 可写,可以编辑或删除此文件: x 可执行,exacutable,可以在命令提示符下当做命令提交给内核运行. 对于目录来说(默认有x权限): r 可以对此目录执行ls以列出内部的所有文件 w 可以在此目录中创建文件 x 可以使用cd切换进此目录,也可以使用ls -l查看内部文件的详细信息. 文件 目录 r 可读,即可以使用类

mysql 用户表结构设计,第三方登录

说起用户表,大概是每个应用/网站立项动工(码农们)考虑的第一件事情.用户表结构的设计,算是整个后台架构的基石.如果基石不稳,待到后面需求跟进了发现不能应付,回过头来反复修改用户表,要大大小小作改动的地方也不少.与其如此,不妨设计用户表之初就考虑可拓展性,争取不需要太多额外代价的情况下一步到位. 先前设计 idusernamepassword用户名加上密码,解决简单需求,留个id作为其他表的外键.当然,那时候密码还可能是明文存储,好点的知道md5. 后来呢,随着业务需求的拓展,要加个用户状态 st