1、小知识点
(1)数据库连接一旦建立之后,即使管理员修改了权限,依旧可以操作。
(2)数据库使用的长连接。
(3)在使用了长连接之后,mysql在执行过程中内存使管理在连接对象中的,因此可能出现内存占用非常大的情况。这些资源会在连接断开后释放掉,但是可能在过程中占用过多内存而导致OOM,mysql异常重启。
–解决方法
1)定期断开连接,在完成一个占用较多内存的查询后,可以断开这个连接,再次查询的时候再进行连接。
2)在mysql5.7版本之后,在执行完一次比较大的查询操作后,可以通过mysql-reset-connection命令来重新初始化连接,不需要再次进行连接和权限验证,会恢复到刚连接的状态。
2、mysql框架的组件和作用
1、连接器:负责和客户端建立连接,获取权限,维持和管理连接。
2、查询缓存:查询请求会先访问缓存(key是查询条件,value是查询到的值)不推荐使用
3、使用缓存:更新会把以前的缓存清除掉
4、分析器:对SQL语句进行词法分析和语法分析,词法分析就是把SQL语句的字符找到对应列,语法分析就是确认SQL语句的语法是否正确。
5、优化器:优化器就是对有多列索引,找到最合适的索引。比如多表关联的时候(join),来确定各个表连接的顺序。
6、执行器:先判断对该表是否有权限,有的话进行查询,然后把查询结果返回。
3、service层和存储引擎的作用
(1)service层有连接器、分析器、优化器和执行器,涵盖了mysql大多数的核心功能,包括视图、存储过程和触发器等,以及所有的内置函数,比如日期,时间、数学和加密等
(2)存储引擎是实现了对数据的储存和提取,它是一种插件式的,比如有innodb/myisam/memmory,在mysql5.5之后默认innodb
4、更新语句还涉及到了2个日志模块,redo log(重做日志)bin log(归档日志)
redo log就像客人来酒馆喝酒,经理会把客人赊账的信息先记得黑板上,而不是花很多时间找到账本去一一更新,这样在进行数据操作的时候太费时间。如果赊账的数据不多,可以在客户很少的情况下进行账本的更新,如果黑板已经写满了,那就得先去更新一下账本,然后把黑板最开始的地方擦掉,继续记录。
redo log用于保证crash safe功能,即数据库发生故障,重启后仍然可以恢复数据。
redo log是存储引擎的日志。
bin log是service层的日志。
二者的不同点
(1)redo log是innodb存储引擎所持有的,bin log是service层所持有的,所有引擎都可以使用。
(2)redo log是物理日志,具有crash safe能力,它记录的是在某个数据页上进行了什么修改,而bin log是逻辑日志,比如记录了语句的原始逻辑,比如给“id=2的这一行的c字段的值+1”。
(3)redo log是循环写的,即固定大小会用完,用完之后就对开始擦除然后写。bin log是追加写,即写了一部分之后,再写的话会写在其他文件上,不会覆盖以前的文件。
mysql> update T set c=c+1 where ID=2;
5、一条修改语句的执行流程
(1)执行器先找引擎取 ID=2 这一行。ID 是主键,引擎直接用树搜索找到这一行。如果 ID=2 这
一行所在的数据页本来就在内存中,就直接返回给执行器;否则,需要先从磁盘读入内存,然后再
返回。
(2)执行器拿到引擎给的行数据,把这个值加上 1,比如原来是 N,现在就是 N+1,得到新的一
行数据,再调用引擎接口写入这行新数据。
(3)引擎将这行新数据更新到内存中,同时将这个更新操作记录到 redo log 里面,此时 redo log 处 于 prepare 状态。然后告知执行器执行完成了,随时可以提交事务。
(4)执行器生成这个操作的 binlog,并把 binlog 写入磁盘。
(5)执行器调用引擎的提交事务接口,引擎把刚刚写入的 redo log 改成提交(commit)状态,更
新完成。
6、如果数据库发生了误删,如何进行数据恢复
当需要恢复到指定的某一秒时,比如某天下午两点发现中午十二点有一次误删表,需要找回数据,
那你可以这么做:
(1)首先要去找到距离最近的一次全量备份,