精华内容
下载资源
问答
  • BinLog

    2020-12-22 17:53:02
    1.Binlog binlog 以事件的形式记录了所有的DDL 和DML 语句(因为它记录的是操作而不是 数据值,属于逻辑日志),可以用来做主从复制和数据恢复。 实现数据的恢复:在开启了binlog 功能的情况下,把binlog 导出成SQL...

    1.Binlog

    binlog 以事件的形式记录了所有的DDL 和DML 语句(因为它记录的是操作而不是
    数据值,属于逻辑日志),可以用来做主从复制和数据恢复。

    • 实现数据的恢复:在开启了binlog 功能的情况下,把binlog 导出成SQL 语句,把所有的操
      作重放一遍.
    • 实现主从复制:从服务器读取主服务器的binlog,然后执行一遍。
      在这里插入图片描述
      1、先查询到这条数据,如果有缓存,也会用到缓存。
      2、把name 改成盆鱼宴,然后调用引擎的API 接口,写入这一行数据到内存,同时记录redo log。这时redo log 进入prepare 状态,然后告诉执行器,执行完成了,可以随时提交。
      3、执行器收到通知后记录binlog,然后调用存储引擎接口,设置redo log 为commit状态。
      4、更新完成。

    1、先记录到内存,再写日志文件。
    2、记录redo log 分为两个阶段。
    3、存储引擎和Server 记录不同的日志。
    4、先记录redo,再记录binlog。

    在这里插入图片描述

    展开全文
  • binlog

    2020-08-13 21:42:26
    主库把ddl,dml写入binlog 从库通过io线程,读取主库的binlog,复制到relaylog 从库通过sql thread读取relaylog,重放sql 事务提交后,sql写入binlog

    主库把ddl,dml写入binlog
    从库通过io线程,读取主库的binlog,复制到relaylog
    从库通过sql thread读取relaylog,重放sql

    在这里插入图片描述

    事务提交后,sql写入binlog

    展开全文
  • 开启MySQL的binlog日志

    万次阅读 多人点赞 2017-07-08 13:41:15
    binlog 就是binary log,二进制日志文件,这个文件记录了mysql所有的dml操作。通过binlog日志我们可以做数据恢复,做主住复制和主从复制等等。对于开发者可能对binlog并不怎么关注,但是对于运维或者架构人员来讲是...
    binlog 就是binary log,二进制日志文件,这个文件记录了mysql所有的dml操作。通过binlog日志我们可以做数据恢复,做主住复制和主从复制等等。对于开发者可能对binlog并不怎么关注,但是对于运维或者架构人员来讲是非常重要的。
     
    如何开启mysql的binlog日志呢?
    在my.inf主配置文件中直接添加三行
    log_bin=ON
    log_bin_basename=/var/lib/mysql/mysql-bin
    log_bin_index=/var/lib/mysql/mysql-bin.index
    三个参数来指定,
    第一个参数是打开binlog日志
    第二个参数是binlog日志的基本文件名,后面会追加标识来表示每一个文件
    第三个参数指定的是binlog文件的索引文件,这个文件管理了所有的binlog文件的目录
     
    当然也有一种简单的配置,一个参数就可以搞定
    log-bin=/var/lib/mysql/mysql-bin
    这一个参数的作用和上面三个的作用是相同的,mysql会根据这个配置自动设置log_bin为on状态,自动设置log_bin_index文件为你指定的文件名后跟.index
     
    这些配置完毕之后对于5.7以下版本应该是可以了,但是我们这个时候用的如果是5.7及以上版本的话,重启mysql服务会报错。这个时候我们必须还要指定一个参数
    server-id=123454
    随机指定一个不能和其他集群中机器重名的字符串,如果只有一台机器,那就可以随便指定了
     
    有了上述的配置之后,我们就可以重新启动我们的mysql了
    # CentOS 6
    service mysqld restart
    
    
    # CentOS 7
    systemctl restart mysqld

    启动成功之后,我们可以登陆查看我们的配置是否起作用

    show variables like '%log_bin%'
    下面我们可以找到这个目录来看一下
     
    因为我这里已经操作过数据库了,所以能看到这里有多个mysql-bin的文件,还有一个mysql-bin.index的文件,我们可以打开这个文件来看一下
    展开全文
  • Mysql的Binlog原理

    万次阅读 多人点赞 2019-03-26 12:54:43
    什么是二进制日志(binlog) binlog是记录所有数据库表结构变更(例如CREATE、ALTER TABLE…)以及表数据修改(INSERT、UPDATE、DELETE…)的二进制日志。 binlog不会记录SELECT和SHOW这类操作,因为这类操作对数据...

    什么是二进制日志(binlog)

    binlog是记录所有数据库表结构变更(例如CREATE、ALTER TABLE…)以及表数据修改(INSERT、UPDATE、DELETE…)的二进制日志。

    binlog不会记录SELECT和SHOW这类操作,因为这类操作对数据本身并没有修改,但你可以通过查询通用日志来查看MySQL执行过的所有语句。

    二进制日志包括两类文件:二进制日志索引文件(文件名后缀为.index)用于记录所有的二进制文件,二进制日志文件(文件名后缀为.00000*)记录数据库所有的DDL和DML(除了数据查询语句)语句事件。

     

    什么是事务日志

    innodb事务日志包括redo log和undo log。

    undo log指事务开始之前, 在操作任何数据之前,首先将需操作的数据备份到一个地方

    redo log指事务中操作的任何数据,将最新的数据备份到一个地方

    事务日志的目的:实例或者介质失败,事务日志文件就能派上用场。

    1.redo log不是随着事务的提交才写入的,而是在事务的执行过程中,便开始写入redo 中。具体 的落盘策略可以进行配置 防止在发生故障的时间点,尚有脏页未写入磁盘,在重启mysql服务的时候,根据redo log进行重做,从而达到事务的未入磁盘数据进行持久化这一特性。RedoLog是为了实现事务的持久性而出现的产物


    2.undo log用来回滚行记录到某个版本。事务未提交之前,Undo保存了未提交之前的版本数据,Undo中的数据可作为数据旧版本快照供其他并发事务进行快照读是为了实现事务的原子性而出现的产物,在Mysql innodb存储引擎中用来实现多版本并发控制

     

    Redolog知识补充

    指定Redo log 记录在{datadir}/ib_logfile1&ib_logfile2 可通过innodb_log_group_home_dir 配置指定 目录存储

    一旦事务成功提交且数据持久化落盘之后,此时Redo log中的对应事务数据记录就失去了意义,所 Redo log的写入是日志文件循环写入的

    指定Redo log日志文件组中的数量 innodb_log_files_in_group 默认为2

    指定Redo log每一个日志文件最大存储量innodb_log_file_size 默认48

    指定Redo logcache/buffer中的buffer池大小innodb_log_buffer_size 默认16Redo buffer 持久化Redo log的策略, Innodb_flush_log_at_trx_commit

    取值 0 每秒提交 Redo buffer --> Redo log OS cache -->flush cache to disk[可能丢失一秒的事务数据]

    取值 1 默认值,每次事务提交执行Redo buffer --> Redo log OS cache -->flush cache to dis[最安全,性能最差的方式]

    取值 2 每次事务提交执行Redo buffer --> Redo log OS cache 再每一秒执行 ->flush cache tdisk操作

     

    快照读和当前读

    快照读:SQL读取的数据是快照版本,也就是历史版本,普通的SELECT就是快照读 innodb快照读,数据的读取将由 cache(原本数据) + undo(事务修改过的数据) 两部分组成

    当前读:SQL读取的数据是最新版本。通过锁机制来保证读取的数据无法通过其他事务进行修改 UPDATE、DELETE、INSERT、SELECT … LOCK IN SHARE MODE、SELECT … FOR UPDATE都是 当前读

     

    Undo + Redo事务的简化过程

      假设有A、B两个数据,值分别为1,2,开始一个事务,事务的操作内容为:把1修改为3,2修改为4,那么实际的记录如下(简化):

      A.事务开始.
      B.记录A=1到undo log.
      C.修改A=3.
      D.记录A=3到redo log.
      E.记录B=2到undo log.
      F.修改B=4.
      G.记录B=4到redo log.
      H.将redo log写入磁盘。
      I.事务提交

     

    二进制日志处理事务和非事务性语句的区别

    在事务性语句(update)执行过程中,服务器将会进行额外的处理,在服务器执行时多个事务是并行执行的,为了把他们的记录在一起,需要引入事务日志的概念。在事务完成被提交的时候一同刷新到二进制日志。对于非事务性语句(insert,delete)的处理。遵循以下3条规则:

    1)如果非事务性语句被标记为事务性,那么将被写入重做日志。

    2)如果没有标记为事务性语句,而且重做日志中没有,那么直接写入二进制日志。

    3)如果没有标记为事务性的,但是重做日志中有,那么写入重做日志。

    注意如果在一个事务中有非事务性语句,那么将会利用规则2,优先将该影响非事务表语句直接写入二进制日志。
     

    XA的概念

    XA(分布式事务)规范主要定义了(全局)事务管理器(TM: Transaction Manager)和(局部)资源管理器(RM: Resource Manager)之间的接口。XA为了实现分布式事务,将事务的提交分成了两个阶段:也就是2PC (tow phase commit),XA协议就是通过将事务的提交分为两个阶段来实现分布式事务。

    两阶段

    1)prepare 阶段

    事务管理器向所有涉及到的数据库服务器发出prepare"准备提交"请求,数据库收到请求后执行数据修改和日志记录等处理,处理完成后只是把事务的状态改成"可以提交",然后把结果返回给事务管理器。即:为prepare阶段,TM向RM发出prepare指令,RM进行操作,然后返回成功与否的信息给TM。

    2)commit 阶段

    事务管理器收到回应后进入第二阶段,如果在第一阶段内有任何一个数据库的操作发生了错误,或者事务管理器收不到某个数据库的回应,则认为事务失败,回撤所有数据库的事务。数据库服务器收不到第二阶段的确认提交请求,也会把"可以提交"的事务回撤。如果第一阶段中所有数据库都提交成功,那么事务管理器向数据库服务器发出"确认提交"请求,数据库服务器把事务的"可以提交"状态改为"提交完成"状态,然后返回应答。即:为事务提交或者回滚阶段,如果TM收到所有RM的成功消息,则TM向RM发出提交指令;不然则发出回滚指令。

    • 外部与内部XA

    MySQL中的XA实现分为:外部XA和内部XA。前者是指我们通常意义上的分布式事务实现;后者是指单台MySQL服务器中,Server层作为TM(事务协调者,通常由binlog模块担当),而服务器中的多个数据库实例作为RM,而进行的一种分布式事务,也就是MySQL跨库事务;也就是一个事务涉及到同一个MySQL服务器中的两个innodb数据库(目前似乎只有innodb支持XA)。内部XA也可以用来保证redo和binlog的一致性问题。

    事务日志与二进制日志的一致性问题

    我们MySQL为了兼容其它非事务引擎的复制,在server层面引入了 binlog, 它可以记录所有引擎中的修改操作,因而可以对所有的引擎使用复制功能; 然而这种情况会导致redo log与binlog的一致性问题;MySQL通过内部XA机制解决这种一致性的问题

    第一阶段:InnoDB prepare, write/sync redo log;binlog不作任何操作;

    第二阶段:包含两步,1> write/sync Binlog; 2> InnoDB commit (commit in memory);

    当然在5.6之后引入了组提交的概念,可以在IO性能上进行一些提升,但总体的执行顺序不会改变。

    当第二阶段的第1步执行完成之后,binlog已经写入,MySQL会认为事务已经提交并持久化了(在这一步binlog就已经ready并且可以发送给订阅者了)。在这个时刻,就算数据库发生了崩溃,那么重启MySQL之后依然能正确恢复该事务。在这一步之前包含这一步任何操作的失败都会引起事务的rollback。

     

    第二阶段的第2步大部分都是内存操作(注意这里的InnoDB commit不是事务的commit),比如释放锁,释放mvcc相关的read view等等。MySQL认为这一步不会发生任何错误,一旦发生了错误那就是数据库的崩溃,MySQL自身无法处理。这个阶段没有任何导致事务rollback的逻辑。在程序运行层面,只有这一步完成之后,事务导致变更才能通过API或者客户端查询体现出来。

     

    下面的一张图,说明了MySQL在何时会将binlog发送给订阅者。

     

    MySQL会在binlog落盘之后会立即将新增的binlog发送给订阅者以尽可能的降低主从延迟

     

    如何开启mysql的binlog

    vi /etc/my.cnf 

    log-bin=mysql-bin #添加这一行就ok

    binlog-format=ROW #选择row模式

    server_id=1 #配置mysql replaction需要定义,不能和canal的slaveId重复

     

    Binlog常见格式

     

    业内目前推荐使用的是row模式,准确性高,虽然说文件大,但是现在有SSD和万兆光纤网络,这些磁盘IO和网络IO都是可以接受的。

     

    在innodb里其实又可以分为两部分,一部分在缓存中,一部分在磁盘上。这里业内有一个词叫做刷盘,就是指将缓存中的日志刷到磁盘上。跟刷盘有关的参数有两个个:sync_binlog和binlog_cache_size。这两个参数作用如下

     

    binlog_cache_size: 二进制日志缓存部分的大小,默认值32k

    sync_binlog=[N]: 表示每多少个事务写入缓冲,刷一次盘,默认值为0

    注意两点:

    (1)binlog_cache_size设过大,会造成内存浪费。binlog_cache_size设置过小,会频繁将缓冲日志写入临时文件。

    (2)sync_binlog=0:表示刷新binlog时间点由操作系统自身来决定,操作系统自身会每隔一段时间就会刷新缓存数据到磁盘,这个性能最好。sync_binlog=1,代表每次事务提交时就会刷新binlog到磁盘,对性能有一定的影响。sync_binlog=N,代表每N个事务提交会进行一次binlog刷新。

    另外,这里存在一个一致性问题,sync_binlog=N,数据库在操作系统宕机的时候,可能数据并没有同步到磁盘,于是再次重启数据库,会带来数据丢失问题。

    mysql的binlog是多文件存储,定位一个LogEvent需要通过binlog filename +  binlog position,进行定位

     

    table_map event & write_rows event

    这两个event是在binlog_format=row的时候使用,设置binlog_format=row,然后创建一个测试表

    CREATE TABLE `trow` ( `i` int(11) NOT NULL, `c` varchar(10) DEFAULT NULL, PRIMARY KEY (`i`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1`

    执行语句INSERT INTO trow VALUES(1, NULL), (2, 'a'),这个语句会产生一个query event,一个table_map event、一个write_rows event以及一个xid event。

     

     

    常用的开源框架原理

    1.原理

    1. 框架模拟mysql slave的交互协议,伪装自己为mysql slave,向mysql master发送dump协议
    2. mysql master收到dump请求,开始推送binary log给slave(也就是canal)
    3. 框架解析binary log对象(原始为byte流)

    2.框架

    2.1、mysql-binlog-connector-java(https://github.com/shyiko/mysql-binlog-connector-java

     目前开源的 CDC (change data capture)工具,如 Zendesk maxwell、Redhat debezium、LinkedIn Databus 等都底层依赖 mysql-binlog-connector-java 或者其前身 open-replicator

    不需要独立部署

    稳定性不是很好,时间久了会出现connetion lost的情况

    2.2、canal (https://github.com/alibaba/canal

    需要独立部署canal server服务

    canal 已在阿里云推出商业化版本 数据传输服务DTS, 开通即用,免去部署维护的昂贵使用成本。DTS针对阿里云RDS、DRDS等产品进行了适配,解决了Binlog日志回收,主备切换、VPC网络切换等场景下的订阅高可用问题。同时,针对RDS进行了针对性的性能优化。

    HA机制设计

    canal的ha分为两部分,canal server和canal client分别有对应的ha(主备模式)实现

    • canal server:  为了减少对mysql dump的请求,不同server上的instance要求同一时间只能有一个处于running,其他的处于standby状态. 
    • canal client: 为了保证有序性,一份instance同一时间只能由一个canal client进行get/ack/rollback操作,否则客户端接收无法保证有序

     

     

    canal 1.1.1版本之后, 默认支持将canal server接收到的binlog数据直接投递到MQ, 目前默认支持的MQ系统有:

    KafkaRocketMQ。1.1.3版本下修复了投递MQ模式,canal server HA在切换后不生效 

     

    参考文章:

    https://agapple.iteye.com/blog/1796633

     

    展开全文
  • 概述binlog会记录对MySQL数据库执行更改的操作,还包括了语句执行的时间,不包括select和show操作。若操作没有对数据库数据操作,也有可能写入binlog日志,默认情况是不开启。根据官方文档的测试表明,开启binlog...
  • Mysql Binlog

    2021-01-02 16:20:56
    Binlog日志介绍 Binlog的记录模式 Binlog的文件结构 Binlog日志介绍 二进制log,别于数据库引擎的redo log。 binlog记录记录DML DDL 。 Binlog的记录模式 statement 有点像redis的 rdb持久化。 Binlog...
  • mysql binlog

    2020-10-17 20:32:45
    查看binlog 的存储格式 show variables like 'binlog_format'; 设置 binlog的存储格式 set session binlog_format='statement'; (设为段格式) set session binlog_format='ROW';(设置为行格式) 查看binlog show ...
  • Binlog用法

    2020-08-12 15:58:52
    Binlog的三个业务应用场 1.什么是binlog binlog是mysql的一种二进制日志文件,用来记录数据的变化。mysql使用binlog进行主从复制,如图: 客户端向master的mysql sever写入数据 当数据发生变化时,master将...
  • MySQL Binlog 介绍

    万次阅读 多人点赞 2019-03-09 23:54:32
    Binlog 简介 MySQL中一般有以下几种日志: 日志类型 写入日志的信息 错误日志 记录在启动,运行或停止mysqld时遇到的问题 通用查询日志 记录建立的客户端连接和执行的语句 二进制日志 记录更改数据的...
  • binlog日志

    2020-11-03 16:15:42
    binlog日志 查看binlog服务是否开启 运行SQL 输入show variables like ‘log_bin’; 如果Value 为 OFF 则未开启日志文件 开启binlog日志 找到my.cnf 中 [mysqld] 添加如下 [mysqld] # binlog 配置 #日志的存放路径 ...
  • 一、binlog简介mysql-binlog是MySQL数据库最重要的二进制日志,它记录了所有的数据定义语言DDL和数据操作语言DML((除了数据查询语句),以事件形式记录,还包含语句所执行消耗的事件。binlog主要应用于主从复制和数据...
  • 一 简介:来聊聊binlog cache二 定义为每个session 分配的内存,在事务过程中用来存储二进制日志的缓存。三 参数1 binlog_cache_size 默认 32K 用于指定存储整个事物生成的binlog event的内存大小,对于大事物来讲很...
  • 一 简介:来聊聊binlog cache二 定义为每个session 分配的内存,在事务过程中用来存储二进制日志的缓存。三 参数1 binlog_cache_size 默认 32K 用于指定存储整个事物生成的binlog event的内存大小,对于大事物来讲很...
  • mysql查看binlog日志内容

    万次阅读 2018-01-07 18:24:54
    (一) binlog介绍 binlog,即二进制日志,它记录了数据库上的所有改变,并以二进制的形式保存在磁盘中; 它可以用来查看数据库的变更历史、数据库增量备份和恢复、Mysql的复制(主从数据库的复制)。 (二) ...
  • binlog解析

    2020-06-23 11:14:19
    MySQL的binlog 日志对于生产环境非常有用,任何时间对数据库的修改都会记录在binglog中;当数据发生增删改,创建数据库对象都会记录到binlog中,数据库的复制也是基于binlog进行同步数据; 和SQL SERVER 数据库开启...
  • 环境:mysql5.7.12查看是否开启binlog执行:show binary logs;输出错误,没有开启binlog。修改my.ini文件不要修改错了,是如下目录:C:ProgramDataMySQLMySQL Server 5.7my.ini配置文件中加入如下配置:# Binary ...
  • 主要介绍了Mysql Binlog快速遍历搜索记录及binlog数据查看的方法的相关资料,需要的朋友可以参考下
  • mysql binlog 简单介绍与基于binlog数据恢复通过备份文件恢复binlog(本节重点)binlog 二进制日志文件show variables like 'log_bin';二进制日志文件(binary log) 记录了对mysql 数据库执行更改的所有操作, 但是不...
  • 众所周知,binlog日志对于mysql数据库来说是十分重要的。在数据丢失的紧急情况下,我们往往会想到用binlog日志功能进行数据恢复(定时全备份+binlog日志恢复增量数据部分),化险为夷! 废话不多说,下面是梳理的...
  • binlog初探

    2020-07-28 11:19:22
    binlog binlog是记录所有数据库表结构变更(例如CREATE、ALTER…) 以及表数据修改的二进制日志。 binlog在数据库的data文件夹下是这样的形式 它包括index结尾的索引文件和日志本身 作用 用于复制,在主从复制中,从...
  • Binlog详解

    万次阅读 2018-05-17 20:49:00
     binlog, 即二进制文件,他记录了MySQL所有数据的变更,并以二进制的形式存储在磁盘上   二、binlog模式  binlog有三种模式:ROW(行模式), Statement(语句模式), Mixed(混合模式)  ROW(行模式):记录...
  • MySQL BinLog

    2020-09-29 18:27:52
    1.查看当前正在往哪个binlog文件中写入(active bin log file) show master status\G 2.查看日志 show binlog events in ‘master-bin.000002’\G 3. bin log 日志示例 执行一个事务,事务内有两条SQL语句: 对应的...
  • 判断MySQL是否已经开启binlog SHOW VARIABLES LIKE 'log_bin'; 查看MySQL的binlog模式 show global variables like "binlog%"; 几个关于binlog常用的命令 #查看日志开启状态 show variables like 'log_%'; #...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 26,695
精华内容 10,678
关键字:

binlog