热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

开发笔记:MySQL——binlog

篇首语:本文由编程笔记#小编为大家整理,主要介绍了MySQL——binlog相关的知识,希望对你有一定的参考价值。一、binlog简介:

篇首语:本文由编程笔记#小编为大家整理,主要介绍了MySQL——binlog相关的知识,希望对你有一定的参考价值。


一、binlog简介:


1、什么是binlog:

   binlog日志用于记录所有更新了数据或者已经潜在更新了数据(例如,没有匹配任何行的一个DELETE)的所有语句。语句以“事件”的形式保存,它描述数据更改。


2、binlog的记录格式:

mysql binlog日志有三种格式,分别为:Statement ,MiXED ,和ROW;

  (在MySQL5.7.7版本之后,把binlog_format的默认值修改成了ROW。master将修改表的event写入binlog中,并且master将binlog信息发送到slave,slave重放binlog中event。基于ROW格式复制是最安全的复制,slave需要的行锁更少;但是也有一些缺点,那就是基于ROW格式的复制,binlog会记录更多的数据。并且无法在slave上看到从master上获取的语句,因为都是event。但是在ROW格式下,可以开启binlog_rows_query_log_events参数,这会让binlog在记录events同时,也记录原始的sql语句,以方便后续的查询;)


①:Statement:每一条会修改数据的sql都会记录在binlog中。


优点:不需要记录每一行的变化,减少了binlog日志量,节约了IO,提高性能。(相比row能节约多少性能与日志量,这个取决于应用的SQL情况,正常同一条记录修改或者插入row格式所产生的日志量还小于Statement产生的日志量,但是考虑到如果带条件的update操作,以及整表删除,alter表等操作,ROW格式会产生大量日志,因此在考虑是否使用ROW格式日志时应该跟据应用的实际情况,其所产生的日志量会增加多少,以及带来的IO性能问题。)


缺点:由于记录的只是执行语句,为了这些语句能在slave上正确运行,因此还必须记录每条语句在执行的时候的一些相关信息,以保证所有语句能在slave得到和在master端执行时候相同 的结果。另外mysql 的复制,像一些特定函数功能,slave可与master上要保持一致会有很多相关问题(如sleep()函数, last_insert_id(),以及user-defined functions(udf)会出现问题).


使用以下函数的语句也无法被复制:

* LOAD_FILE()

* UUID()

* USER()

* FOUND_ROWS()

* SYSDATE() (除非启动时启用了 --sysdate-is-now 选项)


------同时在INSERT ...SELECT 会产生比 RBR 更多的行级锁


②:Row: 不记录sql语句上下文相关信息,仅保存哪条记录被修改。


优点: binlog中可以不记录执行的sql语句的上下文相关的信息,仅需要记录那一条记录被修改成什么了。所以row level的日志内容会非常清楚的记录下每一行数据修改的细节。而且不会出现某些特定情况下的存储过程,或function,以及trigger的调用和触发无法被正确复制的问题


缺点: 所有的执行的语句当记录到日志中的时候,都将以每行记录的修改来记录,这样可能会产生大量的日志内容,比如一条update语句,修改多条记录,则binlog中每一条修改都会有记录,这样造成binlog日志量会很大,特别是当执行alter table之类的语句的时候,由于表结构修改,每条记录都发生改变,那么该表每一条记录都会记录到日志中。


③:Mixedlevel: 是以上两种level的混合使用,

  一般的语句修改使用statment格式保存binlog,如一些函数,statement无法完成主从复制的操作,则采用row格式保存binlog,MySQL会根据执行的每一条具体的sql语句来区分对待记录的日志形式,也就是在Statement和Row之间选择一种.新版本的MySQL中队row level模式也被做了优化,并不是所有的修改都会以row level来记录,像遇到表结构变更的时候就会以statement模式来记录。至于update或者delete等修改数据的语句,还是会记录所有行的变更。



二、Binlog基本配制与格式设定


1、基本配制


Mysql BInlog日志格式可以通过mysql的my.cnf文件的属性binlog_format指定。如以下:

