命令记不住

登陆

MySQL 二进制日志管理

二进制日志管理

1.错误日志

1.1 作用

记录启动\关闭\日常运行过程中,状态信息,警告,错误

1.2 错误日志配置

默认就是开启的: /数据路径下/hostname.err

手工设定:

vim /etc/my.cnf 
log_error=/var/log/mysql.log

重启生效

show variables like 'log_error';

1.3 日志内容查看

主要关注[ERROR],看上下文

2.二进制binlog

2.1 作用

  • (1)备份恢复必须依赖二进制日志
  • (2)主从环境必须依赖二进制日志

2.2 binlog配置 (5.7必须加server_id)

注意:MySQL默认是没有开启二进制日志的。

2.2.1 创建日志目录

[root@db01 mysql]# mkdir /data/binlog
[root@db01 mysql]# chown -R mysql.mysql /data/binlog

2.2.2 修改配置文件

vim /etc/my.cnf
[mysqld]
server_id=6                         
log_bin=/data/binlog/mysql-bin
binlog_format=row

2.2.3 重启数据库生效

[root@db01 mysql]# /etc/init.d/mysqld restart

2.2.4 参数说明

server_id=3306   

主要是在主从复制过程中必须要加的,但是在5.7版本中,要用以下参数(log_bin),开启binlog日志,即使是单机也是必加的

log_bin=/data/binlog/mysql-bin
  • (1)开启二进制日志功能
  • (2)设置二进制日志目录及名称前缀
binlog_format=row

binlog的记录格式

SBR
RBR
mixed

3.binlog记录了什么

2.3.0 引入

binlog是SQL层的功能。记录的是变更SQL语句,不记录查询语句。

2.3.1 记录SQL语句种类

DDL :原封不动的记录当前DDL(statement)。
DCL :原封不动的记录当前DCL(statement)。
DML :只记录已经提交的事务DML

三种记录方式:受binlog_format(binlog的记录格式)参数影响

  • (1)statement(5.6默认)SBR :语句模式原封不动的记录当前DML。
  • (2)ROW(5.7 默认值) RBR :记录数据行的变化(用户看不懂,需要工具分析)
  • (3)mixed(混合)模式 :以上两种模式的混合

面试题:
SBR与RBR模式的对比

STATEMENT:可读性较高,日志量少,但是不够严谨
ROW      :可读性很低,日志量大,足够严谨

id   name    intime
insert into t1 values(1,'zs',now())
我们建议使用:row记录模式

4.event简介

2.4.1 事件的简介

二进制日志的最小记录单元
对于DDL,DCL,一个语句就是一个event
对于DML语句来讲:例如以下列子,就被分为了4个event

DML如下

begin;       120  - 340 
DML1         340  - 460
DML2         460  - 550 
commit;      550  - 760		

2.4.2 event的组成
三部分构成:

  • 事件的开始标识
  • 事件内容
  • 事件的结束标识

Position:
开始标识: at 194
结束标识: end_log_pos 254

194? 254? 
某个事件在binlog中的相对位置号

位置号的作用是: 为了方便我们截取事件

5.日志文件查看

2.5.1 查看日志的开启情况:
log_bin参数设置的路径,可以找到二进制日志

db01 [(none)]>show variables like 'log_bin%';
+---------------------------------+------------------------------+
| Variable_name                   | Value                        |
+---------------------------------+------------------------------+
| log_bin                         | ON                           |
| log_bin_basename                | /data/binlog/mysql-bin       |
| log_bin_index                   | /data/binlog/mysql-bin.index |
| log_bin_trust_function_creators | OFF                          |
| log_bin_use_v1_row_events       | OFF                          |
+---------------------------------+------------------------------+
5 rows in set (0.01 sec)


db01 [(none)]>show variables like 'log_bin%';
+---------------------------------+------------------------------+
| Variable_name                   | Value                        |
+---------------------------------+------------------------------+
| log_bin                         | ON                           |
| log_bin_basename                | /data/binlog/mysql-bin       |
| log_bin_index                   | /data/binlog/mysql-bin.index |
| log_bin_trust_function_creators | OFF                          |
| log_bin_use_v1_row_events       | OFF                          |
+---------------------------------+------------------------------+
5 rows in set (0.01 sec)

2.5.2 查看一共多少个binlog

db01 [(none)]>show binary logs;
+------------------+-----------+
| Log_name         | File_size |
+------------------+-----------+
| mysql-bin.000001 |       154 |
+------------------+-----------+
1 row in set (0.00 sec)

2.5.3 查看mysql正在使用的日志文件

show master status;
x86cloud [(none)]>show master status;
file:当前MySQL正在使用的文件名
Position:最后一个事件的结束位置号

6.日志内容查看

2.6.1 event查看

show master status;

show binlog events in 'mysql-bin.000002';
 x86cloud [(none)]>show binlog events in 'mysql-bin.000005';
+------------------+-----+-------------+-----------+-------------+---------------------------------------+
| Log_name         | Pos | Event_type  | Server_id | End_log_pos | Info                                  |
+------------------+-----+-------------+-----------+-------------+---------------------------------------+
| mysql-bin.000005 |   4 | Format_desc |         1 |         120 | Server ver: 5.6.40-log, Binlog ver: 4 |
| mysql-bin.000005 | 120 | Query       |         1 |         208 | create database db                    |
+------------------+-----+-------------+-----------+-------------+--------------------------------------
Log_name:binlog文件名
Pos:开始的position    *****
Event_type:事件类型
	Format_desc:格式描述,每一个日志文件的第一个事件,多用户没有意义,MySQL识别binlog必要信息
	5.6	4-120 
	5.7    4-154
Server_id:mysql服务号标识
End_log_pos:事件的结束位置号 *****
Info:事件内容*****

录入数据,看事件信息:

create database testdb;
use testdb;
create table t1(id int);
insert into t1 values(1);
commit;
show binlog events in 'mysql-bin.000005';
 x86cloud [testdb]>show binlog events in 'mysql-bin.000005';
 
+------------------+-----+-------------+-----------+-------------+----------------------------------------+
| Log_name         | Pos | Event_type  | Server_id | End_log_pos | Info                                   |
+------------------+-----+-------------+-----------+-------------+----------------------------------------+
| mysql-bin.000005 |   4 | Format_desc |         1 |         120 | Server ver: 5.6.40-log, Binlog ver: 4  |
| mysql-bin.000005 | 120 | Query       |         1 |         208 | create database db                     |
| mysql-bin.000005 | 208 | Query       |         1 |         308 | create database testdb                 |
| mysql-bin.000005 | 308 | Query       |         1 |         409 | use `testdb`; create table t1(id int)  |
| mysql-bin.000005 | 409 | Query       |         1 |         492 | BEGIN                                  |
| mysql-bin.000005 | 492 | Query       |         1 |         594 | use `testdb`; insert into t1 values(1) |
| mysql-bin.000005 | 594 | Xid         |         1 |         625 | COMMIT /* xid=32 */                    |
+------------------+-----+-------------+-----------+-------------+----------------------------------------+

2.6.2 binlog文件内容详细查看

create database testdb1;
use testdb1;
create table t1(id int);
insert into t1 values(1);
commit;
show binlog events in 'mysql-bin.000006';
mysqlbinlog /data/mysql/mysql-bin.000006 
mysqlbinlog --base64-output=decode-rows  -vvvv /data/mysql/mysql-bin.000006
mysqlbinlog -d testdb1 /data/mysql/mysql-bin.000006
推荐阅读