用户管理 查询优化 日志
MySQL 用户管理
用户账号: username@hostname
用户账号管理:
CREATE USER 创建用户
CREATE USER username@hostname
[
IDENTIFIED BY [PASSWORD] 'password'
]
主机也可以使用通配符: create user testuser@'172.16.100.1_ _' IDENTIFIED BY 'password' # 表示可以使用100.100-100.199
DROP USER 删除用户
RENAME USER 修改用户
RENAME USER old_user TO new_user
[, old_user TO new_user] ...
RENAME USER 'jeff rey'@'localhost' TO 'jeff'@'127.0.0.1';
SET PASSWORD 设置密码
权限管理:
grant 授权
revoke 取消权限
查看用户能够使用的权限:show grants for username@’hostname’
Mysql的权限类型:
库级别
表级别
字段级别
管理类
程序类
管理类权限
create temporary tables 临时表
create user
file 允许用户读或者写某些文件
lock tables 添加显式锁
process:查看用户的线程
reload:相当于执行flush和reset
replication client 查询有哪些复制客户端
replication slave 赋予用户复制权限
show databases 查看所有数据库
shutdown 关闭服务
super
数据库访问权限
alter
alter routine 存储历程
create
create routine 存储过程,存储函数
create view
delete
drop
execute
grant option 将自己的权限复制给别的用户
index 索引
show view
数据操作类权限(表级别):
select
insert
update
delete
字段级别:
select(col1,....)
update(col1,....)
insert(col1,....)
所有权限:
ALL [PRIVILEGES]
GRANT
priv_type [(column_list)]
[, priv_type [(column_list)]] ...
ON [TABLE | FUNCTION | PROCEDURE] priv_level
TO username@hostname [IDENTIFIED BY 'password'] ...
[REQUIRE ssl] [WITH with_option ...]
#object_type: 类型
TABLE | FUNCTION | PROCEDURE
#priv_level: 级别
* | *.* | db_name.* | db_name.tbl_name | tbl_name | db_name.routine_name
#user_specification: 给用户和密码的
user
[
IDENTIFIED BY [PASSWORD] 'password'
| IDENTIFIED WITH auth_plugin [AS 'auth_string']
]
#ssl_option: 设置默认连接方式
SSL
#with_option: 限定选项
GRANT OPTION 转赠给别人
| MAX_QUERIES_PER_HOUR count 每小时允许执行的最大查询次数
| MAX_UPDATES_PER_HOUR count
每小时允许执行的最大更新次数
| MAX_CONNECTIONS_PER_HOUR count
每小时允许执行的最大连接次数
| MAX_USER_CONNECTIONS count
使用同一个账号可以同时连接的次数
收回授权 REVOKE
REVOKE priv_type [(column_list)]
[, priv_type [(column_list)]] ...
ON [TABLE | FUNCTION | PROCEDURE] priv_level
FROM user [, user] ...
REVOKE ALL PRIVILEGES, GRANT OPTION
FROM user [, user] ...
REVOKE PROXY ON user
FROM user [, user] ...
*几个跟用户授权相关的表:
db:库级别的权限
host:主机级别权限,已废弃
tables_priv:表级别权限
colomns_priv:列级别的权限
procs_priv:存储过程和存储函数相关的权限
proxies_priv:代理用户权限·*
练习:
1、授权testuser能够通过172.16.0.0/16网络内的任意主机访问当前mysql服务器的权限
grant alter on *.* to 'testuser'@'172.16.%.%' identified by 'password'
2、让此用户能够创建和删除testdb数据库,及库中的表
grant create,drop on testdb.* to 'testuser'@'172.16.%.%';
3、让此用户能够在testdb库中的t1表中执行查询、删除、更新和插入操作
grant select,update,insert,delect on testdb.t1 to 'testuser'@'172.16.%.%'
4、让此用户能够在testdb库上创建和删除索引
grant index,drop index on testdb to 'testuser'@'172.16.%.%';
5、让此用户能够在testdb.t2表上查询id和name字段,并允许其将此权限传授予其他用户
grant select(id,name) on testdb.t2 to 'testuser'@'172.16.%.%'
grant grant option on testdb.t2 to 'testuser'@'172.16.%.%'
MySQL查询缓存
用于保存MySQL查询语句返回的完整结果。被命中时,MySQL 会立即返回结果,省去了解析,优化和执行等阶段
如何检查缓存
MySQL保存结果于缓存中:
把select语句本身做hash计算,计算的结果作为key,查询结果作为value
什么样的语句不会被缓存
查询语句中有一些不确定数据时,不会缓存,列如NOW(),CURRENT_TIME(),一般来说,如果查询中包含用户自定义函数,存储函数,用户变量,临时表,mysql库中系统表,或者任何包含权限的表,一般不会缓存
缓存会带来额外开销
1、每个查询都会先检查是否命中
2、查询结果要先缓存
mysql> 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_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_limit:单个缓存对象的最大值,超出时则不预缓存,手动使用SQL_NO_CACHE可以人为的避免尝试缓存返回超出此参数限定值得语句
query_cache_wlock_invalidate:如果某个表被其他用户连接锁住了,是否仍然从缓存中返回结果,OFF表示返回
*如何判断命令率(次数)
mysql> show global status like 'Qcache%';
+-------------------------+----------+
| Variable_name | Value |
+-------------------------+----------+
| Qcache_free_blocks(空闲块数) | 1 |
| Qcache_free_memory(空闲空间) | 16759688 |
| Qcache_hits(命中次数) | 0 |
| Qcache_inserts(向缓存空间中插入的缓存的次数) | 0 |
| Qcache_lowmem_prunes(内存太小,修剪内存的次数) | 0 |
| Qcache_not_cached(没被缓存的个数) | 8 |
| Qcache_queries_in_cache(缓存中缓存的查询个数) | 0 |
| Qcache_total_blocks(总块数) | 1 |
+-------------------------+----------+
碎片整理 flush query_cache
清空缓存 reset query_cache
计算命中率
show global status where Vaiable_name='Qcache_hits' OR Variable_name='Com_Select';
Qcache_hits/(Qcache_hits+Com_Select)
也可以参考另外一个指标,命中和写入的比率,即Qcache_hits/Qcache_inserts的值,此比值如果能大于3:1.则表明缓存也是有效的,能达到10:1,为比较理想的情况
缓存优化思路
1.批量写入,而非多次单个写入
2.缓存空间不宜过大,因为大量缓存同时失效时会导致服务器假死
3.必要时,使用sql_CACHE和sql_no_cache手动控制缓存。
4.对写密集型的应用场景来说,禁用缓存反而提高性能。
MySQL日志
查询日志
log:{ON|oFF}:是否记录所有语句的日志信息于一般查询日志文件(general_log)
log_output={TABLE|FILE|NONE}
table和file 可以同时出现,用逗号分隔即可
general_log:是否启用查询日志
general_log_file:定义了一般查询日志保存的文件
慢查询日志:查询执行时长超过指定时长的查询
slow_query_log={ON|OFF}
是否启用慢查询日志,它的输出位置也取决
log_output={table|file|none}
slow_query_log_file:www-slow.log
定义慢查询日志的文件
long_query_time : 10.00000 慢查询的时间
long_slow_filter: 不记录慢查记录
错误日志:
服务器启动和关闭过程中的信息;
服务器运行过程中的错误信息
事件调度器运行一个事件时产生的信息
在复制架构中的从服务器上启动从服务器线程时产生的信息
log_error = /path/to/error_log_file
log_warnings = {1|0}
是否记录警告信息保存至错误日志中
二进制日志:修改相关的操作,用来实现复制的凭据
时间点恢复
复制
中继日志:从服务器上的二进制日志
事务日志:将随机I/O转换为顺序I/O ACID :持久性
日志文件组:至少要存在两个,实现轮询
注意:尽可能使用小事务来替代大事务来提升事务引擎的性能