binlog_format = ROW             ---binlog日志格式
log_bin =/mysql/mysql-bin.log        ---binlog日志名
expire_logs_days = 7            ---binlog过期清理时间
max_binlog_size 100m            ---binlog每个日志文件大小

2.Binlog日志格式选择


Mysql默认是使用Statement日志格式,推荐使用ROW.


  由于一些特殊使用,可以考虑使用ROWED,如自己通过binlog日志来同步数据的修改,这样会节省很多相关操作。对于binlog数据处理会变得非常轻松,相对mixed,解析也会很轻松(当然前提是增加的日志量所带来的IO开销在容忍的范围内即可)。


3.mysqlbinlog格式选择


mysql对于日志格式的选定原则:如果是采用 INSERT,UPDATE,DELETE 等直接操作表的情况,则日志格式根据 binlog_format 的设定而记录,如果是采用 GRANT,REVOKE,SET PASSWORD 等管理语句来做的话,那么无论如何 都采用 SBR 模式记录。



三、binlog的相关参数:

--log_bin:
设置此参数表示启用binlog功能,并指定路径名称
--log_bin_index
设置此参数是指定二进制索引文件的路径与名称
--binlog_do_db
此参数表示只记录指定数据库的二进制日志
--binlog_ignore_db
此参数表示不记录指定的数据库的二进制日志
--max_binlog_cache_size
此参数表示binlog使用的内存最大的尺寸
--binlog_cache_size
此参数表示binlog使用的内存大小,可以通过状态变量binlog_cache_use和binlog_cache_disk_use来帮助测试。
    binlog_cache_use:使用二进制日志缓存的事务数量
    binlog_cache_disk_use:使用二进制日志缓存但超过binlog_cache_size值并使用临时文件来保存事务中的语句的事务数量
--max_binlog_size
Binlog最大值,最大和默认值是1GB,该设置并不能严格控制Binlog的大小,尤其是Binlog比较靠近最大值而又遇到一个比较大事务时,为了保证事务的完整性,不可能做切换日志的动作,只能将该事务的所有SQL都记录进当前日志,直到事务结束
--sync_binlog
这个参数直接影响mysql的性能和完整性
--sync_binlog=0:
当事务提交后,Mysql仅仅是将binlog_cache中的数据写入Binlog文件,但不执行fsync之类的磁盘        同步指令通知文件系统将缓存刷新到磁盘,而让Filesystem自行决定什么时候来做同步,这个是性能最好的。
--sync_binlog=n,在进行n次事务提交以后,Mysql将执行一次fsync之类的磁盘同步指令,同志文件系统将Binlog文件缓存刷新到磁盘。
注意:Mysql中默认的设置是sync_binlog=0,即不作任何强制性的磁盘刷新指令,这时性能是最好的,但风险也是最大的。一旦系统绷Crash,在文件系统缓存中的所有Binlog信息都会丢失


四、binlog的删除:

  binlog的删除可以手工删除或自动删除


1、自动删除binlog

通过binlog参数(expire_logs_days )来实现mysql自动删除binlog
mysql> show binary logs;
mysql> show variables like ‘expire_logs_days‘;
mysql> set global expire_logs_days=3;


2、手工删除binlog

mysql> reset master;       ----删除master的binlog
mysql> reset slave;        ----删除slave的中继日志
mysql> purge master logs before ‘2017-03-30 17:20:00‘;   -----删除指定日期以前的日志索引中binlog日志文件
mysql> purge master logs to ‘binlog.000002‘;     ----删除指定日志文件的日志索引中binlog日志文件或者直接用操作系统命令直接删除
mysql> set sql_log_bin=1/0;    ----如果用户有super权限,可以启用或禁用当前会话的binlog记录
mysql> show master logs;     ---查看master的binlog日志 
mysql> show binary logs;     ---查看master的binlog日志
mysql> show master status;   ---用于提供master二进制日志文件的状态信息
mysql> show slave hosts;     ---显示当前注册的slave的列表。不以--report-host=slave_name选项为开头的slave不会显示在本列表中


3、binglog的查看

通过mysqlbinlog命令可以查看binlog的内容

