美文网首页
07-存储引擎-02

07-存储引擎-02

作者: UncleZ_strive | 来源:发表于2019-12-26 19:25 被阅读0次

    1. 物理存储结构

    1.表空间

    • 支持两类表空间: 共享,独立
    5.5 版本 :  默认共享表空间.    包含: 数据字典\undo\tmp\用户表数据和索引
    5.6 版本 :  默认独立表空间.    包含: 数据字典\undo\tmp,将用户数据和索引独立,每个表单独存储
    5.7 版本 :  默认独立表空间.    包含: 数据字典\undo,tmp独立,将用户数据和索引独立,每个表单独存储
    8.0 版本 :  默认独立表空间.    数据字典取消掉, undo,tmp独立  将用户数据和索引独立,每个表单独存储
    
    • 功能名词介绍
    transaction           事务
    undo  : ibdata1       回滚日志
    tmp   : ibtmp1        临时表空间 
    redo  : ib_logfile0~N 重做日志
    ibd   : t1.ibd        表空间数据文件
    
    Innodb Buffer Pool    数据缓冲区池(70-80%)
    log buffer            重做日志缓冲区
    LSN                   日志序列号  
    Trx_id                事务ID
    checkpoint            检查点  
    
    • 事务 ?

    1.什么是事务?
    将多条DML(标准的事务语句),放在一个"组"中运行,要么全成功要么全失败.

    • 交易?
      以物换物
      货币换物
      虚拟币换物
      虚拟币虚拟物
    • 事务ACID特性atomicity, consistency, isolation, and durability.
    A   : 原子性   : 每一个事务都是一个完整整体,不可再分性 . 要么全执行成功要么全失败.
    C   : 一致性   : 在事务前,中,后,保证事务操作的数据前后一致.
    I   : 隔离性   : 多个事务之间,所做事务互不干扰,不能同时更新同一行数据.
    D   : 持久性   : 事务完成之后,所涉及到的数据,必须永久有效(落地)
    

    2.事务的生命周期管理
    标准的事务生命周期:
    (1) 开启一个事务
    begin / start transaction;
    (2) 标准的事务语句
    insert
    update
    delete
    (3) 结束事务
    commit; # 提交事务
    rollback; # 回滚事务

    3.非标准的事务生命周期

    (1) 自动提交机制
    MySQL 5.6 以后:

    1. begin子句会自动添加
    2. 每一条执行完成之后都会自动提交
    mysql> select @@autocommit;
    +--------------+
    | @@autocommit |
    +--------------+
    |            1 |
    +--------------+
    
    [root@db01 data_3306]# vim /etc/my.cnf 
    autocommit=0
    [root@db01 data_3306]# /etc/init.d/mysqld restart
    

    说明: 默认情况下,开启事务时不加begin,逐条自动提交. 手工开启begin命令,按照正常事务工作过程.

    (2) 隐式提交
    1.用于隐式提交的 SQL 语句:

    begin 
    a
    b
    begin
    SET AUTOCOMMIT = 1
    

    2.导致提交的非事务语句:

    DDL语句: (ALTER、CREATE 和 DROP)
    DCL语句: (GRANT、REVOKE 和 SET PASSWORD)
    锁定语句:(LOCK TABLES 和 UNLOCK TABLES)
    

    3.导致隐式提交的语句示例:

    TRUNCATE TABLE
    LOAD DATA INFILE
    SELECT FOR UPDATE
    

    (3) 隐式回滚

    会话断开
    数据库重启
    死锁 
    

    4.事务底层的工作过程
    (1) redo

    • 分布:
      内存: log buffer
      磁盘: ib_logfile0~N
    • 功能:
      1.保存内存数据页的变化
      2.commit时, 实现事务的快速持久化的特性: 量少,顺序IO
      3.宕机时,通过redo实现重做事务,将数据库恢复到宕机之前的状态.
      我们由把这步称之为 ACSR 中的"前滚"操作
      (2) undo 回滚日志
    • 分布: 默认 ibdata1, 5.7开始可以独立undo,8.0后自动独立
    • 功能 :
      1.保存当前事务操作的反操作
      2.在执行rollback命令时,undo提供回滚操作,在ACID中主要实现A的特性,CI也有部分功能
      3.宕机时,ACSR过程中提供回滚操作(将没有commit标记的)

    5.锁(写) 及 隔离级别(读)主要保证隔离性

    • 锁 :
      S : 共享锁,读锁
      X : 排它锁,写锁
      IS : 意向S
      IX : 意向X

    • X 锁的细分
      TX ------> 表锁 DDL
      全局锁表:
      备份时,备份系统表时(非INOODB表),FTWRL
      mysql> flush table with read lock;
      mysql> unlock tables;

    单表: DDL
    mysql> lock table t1 read ;
    mysql> unlock tables; 
    
    RX       ------> 记录锁 DML
    GAP  LOCK X     ------> 间隙锁 特殊DML
    Next LOCK X     ------> 下一键锁定
    
    • 隔离级别(transaction_isolation)
      mysql> select @@transaction_isolation;
      RU :读未提交 READ-UNCOMMITTED
      (1).模拟:
    session  A  
    mysql> begin;
    mysql> use world
    mysql> delete from city where id=1000;
    
    session  B 
    mysql> begin;
    mysql> use world
    mysql> select *from city where id=1000;
    

    (2).会产生的问题:

        1. 脏读
        2. 不可重复读现象
        3. 幻读
    

    RC :读已提交 ***** READ-COMMITTED
    1. 不可重复读现象
    2. 幻读

    RR :可重复读 ***** REPEATABLE-READ
    1. 幻读
    说明:

    1. RR级别+ GAP+ Next lock(GAP+RX)有效防止幻读现象
    2. 通过MVCC,多版本并发控制中,一致性快照读技术,解决了不可重复读问题.
      SR :串行化

    总结:
    AID 都是为了数据库最终一致性 C
    SQL_MODE
    约束

    自己扩展:
    MDL 原数据锁
    page lock 页锁
    latch 内存页锁

    2. InnoDB 存储引擎核心参数

    mysql> select @@innodb_data_file_path;   共享表空间的大小
    mysql> select @@innodb_file_per_table;    
    mysql> select @@innodb_buffer_pool_size;    默认128M,不要超过80%物理内存,否则会产生oom故障
    mysql> select @@innodb_log_buffer_size;     默认16M,日志缓存区的大小
    mysql> select @@innodb_log_file_size;       默认48M,日志文件大小
    mysql> select @@innodb_log_file_in_group;  
    mysql> select @@innodb_flush_log_at_trx_commit; # 双1标准之一.控制
    
    • redo刷写的策略.
      0 每秒钟刷写redo到磁盘.
      1 每次事务提交,理解刷写redo到磁盘
      2 每次事务提交,立即写日志到OS cache中,然后每秒钟刷写到磁盘.

    mysql> select @@innodb_flush_method; 控制(buffer脏页,redo buffer日志)刷写方式
    建议设置:
    O_DIRECT : 数据页刷写磁盘直接穿过文件系统缓存,redo 刷写时,先写

    相关文章

      网友评论

          本文标题:07-存储引擎-02

          本文链接:https://www.haomeiwen.com/subject/tqchoctx.html