文章目录

  • 一. 前置了解
  • 二.binglog
  • 1.1 binglog 了解
  • 1.2 binglog的两个使用场景
  • 1.3 如何开启binlog
  • 1.4 常见binlog 操作
  • 1.4.1 查看所有binlog日志
  • 1.4.2 查看master状态
  • 1.4.3 刷新binlog
  • 1.4.4 重置binlog
  • 1.4.5 查看binlog
  • 第一个是 mysqlbinglog 命令:
  • 第二个是 ``show binlog events in 'logbin.000001' ;``


一. 前置了解

MySQL整体上分为两部分:
第一部分是MySQL server
第二部分是存储引擎:Innodb/Mylsam

MySQL的存储引擎是一个可以插拔的存储引擎,目前最常用的是InnoDB

binlog(归档日志)是MySQL server层的日志redo log g(重做日志)是InnoDB里的日志

二.binglog

1.1 binglog 了解

1.binlog 是 MySQL Server 层的日志,而不是存储引擎自带的日志
2.它记录了所有的 DDL 和 DML(不包含数据查询语句)语句,而且是以事件形式记录,还包含语句所执行的消耗的时间等
3.binlog 是一种逻辑日志,他里边所记录的是一条 SQL 语句的原始逻辑,例如给某一个字段 +1,注意这个区别于 redo log 的物理日志(在某个数据页上做了什么修改)。
4.binlog 文件写满后,会自动切换到下一个日志文件继续写而不会覆盖以前的日志,这个也区别于redo log,redo log 是循环写入的,即后面写入的可能会覆盖前面写入的。
5.般来说,我们在配置 binlog 的时候,可以指定 binlog 文件的有效期,这样在到期后,日志文件会自动删除,这样避免占用较多存储空间。

1.2 binglog的两个使用场景

MySQL 官方文档的介绍,开启 binlog 之后,大概会有 1% 的性能损耗,不过这还是可以接受的:
使用场景一:MySQL主从复制时:在主机上开启 binlog,主机将binlog 同步给从机,从机通过 binlog 来同步数据,进而实现主机和从机的数据同步。
使用场景二:MySQL 数据恢复,通过使用 mysqlbinlog 工具再结合 binlog 文件,可以将数据恢复到过去的某一时刻。

1.3 如何开启binlog

goconfig go配置文件读取 mysql go mysql binlog_日志文件

还是在我们的my.cnf中加入配置

# 这个参数表示启用 binlog 功能,并指定 binlog 的存储目录
log-bin=logbin
# 设置一个 binlog 文件的最大字节
# 设置最大 100MB
max_binlog_size=104857600
# 设置了 binlog 文件的有效期(单位:天)
expire_logs_days = 7
# binlog 日志只记录指定库的更新(配置主从复制的时候会用到)
#binlog-do-db=javaboy_db
# binlog 日志不记录指定库的更新(配置主从复制的时候会用到)
#binlog-ignore-db=javaboy_no_db
# 写缓存多少次,刷一次磁盘,默认 0 表示这个操作由操作系统根据自身负载自行决定多久写一次磁盘
# 1 表示每一条事务提交都会立即写磁盘,n 则表示 n 个事务提交才会写磁盘
sync_binlog=0
# 为当前服务取一个唯一的 id(MySQL5.7 之后需要配置)
server-id=1

完成修改后的my.cnf

# For advice on how to change settings please see
# http://dev.mysql.com/doc/refman/5.7/en/server-configuration-defaults.html
 #修改MySQL的
[mysqld]
#
# Remove leading # and set to the amount of RAM for the most important data
# cache in MySQL. Start at 70% of total RAM for dedicated server, else 10%.
# innodb_buffer_pool_size = 128M
#
# Remove leading # to turn on a very important data integrity option: logging
# changes to the binary log between backups.
# log_bin
#
# Remove leading # to set options mainly useful for reporting servers.
# The server defaults are faster for transactions and fast SELECTs.
# Adjust sizes as needed, experiment to find the optimal values.
# join_buffer_size = 128M
# sort_buffer_size = 2M
# read_rnd_buffer_size = 2M