[[email protected] ~]# mysqlbinlog  /home/mysql/binlog/binlog.000003  | more
/*!40019 SET @@session.max_insert_delayed_threads=0*/;
/*!50003 SET @[email protected]@COMPLETION_TYPE,COMPLETION_TYPE=0*/;
DELIMITER /*!*/;
# at 4
#120330 16:51:46 server id 1  end_log_pos 98    Start: binlog v 4, server v 5.0.45-log created 120330 1
6:51:46
# Warning: this binlog was not closed properly. Most probably mysqld crashed writing it.
# at 196
#120330 17:54:15 server id 1  end_log_pos 294   Query   thread_id=3     exec_time=2     error_code=0
SET TIMESTAMP=1333101255/*!*/;
insert into tt7 select * from tt7/*!*/;
# at 294
#120330 17:54:46 server id 1  end_log_pos 388   Query   thread_id=3     exec_time=28    error_code=0
SET TIMESTAMP=1333101286/*!*/;
alter table tt7 engine=innodb/*!*/;


3.1、解析binlog格式


--位置

位于文件中的位置,“at 196”说明“事件”的起点,是以第196字节开始;“end_log_pos 294”说明以第294字节结束


--时间戳

事件发生的时间戳:“120330 17:54:46”


--事件执行时间

事件执行花费的时间:"exec_time=28"


--错误码

错误码为:“error_code=0”


--服务器的标识

服务器的标识id:“server id 1”



注意:

1、binlog事件中的时间戳是从语句那里继承过来的,一条语句产生多个事件,那这些事件的时间戳都是一样的,而且都是和第一个事件一致的;

2、有时候我们会在binlog中发现执行语句和提交时间不一致的情况,是因为有些事务是自动提交的,在这个事务中只有一条语句执行了一定的时间;


innodb中rowid对binlog的影响:

1、在galera cluster上面最好不要让一个事务更新太多的数据,可以适当控制在1万行以内,都是么有问题的,因为galera cluster的验证和提交都是串行    的,一个事务太大,会导致集群其他事务都等待这个事务完成造成集群假死现象;

2、在innodb中如果没有指定主键,就会创建一个rowid,但是MySQL的binlog是server层,而innodb中的rowid是存储引擎的东西,server层根本感知不到      rowid的存在;

3、rowid是innodb自己定义的一个列,只有在表中没有定义主键的时候,系统才会给这个表加上这一列,但这一列只是为了存储,构成一个聚簇索引,但不    会暴露给逻辑层,并且上层也用不到它,所以直接忽略它即可;

4、在MySQL数据库的使用中,一定要定义主键,如果没有主键,并且是row模式的复制,就必然会造成这样的问题,而不像其他数据库一样,如果没有主键,    还可以使用rowid来操作表;

5、在galera cluster中,更要定义主键。如果没有定义,必然会造成故障,这不是galera cluster的问题,只是它会把这个问题放大而已;


本文出自 “笨小孩的dba之路” 博客,请务必保留此出处http://fengfeng688.blog.51cto.com/4896812/1951160


