热门标签 | HotTags
当前位置:  开发笔记 > 后端 > 正文

浅析MySQL二进制日志

浅析MySQL二进制日志一般情况下,二进制日志更多的用于数据库的同步,因为二进制日志记录了数据库的所有改变,可以使得SLAVE都可以执行同样的更新,其实二进制日志可以对数据库作一个写入回放,所以也可以用于统...SyntaxHighlighter.all();

浅析MySQL二进制日志
 
一般情况下,二进制日志更多的用于数据库的同步,因为二进制日志记录了数据库的所有改变,可以使得SLAVE都可以执行同样的更新,其实二进制日志可以对数据库作一个写入回放,所以也可以用于统计或者即时恢复等其它的目的。
 
二进制日志仅仅包含可能改变数据库的语句,估计都很容易理解这个,但是那些还没有改变且有可能改变数据库的语句也会记录下来,比如drop table if exists或者是带有WHERE条件的UPDATE和DELETE语句。
  www.2cto.com  
一,二进制日志结构
 
二进制日志是一系列二进制日志事件(又称为binlog事件),其实就是很多文件【包括系列日志文件和一个日志索引文件】共同组成二进制日志,这里每个日志文件称为binlog文件,每个日志文件由很多个日志事件组成,每个日志文件都是以Format_description事件开头并且以日志轮换事件Rotate作为文件结束,如:
 
[sql] 
  mysql> show binlog events in 'master-bin.000003';  
+-------------------+-----+-------------+-----------+-------------+---------------------------------------+  
| Log_name          | Pos | Event_type  | Server_id | End_log_pos | Info                                  |  
+-------------------+-----+-------------+-----------+-------------+---------------------------------------+  
| master-bin.000003 |   4 | Format_desc |         1 |         106 | Server ver: 5.1.34-log, Binlog ver: 4 |   
| master-bin.000003 | 106 | Rotate      |         1 |         150 | master-bin.000004;pos=4               |   
+-------------------+-----+-------------+-----------+-------------+---------------------------------------+  
2 rows in set (0.00 sec)  
  www.2cto.com  
Format_description事件包含写日志文件的服务器信息以及日志文件格式,而Rotate事件包含下一个日志文件的文件名及其开始读取的位置。
除了这两个事件以外,日志文件中的其他事件都被分成一个组一个组的形式,在事务存储引擎中,每个组会对应一个事务,而其它有可能是一个语句,总之,日志文件中的事件要么是单个语句,要么是由多条语句组成的事务。
 
事件类型是有很多种,就是上面的Event_type在实际使用时,会有多个取值,但可以归纳为每个日志事件由三个部分组成:
 
通用头。这部分信息就是所有事件都具备的信息,包含一些基本的信息,比如事件类型以及事件的大小,以上面为例可以从Pos和End_log_pos计算出这条语句的大小。
提交头。这部分信息和特定的事件类型有关。
事件体。这部分信息存储事件的主要数据,因事件类型不同而不同,例如,事件是Query的时候,存储查询语句。如下:
 
[sql] 
| master-bin.000004 | 180 | Query       |         1 |         297 | use `db_info`; insert into i_node(name,value) values("sql",@value)         
  www.2cto.com  
二,记录语句
 
传统的MySQL采用基于语句的复制,将实际执行的语句及某些和执行相关的信息一起写入二进制日志,然后在从库上重新执行这些语句。由于二进制日志是多个线程往里写入数据,避免两个线程同时更新对于同步来说是很重要的,为此,在事件写入二进制日志之前,需要获得一个互斥锁,然后在事件写完后释放该锁。下面讨论一下哪些数据会被写入二进制日志
 
2.1 数据操作语言
 
这通常就是DELETE,INSERT,UPDATE语句。在执行这些语句时,通常是执行语句拥有写锁期间写二进制日志,然后在日志写操作完成之后释放锁,这样保证二进制日志和语句导致的更新信息是一致的。
 
2.2 数据定义语言
如一些CREATE TABLE 和ALTER TABLE之类的语句。
 
2.3 查询语句
查询语句的类型是Query事件,这也是最常见的事件,用来存储主库上执行的语句,其实除了实际执行的语句外,这个事件还要包含一些附加的信息。如在写入一行数据中含有AUTO_INCREMENT的字段,我们执行一下写入,然后可以看到日志事件中多了哪些事件:
执行下面语句:
[sql] 
insert into i_node(name,value) values("sql","copy");  
可以得到多了两条日志事件  www.2cto.com  
[sql] 
| master-bin.000004 | 451 | Intvar      |         1 |         479 | INSERT_ID=12                                                                |   
| master-bin.000004 | 479 | Query       |         1 |         596 | use `db_info`; insert into i_node(name,value) values("sql","copy")          |   
+-------------------+-----+-------------+-----------+-------------+-----------------------------------------------------------------------------+  
其实除此以外,还有其它的一些上下文信息会给当前的执行带来结果的影响,这些都是MySQL执行时需要知道的隐式信息。如:
当前数据库。可以看到我执行insert时,并没有执行use db_info这条语句,但是也被日志事件记录下来。因为我在最初执行了,后面MYSQL都采用当前的数据库来执行语句。
用户自定义变量的值。如我执行下面两条语句之后
 
