Please enable JavaScript.
Coggle requires JavaScript to display documents.
Database (:moneybag:恢复机制 (:moneybag:事件 (:moneybag:元素 (:explode…
Database
:moneybag:恢复机制
-
:moneybag:恢复手段
:one:运行日志
:moneybag:检查点
:explode:定期强制缓冲区内容与磁盘内容保持一致,运行日志会记录这个时间点.恢复的时候不用从运行日志的最开始恢复,而是从检查点开始恢复
:moneybag:恢复
:explode:检查点到故障点完成的事务按日志redo,故障点内没完成的事务要undo
:recycle:是否要暂停系统
:one:静止检查点
:moneybag:设置
:explode:停止接收新的事务,等到所有当前活跃事务commit/abort,并在日志中写入记录后,将日志刷新到磁盘,写入日志记录<CKPT>,并再次刷新日志
-
:two:非静止检查点
:moneybag:设置
:explode:不用停止接收新事务,而是写<START CKPT(T1,T2,...Tk)>,记录当前活跃的事务,直到T1,..Tk都完成,就写<END CKPT>
-
:recycle:Redo/Undo
:two:Redo型日志
-
-
:explode::one:如果从t start开始能找到commit/abort,说明事务完成了 :two:对于完成(有commit/abort)的事务,从日志的起始位置开始,处理每一条记录,重做完成事务的所有修改
-
:three:Undo/Redo型日志
-
:explode:不要颠倒顺序.从后开始undo,从前开始redo
:moneybag:追加的log
:explode::one:Redo不用追加(上面的log已经表明做了) :two:undo要追加(因为要用abort闭合start才行,并且只用记录一个值<T, A, 100>
这样子)
:one:Undo型日志
-
:explode::one:如果从t start开始能找到commit/abort,说明事务完成了 :two:对于没有完成的事务(没有ABORT也没有COMMIT),从日志的尾部开始,处理每一条记录,撤销未完成事务的所有修改
-
-
-
:two:副本
:explode:在某一时刻,将数据库的记录备份到另一个介质存储上.如果发生介质故障,可以利用该副本代替
-
-
-
:moneybag:访问机制
:explode:CPU和内存按字,内存和DB按块
:moneybag:事件
:one:read(X,t):将元素t读到事务的局部变量X中
:two:write(X,t):将局部变量t写入到元素X中
-
-
:moneybag:元素
:explode:通常为1磁盘块/1内存页,也可以是1记录或1关系
-
-
:key:持久性(未提交的事务不应该有影响,提交的事务才能有影响.保持缓冲区一致)和原子性
:moneybag:持久性
:moneybag:缓冲区处理
-
-
:three:No force
:explode:内存中的数据后可以一直保留,commit之后过一段时间再写入磁盘
-
:fire::one:读写性能高 :two:需要redo,因为有些commit数据还没写入到磁盘
:four:Steal
-
-
:fire::one:读写性能高 :two:需要undo,因为有些没commit数据写入到了磁盘
-
:moneybag:原子性
:question:在事务中,如果A写入磁盘而B来不及写入怎么办
-
-
:moneybag:ARIES
:explode:Algorithms for Recovery and Isolation Exploiting Semantics(ARIES) 是一种针对no-force,steal数据库的恢复算法
-
-
:moneybag:实现原理
-
:two:重做
:explode::one:先根据DPT找到最小的LSN,再遍历log重做 :two:如果这个事务在DPT里面,但是它的LSN小于记录在DPT里的LSN,那么说明已经落盘,不用重做,否则redo
:three:回滚
:explode:根据ATL undo,利用记录中的上个LSN,不断回滚.并记录CLR,结束事务后记录END CLR
:moneybag:LSN
:explode:Log Sequence Number.日志的序列号,标记时间顺序
:moneybag:日志
-
-
:star:因为只记录前一个LSN,所以利用它可以undo,而不能redo
:warning:上面的undo和redo是模仿aries的,是简化的aries.只是aries使用了减少checkpoint开销和恢复时间的技术
:moneybag:查询优化
:key::one:SQL语句可以转化成代数运算 :two:笛卡尔乘积开销最大,最后执行 :three:关系代数的等价性
:two:逻辑查询优化
:explode:给定SQL语句,选择最优的关系代数操作次序
:key::one:早做选择和投影 :two:串联选择与投影,一次同时进行 :three:结合投影和其他二元运算,去除无关属性 :four:串联乘积和选择,减少保存的量 :five:预处理 :six:公共子表达式
:moneybag:关系代数操作次序交换的等价性
-
:moneybag:定理
:one:并与并,积与积,交与交,连接与连接的交换律
-
-
-
-
:six:选择和积的交换律
:explode:选择如果只涉及其中一个项,就可以交换了
:seven:投影和积的交换律
:explode:笛卡尔乘积前,两个项都保留需要的属性就行了
-
-
-
:moneybag:算法
-
:warning:一元操作如选择和投影,不用分顺序.因为都同时进行
-
-
:one:物理查询优化
:explode:给定一个关系代数,选择合适的算法查询
-
:key:同一关系操作如JOIN,我们有多种物理实现方法
-
:moneybag:代价估算
:two:选择
:one:等于
:explode:T(R)/V(R,A)或1/10
-
-
-
-
:three:自然连接
:explode:T(Res)=T(R)T(S)/MAX(V(R,Y),V(S,Y))
:snowflake:S=R(X,Y) natural join S(Y,Z)
:star:如果Y是R->S的外键,那么结果是T(R).如果Y是R的主键,那么结果是T(S)
-
-
:moneybag:物化视图
:explode:原来定义一个视图只保存视图定义的语句,但物化视图还会保存查询结果
:moneybag:物化视图维护
-
-
:three:增量的视图维护
:moneybag:根据视图的获得方式进行增量
:one:自然连接
:explode:插入/删除的元组集和另一个关系进行自然连接,然后额外添加/删除到原来的视图结果里
:two:选择
:explode:只判断插入/删除的元组集,如果ok就加入到视图结果
:explode:更新分为删除并插入.从而我们只要根据插入/删除的元组,再利用关系代数,确认新视图和旧视图的差,然后补足就可以了
-
:moneybag:其他用途
:one:查询优化
:one:如果用户有某个操作,是和之前的物化视图一样的查询方式,则可以直接利用物化视图
:two:如果对物化视图本身查询,而物化视图通过自己定义拆分出来可以加速原来的查询,那么就可以优化了
-
:moneybag:嵌套子查询
:explode:如果where语句涉及子查询,这样的查询一般会昂贵.所以将它转换成连接的方式,从而降低开销
:moneybag:方法
:explode::one:对于子查询单独的谓词(即不和外层的关系有联系的话),就可以先查出这个表,记住t1 :two:将t1放在外层from里面,这样另外的谓词放在外层where里,这样就ok了
:moneybag:lock
-
:recycle:锁的分类
-
-
:three:Intention Lock
:moneybag:意向锁表示有意加锁,并且如果上了意向锁后,接下来就一定会上锁.意向锁可以分为IS和IX,表明其后代存在S锁/X锁
:moneybag:兼容矩阵
-
:fire::one:IS和IX都兼容,因为都是有意,而不是真干 :two:IX和X不兼容,因为如果上了IX,就有可能X和X冲突
:zap:行锁和表锁
:explode:锁定了整张表,自然就不能操作行了
:question:如何锁定一个node
:explode::one:兼容 :two:父节点都被锁上了 :three:只有父节点是IX或IS,才可以上S/IS :four:只有父节点是IX,SIX,才可以上X,SIX,IX
:star:加锁自上而下,解锁自下而上
:bulb:和Tree Protocol不一样,后者解锁时孩子可以不用解锁
-
:moneybag:grant
:moneybag:Starve
:explode:如果一个item被上了S.我要X的话,就要等它释放.但是其他人可能也要S,由于都是S,不用等待,所以他们都上了S.而我可能要一直等下去.(一本笔记书大家都能看,我得等所有人都看完才能看笔记本)
-
:moneybag:S和X不兼容,S和S兼容.只要保证兼容,都能授予lock
:moneybag:Protocol
:one:Two-Phase Locking
:explode:一个事务,先全部加锁,处理完后,再全部解锁.即,一个事务是Two-Phase Locking,只要它满足可划分成两个阶段,一个阶段只有加锁,一个阶段只有解锁
-
:moneybag:死锁
:zap::zero:T1转账,T2计算A+B的总和 :one:T1要处理itemA和B,那么先加锁A,进行处理 :two:此时T2要加锁B,读取B :three:T2要继续加锁A才能读取,而T1要加锁B才能转账=>死锁
-
-
-
-
:moneybag:Lock Manager
-
:moneybag:Lock Table
-
-
:moneybag:lock
:explode:加入到请求队列中,如果前面和我都是兼容的,那我就可以直接读书了~
:question:怎么看图
:explode::one:事务是下面的,item是上面的 :two:黑色表示granted,白色表示waiting :three:画图,所有白色的指向左边最后一个黑色的 :four:画出来的图中,循环的是死锁
:question:如果有死锁,怎么rollback
-
:moneybag:物理存储
-
:warning:数据库可以存在磁盘里,也可以存在内存里
-
-
:moneybag:文件组织方法
:moneybag:记录
-
:one:定长记录
:moneybag:free list
:explode:Lazy Deletion中在存储的文件设置一个文件头,指向第一个空闲记录,然后这个空闲记录指向下一个空闲记录.从而形成free list
-
-
:two:有序记录文件
:fire:按排序字段检索的话检索效率高,更新效率低
:maple_leaf:溢出文件保留新记录.溢出文件是无序的.如果溢出文件太大的话,顺序记录就无意义.所以要定时数据库重组
-
:four:聚簇文件
-
:fire:根据某一字段,比如在同一系的教师记录,连续存储
:moneybag:查询过程
:moneybag:宏观思路
:one:一次单一元组的一元操作
:explode:迭代器算法
-
-
:moneybag:迭代器
:explode:对每个表设置一个迭代器,可以迭代所有元组,并且只能判断下一个元组是不是在下一个block里
:moneybag:示例
-
-
-
-
:four:Join(R,S)
:explode::one:利用迭代器得到R的第i个元组 :two:利用迭代器得到S的第j个元组 :three:如果i和j可以连接就返回,不能连接的话,S继续向下迭代 :four:如果S返回了NotFound,那么就下移R :five:如果R返回NotFound,那么就整体返回NotFound,否则就重新S.open(),然后继续对R的这个记录迭代S的所有记录
-
:two:整个关系的一元操作
-
-
-
-
:fire:DISTINCT,GROUP BY,SORTING
-
-
:moneybag:Operation
:moneybag:Join
-
-
-
:four:Merge Join
:explode:如果R和S都在连接属性上按顺序存储(我们也可以先排序),那么只需要两边同时向下边移动边比较就行了
-
:five:Hash Join
:explode:在连接属性上将R和S都哈希到各自的哈希表中,这个哈希表的下标是哈希值,存储的是元组的位置.从而我们遍历R,获得这个元组的哈希值h1,然后在S的哈希数组中找到该h1位置,它里面记录的元组位置就是我们需要找的最小范围
:dagger_knife:时间序列数据库
-
-
:three:InfluxDB
-
:dagger_knife:grafana可以做监控,grafana也可以替代kibana
:moneybag:事务
:moneybag:事务调度
:explode:一组事务的基本步骤(读,写,加锁,解锁)的一种执行顺序成为这组事务的一个调度
:moneybag:并行调度
:explode:多个事务在宏观上是并行执行的,微观上,这些基本操作都是交叉执行的
:moneybag:可串行性的
:explode:如果这个并行调度的结果和某一个串行调度相同,这称这个调度是可串行化的
-
:warning:正确的并行调度不一定是可串行的,但可串行的一定是正确的调度
:moneybag:冲突可串行化
:moneybag:冲突
:explode:一对连续的操作,如果改变顺序,就会导致结果不一致
-
:explode:一个调度,如果通过交换相邻两个无冲突的操作,能够转换到偶一个串行的调度,则称此调度为冲突可串行化的调度
-
:warning::one:冲突可串行化比可串行化严格.所以:冲突可串行化=>可串行化 :two:调度的正确性不好判断,所以我们判断是否可串行化;因为可串行化不好判断,所以我们判断是否冲突可串行化
:moneybag:ACID
-
:three:Isolation.不同事务间是独立的,保证了一致性
-
:moneybag:转账
:explode:等两个账号都锁上后,才能执行语句,最后依次解锁
:moneybag:锁上的顺序没有关系,因为我们能保证锁上前都正确,而由于两个都锁上后才转账,所以两个都正确,最后解锁顺序也没关系