https://mp.weixin.qq.com/s/n9vWkee2N-gpXpOHIYtRJg
关于binlog,这里常见的问题如下:
- binlog是什么
- binlog的配置和查看
- binlog的类型
- binlog如何数据恢复
- binlog是逻辑日志还是物理日志
- binlog的作用
binlog是什么
binlo(binary log),是MySql的二进制日志文件,这个文件记录了我们所有的DDL,DML,TCL等操作,即所有会改变数据库的操作,如表的创建、数据的插入更新和删除等。
题外话,介绍一下数据库的分类
- DDL:Data Definition Language,数据定义语言
- 用来操作数据库、表、列等,比如 CREATE、ALTER、DROP
- DML:Data Manipulation Language,数据操作语言
- 用来操作表里的数据,比如 INSERT、UPDATE、DELETE
- DCL:Data Control Language,数据控制语言
- 用来操作访问权限等,比如 GRANT
- DQL:Data Query Language,数据查询语言
- 用来查询数据,比如 SELECT
- TCL:Transaction Control Language,事务控制语言
- 用于数据库的事务管理,比如 COMMIT,ROLLBACK
缩写 | 全称 | 描述 |
DDL | Date Definition Language | 数据库定义语言,用来操作数据库、表、列等,比如 CREATE、ALTER、DROP |
DML | Data Manipulation Language | 数据库操作语言,用来操作表里的数据,比如 INSERT、UPDATE、DELETE |
DCL | Data Control Language | 数据控制语言,用来操作访问权限等 |
DQL | Data Query Language | 数据查询语言,用来查询数据,比如 SELECT |
TCL | Transaction Control Language | 事务控制语言,用于数据库的事务管理,比如 COMMIT,ROLLBACK |
binlog的配置和查看
1)binlog查看配置
我们可以通过以下命令查看binlog日志是否打开,以及存储的文件夹:
show variables like '%log_bin%';
返回结果如下:
其主要字段含义分表如下:
字段 | 含义 |
log_bin | 表示是否开启binlog |
log_bin_basename | 表示的是 binlog 所在的文件夹 |
log_bin_index | 表示的是 binlog 的索引文件,我们可以在其中找到所有的 binlog 日志 |
sql_log_bin | 用于主从复制,这个参数关闭后,主库的改动不会记录到 binlog,不会复制到从库 |
log_bin_basename 指向的是 binlog 存储的文件夹,在后面我们查看 binlog 具体内容的时候,会需要进入到这个文件夹进行查看。
2) binlog 查看
我们可以通过下面的命令查看全部的binlog文件。
show BINARY LOGS; show MASTER LOGS;
显示内容如下:
binlog的类型
binlog有三种类型,分别是: STATEMENT 、 ROW 和 MIXED 。
这里我们先介绍一下如何查看和修改binlog类型。
1. 查看binlog的类型
命令如下:
SHOW VARIABLES LIKE 'binlog_format';
输出binlog类型
表示binlog的保存烈性是log
2.修改binlog类型
修改 binlog 类型我们到 binlog 文件中修改,这里我们修改 mysqld.cnf(Linux系统中),修改 binlog_format 的值,没有这个配置项的话加一行,如下:
binlog_format = STATEMENT
保存之后重启MySQL,就可以发现参数发生了变化。
3.binlog的类型。含义及其优缺点
类型 | 说明 | 适用场景 | 优点 | 缺点 |
STATEMENT | STATEMENT 类型记录的是执行 SQL 语句的内容,比如 INSERT、UPDATE、DELETE 等语句本身。 | 适用简单SQL语句场景。比如单条数据的插入、更新、删除等。 | 日志文件小,可读性强 | 某些复杂问题出现不一致情况 |
ROW | 存储的是数据行的变更,会包含变更前后的内容 | 精确记录数据行变更的常见 | 可以精确记录行数据,避免STATEMENT类型可能出现的数据不一致的问题 | 日志文件大,可读性差 |
MIXED | 根据具体情况自动选择STATEMENT 或ROW类型来记录数据更改 | 兼顾了 STATEMENT 和 ROW 两种类型的有点,既可以节约空间,也可以精确记录数据变更 | 因为是系统是自动选择类型来记录,所以可能存在选择不够理想的记录方式从而导致一些不一致或者是性能问题 |
binlog如何数据恢复
在介绍如何恢复数据前,先介绍一下binlog的文件保存机制。
binlog文件保存机制
- binlog文件内容为某一刻开始保存的日志记录。
- 当我们重启时,系统会自动为我们新建一个日志文件。重启之后之后所有数据操作都会被放到新的binlog文件里面。
- 我们还快通过flush logs 操作手动新建一个binlog日志。
1. 恢复数据前提
- 已打开binlog日志记录
- 有一个备份库,这个备份库作用是在误操作后可以快速从最近时间点进行恢复(来源可以每天或更小粒度对目标数据库定时保存)
2.恢复数据步骤
1)停止写入更新操作
2)执行flush logs
3) 导出binlog日志
4)替换
binlog是逻辑日志还是物理日志
介绍一下 MySQL 中关于逻辑日志与物理日志的区别。
所谓逻辑日志指的是记录数据库操作的日志,比如 INSERT、UPDATE 等逻辑操作。
而物理日志则是指记录数据的各种存储细节,比如 MySQL 具体某个数据页的写入和修改数据等。
所以,binlog 则属于逻辑日志。
binlog的作用
数据库的备份和恢复
数据同步(主从赋值模式下,主库的更改会通过binlog的方式同步到从库)