[sql] 
mysql> set @value = 'copy-on-write';  
Query OK, 0 rows affected (0.00 sec)  
  
mysql> insert into i_node(name,value) values("sql",@value);  
Query OK, 1 row affected (0.00 sec)  
 
可以看到此时的日志事件如下:
[sql] 
| master-bin.000004 | 596 | Intvar      |         1 |         624 | INSERT_ID=13                                                                |   
| master-bin.000004 | 624 | User var    |         1 |         675 | @`value`=_latin1 0x636F70792D6F6E2D7772697465 COLLATE latin1_swedish_ci     |   
| master-bin.000004 | 675 | Query       |         1 |         792 | use `db_info`; insert into i_node(name,value) values("sql",@value)          |   
多了一个变量的赋值操作,类型是User var  www.2cto.com  
 
RAND()函数的种子。在执行随机数时,不会记录其随机数,会记录其种子数。
当前时间。
AUTO_INCREMENT字段的插入值,这个是一个上下文,因为它与前面的行有关。
LAST_INSERT_ID函数。
线程ID,调用CORRENT_ID函数。

推荐阅读
  • PHP中Smarty模板引擎自定义函数详解
    本文详细介绍了如何在PHP的Smarty模板引擎中自定义函数,并通过具体示例演示了这些函数的使用方法和应用场景。适合PHP后端开发者学习。 ... [详细]
  • 本文探讨了如何在PHP与MySQL环境中实现高效的分页查询,包括基本的分页实现、性能优化技巧以及高级的分页策略。 ... [详细]
  • 软件测试行业深度解析:迈向高薪的必经之路
    本文深入探讨了软件测试行业的发展现状及未来趋势,旨在帮助有志于在该领域取得高薪的技术人员明确职业方向和发展路径。 ... [详细]
  • MVC模式下的电子取证技术初探
    本文探讨了在MVC(模型-视图-控制器)架构下进行电子取证的技术方法,通过实际案例分析,提供了详细的取证步骤和技术要点。 ... [详细]
  • 本文探讨了使用Python实现监控信息收集的方法,涵盖从基础的日志记录到复杂的系统运维解决方案,旨在帮助开发者和运维人员提升工作效率。 ... [详细]
  • 【MySQL】frm文件解析
    官网说明:http:dev.mysql.comdocinternalsenfrm-file-format.htmlfrm是MySQL表结构定义文件,通常frm文件是不会损坏的,但是如果 ... [详细]
  • 本文介绍了MySQL窗口函数的基本概念、应用场景及常见函数的使用方法。窗口函数在处理复杂查询时非常有用,例如计算每个用户的订单排名、环比增长率、以及动态聚合等。 ... [详细]
  • 本文回顾了作者在求职阿里和腾讯实习生过程中,从最初的迷茫到最后成功获得Offer的心路历程。文中不仅分享了个人的面试经历,还提供了宝贵的面试准备建议和技巧。 ... [详细]
  • 本文详细解析了MySQL中常见的几种错误,并提供了具体的解决方法,帮助开发者快速定位和解决问题。 ... [详细]
  • 搭建个人博客:WordPress安装详解
    计划建立个人博客来分享生活与工作的见解和经验,选择WordPress是因为它专为博客设计,功能强大且易于使用。 ... [详细]
  • 七大策略降低云上MySQL成本
    在全球经济放缓和通胀压力下,降低云环境中MySQL数据库的运行成本成为企业关注的重点。本文提供了一系列实用技巧,旨在帮助企业有效控制成本,同时保持高效运作。 ... [详细]
  • 本文介绍了如何通过安装 sqlacodegen 和 pymysql 来根据现有的 MySQL 数据库自动生成 ORM 的模型文件(model.py)。此方法适用于需要快速搭建项目模型层的情况。 ... [详细]
  • H5技术实现经典游戏《贪吃蛇》
    本文将分享一个使用HTML5技术实现的经典小游戏——《贪吃蛇》。通过H5技术,我们将探讨如何构建这款游戏的两种主要玩法:积分闯关和无尽模式。 ... [详细]
  • 本文详细介绍了Oracle 11g中的创建表空间的方法,以及如何设置客户端和服务端的基本配置,包括用户管理、环境变量配置等。 ... [详细]
  • Maven + Spring + MyBatis + MySQL 环境搭建与实例解析
    本文详细介绍如何使用MySQL数据库进行环境搭建,包括创建数据库表并插入示例数据。随后,逐步指导如何配置Maven项目,整合Spring框架与MyBatis,实现高效的数据访问。 ... [详细]
author-avatar
认识你不笑嘻嘻
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有