登录
首页 >  数据库 >  MySQL

MySQL binlog 设计

来源:SegmentFault

时间:2023-02-24 18:43:33 186浏览 收藏

来到golang学习网的大家,相信都是编程学习爱好者,希望在这里学习数据库相关编程知识。下面本篇文章就来带大家聊聊《MySQL binlog 设计》,介绍一下MySQL,希望对大家的知识积累有所帮助,助力实战开发!

通过这篇文章你能了解到的知识

  • binlog.000001
    binlog.000002
    binlog.000003
    binlog.000004
    binlog.000005
    binlog.000006
    binlog.index 

    每个日志文件以一个 4 字节魔数 ( 0xfe b i n) 开头,后面是一组描述数据修改的事件,文件格式如下:

    +===================+
    | Magic Number        |
    +===================+
    | Start Event        |
    +===================+
    | Event 1            |
    +===================+
    | ...                |
    +===================+

    一个具体的例子:

     show BINLOG EVENTS in 'binlog.000001'
    +---------------+---------+----------------+-----------+-------------+-------------------------------------------------------------------+
    | Log_name      | Pos     | Event_type     | Server_id | End_log_pos | Info                                                              |
    +---------------+---------+----------------+-----------+-------------+-------------------------------------------------------------------+
    | binlog.000001 | 4       | Format_desc    | 1         | 125         | Server ver: 8.0.26, Binlog ver: 4                                 |
    | binlog.000001 | 125     | Previous_gtids | 1         | 156         |                                                                   |
    | binlog.000001 | 156     | Anonymous_Gtid | 1         | 233         | SET @@SESSION.GTID_NEXT= 'ANONYMOUS'                              |
    | binlog.000001 | 233     | Query          | 1         | 337         | use `mysql`; TRUNCATE TABLE time_zone /* xid=3 */                 |
    | binlog.000001 | 337     | Anonymous_Gtid | 1         | 414         | SET @@SESSION.GTID_NEXT= 'ANONYMOUS'                              |
    | binlog.000001 | 414     | Query          | 1         | 523         | use `mysql`; TRUNCATE TABLE time_zone_name /* xid=4 */            |

    事件 Event 常见分类

    • +===================+
      | event header      |
      +===================+
      | event data        |
      +===================+

      以下是 Event 的具体结构以及各版本之间的差异

      其中数字代表着这个字段在 Event 中的 limit 与 offset, 例如 0:4,代表着在这个字段的位置在 Event 的 0-4 个字节。

      +=====================================+
      | event  | timestamp         0 : 4    |
      | header +----------------------------+
      |        | type_code         4 : 1    |
      |        +----------------------------+
      |        | server_id         5 : 4    |
      |        +----------------------------+
      |        | event_length      9 : 4    | v1 header 共 13 个字节
      |        +----------------------------+
      |        | next_position    13 : 4    | v3 版本增加。
      |        +----------------------------+
      |        | flags            17 : 2    | v3 版本增加。 v3 header 共 19 个字节
      |        +----------------------------+
      |        | extra_headers    19 : x-19 | v4 版本增加。 v4 header 最少 19 个字节
      +=====================================+
      | event  | fixed part        x : y    |
      | data   +----------------------------+
      |        | variable part              |
      +=====================================+

      header 部分各字段解释

      • +======================================+
        | fixed   | issue_thread      0 : 4    | 触发该语句的线程id
        | part    +----------------------------+
        |         | timestamp         4 : 4    | 语句执行的时间
        |         +----------------------------+
        |         | db_name_len       8 : 1    | 使用数据库名长度
        |         +----------------------------+
        |         | error_code        9 : 2    | 错误码
        +======================================+
        | variable| db_name                    | db name
        | part    +----------------------------+
        |         | sql_statment               | sql 语句
        +======================================+

        总结

        • binlog
          文件由魔数与事件列表构成,事件列表分成三部分:开始事件 + 数据更新相关的事件 + 切换事件
        • 事件的类型决定了事件的格式,因为每种事件所需的信息是不一致的

        常见问题

        1. 主从复制,采取的是 push 模式还是 pull 模式
        2. MySQL binlog 为什么不默认使用 Mixed 模式
        3. 在使用
          RBL
          前提下 ,DDL(CREATE/ALTER) 语句怎么记录
        4. 使用
          NOW()
          的语句是不安全么(
          SBL
          主从复制 )
        5. 如果让你来设计开始事件类型的结构,data 部分需要什么数据
        6. binlog
          redo log
          区别

        参考

        1. https://dev.mysql.com/doc/int...
        2. http://mysql.taobao.org/month...
        3. https://zhuanlan.zhihu.com/p/...

        今天关于《MySQL binlog 设计》的内容就介绍到这里了,是不是学起来一目了然!想要了解更多关于mysql的内容请关注golang学习网公众号!

声明:本文转载于:SegmentFault 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>
评论列表