Redo Log 是属于InnoDB引擎所特有的日志,而MySQL Server也有本身的日志,即 Binary log(二进制日志),简称Binlog。mysql
Binlog是记录全部数据库表结构变动以及表数据修改的二进制日志,不会记录SELECT和SHOW这类操做。sql
Binlog日志是以事件形式记录,还包含语句所执行的消耗时间。数据库
开启Binlog日志有如下两个最重要的使用场景。服务器
主从复制:在主库中开启Binlog功能,这样主库就能够把Binlog传递给从库,从库拿到Binlog后实现数据恢复达到主从数据一致性。 数据恢复:经过mysqlbinlog工具来恢复数据。
Binlog文件名默认为“主机名_binlog-序列号”格式,例如oak_binlog-000001,也能够在配置文件中指定名称。数据结构
文件记录模式有STATEMENT、ROW和MIXED三种,具体含义以下。函数
日志中会记录每一行数据被修改的状况,而后在slave端对相同的数据进行修改。工具
优势:能清楚记录每个行数据的修改细节,能彻底实现主从数据同步和数据的恢复。 缺点:批量操做,会产生大量的日志,尤为是alter table会让日志暴涨。
每一条被修改数据的SQL都会记录到master的Binlog中,slave在复制的时候SQL进程会解析成和原来master端执行过的相同的SQL再次执行。简称SQL语句复制。线程
优势:日志量小,减小磁盘IO,提高存储和恢复速度 缺点:在某些状况下会致使主从数据不一致,好比last_insert_id()、now()等函数。
以上两种模式的混合使用,通常会使用 STATEMENT 模式保存binlog,对于STATEMENT模式没法复制的操做使用 ROW 模式保存binlog,MySQL会根据执行的SQL语句选择写入模式。日志
经常使用的log event有:Query event、Row event、Xid event等。binlog文件的内容就是各类Log event的集合。code
Log Event保存在一个binlog_cache_mngr数据结构中,在该结构中有两个缓冲区,一个是stmt_cache,用于存放不支持事务的信息;另外一个是trx_cache,用于存放支持事务的信息。
不一样事务以串行方式将log event写入binlog文件中,因此一个事务包含的log event信息在binlog文件中是连续的,中间不会插入其余事务的log event。
Binlog状态查看
show variables like 'log_bin';
开启Binlog功能
须要修改my.cnf或my.ini配置文件,在[mysqld]下面增长log_bin=mysql_bin_log,重启MySQL服务。
#log-bin=ON #log-bin-basename=mysqlbinlog binlog-format=ROW log-bin=mysqlbinlog
执行开启语句
set global log_bin=mysqllogbin;
使用show binlog events命令
show binary logs; //等价于show master logs; show master status; show binlog events; show binlog events in 'mysqlbinlog.000001'\G; 结果: Log_name: mysql_bin.000001 //此条log存在那个文件中 Pos: 174 //log在bin-log中的开始位置 Event_type: Intvar //log的类型信息 Server_id: 1 //能够查看配置中的server_id,表示log是那个服务器产生 End_log_pos: 202 //log在bin-log中的结束位置 Info: INSERT_ID=2 //log的一些备注信息,能够直观的看出进行了什么操做
能够用mysql自带的工具mysqlbinlog
mysqlbinlog "文件名" mysqlbinlog "文件名" > "文件名好比:test.sql"
使用 binlog 恢复数据
//按指定时间恢复 mysqlbinlog --start-datetime="2020-04-25 18:00:00" --stop-datetime="2020-04-26 00:00:00" mysqlbinlog.000002 | mysql -uroot -p1234 //按事件位置号恢复 mysqlbinlog --start-position=154 --stop-position=957 mysqlbinlog.000002 | mysql -uroot -p1234
mysqldump:按期所有备份数据库数据。mysqlbinlog: 能够作增量备份和恢复操做。
删除Binlog文件
purge binary logs to 'mysqlbinlog.000001'; //删除指定文件 purge binary logs before '2020-04-28 00:00:00'; //删除指定时间以前的文件 reset master; //清除全部文件
能够经过设置expire_logs_days参数来启动自动清理功能。默认值为0表示没启用。设置为1表示超出1天binlog文件会自动删除掉
(crash-safe 即在 InnoDB 存储引擎中,事务提交过程当中任何阶段,MySQL忽然奔溃,重启后都能保证事务的完整性,已提交的数据不会丢失,未提交完整的数据会自动进行回滚。这个能力依赖的就是redo log和unod log两个日志。)