• 数据库基础题目~综合


    一 redo undo binlog
        第一点
          redo是记录数据页变更操作的物理日志
          undo是记录数据版本历史快照的逻辑日志
          binlog 是记录事务语句的逻辑日志
      第二点 当要修改数据时
        1 undo生成目标数据的历史快照版本
         分类 insert_undo,update_undo 
         格式 <事务,column,old_value>
         redo记录针对目标数据页的操作和undo本身的操作
         提供历史版本读取和事务回滚
     2 二阶段提交
        redo进行刷新->prepare
        redo_buffer->redo_file->redo_disk(参数决定是否经过redofile flush操作)
        binlog生成相应binlog_event并写入binlog_buffer-commit
        binlog刷新,(参数不同是否决定文件刷新到磁盘 sync操作)
        binlog_buffer->binlog_disk
     3 数据页进行修改
     4 数据页写入double write,double write进行刷新
     5 数据页刷新到磁盘
    二 mvcc机制
     1 先形成一个活跃会话列表,其中最小事务ID和最大事务ID+1构成一个范围(read_view),接下来进行比较
     2 如果会话本身小于最小事务ID,那么可以直接读取数据本身,证明目标数据没有被操作
     3 如果会话本身大于最大事务ID+1(下一个可申请的事务ID),那么读取相应的快照,证明目标数据肯定被操作
     4 如果会话本身处于这个范围,就进行循环匹配,如果会话事务ID匹配命中,则代表数据在被使用,读取数据快照,否正就直接读取数据本身
     小case
    核心思想就是取得目标行数据的当前版本号,进行比较判断,确认是否被使用.事实上,事务号会被随时更新,如果事务在被新事务使用,行数据存储的事务号也会同步更新.事务号是正序增长的, rr和rc都有mvcc,机制不同的地方就在于rr模式下只会生成一次read_view 所以是可以实现可重复读的
    三  SSD优化策略
     1 关闭double-write 双写是为了实现原子写出现的,先刷数据页到ibdata1,再刷脏页到数据文件中..而SSD本身实现了原子写,所以不再需要
     2 关闭邻页刷脏 邻页刷脏是代表每次不光要刷脏页自己,还要查找相邻的符合要求(源码是一个去间)的脏页,目的是为了减少随机IO,但是消耗了时间,而随机IO在SSD并不存在,所以关闭
     3 调整io-capation,每次刷新的脏页数量 来源于fio针对磁盘的压测 设置为磁盘的IOPS
     4 调整innodb_flush_method为 o_dircet 数据文件的写入不再经过OS CACHE,记住这里是数据文件
     5 增大redologfile单个大小,(适合初始化实例),减少针对单位置的反复重写
     6 调整linux的IO调度算法为noop-noop是FIFO算法的优化版,还会对相邻IO进行合并,本身不区分IO请求种类,默认IO性能不存在问题
    四 mysql锁机制
        从锁粒度来说 分为   全局锁 表级锁  和 行锁 
             表级锁 又分为
                            表锁
                            元数据锁(关键字-升级)
                                  非DDL
                                  MDL_SHARED_WRITE/MDL_SHARED_READ
                                  DDL阶段
                                  MDL_SHARED_UPGRADABLE 禁止写,其他事务可以读取(共享锁) 升级到下一个锁
                                  MDL_SHARED_NO_WRITE 禁止写,其他事务可以读取(共享锁) 非in-place的copy阶段 升级到下个锁,in-place等待
                                  MDL_EXCLUSIVE  禁止读写->排他锁->rename-table
                                  未提交事务和查询事务阻塞MDL就是在rename阶段无法申请到MDL排他锁导致串行化等待
             行锁又分为 row-lock  锁定索引记录本身
                                gap lock  锁定索引记录间隙
                                next-key lock  锁定索引记录的间隙和记录本身,总结就是左开右闭
                                加索基本单位是nklock,
                                如果唯一索引会退化成row-lock,
                                如果是等值的非唯一索引 针对不唯一索引上的等值查询,向右遍历时且最后一个值不满足等值条件的时候 会都会按照正常的GAP LOCK锁定上下区间 
                                如果是不存在记录的等值查询, 不论唯一/不唯一的索引 都会按照正常的GAP LOCK锁定上下区间
                                判断锁定范围的口诀:没有相等的范围值,直接比较辅助索引的锁定范围 有相等的范围值,再进一步进行辅助索引对应的主键进行二次判定
    五 AHI-自适应HASH索引
       目的:能够根据SQL的条件快速的定位到叶子节点的热点数据页.而并非需要通过B+树从root节点定位
       结构: hash表,索引的前缀索引hash值-热点数据页形成k-v对应关系
       构建: 收集  search_info(前缀索引) & block info(成功次数)  符合条件(次数和条数)的成功利用AHI检索的情况才会考虑构建AHI缓存
        应用: SQL语句为唯一性索引(存在多列唯一性索引情况)简单条件查询,并且记录本身并不包含大字段
    与change_buffer刚好相反,一个对应唯一性索引 一个对应非唯一性索引
    六 char varchar
       对于varchar mysql在内存空间申请大小取决于定义的字符数,但是在磁盘占用取决的是数据实际占用的空间.
       对于 char 在内存空间申请和在磁盘占用就取决于定义的字符串,属于固定值的空间
       对于char varchar的索引长度计算方式 是 (3utf8/4mb4)*定义字符+1(如果是null) + 2(varchar需要存储额外信息)
    七 rdb与aof
         rdb  二进制快照文件
                1 bgsave/save 和设置单位时间内keys的变化数量
                2 cow 技术 会fork一个子进程,针对数据页进行跟踪,当数据页发生变化时,才会申请空间进行拷贝副本. 大大节省了内存空间的占用,和父进程共享内存空间用来备份数据页不变的数据.
                3  备份有效期是开始生成rdb的时候,可以理解成一个定时mysqldump增量备份,
                4  恢复优先级是低于aof
         aof   操作日志快照文件
                1 持久化参数设置: 每秒同步,由操作系统同步.每次都同步
                2 会根据持久化的参数设置来缓存命令,再执行相关命令
                3 恢复优先级高于rdb
                4  bgrewriteaof 触发rewrite, rewrite会遍历所有的数据进行记录和优化合并处理,写入临时aof文件中(期间的改变都会进行记录应用到临时aof文件中).最后再覆盖原aof文件,实现aof的重写功能
     八  MHA切换流程
        1 主检测线程进行mysql-master探测 如果三次探测失败 就进行下一步探测
        2 第二检测脚本会从指定的从节点向主发生探测,如果也失败则执行切换任务
        3 切换开始
           1 首先获取所有从节点中最新的master binlog file和postion.然后尝试从原主进行binlog保存,如果能登录服务器的话
           2 选择新的master,并对比最新从节点生成差异relay-log
           3 针对新的master进行差异的relay-log和binlog数据补偿
           4  新的master 绑定VIP 打开读写,对外提供服务
           5  其他从节点进行差异的relay-log和binlog数据补偿
           6  其他从节点change master to 新的master 
    九 MONGO整体同步流程
    1) 全量同步开始,获取同步源上的最新时间戳t1 2) 全量同步集合数据,建立索引(比较耗时) 3) 获取同步源上最新的时间戳t2 4) 重放t1到t2之间所有的oplog 5) 全量同步结束
         简而言之 全量拷贝数据+建立索引的过程中也会重放oplog,之后才是增量同步 
        全量同步数据的时候,会不会源数据的oplog被覆盖了导致全量同步失败?在3.4之后拷贝途中会将oplog缓存到本地进行应用 在3.4之前可能会
     十 mongo的数据备份与恢复
         全量备份方式
          1 LVM快照需要开jonural日志  2 mongodump  3 ECS快照模式(云环境) 4 从节点冷备模式-(加锁,直接拷贝数据目录,解锁)
         数据恢复方式
         1 mongo延时库(参与投票但不参与选举) 2 全备抽取数据(如果有的话) 3 事先做人工备份(常见于线上数据人为发起的变更) 4 采用全量+oplog增量方式 
         备份恢复   
       全量备份还原
       mongodump --port $port --oplog -o $backup_dir
       mongorestore --port $port --oplogReplay --drop $backup_dir
      增加备份还原
       mongordump --port $port -d local -c oplog.rs -o $backup_dir
      mongorestore --port $port --oplogReplay $backup_dir/local/oplog.rs.bson
    十一 mongodb的选举机制

     1 mongodb的每个节点成员都会同其他节点进行周期性的节点检测 如果超过一定的阈值没有反馈,就认为其他节点不可用

        2 当主挂掉后.mongodb的所有从节点会进行选举

           当选成新主的条件

           0 原主已经挂掉

           1 optime必须是所有成员中最新的,也即是数据是最新的

           2  本身具备当选成新主的必备条件 优先级不为0 不属于冲裁节点

           3  收获超过集群所有成员超过一半以上的投票数

        3 当选择新主后 其他从节点会指向新主

        4 mongodb是类raft协议 但是不是raft协议

     十二  mongodb的磁盘空间

           3.2之前是repairdatabase 全局锁  3.2 是DB锁级别的compact,针对DB级别不能读写

    十三  WT引擎对比MMAP引擎的优势  

        1 能够有效的控制内存占用

        2 更细粒度的锁 基于collection 级别

        3  能够进行数据和索引压缩,减少磁盘占用,但是会消耗cpu

        4  能够进行DB级别的磁盘回收而不是阻塞全局repairdatabase

        5  针对多核cpu有更好的发挥表现,能提升性能

           

     

  • 相关阅读:
    获取ios设备的当前IP地址
    swift 日期的基本操作
    iOS ChildViewController使用示例
    Swift 进制转换问题
    objc_msgSend iOS8 EXC_BAD_ACCESS
    objc非主流代码技巧
    黑魔法__attribute__((cleanup))
    判断一个对象是否实现了某方法,而非继承而来
    Controlling How NSThread and NSRunLoop Exit
    万年历-农历-节气
  • 原文地址:https://www.cnblogs.com/danhuangpai/p/14845498.html
Copyright © 2020-2023  润新知