首页 > 数据库 > MySQL > 正文

MySQL的binlog redo log和undo log怎么利用

2024-07-24 12:33:39
字体:
来源:转载
供稿:网友
  这篇文章主要介绍“MySQL的binlog、redo log和undo log怎么使用”,在日常操作中,相信很多人在MySQL的binlog、redo log和undo log怎么使用问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”MySQL的binlog、redo log和undo log怎么使用”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!
 
  1、binlog
  binlog用于记录数据库执行的写入性操作(不包括查询)信息,以二进制的形式保存在磁盘中。binlog是mysql的逻辑日志,并且由Server层进行记录,使用任何存储引擎的mysql数据库都会记录binlog日志。
  
  当从节点连接主节点时,主节点会创建一个log dump 线程,用于发送binlog的内容。在读取binlog中的操作时,此线程会对主节点上的binlog加锁,当读取完成,甚至在发动给从节点之前,锁会被释放;
  从节点I/O线程
  当从节点上执行start slave命令之后,从节点会创建一个I/O线程用来连接主节点,请求主库中更新的binlog。I/O线程接收到主节点binlog dump进程发来的更新之后,保存在本地relaylog中;
  从节点SQL线程
  SQL线程负责读取relaylog中的内容,解析成具体的操作并执行,最终保证主从数据的一致性;
  MySQL 数据库主从同步原理
  binlog的内容
  上面说了,binlog是一种逻辑日志,可以简单得理解为sql语句,但是实际上还包含着执行的sql语句的反向逻辑。delete对应着delete本身以及反向的insert信息;update包含着对应的update执行前后数据行的相关信息;insert包含自身的insert以及对应的delete信息。
 
  binlog的格式
  binlog共有三种格式,分别是statement、row以及mixed。MySQL 5.7.7版本之前默认使用的是statement,MySQL 5.7.7之后默认使用的是row。日志的格式可以通过my.ini配置文件中的binlog-format来修改。
  (1)statement:基于sql语句的复制(statement-based replication,SBR),每一条修改数据的sql语句都会记录到binlog中。
 
  优点:不需要具体记录某一行的变化,节约空间,减少io,提高性能;
  缺点:在执行sysdate()或者sleep()等操作的时候,可能导致主从数据不一致的情况;
  (2)row:基于行记录的复制(row-based replication,RBR),不记录sql语句上下文相关信息,而是记录哪条记录被修改的细节。
 
  优点:非常详细地记录每一行记录修改的细节,因而不会出现数据无法被正确复制的情况;
  缺点:由于会非常详细地记录每一条记录修改的细节,这样会产生大量的日志内容。假设现在有一条update语句,修改了很多条记录,则每条修改记录都会记录到binlog中。特别地,alter table这个操作,由于表结构的变化,每行记录都会发生变化,导致日志量暴增;
  (3)mixed:根据上面所说的,statement和row各有优缺点,因此出现了mixed这个版本,将这二者进行混合。一般情况下使用statement格式来进行保存,当遇到statement无法解决时,切换为row格式来进行保存。
  特别地,上面说了,新版本(MySQL 5.7.7之后)默认使用的row格式,这里的row也做了相应的优化,在遇到alter table这个操作时采用statement格式进行记录,其余操作仍然使用row格式。
 
  binlog刷盘时机
 
  对于InnoDB存储引擎来说,只有在事务提交的时候才会记录binlog,此时记录还在内存中,MySQL通过sync_binlog来控制binlog的刷盘时机,取值范围为0-N:
 
  0:不强制刷到磁盘,由系统自行判断何时写入磁盘中;
  1:每次提交后都要将binlog写入磁盘中;
  N:每N个事务,才会将binlog写入磁盘中;
  从上面可以看出,sync_binlog最安全的是设置是1,这也是MySQL 5.7.7之后版本的默认值。但是设置一个大一些的值可以提升数据库性能,因此实际情况下也可以将值适当调大,牺牲一定的一致性来获取更好的性能。

(编辑:武林网)

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表