目录
一 关于mysql的设计和运行逻辑
mysql在启动的时候非常占空间,需要申请很大的空间,但是有时候内存并没有那么多,所以OS会把mysql需要的空间一部分一部分地给他。
mysql申请了空间之后,对申请的空间进行管理划分,专门有对应的区域来存储日记,缓存,管理相关信息等。
这样mysql处理就有对应的空间了,那么他是如何进行处理数据的?
mysql处理数据为了保证速度,是把数据从磁盘中加载到内存中再进行操作的。(把数据从内存加载到磁盘中的行为叫做落盘)
另一方面,这种行为让磁盘中保留了我们表之前的数据,如果想进行回滚事务的话,就可以利用保存的数据进行回滚。---》
我们在进行对应的数据操作的时候,首先被保存在磁盘上的应该是对应的mysql的日记,因为mysql有设计对应的管理数据的结构,但是插入我的数据的是设计到整个表结构,相比之下,保存数据的速度快很多,并且保存了数据之后,就可以插入数据。
我们就是利用这个日记来进行恢复的
二 MySQL的三类日志
关于mysql的三类主要的日记
①undolog:InnoDB存储引擎生成的日志,主要用于事物的回滚和MVCC,保证了事务的原子性
②binlog:Server层生成的日志,主要是用来备份数据,集群等
Server层生成的日志,就是用户的sql指令
Mysql是个服务器,所有的sql指令通过mysql客户端交给mysqld这样的进程,进程在处理的时候,对于日记除了词法语法分析调优等外,还会把历史上用户的所有指令记录下来。
Mysql会记录下所有的数据,做数据库级别的分布式备份,可以把日志同步;还可以增量式备份……
③redo log:InnoDB存储引擎生成的日志,用于崩溃后修复数据,保证了事务的持久性
三 对于日志的利用
插入查询
1 备份
对于A表如果要进行备份的话,我们可以把对应的A表的数据全部查询出来之后写到另一个数据表中。
首先创建一个这样的表,表的结构是一样的,但是没有数据
之后把筛选出来的数据插入到我们的用来测试的表结构中,就完成了数据的备份
2 删除重复数据
我们可以利用distinct来删除重复的数据,这样就保证了每个数据只有一份。此时我们创建一个和之前表A一样结构的表B,把数据插入表B即可
这样就完成了去重之后的数据插入。对于原始表,去掉重复数据,并且重复数据只能有一份,move操作,是原子的。