# 这个参数表示启用 binlog 功能,并指定 binlog 的存储目录
log-bin=logbin
# 设置一个 binlog 文件的最大字节
# 设置最大 100MB
max_binlog_size=104857600
# 设置了 binlog 文件的有效期(单位:天)
expire_logs_days = 7
# binlog 日志只记录指定库的更新(配置主从复制的时候会用到)
#binlog-do-db=javaboy_db
# binlog 日志不记录指定库的更新(配置主从复制的时候会用到)
#binlog-ignore-db=javaboy_no_db
# 写缓存多少次,刷一次磁盘,默认 0 表示这个操作由操作系统根据自身负载自行决定多久写一次磁盘
# 1 表示每一条事务提交都会立即写磁盘,n 则表示 n 个事务提交才会写磁盘
sync_binlog=0
# 为当前服务取一个唯一的 id(MySQL5.7 之后需要配置)
server-id=1
 
skip-host-cache
skip-name-resolve
datadir=/var/lib/mysql
socket=/var/run/mysqld/mysqld.sock
secure-file-priv=/var/lib/mysql-files
user=mysql

# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0

#log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
#修改Mysql客户端的,一般乱码了就是这里出现了问题
[client]
socket=/var/run/mysqld/mysqld.sock

!includedir /etc/mysql/conf.d/
!includedir /etc/mysql/mysql.conf.d/

开启binlog后


docker restart mysql1 重启mysql1线程

再进入mysql01容器中

docker exec -it mysql01 /bin/bash

goconfig go配置文件读取 mysql go mysql binlog_MySQL_02


再进mysql server中

mysql -uroot -p

输入sql指令
show variables like '%log_bin%';

如下所示:

log_bin显示ON表示binlog开启了

log_bin_basename这个是将来产生的binlog日志文件的名称前缀,即根据大家目前所看到的配置,将来产生的binlog日志文件名为log_bin.xxx,

这个文件中将会用来记录所有的DDL和DML语句事件。

log_bin_index:这个是binlog的索引文件,保存了所有binlog的目录,因为binlog可能会有多个。我们可以来查看一下现在的logbin.inxdex文件;

goconfig go配置文件读取 mysql go mysql binlog_服务器_03

docker exec -it mysql01 /bin/bash先进来查看

cat /var/lib/mysql/logbin.index 再去查看logbin

goconfig go配置文件读取 mysql go mysql binlog_mysql_04

1.4 常见binlog 操作

1.4.1 查看所有binlog日志

通过如下方式我们可以查看binlog日志列表:

show master logs; 记得加上分号

goconfig go配置文件读取 mysql go mysql binlog_MySQL_05


可以看到,我们这里只有一个日志文件,文件名为

logbin.000001


File_size 表示这个文件占用的字节大小是154。

1.4.2 查看master状态

这个命令再我们搭建MySQL主从的时候经常会用到。
show master status;

goconfig go配置文件读取 mysql go mysql binlog_服务器_06

1.4.3 刷新binlog

flush logs 正常来说,一个binlog写满之后,会自动去切花刀下一个binlog开始写,不过我们也可以指向一个flush logs 命令手动刷新binlog,手动刷新binlog之后,就会产生一个新的binlog日志文件,接下来所有的binlog日志都将记录到新的文件夹中

goconfig go配置文件读取 mysql go mysql binlog_数据库_07


当我们刷新日志之后,再通过show master logs 去查看日志,会发现日志文件产生了一个新的文件,再通过show master status去查看最新的日志文件,发现也已经变为了最新的login.000003

goconfig go配置文件读取 mysql go mysql binlog_日志文件_08

1.4.4 重置binlog

reset master 可以充值binlog日志文件,为了让日志重新从000001开始记录,不过如果当前主机有一个或者多个从机正在运行,那么该命令就运行不了。(因为从机是通过binlog来实现数据库同步的,主机把binlog清空了,从机会找不到binlog而报相应的错误。)

goconfig go配置文件读取 mysql go mysql binlog_数据库_09

1.4.5 查看binlog

由于binlog是二进制日志文件,没办法直接打开看

为了查看binlog ,MySQL为我们提供了两个官方工具

第一个是 mysqlbinglog 命令:

很多版本的mysql中不带有这个命令,所以此处不做解释

第二个是 show binlog events in 'logbin.000001' ;

goconfig go配置文件读取 mysql go mysql binlog_数据库_10

具体参数: 1.log_name:可以指定要查看的 binlog 日志文件名,如果不指定的话,表示查看最早的 binlog 文件。
2.pos:从哪个 pos 点开始查看,凡是 binlog 记录下来的操作都有一个 pos 点,这个其实就是相当于我们可以指定从哪个操作开始查看日志,如果不指定的话,就是从该 binlog 的开头开始查看。
3.offset:这是是偏移量,不指定默认就是 0。
4.row_count:查看多少行记录,不指定就是查看所有。