推荐阅读
  • MySQL 8.0 中的二进制日志格式详细解析及其官方文档参考。本文介绍了MySQL服务器如何使用不同的日志记录格式来记录二进制日志,包括早期版本中基于SQL语句的复制机制(即基于语句的日志记录)。此外,还探讨了其他日志记录方式,如基于行的日志记录和混合日志记录模式,并提供了配置和管理这些日志格式的最佳实践。 ... [详细]
  • 在安装并配置了Elasticsearch后,我在尝试通过GET /_nodes请求获取节点信息时遇到了问题,收到了错误消息。为了确保请求的正确性和安全性,我需要进一步排查配置和网络设置,以确保Elasticsearch集群能够正常响应。此外,还需要检查安全设置,如防火墙规则和认证机制,以防止未经授权的访问。 ... [详细]
  • 针对MySQL Undo空间满载及Oracle Undo表空间溢出的问题,本文详细探讨了其原因与解决策略。首先,通过启动SQL*Plus并以SYS用户身份登录数据库,查询当前数据库的UNDO表空间名称,确认当前状态。接着,分析导致Undo空间满载的常见原因,如长时间运行的事务、频繁的更新操作等,并提出相应的解决方案,包括调整Undo表空间大小、优化事务管理、定期清理历史数据等。最后,结合实际案例,提供具体的实施步骤和注意事项,帮助DBA有效应对这些问题。 ... [详细]
  • 深入解析C#中app.config文件的配置与修改方法
    在C#开发过程中,经常需要对系统的配置文件进行读写操作,如系统初始化参数的修改或运行时参数的更新。本文将详细介绍如何在C#中正确配置和修改app.config文件,包括其结构、常见用法以及最佳实践。此外,还将探讨exe.config文件的生成机制及其在不同环境下的应用,帮助开发者更好地管理和维护应用程序的配置信息。 ... [详细]
  • C++ 开发实战:实用技巧与经验分享
    C++ 开发实战:实用技巧与经验分享 ... [详细]
  • Objective-C 中的委托模式详解与应用 ... [详细]
  • 在Java分层设计模式中,典型的三层架构(3-tier application)将业务应用细分为表现层(UI)、业务逻辑层(BLL)和数据访问层(DAL)。这种分层结构不仅有助于提高代码的可维护性和可扩展性,还能有效分离关注点,使各层职责更加明确。通过合理的设计和实现,三层架构能够显著提升系统的整体性能和稳定性。 ... [详细]
  • 作为软件工程专业的学生,我深知课堂上教师讲解速度之快,很多时候需要课后自行消化和巩固。因此,撰写这篇Java Web开发入门教程,旨在帮助初学者更好地理解和掌握基础知识。通过详细记录学习过程,希望能为更多像我一样在基础方面还有待提升的学员提供有益的参考。 ... [详细]
  • 本文详细探讨了MySQL数据库实例化参数的优化方法及其在实例查询中的应用。通过具体的源代码示例,介绍了如何高效地配置和查询MySQL实例,为开发者提供了有价值的参考和实践指导。 ... [详细]
  • 2018年9月21日,Destoon官方发布了安全更新,修复了一个由用户“索马里的海贼”报告的前端GETShell漏洞。该漏洞存在于20180827版本的某CMS中,攻击者可以通过构造特定的HTTP请求,利用该漏洞在服务器上执行任意代码,从而获得对系统的控制权。此次更新建议所有用户尽快升级至最新版本,以确保系统的安全性。 ... [详细]
  • 本文详细介绍了如何安全地手动卸载Exchange Server 2003,以确保系统的稳定性和数据的完整性。根据微软官方支持文档(https://support.microsoft.com/kb833396/zh-cn),在进行卸载操作前,需要特别注意备份重要数据,并遵循一系列严格的步骤,以避免对现有网络环境造成不利影响。此外,文章还提供了详细的故障排除指南,帮助管理员在遇到问题时能够迅速解决,确保整个卸载过程顺利进行。 ... [详细]
  • 蜘蛛表格:全面解析与应用指南
    蜘蛛表格:全面解析与应用指南 ... [详细]
  • 本文介绍了一种利用Dom4j库和JFileChooser组件在Java中实现XML文件自定义路径导出的方法。通过创建一个Document对象并设置根元素,结合JFileChooser选择目标路径,实现了灵活的XML文件导出功能。具体步骤包括初始化Document对象、构建XML结构以及使用JFileChooser选择保存路径,确保用户能够方便地将生成的XML文件保存到指定位置。 ... [详细]
  • 2019年后蚂蚁集团与拼多多面试经验详述与深度剖析
    2019年后蚂蚁集团与拼多多面试经验详述与深度剖析 ... [详细]
  • 通过命令行工具 `virt-install` 配置和安装虚拟机环境。`virt-install` 是一个基于 `libvirt` 虚拟化管理库的命令行工具,用于创建新的虚拟机实例。该工具支持通过串行控制台和 SDL 图形界面进行虚拟机的安装和管理,适用于多种操作系统和虚拟化平台。 ... [详细]
author-avatar
kuaike的诱惑
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有